2017-10-13 102 views
0

以下是我在頁面上提交新表單提交的代碼。我一直在研究這一整天,並且聲明在bind_param上失敗。

$query = " INSERT INTO table 
            ( 
             AbandonedComments,           
             DetectorComments,           
             FireExComments,           
             PestComments,          
             SanitationComments 
            ) 
           VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?,           
             ?; 
            )"; 
       $stmt = $mysqli->prepare($query); 
       $stmt->bind_param("sssss", 
         $_POST['GeneralComment'], 
         $_POST['SmokeDetectorComment'], 
         $_POST['fireExComments'], 
         $_POST['PestComments'], 
         $_POST['SanitationComments'] 
       ); 
$stmt->execute(); 
$stmt->close(); 

我已經在try/catch,if/else中包裝了該部分,並且已經過測試以查看值是否經過。

  • 在try/catch語句沒趕上,但沒有成功或者
  • 的的if/else跑都不是。
  • 所有值都相應地通過。

我知道execute()可以錯誤檢查,因爲它返回一個布爾值,但我還沒有找到bind_param上的任何東西。

編輯:我發佈了這個帖子後,他指出了錯誤,並解釋說沒有錯誤檢查'bind_param',但'準備'和'執行'將返回布爾值,你可以在那裏檢查。

+1

_返回TRUE成功或FALSE失敗._ http://php.net/manual/en/mysqli-stmt.bind-param .php – AbraCadaver

+0

*「是否有錯誤檢查$ stmt-> bind_param的方法?」 - 我以前回答過這樣的問題,並且沒有辦法檢查'bind_param()'上的錯誤。我只需要找到它。 –

+0

也許別的東西失敗了,這是什麼?'; – AbraCadaver

回答

2

我認爲你有一個分號插入錯誤

VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?,           
             ?**;** 
            )" 
+1

好吧,但是.....有一個原因,它沒有拋出一個錯誤;你知道爲什麼嗎?我做。我希望你找到它並解釋它。 –

+1

這是正確的答案,我現在還不能接受。查詢起作用! – Liam

+0

@Liam爲什麼你在編輯中刪除了分號? https://stackoverflow.com/revisions/46736498/3這個答案不適用於現在存在的問題。編輯好停止編輯。 https://stackoverflow.com/revisions/46736498/3 –

4
VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?,           
             ?; <<< trailing semi-colon 

通知分號在那裏?

它沒有拋出錯誤的原因是因爲在PHP和其他語言中,被認爲是一個有效的字符,作爲「語句的結尾」,位於所有佔位符的末尾(請參閱編輯)。

參考:

如同在C或Perl,PHP要求指令,在每個語句的末尾分號結束。一段PHP代碼的結束標記自動包含分號;你不需要用分號來終止PHP塊的最後一行。塊的結束標記將包括緊接着的換行符(如果存在的話)。

您聲明查詢(綁定)失敗;它要麼失敗的原因,你沒有檢查真正的錯誤,或者它失敗了,可能會發生。

您也無法檢查綁定上的錯誤,您在查詢時檢查錯誤並報告錯誤,如果這也是PHP相關問題。

編輯:

然而,有您的查詢閱讀是這樣的:

VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?; <<< trailing semi-colon           
             ? 
            )"; 

...那麼這將是一個完全不同的球賽,因爲最後一個佔位符永遠不會被使用,並且語句停在第4個佔位符處。

你可以並且應該通過modifiying你現在$stmt->execute();聲明和使用!這是「沒有」操作,轉化爲類似「如果查詢沒有執行」使用條件語句:

if(!$stmt->execute()) { 
    echo "Error: " . mysqli_error($mysqli); 
}else{ 
    echo "Success"; 
} 
2

語法檢查在您撥打prepare()而不是bind_param()時完成。

$stmt = $mysqli->prepare($query) or die($mysqli->error); 

然而,bind_param()應該已經報告了一個錯誤,因爲$stmtFALSE。它應該抱怨在非對象上調用方法。

2

正如@Barmar所示,如果您不啓用例外,那麼您必須檢查每個mysqli調用以獲得false的響應。 IIRC,每個mysqli函數在出錯時都會返回false。

您應該配置mysqli來引發prepare()錯誤的異常。這不是它的默認設置,所以你必須啓用它。但是如何從文檔中做到這一點並不明顯。

http://php.net/manual/en/mysqli-driver.report-mode.php顯示了一個例子。

mysqli_report(MYSQLI_REPORT_STRICT); 

$link = mysqli_connect(...); 

執行此操作後,那麼你的準備()應該提出,因爲SQL語法錯誤的一個例外,在你的價值觀子句中多餘的分號,其他人已經指出。

我總是很驚訝,很少有人用mysqli啓用例外。我想他們只是沒有注意到文檔中有關mysqli_report()的部分。它真的很隱蔽。

對於使用PDO啓用異常的開發人員來說,這似乎更爲常見。默認情況下,此功能也未啓用,但在文檔中更容易找到:http://php.net/manual/en/pdo.error-handling.php

相關問題