PHP PDO - 关闭语句 - 不能创建超过 max_prepared_stmt_count 语句
Posted
技术标签:
【中文标题】PHP PDO - 关闭语句 - 不能创建超过 max_prepared_stmt_count 语句【英文标题】:PHP PDO - Close statement - Can't create more than max_prepared_stmt_count statements 【发布时间】:2017-01-09 05:20:51 【问题描述】:如何使用 PDO 关闭语句?如果我检查一般的 mysql 日志,我永远不会遇到关闭命令。 (command_type: 关闭 stmt)。
截至目前,MySQL 在其中一些查询之后抛出“Can't create more than max_prepared_stmt_count statements”。
一个奇怪的事情是 PDO 准备查询,即使没有任何准备。为什么不直接执行查询(command_type: Execute)?
片段
// Executes a SQL query and returns the PDO statement
$statement = $pdo->query(sprintf('CALL TEST_PROCEDURE(%s)', implode(',', $parameters)));
// Retrieve the result of the query
$result = current($statement->fetchAll(PDO::FETCH_OBJ));
$statement = null;
一般日志
select * from mysql.general_log where argument like "%call%" \G;
...
event_time: 2016-09-01 10:34:40
user_host: root[root] @ localhost [127.0.0.1]
thread_id: 4111
server_id: 0
command_type: Prepare
argument: CALL TEST_PROCEDURE(234,'989',1,'3353' ....)
*************************** 2. row ***************************
command_type: Execute
argument: CALL TEST_PROCEDURE(234,'989',1,'3353' ....)
【问题讨论】:
当没有使用 prepare() 方法时,PDO 不准备任何东西。我会说这是与 mysql 日志有关的东西 一些想法:确实,PDO 'query()' 函数用于返回结果的事物,即SELECT
s。对于其他一切应使用exec()
(executes an SQL statement in a single function call)。因此,当query()
函数用于“调用”时,必须将其转换为“exec()”语句。 PDO 或数据库引擎。为什么要获得准备好的陈述将需要更多搜索。
@RyanVincent MySQL 过程正在返回,因此是查询方法而不是执行。
@user634545 顺便问一下,你能试试用 exec() 代替 query() 吗?以防万一。
现在我很困惑。我认为 mysql 程序不能返回一个值,因为这就是函数的用途? Out parameters
可用于从过程中返回值。这是 PDO 的另一个独立问题...
【参考方案1】:
您可以通过调用$statement->closeCursor();
显式关闭连接
【讨论】:
我也尝试过 closeCursor,没有任何区别。$statement = null;
正在做同样的事情。您试图提高声誉的这个问题并不像您想象的那么愚蠢。
@YourCommonSense 哇,我开始想念您宝贵的 cmets。 :)以上是关于PHP PDO - 关闭语句 - 不能创建超过 max_prepared_stmt_count 语句的主要内容,如果未能解决你的问题,请参考以下文章