• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ocena skryptu PHP5 & OOP & PDO

Object Storage Arubacloud
0 głosów
442 wizyt
pytanie zadane 29 stycznia 2017 w PHP przez niezalogowany

Cześć, obecnie uczę się PHP / OOP.

Stworzyłem skrypt który zarządza tabelą (dodaje, usuwa, modyfikuje) z produktami w bazie danych MySQL.

Mój skrypt działa bez zarzutu jednak chciałbym się dowiedzieć od kogoś kto "zjadł zęby" na PHP jak mój kod prezentuję się od strony profesionalnego programowania gdzie są błędy co muszę poprawić mimo tego że kod działa.

skrypt jest dość prosty więc każdy powinien go zrozumieć.

z góry dzięki za każdą odpowiedź.

 

<?php
class Product{
    private $pdo = null;
    private $config;
    private $table;

    /*
    |--------------------------------------------------------------------------
    | __construct($createTable = NULL)
    |--------------------------------------------------------------------------
    | 
    | $createTable - nazwa tabeli, jeżeli NULL tabela default products
    |
    */
     public function __construct($createTable = NULL){

        $this->config = parse_ini_file('config.ini', true); // Data base config.

        try{
            $this->pdo = new PDO('mysql:host=' . $this->config['db_MySQL']['db_server'] . ';dbname=' .  $this->config['db_MySQL']['db'] . 
            ';charset=' . $this->config['db_MySQL']['charset'], $this->config['db_MySQL']['db_user'], $this->config['db_MySQL']['db_password']);

            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            echo "<samp>&gt; Połączono z bazą danych</samp><br>";
        }
        catch(PDOException $e){
            echo "Error: " . $e->getMessage();
            exit();
        }

        if($createTable != NULL){

            $this->table = $createTable;
            $this->createTable($this->table);

        }else{
            $this->table = 'products'; // Tabela o nazwie default products MUSI JUŻ ISTNIEĆ W BAZIE DANYCH.
        }
     }

     public function __destruct(){ $this->pdo = NULL;} // Destruktor zamyka połączenie z bazą danych MySQL.

    /*
    |--------------------------------------------------------------------------
    | createTable($name)
    |--------------------------------------------------------------------------
    | 
    | $name - nazwa tabeli
    |
    */
    private function createTable($name){
        try{
            $sql = "CREATE TABLE IF NOT EXISTS $name (
            Id INT NOT NULL AUTO_INCREMENT,
            Name VARCHAR(255) NOT NULL,
            Category VARCHAR(255) NOT NULL,
            Price DOUBLE NOT NULL,
            PRIMARY KEY (Id)
            )ENGINE=InnoDB;";

            $this->pdo->exec($sql);
            echo "<samp>&gt; Utworzono tabele: <b>$name</b></samp><br>";
        }
        catch(PDOException $e){
            echo 'Error: ' . $e->getMessage();
        }
            
    }

    /*
    |--------------------------------------------------------------------------
    | addProduct($name, $category, $price)
    |--------------------------------------------------------------------------
    | 
    | $name - nazwa produktu
    | $category - kategoria produktu
    | $price - cena produktu
    |
    */
    public function addProduct($name, $category, $price){

        $name = filter_var($name, FILTER_SANITIZE_STRING);
        $category = filter_var($category, FILTER_SANITIZE_STRING);

        if(filter_var($price, FILTER_VALIDATE_FLOAT) === false){$price = 0;} // Złe dane, cena = 0
        
        try{
            $stmt = $this->pdo->prepare("INSERT INTO $this->table (Name, Category, Price) VALUES (:name, :category, :price)");
            $stmt->bindParam(':name', $name);
            $stmt->bindParam(':category', $category);
            $stmt->bindParam(':price', $price);
            $stmt->execute();

            echo "<samp>&gt; Dodano produkt <b>($name, $category, $price)</b> </samp><br>";
        }
        catch(PDOException $e){
            echo 'Error: ' . $e->getMessage();
        }
    }

    /*
    |--------------------------------------------------------------------------
    | deleteProduct($id)
    |--------------------------------------------------------------------------
    | 
    | $id - numer id produktu
    | 
    */
    public function deleteProduct($id){
        try{
            if(!filter_var($id, FILTER_VALIDATE_INT) === false) {
                $stmt = $this->pdo->prepare("DELETE FROM $this->table WHERE Id = ? LIMIT 1");
                $stmt->execute([$id]);
                $deleted = $stmt->rowCount(); // ile rekordów usunięto.
                echo "<samp>&gt; Usunięto: <b>$deleted</b></samp><br>";
            }
        }
        catch(PDOException $e){
            echo 'Error: ' . $e->getMessage();
        }
    }

    /*
    |--------------------------------------------------------------------------
    | updateProduct($id, $newName, $newCategory, $newPrice)
    |--------------------------------------------------------------------------
    | 
    | $id - numer id produktu
    | $newName - nowa nazwa produktu
    | $newCategory - nowa kategoria produktu
    | $newPrice - nowa cena produktu
    | 
    */
    public function updateProduct($id, $newName, $newCategory, $newPrice){

        $newName = filter_var($newName, FILTER_SANITIZE_STRING);
        $newCategory = filter_var($newCategory, FILTER_SANITIZE_STRING);

        if(filter_var($newPrice, FILTER_VALIDATE_FLOAT) === false){$newPrice = 0;} // Złe dane, cena = 0

        try{
            if(!filter_var($id, FILTER_VALIDATE_INT) === false) {
                $sql = "UPDATE $this->table SET Name = ?, Category = ?, Price = ? WHERE Id = ?";
                $this->pdo->prepare($sql)->execute([$newName, $newCategory, $newPrice, $id]);
                echo "<samp>&gt; Zmieniono</samp><br>";
            }
        }
        catch(PDOException $e){
            echo 'Error: ' . $e->getMessage();
        }
    }

    /*
    |--------------------------------------------------------------------------
    | view($id = NULL)
    |--------------------------------------------------------------------------
    | 
    | $id - Numer produktu do wyświetlenia jeżeli puste wyświetl wszystkie
    | 
    */
    public function view($id = NULL){
        try{
            if(!filter_var($id, FILTER_VALIDATE_INT) === false && $id != NULL){
                $stmt = $this->pdo->query("SELECT * FROM $this->table WHERE Id = $id");
                echo "<table>";
                echo "<tr><th>Nazwa</th><th>Kategoria</th><th>Cena</th></tr>";
                while($row = $stmt->fetch()){
                    printf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",
                    htmlspecialchars($row['Name']),
                    htmlspecialchars($row['Category']),
                    htmlspecialchars($row['Price']));
                }
                echo "</table>";
            }else{
                $stmt = $this->pdo->query("SELECT * FROM $this->table");
                echo "<table>";
                echo "<tr><th>Nazwa</th><th>Kategoria</th><th>Cena</th></tr>";
                while($row = $stmt->fetch()){
                    printf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",
                    htmlspecialchars($row['Name']),
                    htmlspecialchars($row['Category']),
                    htmlspecialchars($row['Price']));
                }
                echo "</table>";
            }
        }
        catch(PDOException $e){
            echo 'Error: ' . $e->getMessage();
        }
    }
}
?>

 

