PDO (PHP Data Objects) – to sterownik napisany w języku PHP, pozwalający komunikować się z różnymi bazami danych np: MySQL, PostgreSQL, SQL Server, Oracle itd. Zaleta jest oczywista. Twórca witryny może stworzyć elastyczny interfejs uruchamiany na różnych serwerach bez konieczności tworzenia nakładek. Poza tym PDO ma obiektową składnię i jest szybszy oraz bezpieczniejszy w porównaniu z innymi rozwiązaniami.
POŁĄCZENIE Z SERWERWM BAZY (new PDO)
1 2 3 4 5 6 7 8 |
try { $pdo = new PDO('mysql:host=localhost;dbname=nazwa bazy', 'user', 'password'); echo 'Udało się połączyć z serwerem bazy...'; } catch(PDOException $error) { echo 'Wystąpił błąd: '.$error->getMessage(); } |
Kod zawarty jest wewnątrz instrukcji obsługi wyjątków try catch. Na początku tworzony jest nowy obiekt klasy (new PDO). Do konstruktora przekazujemy parametry połączenia, w kolejności:
- rodzaj bazy (w powyższym przykładzie: mysql),
- host (np: host=localhost)
- nazwa bazy (dbname=nazwa bazy)
- login do bazy (user)
- hasło do bazy (password)
Opcjonalnie można ustawić PORT (jeśli jest wymagany):
1 |
$pdo = new PDO('mysql:host=localhost;dbname=nazwa bazy;port=3307', 'user', 'password'); |
KONFIGURACJA PARAMETRÓW PDO (setAttribute)
Za pomocą metody setAttribute możemy już na samym wejściu skonfigurować niektóre parametry pracy z PDO, np:
1 2 3 4 5 6 7 8 |
try { $pdo = new PDO('mysql:host=localhost;dbname=nazwa bazy', 'user', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $error) { echo 'Wystąpił błąd: '.$error->getMessage(); } |
Stałe PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ustawiają żądanie, aby wszelkie błędy zapytania raportowane były jako wyjątki.
ZAPYTANIE DO BAZY (query)
Kwerendy SQL wprowadzamy do metody query().
1 2 3 4 5 6 7 |
$sql = $pdo->query('SELECT * FROM users'); foreach($sql as $row) { echo $row['login'].'<br />'; } $sql->closeCursor(); |
Metoda query() zwraca obiekt wyników zapytania SQL. W pętli foreach pobieramy do tablicy asocjacyjnej wyniki i wyświetlamy je na stronie. Metoda closeCursor() zamyka zbiór wyników. Metoda ta jest wymagana, inaczej nie będzie można wysłać kolejnego zapytania.
WBUDOWANE ATRYBUTY PRZESTRZENI PDO
Za pomocą stałych atrybutów z przestrzeni PDO, można określić typ zwracanych danych w formie tablicy asocjacyjnej lub innej.
1 2 |
$sql = $pdo->query('SELECT * FROM users'); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); |
- PDO::FETCH_NUM – zwraca tablicę z numerami kolumn,
- PDO::FETCH_BOTH – zwraca tablicę z numerami i nazwami kolumn,
- PDO::FETCH_OBJ – zwraca obiekt z atrybutami kolumn,
- PDOStatement::fetch() – pobiera pojedynczy rekord z wyniku; może być używana wiele razy – każde wywołanie pobierze nowy rekord,
- PDOStatement::fetchAll() – pobiera wszystkie rekordy z wyniku,
- PDOStatement::fetchColumn() – pobiera wartość kolumny z wyniku; może być używana wiele razy – każde wywołanie pobierze nowy rekord.
MODYFIKOWANIE ZAWARTOŚCI BAZY DANYCH (exec)
Metoda exec() pozwala wykonać zapytania SQL niezwracające zbioru wyników, np: INSERT lub UPDATE.
1 2 3 4 5 6 7 8 9 |
// INSERT $add = $pdo->exec("INSERT INTO users ('login') VALUES ('tester')"); if ($add > 0) { echo 'Dodano rekord'; } $add->closeCursor(); //UPDATE $updt = $pdo->exec("UPDATE users SET login='neo' WHERE id='1'"); if ($updt > 0) { echo 'Zaktualizowano rekord'; } $updt->closeCursor(); |
BINDOWANIE (bindValue i prepare)
Bindowanie (podpinanie) – pozwala wysłać do bazy szkielet zapytania, do którego podpina się dane za pomocą metody bindValue($parametr, $wartość, $typ danych). Bindowanie zabezpiecza zapytania SQL przed atakami typu SQL Injection.
Przykład:
1 2 3 4 5 6 7 8 9 10 |
# wykorzystując metodę prepare() wysyłamy do bazy danych szkielet zapytania: $add = $pdo->prepare('INSERT INTO users (login,haslo) VALUES (:login,:haslo)'); # bindujemy: $add->bindValue(':login','test',PDO::PARAM_STR); $add->bindValue(':haslo','*****',PDO::PARAM_STR); # stała PDO::PARAM_STR określa typ danych typu tekstowego # np. dla liczby będzie: PDO::PARAM_INT $add->execute(); // wykonanie zapytania |
Za pomocą bindowania można z łatwością pobrać i wyświetlić rekordy z tabeli:
1 2 3 4 5 6 7 8 9 10 11 |
$sql = $pdo->prepare("SELECT * FROM users WHERE login=:user AND haslo=:password LIMIT 1"); $sql->bindValue(':user','tester',PDO::PARAM_STR); $sql->bindValue(':password','hasło',PDO::PARAM_STR); $sql->execute(); if ($row = $sql->fetch()) # metoda fetch() zwraca pojedynczy rekord { echo 'Witaj '.$row['login']; } else { echo 'Brak wyników.'; } |
Metoda rowCount() pozwala pobrać liczbę rekordów zapytania:
1 2 3 4 |
$sql = $dbh->prepare('SELECT * FROM users'); $sql->execute(); $count = $sql->rowCount(); echo 'Liczba rekordów: '.$count; |
Więcej informacji znajdziesz w manualu: php.net/manual/en/book.pdo.php