Beispiele für die Verwendung von PDO
Einrichten der Verbindung zu MySQL:
try { $db = new PDO('mysql:host=localhost;dbname=testdb', $login, $passwd); } catch (PDOException $e) { echo $e->getMessage(); } // закрытия соединения и освобождение ресурсов $db = NULL;
Verbindung unter Berücksichtigung der Codierung:
$db = new PDO('mysql:host=xxxx.ua;dbname=xxxx', $this->login, $this->passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
PDO bietet zwei Möglichkeiten, eine Abfrage auszuführen:
- Vorbereitung von Variablen – empfohlen für Geschwindigkeit && Sicherheit
- direkte Ausführung
Abfragen, die Informationen ändern, werden über die Methode exec() ausgeführt:
$db->exec(“INSERT INTO users (login) VALUES(‘john’)”); $id = $db->lastInsertId(); $db->exec(“UPDATE user SET login=‘alex’”)
Die Methode exec gibt einen Wert zurück – die Anzahl der betroffenen Zeilen, oder FALSE im Fehlerfall.
Abfragen, die Informationen abrufen, werden über die Methode query() ausgeführt:
$res = $db->query(“SELECT * FROM users”);
Der Rückgabewert ist FALSE im Fehlerfall.
Escaping von Sonderzeichen (Escaping von Werten): $db->quote($_POST[‘login’])
Mögliche Arten der Datenabfrage:
- Array (numerischer oder assoziativer Index)
- Zeichenkette (für eine Spalte)
- Objekte
- Callback-Funktion
- Lazy Loading (faule Abfrage)
- Lazy Loading (faule Abfrage)
- Iteratoren
Abfrage als Array:
$res = $db->query(“SELECT * FROM users”); while ($row = $res->fetch(PDO::FETCH_NUM)){ // $row - массив с числовыми ключами } $res = $db->query(“SELECT * FROM users”); while ($row = $res->fetch(PDO::FETCH_ASSOC)){ // $row - ассоциативный массив значений, ключи - названия столбцов } $res = $db->query(“SELECT * FROM users”); while ($row = $res->fetch(PDO::FETCH_BOTH)){ // $row - числовой и ассоиативный массив }
Abfrage einer einzelnen Spalte:
$column = $db->query(“SELECT id FROM users WHERE login=‘login’ AND password=‘password’”); $user = $column->fetchColumn())
Abfrage als Objekt:
$res = $db->query(“SELECT * FROM users”); while ($obj = $res->fetch(PDO::FETCH_OBJ)) { // $obj - экземпляр объекта stdClass, имена столбцов - свойства объекта }
Abfrage als Iterator (Iterator-Schnittstelle)
$res = $db->query(“SELECT * FROM users”, PDO::FETCH_ASSOC); foreach ($res as $row) { // $row - ассоциативный массив значений }
Lazy Loading – gibt das Ergebnis als Objekt zurück, aber die tatsächliche Befüllung des Objekts mit Werten erfolgt erst bei der ersten Zugriffsoperation auf dieses Feld:
$res = $db->query(“SELECT * FROM users”, PDO::FETCH_LAZY); foreach ($res as $row) { echo $row[‘name’]; // получение значения }
Abrufen aller Abfrageergebnisse auf einmal:
$qry = “SELECT * FROM users”; $res = $db->query($qry)->fetchAll(PDO::FETCH_ASSOC); // $res - массив всей выборки, каждая строка представлена ассоциативным массивом
Verarbeitung des Abfrageergebnisses mit einer Callback-Funktion:
function add_salt($login,$passw) { … } $res = $db->query(“SELECT * FROM users”); $res->fetchAll(PDO::FETCH_FUNC, “add_salt”);
Möglichkeiten von Abfragen mit vorbereiteter Ausführung:
- wird einmal kompiliert, wird die erforderliche Anzahl von Malen ausgeführt
- klare Trennung zwischen Struktur und Eingabedaten (Verhinderung von SQL-Injection)
- schnellere Ausführung im Vergleich zu query()/exec(), sogar bei einmaliger Ausführung
Beispiel einer Abfrage:
$stmt = $db->prepare(“SELECT * FROM users WHERE id=?”); $stmt->execute(array($_GET[‘id’])); $stmt->fetch(PDO::FETCH_ASSOC);
Parameter für die Abfrage können als Namen angegeben und an Variablen gebunden werden:
$db->prepare('SELECT * FROM users WHERE name=:name AND email=:email'); $db->execute(array(':name'=>john,':email'=>'john@domain.com')); $result = $db->fetchAll(); print_r($result); $dbh->execute(array(':name'=>'alex',':email'=>'alex@domain.com')); print_r($result); // пример использования метода bindParam() try{ $sql = $db->prepare("INSERT INTO USERS(name,email) VALUES (:name,:email)"); $sql->bindParam(':name',$name); $sql->bindParam(':email',$email); // назначение значений и вставка новой строки $name='Joy'; $email='joy@domain.com'; $dbh->exec(); $name='debian'; $email='debian@domain.com'; $dbh->exec(); } catch(PDOException $e) { $dbh->rollBack(); echo 'Error : '.$e->getMessage(); }
Transaktionen. Fast alle PDO-Treiber können mit Transaktionen arbeiten:
$db->beginTransaction(); if ($db->exec($qry) === FALSE) { $db->rollback(); } $db->commit();
Abrufen von Metainformationen über die Abfrage – Anzahl der Spalten und Informationen zu allen Spalten:
$res = $db->query($qry); $ncols = $res->columnCount(); for ($i=0; $i < $ncols; $i++) { $meta_data = $res->getColumnMeta($i); }
Erweiterung der PDO-Funktionalität:
class DB extends PDO { function query($qry, $mode=NULL) { $res = parent::query($qry, $mode); if (!$res) { var_dump($qry, $this->errorInfo()); return null; } else { return $res; } } }
