PDO (Php Data Objects) - это расширение для PHP, предоставляющее разработчку интерфейс для взаимодействия с базами данных. Как ясно из документации, PDO может работать с любой базой данных.
Подключение к базе данных:
$host = 'localhost';
$db = 'database';
$user = 'root';
$pass = '123';
$charset = 'utf8';
$dsn = 'mysql:host=' . $host . ';dbname=' . $db . ';charset=' . $charset;
$params= [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $pass, $params);
При подключении с помощью PDO, такие вещи как хост, база данных и кодировка помещаются в виде строки в переменную $dsn и передаются первым параметром при создании объекта PDO, далее идут логин с паролем и массив параметров.
В документации нет конкретного раздела со списком всех параметров, но они встречаются в других разделах, например, Ошибки и их обработка, Транзакции и автоматическая фиксация изменений и др.
Параметры
PDO::ATTR_ERRMODE - Установка режима работы обработки ошибок.
PDO::ERRMODE_SILENT
- (значение по умолчанию) PDO просто предоставит вам код ошибки.PDO::ERRMODE_WARNING
- Помимо установки кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может быть полезно при отладке или тестировании, когда нужно видеть, что произошло, но не нужно прерывать работу приложения.PDO::ERRMODE_EXCEPTION
- Будет выброшено исключение.
Пример обработки исключения:
try {
$dbh = new PDO($dsn, $user, $password, $params);
} catch (PDOException $e) {
echo 'Подключение не удалось: ' . $e->getMessage();
}
PDO::ATTR_DEFAULT_FETCH_MODE - Режим получения данных.
PDO::FETCH_ASSOC
- получение данных в виде ассоциативного массива. Очень удобно, чтобы не писать все время $row = $stmt->fetch(PDO::FETCH_ASSOC);, а просто $row = $stmt->fetch();
PDO::ATTR_EMULATE_PREPARES
true
- За обработку подготовленных выражений будет отвечать сам PDO. В базу данных передастся чистый запрос с уже подставленными и корректно экранированными данными.false
- Использует штатный механизм СУБД для подготовки запроса и затем отдельным обращением передаёт данные для этого запроса.
Данный параметр со значением true позволяет использовать сразу несколько запросов подряд.
Запросы
$stmt = $pdo->query('SELECT name FROM users');
while ($row = $stmt->fetch())
{
echo $row['name'] . "\n";
}
Подготовленные запросы
Если в запрос передаётся хотя бы одна переменная, то этот запрос в обязательном порядке должен выполняться только через подготовленные выражения. Это обычный SQL запрос, в котором вместо переменной ставится специальный плейсхолдер. PDO поддерживает позиционные плейсхолдеры (?)
, для которых важен порядок передаваемых переменных, и именованные (:name)
, для которых порядок не важен. Примеры:
$sql = 'SELECT name FROM users WHERE email = ?';
$sql = 'SELECT name FROM users WHERE email = :email';
Чтобы выполнить такой запрос, сначала его надо подготовить с помощью функции prepare()
. Она также возвращает PDO statement, но ещё без данных. Чтобы их получить, надо исполнить этот запрос, предварительно передав в него переменные. Передать можно двумя способами:
Чаще всего можно просто выполнить метод execute()
, передав ему массив с переменными:
$stmt = $pdo->prepare('SELECT name FROM users WHERE email = ?');
$stmt->execute(array($email));
$stmt = $pdo->prepare('SELECT name FROM users WHERE email = :email');
$stmt->execute(array('email' => $email));
Далее можно использовать данные в обычном порядке, например:
foreach ($stmt as $row)
{
echo $row['name'] . "\n";
}