0

我有一些工作的 php/mysql,我现在正在迁移到存储过程。

一旦调用任何存储过程,后续的 CALL 和 SELECT 就会失败,并显示“命令不同步;您现在无法运行此命令”。

不是 SELECT 的现有存储过程可以正常工作。

function db_all ($query)
{
    log_sql_read ($query);
    $result = mysql_query ($query, db_connection ());

    if (!$result)
    {
        log_sql_error ($query);
        return Array ();
    }

    $rows = Array ();

    while ($row = mysql_fetch_assoc ($result))
        array_push ($rows, $row);

    mysql_free_result ($result);

    return $rows;
}

db_all ("SELECT 1 as `test`");
db_all ("SELECT 2 as `test`");
db_all ("CALL `$db`.`select_info`($id);"); // RETURNS CORRECT DATA
db_all ("CALL `$db`.`select_info`($id);"); // ERROR HERE
db_all ("SELECT 5 as `test`");             // ERROR HERE

由于未调用mysql_free_result,此错误在其他地方进行了解释,但我确实调用了它。那么有什么问题呢?

我看到了一些引用 mysqli 的解决方案。我现在需要一个非 mysqli解决方案。

4

1 回答 1

1

问题是在执行时,存储过程会给你两个结果集。一个带有实际结果集,另一个带有执行状态。并且您需要在进行另一个返回结果集的调用之前消耗两者。

mysqli_*您可以利用mysqli_multi_query, mysqli_store_result,mysqli_next_result来实现这一点。mysqli你可以在这里看到如何做到这一点。

在您的情况下,mysql_*您可以在完成获取结果后关闭连接。

function db_all ($query)
{
    $link = db_connection();     //Open connection

    log_sql_read ($query);
    $result = mysql_query ($query, $link);

    if (!$result)
    {
        log_sql_error ($query);
        return Array ();
    }

    $rows = Array ();

    while ($row = mysql_fetch_assoc ($result))
        array_push ($rows, $row);

    mysql_free_result ($result);
    mysql_close($link);          //Close the connection
    return $rows;
}
于 2013-03-16T19:07:50.090 回答