0

我想从同一个 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();

wheregetconn()返回与 . 的数据库连接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".

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

4

3 回答 3

5
$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();
于 2013-05-23T08:44:31.827 回答
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(); 
于 2013-05-23T08:44:11.873 回答
-1

在进行第二次数据库调用之前,调用clearStoredResults($conn)如下定义的 PHP 函数($conn调用得到的 MySQLi 数据库链接在哪里new mysqli(...);):

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

我发现这可以进行连续调用。

于 2013-09-10T09:03:30.980 回答