11

multi_query を使用してみましたが、厳格な標準メッセージがポップアップし続けます。

$querystring = "INSERT INTO responses VALUES('1', '2', '3', '4'); INSERT INTO responses VALUES('1', '2', '3', '4')";

if (mysqli_multi_query($db, $querystring)) {
   do {
       if ($result = mysqli_store_result($db)) {
           //
       }
   } while (mysqli_next_result($db));
}
echo "end";

私が得るエラーメッセージは次のとおりです。

厳格な基準: mysqli_next_result(): 次の結果セットはありません。mysqli_more_results()/mysqli::more_results() を呼び出して、この関数/メソッドを呼び出すかどうかを確認してください

追加と削除を試みまし-;たが、うまくいきませんでした。

4

3 に答える 3

33

pipodesign は $querystring 内のエラーを修正して問題を軽減しましたが、Strict Standards エラーに関して実際の解決策は提供されませんでした。

DO WHILE から WHILE に変更する必要はありません。

あなたが受け取る厳格な基準のメッセージは、非常に有益です。従うには、これを使用します。

do{} while(mysqli_more_results($db) && mysqli_next_result($db));

次に、ループ内で条件付きの終了またはブレークを記述する必要はありません。これは、while 条件がエラーの最初の発生時にループをブレークするためです。*最初のクエリにエラーがある場合、do-while の前の if ステートメントはループへのエントリを拒否することに注意してください。

この例では、INSERT クエリのみを実行しているため、処理する結果セットを受け取ることはありません。追加した行数を数えたい場合は、mysqli_affected_rows() を使用します。

あなたの質問に対する完全な解決策として:

if(mysqli_multi_query($db,$querystring)){
    do{
        $cumulative_rows+=mysqli_affected_rows($db);
    } while(mysqli_more_results($db) && mysqli_next_result($db));
}
if($error_mess=mysqli_error($db)){echo "Error: $error_mess";}
echo "Cumulative Affected Rows: $cumulative_rows";

出力:

 // if no errors
Cumulative Affected Rows: 2

// if error on second query
Error: [something]
Cumulative Affected Rows: 1

// if error on first query
Error: [something]
Cumulative Affected Rows: 0

後期編集:

mysqli を初めて使用する人はこの投稿に出くわすので、multi_query() を使用して結果セットの有無にかかわらずクエリを処理する一般的で堅牢なスニペットを提供し、配列内のどのクエリが処理されているかを表示する機能を追加します...

従来の "IF(){DO{} WHILE}" 構文:

if(mysqli_multi_query($mysqli,implode(';',$queries))){
    do{
        echo "<br><br>",key($queries),": ",current($queries);  // display key:value @ pointer
        if($result=mysqli_store_result($mysqli)){   // if a result set
            while($rows=mysqli_fetch_assoc($result)){
                echo "<br>Col = {$rows["Col"]}";
            }
            mysqli_free_result($result);
        }
        echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs
    } while(next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli));
}
if($mysqli_error=mysqli_error($mysqli)){
    echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error";  // display array pointer key:value
}
//if you want to use the snippet again...
$mysqli_error=null; // clear variables
reset($queries); // reset pointer

再発明されたWheel "WHILE{}" 構文(...テスト後のループが嫌いな人向け):

while((isset($multi_query) && (next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli))) || (!isset($multi_query) && $multi_query=mysqli_multi_query($mysqli,implode(';',$queries)))){
    echo "<br><br>",key($queries),": ",current($queries);  // display array pointer key:value
    if($result=mysqli_store_result($mysqli)){
        while($rows=mysqli_fetch_assoc($result)){
            echo "<br>Col = {$rows["Col"]}";
        }
        mysqli_free_result($result);
    }
    echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs
}
if($mysqli_error=mysqli_error($mysqli)){
    echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error";  // display array pointer key:value
}
//if you want to use the snippet again...
$multi_query=$mysqli_error=null; // clear variables
reset($queries); // reset pointer

したがって、次のクエリを指定した場合、どちらのスニペットでも同じ出力が得られます。

クエリ配列:

$queries[]="SELECT * FROM `TEST`";
$queries[]="INSERT INTO `TEST` (Col) VALUES ('string1'),('string2')";
$queries[]="SELECT * FROM `TEST`";
$queries[]="DELETE FROM `TEST` WHERE Col LIKE 'string%'";

出力:

0: SELECT * FROM `TEST`
Rows = 0

1: INSERT INTO `TEST` (Col) VALUES ('string1'),('string2')
Rows = 2

2: SELECT * FROM `TEST`
Col = string1
Col = string2
Rows = 2

3: DELETE FROM `TEST` WHERE Col LIKE 'string%'
Rows = 2

必要に応じてスニペットを変更してください。バグを発見した場合はコメントを残してください。

于 2014-03-18T03:19:28.567 に答える
1

この警告が表示される理由は、コマンド ブロックの実行後に条件を評価するdo...ループを使用しているためです。whileそのため、結果がなくなると、ループの内容がもう一度実行され、その警告が生成されます。

while ($mysql->next_result())...ループを使用すると、doこれを修正できます。(一般的な注意事項:データベースプログラミングでは、あなたのようにポストテストループを使用することは非常にまれです)

コードが詩なら、私はシェイクスピアになろうとしています!

于 2013-09-24T15:05:25.387 に答える