# Подключения и управление подключениями

Для установки соединений создают экземпляры базового класса — PDO. Неважно, через какой драйвер разработчик взаимодействует с базой данных; объекты подключения создают по имени класса PDO, независимо от драйвера. Конструктор класса принимает аргументы, которые определят источник базы данных (англ. Data Source Name, DSN) и необязательные имя пользователя и пароль, если передали.

Пример #1 Подключение к БД MySQL

    <?php

    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

    ?>

Модуль выбросит исключение `PDOException`, если при подключении возникнут ошибки. Исключение перехватывают и обрабатывают, или оставляют глобальному обработчику исключений приложения, который установили функцией set_exception_handler().

Пример #2 Пример обработки ошибок подключения

    <?php

    try {
        $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    } catch (PDOException $e) {
        // Например, через какое-то время повторить попытку соединения
    }

    ?>

Внимание

Как и остальные исключения, исключение PDOException перехватывают явно — через блок `catch` или неявно — функцией set_exception_handler(). По умолчанию непойманное исключение преобразуется в фатальную ошибку уровня `E_FATAL_ERROR`. Фатальная ошибка будет содержать стек вызовов, из-за которой появляется риск утечки информации о соединении. Поэтому на сервере, который работает в производственной среде, в файле php.ini для опции `display_errors` устанавливают значение `0`.

После успешного подключения к базе данных экземпляр класса PDO возвращается в скрипт. Соединение остаётся активным в течение жизни объекта PDO. Потребуется уничтожить объект, чтобы закрыть соединение. Объект уничтожают путём удаления ссылок на объект через присваивание значения `null` переменным, которые содержат объект. PHP автоматически закроет соединение по окончании работы скрипта, если не сделать этого явно.

> Замечание: Другие ссылки, которые по-прежнему указывают на экземпляр PDO, также потребуется удалить. Такие ссылки остаются в экземпляре PDOStatement или в других переменных, которые ссылаются на тот же экземпляр PDO. Ссылки удаляют путём присваивания значения `null` переменной, которая ссылается на объект PDOStatement.

Пример #3 Пример закрытия соединения

    <?php

    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

    // С этого места пользуемся соединением...
    $sth = $dbh->query('SELECT * FROM foo');

    // ...а здесь соединение больше не требуется; закрываем его
    $sth = null;
    $dbh = null;

    ?>

Установка постоянных соединений с серверами баз данных часто приносит пользу приложениям. Постоянные соединения не закрываются при завершении работы скрипта, кешируются и переиспользуются, когда другой скрипт запрашивает соединение с теми же учётными данными. С постоянными соединениями не требуется создавать новые подключения при каждом обмене данными с базой, что увеличивает скорость работы таких приложений.

Пример #4 Постоянные соединения

    <?php

    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
        PDO::ATTR_PERSISTENT => true
    ));

    ?>

Значение параметра `PDO::ATTR_PERSISTENT` преобразовывается в логическое значение (bool): включить или выключить постоянные подключения, если только это не числовая строка (string), которая разрешает использовать несколько пулов постоянных подключений. Это приносит пользу, когда разные соединения используют несовместимые настройки, например, разные значения режима буферизации `PDO::MYSQL_ATTR_USE_BUFFERED_QUERY`.

> Замечание:

> Постоянные соединения включают путём добавления константы `PDO::ATTR_PERSISTENT` в массив параметров драйвера, которые передают конструктору класса PDO. Драйвер не будет использовать постоянные соединения, если установить этот атрибут методом PDO::setAttribute() после создания объекта.

Внимание

Модуль PDO не выполняет очистку постоянных подключений. Временные таблицы, блокировки, транзакции и другие изменения состояния могут оставаться от предыдущего использования подключения, вызывая непредвиденные проблемы. Дополнительные сведения смотрите в разделе Постоянные соединения с базами данных.

> Замечание:

> При взаимодействии с ODBC-драйвером модуля PDO и если ODBC-библиотеки поддерживают объединение подключений в пул по протоколу ODBC, как это делают unixODBC и Windows, и, возможно, другие системы, то вместо постоянных PDO-соединений рекомендуют оставлять кеширование соединений на уровне ODBC-пула. Пул соединений драйвера ODBC разделяет соединения с другими модулями в процессе; если PDO-объект попросят кешировать соединение, то такое соединение не вернётся в пул соединений драйвера ODBC, из-за чего драйвер создаст дополнительные подключения для обслуживания других модулей.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open