# PDO **PDO** - PHP Data Objects, унифицированный слой (**API**) для доступа к разным СУБД. **PDO** является объектно-ориентированной библиотекой, которая содержит несколько классов для работы с СУБД: - **PDO** - Соединение с СУБД, которое позволяет выполнять запросы. - **PDOStatement** - Тот или иной результат работы запроса, например строки данных после выполнения `SELECT`. ## Инициализация соединения. Для доступа к СУБД нужны следующие параметры: - **Хост**. Современные СУБД зачастую являются сетевыми. Таким образом нужно знать адрес компьютера в сети. - **Имя БД**. Одновременно в СУБД может быть несколько баз данных. - **Имя пользователя** и **Пароль**. ```php query('SELECT * from FOO') as $row) { print_r($row); } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "
"; die(); } ``` http://pdo.asmer.php1.a-level.com.ua/init.php Выше в коде показан один из способов выполнения запросов: использование метода `query` объекта класса PDO (`$dbh`, *database handler*) с текстом запроса. `query` возвращает объект класса `PDOStatement`, который можно итерировать. ## Запрос и его подготовка. Существует так же более безопасный и в определенных случаях более быстрый двухэтапный способ: ```php 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() . "
"; 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`.