Trong khi pipodesign sửa lỗi trong chuỗi truy vấn $ và giảm bớt sự cố, giải pháp thực tế không được cung cấp liên quan đến lỗi Chuẩn nghiêm ngặt.
Tôi không đồng ý với lời khuyên của SirBT, thay đổi từ DO WHILE thành WHILE là không cần thiết.
Thông báo tiêu chuẩn nghiêm ngặt mà bạn nhận được khá thông tin. Chấp hành, sử dụng này:
do{} while(mysqli_more_results($db) && mysqli_next_result($db));
Sau đó, không có nhu cầu để bạn có thể viết một lối ra có điều kiện hoặc phá vỡ bên trong vòng lặp vì điều kiện thời gian sẽ phá vỡ các vòng lặp về sự xuất hiện đầu tiên của một lỗi. * lưu ý, câu lệnh if trước khi-do-while sẽ từ chối nhập vào vòng lặp nếu truy vấn đầu tiên có lỗi.
Trong ví dụ của bạn, bạn chỉ đang chạy truy vấn INSERT, do đó bạn sẽ không nhận được bất kỳ bộ kết quả nào để xử lý. Nếu bạn muốn đếm số hàng bạn đã thêm, hãy sử dụng mysqli_affected_rows().
Là một giải pháp hoàn chỉnh cho câu hỏi của bạn:
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";
Output:
// 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
MUỘN EDIT:
Kể từ khi những người mới đến mysqli đang vấp ngã trên cái này ost, tôi sẽ cung cấp một đoạn mã chung nhưng mạnh mẽ để xử lý các truy vấn có/không có bộ kết quả bằng cách sử dụng multi_query() và thêm một tính năng để hiển thị truy vấn nào trong mảng đang được xử lý ...
Classic "IF() {do {} while}" Cú pháp:
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
Sáng tạo lại bánh xe "KHI {}" Cú pháp (... cho những người không như bài kiểm tra vòng):
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
Vì vậy, một trong hai đoạn mã cho các truy vấn sau đây sẽ cung cấp sản lượng giống nhau:
Query mảng:
$queries[]="SELECT * FROM `TEST`";
$queries[]="INSERT INTO `TEST` (Col) VALUES ('string1'),('string2')";
$queries[]="SELECT * FROM `TEST`";
$queries[]="DELETE FROM `TEST` WHERE Col LIKE 'string%'";
Output:
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
Sửa đổi đoạn của tôi mỗi nhu cầu của bạn. Để lại một bình luận nếu bạn phát hiện ra một lỗi.
"Tôi đã cố gắng thêm và loại bỏ" Bạn đã cũng đã cố gắng để ... hhmmmm. idunno thêm một kiểm tra cho 'mysqli :: more_results()'? – PeeHaa
Đây là cảnh báo khá vô dụng. Về cơ bản nó yêu cầu bạn viết mã xấu hơn. Lý do đằng sau cảnh báo này là gì? – Calmarius