2013-02-05 33 views
5

Tôi đã thử sử dụng multi_query nhưng tôi tiếp tục nhận được thông báo Tiêu chuẩn nghiêm ngặt bật lên.Tiêu chuẩn nghiêm ngặt: lỗi mysqli_next_result() với mysqli_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"; 

Thông báo lỗi tôi nhận được là:

nghiêm ngặt tiêu chuẩn: mysqli_next_result(): Không có bộ kết quả tiếp theo. Vui lòng gọi mysqli_more_results()/mysqli :: more_results() để kiểm tra xem có gọi hàm/phương thức này

Tôi đã thử thêm và xóa -; nhưng không có may mắn.

+2

"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

+0

Đâ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

Trả lời

19

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.

1

Lý do bạn nhận được cảnh báo này, đơn giản chỉ vì bạn sử dụng vòng lặp do ... while để đánh giá điều kiện sau khi chạy khối lệnh. Vì vậy, khi không có kết quả nào khác, nội dung của vòng lặp được chạy thêm một lần nữa, cho biết cảnh báo đó.

Sử dụng vòng lặp while ($mysql->next_result()) ... do sẽ khắc phục điều này. (Lưu ý chung: Sử dụng các vòng hậu kiểm tra như bạn đã làm là khá phổ biến trong lập trình cơ sở dữ liệu)

Nếu mã là thơ, tôi đang cố trở thành Shakespeare!

0

(Đã đăng câu trả lời thay mặt cho OP).

quyết:

$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 (!mysqli_more_results($db)) { 
    exit(); 
    } 
} while (mysqli_next_result($db)); 
} 
echo "end"; 
Các vấn đề liên quan