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

Ocena skryptu PHP5 & OOP & PDO

VPS Starter Arubacloud
0 głosów
438 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ź 178 wizyt
pytanie zadane 14 maja 2019 w PHP przez mi-20 Stary wyjadacz (13,190 p.)
0 głosów
0 odpowiedzi 292 wizyt
pytanie zadane 3 czerwca 2018 w PHP przez karol928 Początkujący (320 p.)
0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 4 grudnia 2019 w PHP przez chmieluziomal Początkujący (450 p.)

92,417 zapytań

141,222 odpowiedzi

318,985 komentarzy

61,831 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...