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()' 函数用于返回结果的事物,即SELECTs。对于其他一切应使用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 语句的主要内容,如果未能解决你的问题,请参考以下文章

PHP使用PDO进行事务处理

解析由 PDO 语句创建的 JSON 对象

PHP PDO rowCount 在 SELECT 语句上返回 -1

PHP PDO 语句可以接受表名或列名作为参数吗?

PDO、Mysql 和原生预处理语句

使用 PDO 从 php 页面将具有更多列的表单数据插入 mysql 数据库