我想从同一个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"
。
我无法弄清楚为什么只在一台服务器上发生这种情况。
答案 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();
}
}
}
我发现这可以连续拨打电话。