Klasa obsługi bazy danych
W tym tutorialu opiszę jak zrobić własną klasę obsługi bazy danych. Dzięki temu będziemy mogli np. policzyć ilość zapytań czy odpowiednio je filtrować.
Na początek stworzymy sobie klasę o nazwie Sql i zapiszemy do pliku sql.class.php. Przy okazji stworzymy dwie zmienne publiczne $result (przechowywanie wyników) oraz $queries (ilość zapytań).
<?php
class Sql {
public $result = array();
public $queries = 0;
// tutaj dodajemy funkcje
}
?>Na początek stworzymy sobie dwie funkcje: połączenie i rozłączenie, które umieścimy w konstruktorze i destruktorze.
function __construct($dbhost, $dbuser, $dbpass, $dbname) {
$connection = @mysql_connect($dbhost, $dbuser, $dbpass);
$database = @mysql_select_db($dbname);
if (!$connection) {
die('<h2>ERROR</h2> MySQL Server is not responding');
} elseif (!$database) {
die('<h2>ERROR</h2> Cannot connect to specified database');
} else {
return true;
}
}Funkcja jest bardzo prosta, jeśli wystąpi jakiś błąd to wyświetlamy komunikat - w przeciwnym wypadku zwracamy prawdę (true). Funkcja na rozłączanie jest jeszcze prostsza:
function __destruct() {
@mysql_close();
}Teraz czas na najważniejszą funkcje - zapytanie:
function query($query) {
$this->result = mysql_query($query);// 1
$this->queries++;// 2
if ($this->result) // 3
return $this->result;
else // 4
echo '<b>MYSQL ERROR:<br />' . mysql_errno() . "</b>: " .
mysql_error() . '<br /><br />' . "n";
}- Tworzymy funkcję query z parametrem $query (treść zapytania). Zapisujemy wyniki zapytania do $this->result
- Zwiększamy liczbę zapytań o 1.
- Jeśli wszystko ok to zwracamy wyniki.
- Jeśli coś nie tak to wyświetlamy treść błędu.
Teraz 3 proste funkcje:
fetch_array - zwracanie wyników w tablicy asocjacyjnej i numerycznej
fetch_assoc - zwracanie wyników w tablicy asocjacyjnej
num_rows - ilość wyników
function fetch_array() {
return mysql_fetch_array($this->result);
}
function fetch_assoc() {
return mysql_fetch_assoc($this->result);
}
function num_rows() {
return mysql_num_rows($this->result);
}Dobra, najważniejsze funkcje już mamy - teraz czas na jakieś dodatki. Ułatwimy sobie pracę tworząc funkcje do:
- dodawania rekordów,
- aktualizowania,
- usuwania.
function insert($table, $values) {
$keys = implode("`, `", array_keys($values)); // 1
$values = implode("', '", array_values($values)); // 2
$this->query("INSERT INTO `$table` (`$keys`) VALUES ('$values')"); // 3
}Jako parametry funkcji przyjmujemy nazwę tabeli oraz klucze i wartości rekordów jako tablicę.
- Przerabiamy klucze tablicy (nazwy pól) na ciąg tekstowy dodając między nimi ', '
- To samo co wyżej tylko dla wartości.
- Tworzymy i wykonujemy zapytanie.
function update($table, $values, $where) {
$fields = Array(); // 1
foreach($values as $key => $value) { // 2
$fields[] = "`$key` = '$value'";
}
$fields = implode(', ', $fields); // 3
$this->query("UPDATE `$table` SET $fields WHERE $where"); // 4
}Funkcja "update" jest podobna do "insert" tylko tutaj dochodzi kolejny parametr "$where" czyli "gdzie" - np. id = '5'
- Tworzymy zmienną $fields jako pustą tablicę.
- W pętli dla zmiennej $values (nazwy i wartości rekordów) dodajemy do zmiennej $fields kolejne wartości. Trzeba tak zrobić ponieważ struktura zapytania "UPDATE" wygląda tak:
UPDATE
tabelaSET pole = 'wartosc', innepole = 'inna wartosc' - Przerabiamy tablicę $fields na ciąg tekstowy dodając między wartościami przecinek.
- Tworzymy zapytanie i je wykonujemy. Ostatnią funkcją będzie usuwanie rekordu. Jest ona bardzo prosta więc obejdzie się bez komentarza ;)
function delete($table, $where) {
$this->query("DELETE FROM `$table` WHERE $where");
}No i to by było na tyle :) Teraz w łatwością można wykonywać zapytania SQL. Oczywiście można to jeszcze rozbudować, ale to już sprawa każdego z was.
Jeszcze tylko pokażę jakiś przykład.
<?php
include 'sql.class.php'; // dołączamy plik z klasą
$sql = new Sql('host', 'user', 'haslo', 'baza'); // tworzymy nowy obiekt Sql i łączymy się z bazą danych
$sql->insert('tabela', Array('cos1' => 'cos1_value', 'cos2' => 'cos2_value', 'cos3' => 'cos3_value')); // dodajemy jakieś dane
$sql->update('tabela', Array('cos1' => 'cos1_value', 'cos2' => 'cos2_value', 'cos3' => 'cos3_value'), "id = '5'"); // aktualizujemy coś
$sql->query("SELECT * FROM tabela ORDER BY id ASC"); // wykonujemy zapytanie SELECT
while($row = $sql->fetch_array()) { // wyświetlamy wyniki w pętli
print_r($row);
}
echo 'Zapytan sql: '.$sql->queries; // ilość zapytań (powinno wyświetlić 3)
// nie trzeba się rozłączać z bazą danych, zrobi to za nas destruktor
?>UPDATE1: zmieniłem żeby używało konstruktora i destruktora.