PDO.md 5.0 KB

PDO

PDO - PHP Data Objects, унифицированный слой (API) для доступа к разным СУБД. PDO является объектно-ориентированной библиотекой, которая содержит несколько классов для работы с СУБД:

  • PDO - Соединение с СУБД, которое позволяет выполнять запросы.
  • PDOStatement - Тот или иной результат работы запроса, например строки данных после выполнения SELECT.

Инициализация соединения.

Для доступа к СУБД нужны следующие параметры:

  • Хост. Современные СУБД зачастую являются сетевыми. Таким образом нужно знать адрес компьютера в сети.
  • Имя БД. Одновременно в СУБД может быть несколько баз данных.
  • Имя пользователя и Пароль.
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

Первым параметром конструктора PDO является так называемый DSN - строка, которая определяет тип СУБД, хост и имя базы. В зависимости от типа СУБД PDO подключает тот или иной драйвер СУБД и передает в него нужные настройки.

В случае успешного соединения (в противном случае происходит исключение PDOException) можно работать с данными в СУБД:

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    foreach($dbh->query('SELECT * from FOO') as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

http://pdo.asmer.php1.a-level.com.ua/init.php

Выше в коде показан один из способов выполнения запросов: использование метода query объекта класса PDO ($dbh, database handler) с текстом запроса. query возвращает объект класса PDOStatement, который можно итерировать.

Запрос и его подготовка.

Существует так же более безопасный и в определенных случаях более быстрый двухэтапный способ:

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=test2', "test2", "TeSt2");
    $sth = $dbh->prepare('INSERT INTO person SET name = :name, surname = :surname, father_name = :father_name'); 
    $sth->execute(array( ":name" => "Donald", ":surname" => "Trump", ":father_name" => "Moishovich"));
    foreach($dbh->query("SELECT * FROM person") as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

http://pdo.asmer.php1.a-level.com.ua/prepare.php

Как видно, данные не передаются в запрос не как часть строки запроса, а в последствии в качестве ассоциативного массива. Несмотря на схожесть с предыдущим способом, запрос действительно подготавливается СУБД, после чего он выполняется быстрее, так как ему только передаются данные. Ко всему прочему это сводит на нет возможность SQL инъекций через поля.

Задание.

Заполнить таблицы базы данных blog с помощью PDO::prepare.

Практикум: NoPMA

Сделать простую одностраничную SQL-консоль, нечто среднее между mysql в консоли и PHPMyAdmin:

  1. Спросить логин, пароль и СУБД в форме. Проверить с помощью PDOException, если удачно, сохраняем в сессию.
  2. Если в сессии уже есть логин, пароль и СУБД, то показываем textarea для запроса.
  3. По отправке формы с полем ввода запроса передаем запрос в query, результат выводим в HTML-таблицу, если это выборка. Текст запроса должен сохранится в textarea над HTML таблицей. Под textarea выводится текст ошибки или количество записей, задействованных в запросе.
  4. Для шаблонизации используем twig.