2 odpowiedzi

+3 głosów
odpowiedź 29 stycznia 2017 przez Boshi VIP (100,240 p.)
Co ma klasa produkt wspólnego z bazą danych? wytłumacz mi bo kompletnie nie mam pojęcia jak można mieszać tak dwie różne sprawy.
komentarz 29 stycznia 2017 przez niezalogowany
To że klasa produkt zarządza rekordami w tabeli ?
2
komentarz 29 stycznia 2017 przez Boshi VIP (100,240 p.)
A nie uważasz, że baza danych to jest coś oddzielnego od produktu? twoja klasa aktualnie robi wszystko, a wystarczyło przekazać tylko obiekt jako parameter w hincie konstruktora
komentarz 29 stycznia 2017 przez efiku Szeryf (75,160 p.)
Robisz Boską klasę, robisz to źle.

https://webmastah.pl/jak-programowac-obiektowo-cz-1-wstep/

https://github.com/domnikl/DesignPatternsPHP

Nosek tutaj  ^ i czytać:)
+2 głosów
odpowiedź 29 stycznia 2017 przez writen Nałogowiec (29,060 p.)
Twoja klasa robi zbyt wiele rzeczy. (SRP rulez!) Wczytywanie konfigu, łączenie się z bazą danych, walidacja, generowanie widoku - to tematy na co najmniej 4 kolejne klasy.

No i te komentarze należało by zmienić na normalne DockBlocki.
komentarz 29 stycznia 2017 przez niezalogowany
Czyli z tej klasy mam wyrzucić łączenie z bazą danych, wczytanie configu i widok tak ?
komentarz 29 stycznia 2017 przez writen Nałogowiec (29,060 p.)
No, tak.
komentarz 30 stycznia 2017 przez niezalogowany

DockBlocki znasz jakiś tutorial PL do tego ? Obecnie pracuje z dokumentacji i idzie mi chyba całkiem dobrze ale chciałbym to jeszcze podbudować czymś w ojczystym języku :)

komentarz 30 stycznia 2017 przez writen Nałogowiec (29,060 p.)

Nie znam żadnych polskich materiałów.

Wpisz sobie google PHPDoc.

Podobne pytania

0 głosów
1 odpowiedź 182 wizyt
pytanie zadane 14 maja 2019 w PHP przez mi-20 Stary wyjadacz (13,190 p.)
0 głosów
0 odpowiedzi 296 wizyt
pytanie zadane 3 czerwca 2018 w PHP przez karol928 Początkujący (320 p.)
0 głosów
1 odpowiedź 155 wizyt
pytanie zadane 4 grudnia 2019 w PHP przez chmieluziomal Początkujący (450 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...