2017-09-10 41 views
0

在下面的php代碼中,準備語句會故意導致錯誤,以測試bind_param並執行,添加$ bikes。準備好的語句和bind_param錯誤處理

在execute函數中返回錯誤信息;但是,在bind_param中,雖然發生錯誤,但它不返回任何錯誤信息。

如何獲取bind_param中的錯誤信息?

$sqlQuery = "INSERT INTO the_cars (cars) VALUES (?)"; 

if($statement = $con->prepare($sqlQuery)){ 

    if(!$statement->bind_param("s", $cars, $bikes)){ //bikes should not be here 
     $errors = $statement->error; //error is empty 
    }; 

    if(!$statement->execute()){ 
     $errors1 = $statement->error; // error: No data supplied for parameters in prepared statement 
    }; 

}else{  
    $errors = $con->error; 
} 

編輯:

PHP手冊似乎表明,在bind_param錯誤的處理方式。 查看文本的以下部分:實施例#3 INSERT製備一次,多次執行»/ *準備語句,階段2​​:結合並執行*/

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

這似乎也位置主張在一些職位。例如:

MySQLi prepared statements error reporting

不過,我做了一些嘗試,我從來沒有能夠得到一個說法錯誤的描述中bind_param。

+0

我認爲你必須自己檢查一下。 – Sysix

回答

2

你不能得到一個錯誤(也沒有得到一個)出來的東西還沒有被執行,因此第二個條件語句不會拋出一個錯誤。您需要檢查執行是否成功,而不是針對bind_param()方法。

然後第三個(條件語句)在理論上理論上不會引發錯誤,因爲您的查詢中包含的內容在理論上將被視爲有效(查詢)語句。

您需要做的是從綁定中刪除if(!$statement)語句,但將保留在執行部分中。

然後您將收到一條錯誤消息。

if($statement = $con->prepare($sqlQuery))你的第一個條件語句是有效的,所以因爲它沒有被執行else它不會引發錯誤。

請教關於如何查詢上PHP.net以下參考手冊/檢查錯誤正確,也不要試圖重新創造什麼並不打算在第一時間拋出錯誤:

總之,錯誤處理的查詢(及其執行)來完成,而不是在綁定。

bind_param()請教手冊:

沒有提到或處理在該方法的錯誤的示例。

+0

謝謝弗雷德。由於我無法寫評論中的所有內容,所以我編輯了我的帖子。我的問題集中在bind_param上。一切都表明你的意見是正確的(我同意的觀點)。也就是說,雖然在執行語句錯誤被觸發之後執行bind_param時可能會失敗.Prepare返回連接錯誤並執行返回語句錯誤。 – josei

+0

不客氣@josei我很想知道,但爲什麼你想檢查綁定是否失敗。至於你在編輯https://stackoverflow.com/questions/2552545/mysqli-prepared-statements-error-reporting中包含的鏈接 - 這是正確的。您首先需要檢查兩個變量是否包含值,否則不要準備或嘗試綁定。我發佈的原始答案應該是你需要關注的內容,而不是綁定時不可能做的事情;它始終是變量的存在和正確的綁定參數,例如'i'或's'或其他。 –

+0

我同意。對我而言,我確信我應該在準備好的陳述中處理錯誤;即準備並執行。由於上述鏈接,我想知道是否有任何可能發生在bind_param中的特定錯誤,並且我看不清楚。這是我發佈的原因之一。您的意見有助於我更加確定處理準備報表錯誤的適當方式。再次感謝。 – josei