#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. Но вы используете этот объект для выполнения запросов, а результаты упаковываются в другой класс.
Итак, у вас в основном есть несколько классов с результатами вашего запроса, но только одно соединение с базой данных, которая выполняет запросы.