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