连续的MySQLi编写的语句不起作用

时间:2013-05-23 08:41:24

标签: php mysqli prepared-statement

我想从同一个PHP文件中连续调用MySQL存储例程(使用预处理语句),如下所示:

$conn = getconn();
$stmt = $conn->prepare("CALL GetUserLoginData(?);");
$stmt->bind_param("s", $username);
$stmt->execute();

// Process data here... until next stored routine call

$conn = getconn();
// var_dump($conn);
$stmt2 = $conn->prepare("CALL SetUserLoginTime(?);");
$stmt2->bind_param("i", $userid);
$stmt2->execute();

其中getconn()返回与new mysqli()的数据库连接。

此代码适用于运行PHP 5.3.8-1 / MySQL 5.1.54的Web服务器,但在使用PHP 5.3.10 / 5.5.29的服务器上

如果我取消注释var_dump($conn),我会["error"]=> string(52) "Commands out of sync; you can't run this command now"

我无法弄清楚为什么只在一台服务器上发生这种情况。

3 个答案:

答案 0 :(得分:4)

$conn = getconn();
$stmt = $conn->prepare("CALL GetUserLoginData(?);");
$stmt->bind_param("s", $username);
$stmt->execute();

// Process data here... until next stored routine call

$conn = getconn();
// var_dump($conn);
$stmt2 = $conn->prepare("CALL SetUserLoginTime(?);");
$stmt2->bind_param("i", $userid);
$stmt2->execute();

因为预准备语句使用无缓冲的查询类型。您有两种选择:

1)执行后关闭查询

$conn = getconn();
$stmt = $conn->prepare("CALL GetUserLoginData(?);");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->close(); // Frees the buffer

2)使用free_results: http://php.net/manual/en/mysqli-result.free.php

不在您的问题中的情景:

有时关闭查询或释放结果不是一种选择。例如while循环...在这样的情况下,您应该使用:

store_result();

答案 1 :(得分:0)

尝试

$conn = getconn();
$stmt = $conn->prepare("CALL GetUserLoginData(?);");
$stmt->bind_param("s", $username);
$stmt->execute();

// Process data here... until next stored routine call

mysqli_free_result();
$conn = getconn();
// var_dump($conn);
$stmt2 = $conn->prepare("CALL SetUserLoginTime(?);");
$stmt2->bind_param("i", $userid);
$stmt2->execute(); 

答案 2 :(得分:-1)

在进行第二次数据库调用之前,按照下面的定义调用PHP函数clearStoredResults($conn)(其中$conn是通过调用new mysqli(...);获得的MySQLi数据库链接):

function clearStoredResults($mysqli_link) {
    while ($mysqli_link->next_result()) {
        if ($l_result = $mysqli_link->store_result()) {
            $l_result->free();
        }
    }
}

我发现这可以连续拨打电话。