2012-09-05 39 views
3

這裏就是我想:如何使用mysqli :: multi_query獲取錯誤消息?

if($mysqli->multi_query(file_get_contents('file_that_contains_a_bunch_of.sql'))) { 
    do { 
     $result = $mysqli->use_result(); 
     if($mysqli->errno === 0) { 
      echo $mysqli->affected_rows.' row(s) affected'.PHP_EOL; 
     } else { 
      die($mysqli->error); 
     } 
    } while($mysqli->next_result()); 
} 

但它早中止循環,不打印錯誤消息。我如何知道錯誤是什麼?

+0

你應該在你'模具()'調用會得到錯誤信息。 –

+0

@MikeBrant:這不是那個 - 那就是問題所在。 – mpen

+0

爲什麼不從exec使用mysql轉儲? – JvdBerg

回答

2

彼得刪除了他的答案,但它暗示了問題是什麼。我必須在循環之外進行錯誤檢查。

下面的一切,我需要寫

if($mysqli->errno) die($mysqli->error) 

,如果有對未來查詢的錯誤next_result函數返回false,所以它甚至不會進入循環體。

1

如果配置莫名其妙mysqli_report,查找字符串這樣

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 
在這種情況下

可能中止循環,每次你會嘗試這樣做

$mysqli->use_result(); 

,你將有如果沒有結果,例如,如果存在「設置」,「插入」,「更新」或「刪除」類型的查詢,則生成錯誤。

您是否找到了獲取錯誤信息的方式?

+1

這是幾年前,但是,我想是的。請參閱[我的答案](http://stackoverflow.com/a/12287843/65387) – mpen

+0

根據我的經驗,即使某些查詢失敗,「multi_query」也會返回true,這就是爲什麼 - 沒有一點檢查它可以消除「如果」的陳述。但是你可以添加一些東西:如果你使用「START TRANSACTION;」和「承諾」在你的SQL腳本中,你可以避免一些問題。我的意思是,默認情況下,PHP不會爲「multi_query」啓動事務。 –

+2

mysqli :: multi_query ONLY如果第一條語句失敗,則返回FALSE。從這裏http://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.multi-query.html –

0

使用此代碼,它工作得很好

while ($conn->more_results()){ 
    $conn->next_result(); 
    echo $conn->error; 
}