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".

なぜこれが1つのサーバーだけで起こっているのかわかりません。

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();

準備されたステートメントはバッファリングされていないクエリ タイプを使用するためです。次の 2 つのオプションがあります。

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 に答える