2015-03-13 28 views
2

我正在做一個項目,並剛剛被告知我需要將註冊日期添加到我的註冊表單中,然後完成我認爲應該解決這個問題,但是卻會得到一個致命的錯誤。這段代碼有什麼問題?因爲它在我將registration_date + CURRENT_TIMESTAMP添加到它之前完美工作。添加註冊日期並獲得'調用成員函數bind_param()布爾'錯誤

$firstname = $_POST['firstname']; 
$surname = $_POST['surname']; 
$email = $_POST['email']; 
$address = $_POST['address']; 
$postcode = $_POST['postcode']; 
$telephone = $_POST['telephone']; 
$username = $_POST['username']; 
$password = $_POST['password']; 

$q = "INSERT INTO tbl_customers (firstname, surname, email, address, postcode, telephone, username, password, registration_date) 
VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; 

$stmt = $dbc->prepare($q); 
$stmt->bind_param('ssssssss', '$firstname', '$surname', '$email', '$address', '$postcode', '$telephone', '$username', md5('$password'), CURRENT_TIMESTAMP); 

$r = $stmt->execute(); 

if ($r === TRUE) { 
    echo "New record created successfully"; 
} else { 
    echo "Error: " . $q . "<br>" . $dbc->error; 
} 

謝謝。

+0

準備可以返回false。你應該檢查一下。 – 2015-03-13 13:34:08

+0

如果包含錯誤消息,您可能會獲得更多幫助。 – 2015-03-13 13:36:28

+0

再加一個'?'和's'在適當的地方。你現在有9個領域,但只有8個。 – bloodyKnuckles 2015-03-13 13:40:19

回答

4

任何時候,你得到的...

"Fatal error: Call to a member function bind_param() on boolean"

...這可能是因爲沒有與您的查詢的問題。 prepare()可能會返回FALSE(一個布爾值),但是這個通用失敗消息並沒有給你留下太多線索。你如何發現你的查詢出了什麼問題?你

首先,要確保錯誤報告已打開並可見:添加以下兩行到您的文件(S)的頂部您打開後立即<?php標籤:

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

如果你的錯誤報告有已經在php.ini中設置,你將不必擔心這一點。只要確保你能妥善地處理錯誤,並且永遠不要向用戶泄露任何問題的真正原因。向公衆揭示真實的原因可能是希望損害您的網站和服務器的人的黃金邀請。如果您不想向瀏覽器發送錯誤,則可以隨時監控您的Web服務器錯誤日誌。日誌位置因服務器而異,例如在Ubuntu上,錯誤日誌通常位於/var/log/apache2/error.log。如果您正在Linux環境中檢查錯誤日誌,則可以在控制檯窗口中使用tail -f /path/to/log以查看實時發生的錯誤....或執行錯誤日誌。

一旦您擺脫了標準錯誤報告,在您的數據庫連接上添加錯誤檢查並且查詢會給您提供有關正在發生的問題的更多詳細信息。看看列名不正確的例子。首先,返回通用致命錯誤消息的代碼:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; 
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection 
$query->bind_param('s', $definition); 
$query->execute(); 

錯誤是通用的,對您解決發生的事情沒有多大幫助。

隨着幾行代碼,你可以得到非常詳細的信息,你可以用它來立即解決問題。檢查prepare()陳述的真實性,如果它是好的,您可以繼續進行綁定和執行。

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; 
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection 
    $query->bind_param('s', $definition); 
    $query->execute(); 
    // any additional code you need would go here. 
} else { 
    $error = $mysqli->errno . ' ' . $mysqli->error; 
    echo $error; // 1054 Unknown column 'foo' in 'field list' 
} 

如果出現問題,您可以吐出一條錯誤消息,將您直接帶到問題中。在這種情況下,表中沒有foo列,解決這個問題是微不足道的。

如果您選擇,您可以在函數或類中包含此檢查,並通過如前所述優雅地處理錯誤來擴展它。

相關問題