PDO

06 Августа 2019 16:42

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 - Установка режима работы обработки ошибок.

  1. PDO::ERRMODE_SILENT - (значение по умолчанию) PDO просто предоставит вам код ошибки.
  2. PDO::ERRMODE_WARNING - Помимо установки кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может быть полезно при отладке или тестировании, когда нужно видеть, что произошло, но не нужно прерывать работу приложения.
  3. PDO::ERRMODE_EXCEPTION - Будет выброшено исключение.

Пример обработки исключения:

try {
    $dbh = new PDO($dsn, $user, $password, $params);
} catch (PDOException $e) {
    echo 'Подключение не удалось: ' . $e->getMessage();
}

PDO::ATTR_DEFAULT_FETCH_MODE - Режим получения данных.

  1. PDO::FETCH_ASSOC - получение данных в виде ассоциативного массива. Очень удобно, чтобы не писать все время $row = $stmt->fetch(PDO::FETCH_ASSOC);, а просто $row = $stmt->fetch();

PDO::ATTR_EMULATE_PREPARES

  1. true - За обработку подготовленных выражений будет отвечать сам PDO. В базу данных передастся чистый запрос с уже подставленными и корректно экранированными данными.
  2. 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";
}