@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 «отпустить» соединение?
  • Вопрос задан
  • 3326 просмотров
Решения вопроса 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()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы