我得到了错误: 常规错误:2014当其他无缓冲查询处于活动状态时,无法执行查询。考虑使用PDOStatement :: fetchAll()。另外,如果您的代码只打算针对mysql运行,则可以通过设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。 但是:
我认为“ 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
我实际的Workarround是:
$cmd = pdo()->query("ANALYZE TABLE test");
$cmd->closeCursor();
unset($cmd);
在10.2.22-MariaDB-log或PHP版本7.2.10中是否存在任何配置错误?
答案 0 :(得分:0)
我不使用pdo的query()而是exec()。
这正是您的问题。 Mysql不知道您是否需要结果。或更确切地说,它假设只要您提出请求,结果就会一直在等待您。因此,对返回任何数据的查询使用exec()毫无意义,这也是您收到错误的确切原因。