@truezemez

PDO. exec + query = exception?

Код:

$db = new PDO($dsn, $user, $pass);<br>
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);<br>
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);<br><br>
$db->exec('select version()');<br>
$db->query('select version()');<br>


Бросает Exception:
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.




Совет из сообщения, как я понял, работает только для ситуаций с query или prepare. Как мне заставить exec «отпустить» соединение?
  • Вопрос задан
  • 3324 просмотра
Решения вопроса 1
weirdan
@weirdan
C exec по простому не получится, поскольку exec вызывает mysql_affected_rows() раньше, чем mysql_store_result() (см github.com/php/php-src/blob/master/ext/pdo_mysql/mysql_driver.c#L256), в то время как документация к libmysql говорит, что в случае, если предыдущий запрос был селектом и mysql_store_result() еще не была вызвана, результатом всегда будет -1 (признак ошибки). Таким образом со стороны сервера остается невычитанный резалтсет (что не дает работать последующим запросам), а mysql_handle_doer() выходит, не доходя до mysql_store_result().

Единственный очевидный способ — пересоздать соединение: $db = null; $db = new PDO(...), поскольку PDO не предоставляет метод disconnect()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 22:11
2000 руб./за проект
24 апр. 2024, в 22:00
500 руб./в час
24 апр. 2024, в 21:49
10000 руб./за проект