W tym poście zademonstruję własną klasę o nazwie Query, której mechanizm obsługuje podstawowe operacje języka SQL (INSERT, UPDATE, SELECT, DELETE). Korzystając z klasy użytkownik nie musi znać składni SQL’a. I to jest jej główna zaleta, jak również prostota w użyciu. Oczywiście kod klasy ma jedynie znaczenie dydaktyczne i nie rozwiązuje wszystkich problemów, np: relacji między tabelami. Aczkolwiek nic nie stoi na przeszkodzie abyś popracował nad jej uniwersalnością ;).
Ok, a teraz przejdźmy do praktyki i zobaczmy różnicę w zapisie kwerend. Dla porównania, standardowe zapytanie usuwające rekord z bazy przy użyciu PHP i MySQL wygląda tak:
1 2 |
$sql = "DELETE FROM users WHERE id='123'"; // usuwa rekord o id = 123 $result = mysql_query($sql); // wykonuje zapytanie |
To samo z użyciem klasy Query:
1 2 |
$sql = new Query("users",123); $sql->Remove(); |
Lepiej, co ? 😉 Więcej przykładów poniżej, ale wpierw skopiuj i zapisz kod całej klasy w pliku: class.Query.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
<?php # class.Query.php # e-spin.pl class Query { private $_id; private $_table_name; private $_dbpdo; private $_parameters = array(); public function __construct($table_name,$id = null) { try { global $pdo; $this->_dbpdo = $pdo; $this->_table_name = $table_name; $this->_id = $id; } catch(PDOException $error) { return $error->getMessage(); } } public function getTable() { return $this->_table_name; } public function getID() { return $this->_id; } public function setField($variable, $value = null) { $this->_parameters[$variable] = $value; } public function getField() { return $this->_parameters; } public function getInsertID() { return $this->_dbpdo->lastInsertId(); } # sql:INSERT public function Insert() { foreach ($this->getField() as $key=>$value) { $join_fields_name.= $key.','; $join_fields_value.= "'".$value."',"; } $join1 = rtrim($join_fields_name, ','); $join2 = rtrim($join_fields_value, ','); $add = $this->_dbpdo->exec("INSERT INTO ".$this->getTable()." (".$join1.") VALUES (".$join2.")"); if ($add > 0) { return true; } else { return false; } $add->closeCursor(); } # sql:UPDATE public function Update() { foreach ($this->getField() as $key=>$value) { $join_fields.= $key."='".$value."',"; } $join = rtrim($join_fields, ','); $update = $this->_dbpdo->exec("UPDATE ".$this->getTable()." SET ".$join." WHERE id='".$this->getID()."'"); if ($update > 0) { return true; } else { return false; } $update->closeCursor(); } # sql:SELECT public function Select() { foreach ($this->getField() as $key=>$value) { $join_fields.= $key.','; } $join = rtrim($join_fields, ','); $sel = $this->_dbpdo->query("SELECT ".$join." FROM ".$this->getTable()." WHERE id='".$this->getID()."'"); if ($sel > 0) { return $sel->fetch(); } else { return false; } $update->closeCursor(); } # sql:DELETE public function Remove() { $delete = $this->_dbpdo->exec("DELETE FROM ".$this->getTable()." WHERE id='".$this->getID()."'"); } public function RemoveCheck() { $array = $this->getID(); if ($array!='') { foreach($array as $value) { $this->_dbpdo->exec("DELETE FROM ".$this->getTable()." WHERE id='$value' LIMIT 1"); } } } public function Clear() { $clear = $this->_dbpdo->exec("DELETE FROM ".$this->getTable().""); } } ?> |
Aby użyć klasy będziemy potrzebować połączenia z bazą danych. W pliku connect.php tworzymy je za pomocą sterownika PDO:
1 2 3 4 5 6 7 8 9 |
/* connect.php */ try { $pdo = new PDO('mysql:host=localhost;dbname=baza', 'user', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $error) { echo $error->getMessage(); } |
Przykłady operacji SQL:
1. INSERT
1 2 3 4 5 6 7 8 9 10 11 12 13 |
require_once 'connect.php'; // dołączamy połączenie z bazą require_once 'class.Query.php'; // dołączamy klasę // tworzymy nowy obiekt klasy podając w nawiasie nazwę tabeli $insert = new Query("users"); // ustawiamy nazwy pól tabeli i wartości do zapisu $insert->setField("login","Tester"); $insert->setField("password",sha1(md5("hasło"))); $insert->setField("firstname","John"); $insert->setField("lastname","Doe"); $insert->Insert(); // wykonujemy instrukcje |
Aby pobrać id ostatniego INSERTa wystarczy skorzystać z metody $insert->getInsertID() 🙂
2. UPDATE
1 2 3 4 5 6 7 8 9 10 |
$id = 123; // id użytkownika # podajemy nazwę tabeli i id aktualizowanego rekordu $update = new Query("users",$id); $update->setField("login","Neo"); $update->setField("password",sha1(md5("nowe hasło"))); $update->setField("firstname","Jan"); $update->Update(); // metoda wykonuje UPDATE |
3. DELETE
1 2 |
$remove = new Query("users",123); # usuwamy rekord o id=123 $remove->Remove(); |
Możliwe jest również usunięcie grupy wybranych rekordów np:
1 2 3 4 5 6 7 8 |
/* np.: <input type="checkbox" name="id[]" value="1" /> <input type="checkbox" name="id[]" value="2" /> ... itd */ $delete = new Query("users",$_POST["id"]); // usuwamy rekordy z tablicy $_POST $delete->RemoveCheck(); |
Czyszczenie całej tabeli:
1 2 |
$clear = new Query("users"); $clear->Clear(); |
4. SELECT
1 2 3 4 5 6 7 8 9 10 11 |
$select = new Query("users",5); // pobranie danych użytkownika o id=5 // ustawiamy nazwy pól, które chcemy pobrać $select->setField("login"); $select->setField("firstname"); $select->setField("lastname"); $row = $select->Select(); // wyświetlamy dane echo $row["login"].' ('.$row["firstname"].' '.$row["lastname"].')'; |
I to wszystko w tym temacie. Do następnego! =>