8

私はそれを理解したいですmysqli_store_result実際には何をしますか? のPHPマニュアルにアクセスしたmysqli_store_resultところ、定義が見つかりました

mysqli_store_result — Transfers a result set from the last query

問題は、結果セットをどこに転送するかです。実際には"Commands out of sync; you can't run this command now"実行後にエラーが発生していましmysqli_multi_queryたが、次の方法を使用するとエラーがなくなりました。

 mysqli_multi_query($connection,$query);

do
{
    mysqli_store_result($connection);
}
while(mysqli_next_result($connection));

さて、私はこれを使用する必要がmysqli_store_result($connection)ありmysqli_next_result($connection)ますmysqli_querymysqli_multi_query?

「mysqli_free_result() 関数を使用してクエリの結果によって使用されるメモリを解放することは常に良い習慣ですが、mysqli_store_result() を使用して大きな結果セットを転送する場合、これは特に重要になります。」

ソース: PHP: mysqli_store_result

もう1つの質問が発生します上記を実行すると、次のようなmysqli_multi_query($connection,$query);ステートメントが表示されecho 'storing result <br />'ます

do
{
    echo 'storing result <br />
    mysqli_store_result($connection);
}
while(mysqli_next_result($connection));

$query には 2 つの INSERT クエリしかありませんでしたが、次の出力が得られました

storing result
storing result
storing result
storing result

これは、転送された結果セットが 4 つあったことを意味します。この状況が理解できません。最後の質問です。上記のdo whileプロセスはパフォーマンスに影響しますか?

4

2 に答える 2

7

以前のコメントでは、mysqli_store_result()は INSERT ステートメントでは使用しないと述べられていましたが、実際に適切な関数については誰も言及していませんでした: mysqli_affected_rows(). ステートメントがレコード セットを返し、それを数値的にチェックする場合は、 を使用しますmysqli_num_rows()

混合物を扱う場合、これで始めることができます:

$queries[] = "INSERT INTO TestTable (Column1) VALUES ('TEST1')";
$queries[] = "SELECT * FROM TestTable WHERE Column1 LIKE 'TEST%'";
$queries[] = "INSERT INTO TestTable (Column1) VALUES ('TEST2')";
$queries[] = "SELECT * FROM TestTable WHERE Column1 LIKE 'TEST%'";
$queries[] = "DELETE FROM TestTable WHERE Column1 LIKE 'TEST%'";

if(mysqli_multi_query($con, implode(';', $queries))){
    do{
        if($result = mysqli_store_result($con)){
            echo "Selected rows = " . mysqli_num_rows($result) . "<br><br>";
            mysqli_free_result($result);
        }else{
            $cumulative_rows += $aff_rows = mysqli_affected_rows($con);
            echo "Current Query's Affected Rows = $aff_rows, Cumulative Rows = $cumulative_rows<br><br>";
        }
    } while(mysqli_more_results($con) && mysqli_next_result($con));
}

出力:

Current Query's Affected Rows = 1, Cumulative Affected Rows = 1

Selected rows = 1

Current Query's Affected Rows = 1, Cumulative Affected Rows = 2

Selected rows = 2

Current Query's Affected Rows = 2, Cumulative Affected Rows = 4 

データベースクエリのトピックに不慣れな人への重要な注意:ユーザー提供/外部ソース/信頼できないデータを使用している場合は、セキュリティ/安定性のためにプレースホルダーを含む準備済みステートメントを使用する必要があります(これにmysqli_multi_query()は同意しません)。を使用するmysqli_multi_query()と、クエリのバッチを送信するクールで簡潔な方法のように思えますが、安全な方法で一度に 1 つずつクエリを送信するよりも、この関数を使用する説得力のある理由/シナリオは多くありません。

于 2014-03-17T21:25:31.377 に答える
0

実際には、MySQL から結果セット全体をフェッチします。その後、mysqli_data_seek() を使用して、セット内の特定の行に移動できます。つまり、最初の呼び出しの後にすべての結果が php 側に保存され、その後の呼び出しでは php からの結果が要求されるだけです。

于 2013-05-03T09:23:19.403 に答える