2013-02-05 60 views
5

我試過使用multi_query,但我不斷收到一個嚴格的標準消息彈出。嚴格的標準:mysqli_next_result()錯誤與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"; 

該錯誤消息我得到的是:

嚴格標準:mysqli_next_result():沒有一個結果集。請撥打mysqli_more_results()/ mysqli的:: more_results()來檢查是否調用這個函數/方法

我試着添加和刪除-;,但沒有運氣。

+2

「我試着添加和刪除」 你也試着... hhmmmm。 idunno添加一個檢查'mysqli :: more_results()'? – PeeHaa

+0

這幾乎是無用的警告。基本上它會要求你寫更醜陋的代碼。這個警告背後的原因是什麼? – Calmarius

回答

19

雖然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 

按您的需要修改我的片段。如果發現錯誤,請留下評論。

1

你得到這個警告的原因,僅僅是因爲你使用了一個do ... while循環,它在運行命令塊後評估條件。因此,當沒有更多結果時,循環的內容會再運行一次,產生該警告。

使用while ($mysql->next_result()) ... do循環應該解決這個問題。 (一般說明:使用後測循環與你一樣在數據庫編程中很少見)

如果代碼是詩歌,我想成爲莎士比亞!

0

(發表回覆代表OP)

解決:

$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";