A teraz do rzeczy:
Od dzisiaj studiuję rozszerzenie PDO. Napisałem prostą klasę licznika odwiedzin odpornego na odświeżanie strony. Dane licznika przechowywane są w bazie danych. Konstruktor klasy tworzy nową tabelę jeśli takowa nie istnieje. Więcej szczegółów w komentarzach do metod.
Proszę doświadczonych programistów o:
1. ocenę kodu;
2. wskazówki na co zwracać uwagę;
3. ocenę pod kątem bezpieczeństwa (czy takie wykorzystanie PDO utrudnia SQL Injection?)
4. co można zoptymalizować;
5. opinie czy takie wykorzystanie funkcji unset jest korzystne/dobre, czy też zbędne/złe?
6. Co sądzicie o PDO? Czy pod względem wygody/wydajności/bezpieczeństwa jest lepsze od innych metod? Co polecacie?
Każda konstruktywna krytyka jest mile widziana.
Oto kod:
class Counter { private $db; //obiekt bazy danych private $counter; //zmienna zawierająca wartość licznika //Funkcja inicjuje połączenie z bazą danych, wrazie potrzeby tworzy tabelę i ustawia wartość //licznika. Ponadto ustawia cookie o nazwie visited na wartość true i czas życia 3h. function __construct($dbName, $user, $password, $host="localhost", $dbType="mysql") { //w tym miejscu powinny znajdować się instrukcję obsługi pozostałych typów baz danych $dsn = "$dbType:dbname=$dbName;host=$host;"; try { $this->db = new PDO($dsn, $user, $password); } catch (PDOException $e) { } $checkIfTableExists = $this->db->prepare("SELECT * FROM licznik"); if(!$checkIfTableExists->execute()) { $create = $this->db->prepare("CREATE TABLE licznik(Hits INT)"); $create->execute(); $insert = $this->db->prepare("INSERT INTO licznik VALUES(0)"); $insert->execute(); } $select = $this->db->prepare("SELECT Hits FROM licznik"); $select->execute(); $result = $select->fetch(PDO::FETCH_ASSOC); $this->counter = $result['Hits']; } else { $this->counter = $result['Hits'] + 1; $update = $this->db->prepare("UPDATE licznik SET Hits=$this->counter"); $update->execute(); } } //Funkcja umożliwia ustawienie licznia na dowolną wartość. function setCounter($val) { $this->counter = $val; $update = $this->db->prepare("UPDATE licznik SET Hits=$val"); $update->execute(); } //Funckja zwraca wartość licznika. function getCounter() { return $this->counter; } //Funkcja ustawia wartość licznika na 0. function resetCounter() { $reset = $this->db->prepare("UPDATE licznik SET Hits=0"); $reset->execute(); $this->counter = 0; } //Destruktor klasy Counter. function __destruct() { } }
Sposób użycia:
$licznik = new Counter("nazwa_bazy", "user", "hasło", "host", "typ_bazy");