雖然pipodesign更正了$ querystring中的錯誤並緩解了問題,但沒有提供關於嚴格標準錯誤的實際解決方案。
我不同意SirBT的建議,從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
LATE編輯:
由於人們新的mysqli跨絆腳石這個p ost,我將提供一個通用而健壯的代碼片斷來處理使用multi_query()和/或不使用結果集的查詢,並添加一個功能來顯示正在處理數組中的哪個查詢。
經典的 「if(){DO {}雖然}」 語法:
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
重新發明輪子 「而{}」 語法(...對於那些誰不像後期測試循環):
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
按您的需要修改我的片段。如果發現錯誤,請留下評論。
「我試着添加和刪除」 你也試着... hhmmmm。 idunno添加一個檢查'mysqli :: more_results()'? – PeeHaa
這幾乎是無用的警告。基本上它會要求你寫更醜陋的代碼。這個警告背後的原因是什麼? – Calmarius