Если вы используете exec()
для SELECT
, значит, вы уже делаете что-то не так. Эта функция (, как указано в руководстве ) не извлекает результаты из базы данных. Он может использоваться только для запросов, которые не дают набора результатов и не имеют ввода переменных. Если запрос дает результат, вам нужно получить этот результат из MySQL, используя то же соединение.
Постоянное соединение не может быть повторно использовано, если оно все еще используется. Это может произойти по многим причинам, одна из которых - несомненный результат. MySQL будет держать соединение открытым, ожидая, пока клиент выполнит некоторые действия с набором результатов. После того как результат полностью получен с сервера MySQL, он может принимать новые запросы.
Это проблема не только с постоянными соединениями, так как при использовании * 1009 может возникнуть проблема с невыполненным набором результатов. * один за другим с обычными соединениями.
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];
$pdo = new PDO("mysql:host=localhost;dbname=test;port=3307", "root", "", $options);
// The following will give:
// SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
var_dump($pdo->exec("SELECT 1"));
var_dump($pdo->exec("SELECT 1"));
PDOException: SQLSTATE [HY000]: общая ошибка: 2014 Не удается выполнить запросы, когда другие небуферизованные запросы активны. Рассмотрите возможность использования PDOStatement :: fetchAll (). В качестве альтернативы, если ваш код будет работать только с mysql, вы можете включить буферизацию запросов, установив атрибут PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY. в C: \ wamp64 \ www\test \ index. php в строке 16
Чтобы ответить на ваш вопрос из заголовка: Да. Существует разница между использованием exec()
и query()
при использовании постоянных соединений, но эта разница также существует, когда не используются постоянные соединения.
tl; dr: не использовать exec()
для запросов, которые дают результаты. Вместо этого используйте подготовленные заявления.