Na samym początku wypada się przywitać co też czynię, jako że jestem świeżo po rejestracji na forum. Mam też nadzieję, że nie umknął mi żaden punkt regulaminu i na starcie nie popełniłem jakiegoś "wykroczenia" zamieszczając pierwszy post.
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) {
echo "Nieudana próba połączenia: " . $e->getMessage(); }
$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();
}
unSet($checkIfTableExists);
$select = $this->db->prepare("SELECT Hits FROM licznik");
$select->execute();
$result = $select->fetch(PDO::FETCH_ASSOC);
if (isSet($_COOKIE['visited'])) { $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");
echo "Liczba odwiedzin: " . $licznik->getCounter();
Ten post edytował gregherb 28.05.2011, 21:57:20