Без SELECT: невозможно выполнить запросы, пока активны другие небуферизованные запросы (INSERT INTO / ANALYZE TABLE / BEGIN TRANSACTION) - PullRequest
0 голосов
/ 24 июня 2019

Я получил ошибку: Общая ошибка: 2014 Невозможно выполнить запросы, когда другие небуферизованные запросы активны.Рассмотрите возможность использования PDOStatement :: fetchAll ().В качестве альтернативы, если ваш код работает только с mysql, вы можете включить буферизацию запросов, установив атрибут PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY.Но:

  1. PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY включено
  2. Я не использую запрос pdo (), а только exec ().

Я думаю, что есть проблема с "ANALYZE TABLE".Возвращает набор результатов со строкой.Мне не нужна эта информация.Я не могу изменить порядок команд sql, потому что в действительности это разные партии, которые вызываются ночью заданием cron ...

Тестовый код:

pdo()->exec("TRUNCATE TABLE test;");
pdo()->exec("INSERT INTO test SELECT id FROM data");
//    pdo()->exec("INSERT INTO test VALUES (1)"); if only VALUES(..) is used no error thrown
pdo()->exec("ANALYZE TABLE test"); // this returns 1 row
pdo()->beginTransaction(); // here comes the exception!

Настройки соединения:

PDO::ATTR_EMULATE_PREPARES => 1
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => 1
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, lc_time_names = 'de_DE',sql_mode ='STRICT_ALL_TABLES,PIPES_AS_CONCAT', group_concat_max_len=1000000" ; 
PDO::MYSQL_ATTR_COMPRESS => 1

Мой фактический обходной путь:

$cmd = pdo()->query("ANALYZE TABLE test");
$cmd->closeCursor();
unset($cmd);

Есть ли неправильная конфигурация или это ошибка в 10.2.22-MariaDB-log или PHP версии 7.2.10

1 Ответ

0 голосов
/ 24 июня 2019

Я не использую запрос pdo (), только exec ().

Это именно ваша проблема. Mysql понятия не имеет, нужен ли вам результат или нет. Или, скорее, предполагается, что пока вы сделали запрос, результат его будет ждать вас. Следовательно, использование exec () для запроса, который возвращает любые данные, просто не имеет смысла, а также является точной причиной, по которой вы получаете ошибку.

...