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";
    }
  1. Tworzymy funkcję query z parametrem $query (treść zapytania). Zapisujemy wyniki zapytania do $this->result
  2. Zwiększamy liczbę zapytań o 1.
  3. Jeśli wszystko ok to zwracamy wyniki.
  4. 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:

  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ę.

  1. Przerabiamy klucze tablicy (nazwy pól) na ciąg tekstowy dodając między nimi ', '
  2. To samo co wyżej tylko dla wartości.
  3. 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'

  1. Tworzymy zmienną $fields jako pustą tablicę.
  2. 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 tabela SET pole = 'wartosc', innepole = 'inna wartosc'
  3. Przerabiamy tablicę $fields na ciąg tekstowy dodając między wartościami przecinek.
  4. 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.