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

問題は、ストアド プロシージャを実行すると、2 つの結果セットが返されることです。1 つは実際の結果セットで、もう 1 つは実行のステータスです。また、結果セットを返す別の呼び出しを行う前に、両方を消費する必要があります。

、、をmysqli_*利用してそれを達成できます。ここでその方法を確認できます。mysqli_multi_querymysqli_store_resultmysqli_next_resultmysqli

あなたの場合、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 に答える