# 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`.