【发布时间】: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 的另一个独立问题...