Несколько экземпляров PDO в скрипте?

#php #mysql #pdo

#php #mysql #pdo

Вопрос:

У меня есть вопрос о наилучшей практике использования PDO. Я пытаюсь наконец перейти к объектно-ориентированной разработке и отказаться от привычек PHP, которые я разработал десять лет назад.

Мой обычный метод разработки состоял в том, чтобы открыть соединение с БД в начале скрипта / страницы, а затем выполнить несколько mysql_query вызовов по мере необходимости (в основном SELECT и INSERT ). Я впервые использую PDO, и, похоже, практика здесь заключается в создании отдельных объектов PDO для каждого запроса / транзакции. Похоже, что это создало бы несколько подключений к одной и той же базе данных во время строки, что кажется множеством ненужных накладных расходов.

Мое мнение об этом совершенно неверно?

Приношу свои извинения, если это где-то описано, что я пропустил. Я просмотрел StackOverflow, php.net и у меня есть книга по PHP 5.3.

Ответ №1:

Нет, в этом случае вам не следует создавать несколько экземпляров PDO. Просто создайте 1 экземпляр и используйте PDO::query() на нем. Например:

 $pdo = new PDO(...);

/* ... */

$pdo->query("SELECT * FROM table1");

/* ... */

$pdo->query("SELECT * FROM table2");

/* ... etc ... */
  

Если запрос содержит параметры, то предпочтите использовать PDO::prepare() и PDOStatement::execute() вместо PDO::query() . Вы можете найти пример в документации для PDO::prepare() .

Комментарии:

1. Ах, это имеет смысл. Спасибо! Что бы вы сказали, это лучший способ справиться с этим, насколько это возможно? Должен ли я сделать $pdo глобальной переменной или передавать ее в качестве аргумента каждому новому классу / функции, которым это может понадобиться?

2. @David Grenier, в общем, вам следует избегать глобальной области видимости.

Ответ №2:

Объект PDO хранит соединение, в котором выполняются запросы. Обычно вам нужен только один из них.

Хотя бывают случаи, когда 2 соединения могут быть удобными (например, при подключении к совершенно разным базам данных), обычно вам нужен только один экземпляр класса PDO.

У вас будет несколько экземпляров, это класс PDOStatement. В котором хранятся сами операторы запроса (а также результаты). Таким образом, для каждого запроса у вас будет один экземпляр PDOStatement.

Ответ №3:

да, вы изначально подключаетесь к базе данных, создавая экземпляр объекта PDO. Но вы используете этот объект для выполнения запросов, а результаты упаковываются в другой класс.

Итак, у вас в основном есть несколько классов с результатами вашего запроса, но только одно соединение с базой данных, которая выполняет запросы.