2

我有一个包含以下几行的 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
));

我收到以下错误:

查询:插入timeentry( tenant_id, time_id, timestart, assig_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 时出现相同的错误。

任何帮助是极大的赞赏。

4

1 回答 1

2

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

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

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

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

于 2012-12-13T21:29:18.317 回答