【问题标题】:MeekroDB error "Commands out of sync; you can't run this command now"MeekroDB 错误“命令不同步;您现在无法运行此命令”
【发布时间】:2012-12-01 20:41:53
【问题描述】:

我有一个包含以下几行的 PHP 脚本:

require_once 'meekrodb.2.1.class.php';
DB::$user = 'usr';
DB::$password = 'pwd';
DB::$dbName = 'db';
DB::$encoding = 'utf8';

$results = DB::queryFirstField("
    CALL getSequence('time_id', %i); // ***** Stored procedure call *****
", TENANT_ID);

DB::insert('timeentry', array(
    'tenant_id' => TENANT_ID,
    'time_id' => $results,
    'timestart' => DB::sqleval("now()"),
    'assig_id' => $assig_id
));

我收到以下错误:

查询:插入timeentrytenant_idtime_idtimestartassig_id)值(1、'42'、now()、'1')

错误:命令不同步;你现在不能运行这个命令

如果我用 SELECT 语句替换对存储过程的调用,一切正常。

$results = DB::queryFirstField("
    SELECT 45; // ***** SELECT statement *****
");

DB::insert('timeentry', array(
    'tenant_id' => TENANT_ID,
    'time_id' => $results,
    'timestart' => DB::sqleval("now()"),
    'assig_id' => $assig_id
));

我还没有分析 MeekroDB 库 (http://www.meekro.com) 的内部结构。

我尝试将每个语句包装在事务中,但在调用存储过程后立即执行 COMMIT 时出现相同的错误。

非常感谢任何帮助。

【问题讨论】:

    标签: php mysql meekro


    【解决方案1】:

    调用 MySQL 中的存储过程会产生多个结果集。也就是说,一个存储过程可能有多个 SELECT,因此客户端必须遍历多个结果集才能完成对 CALL 的处理。

    请参阅此问题答案中的示例:Retrieving Multiple Result sets with stored procedure in php/mysqli

    在 CALL 的所有结果完成之前,它不会被视为关闭,并且 MySQL 不允许您在当前查询完全完成之前运行另一个查询。

    我不太了解 MeekroDB 库,但看了一眼在线文档,我看不到任何迭代多个结果集的方法。所以可能没有任何方法可以安全地调用存储过程。具体支持建议联系作者:http://www.meekro.com/help.php

    【讨论】:

    • 感谢 Bill 的回答,我如何才能确定存储过程是否获得了一个或多个结果集。我已经在 MySQL 客户端中执行了它,但我只得到一个结果......这可能是一个 MeekroDB 错误。我已经联系了作者。我可以执行一个命令(在这个库之外)以关闭挂起的查询吗?
    • 我设法通过更改库来关闭连接。谢谢你的帮助。当然我希望能得到官方修复这个问题。
    • 即使给定的存储过程只返回一个结果集,调用它也会调用多查询接口。这可能只是 MeekroDB 开发人员没有预料到的 API 用法。是的,您可以关闭该语句,也可以调用while ($pdoStmt->nextRowset()) { } 强制它迭代到结果链的末尾。另见php.net/manual/en/pdostatement.nextrowset.php
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2012-07-19
    • 1970-01-01
    • 2013-12-27
    • 2019-07-04
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多