2014-06-23 34 views
0

我正在寫我的第一個PHP類,嘗試學習面向對象的概念。此代碼的目標是將用戶的IP和相關參數記錄到數據庫中,我可能稍後將其用作應用臨時禁令的基礎。 (不,我們不要討論這個策略的優點 - 讓我們繼續編碼類吧!)。這是我有:爲什麼我的第一個PHP類沒有按預期工作?

class banAss { 

    public function __construct(mysqli $db){ 
     $this->db = $db; 
     $this->visitip = $_SERVER['REMOTE_ADDR']; 
     $this->visitAgent = $_SERVER['HTTP_USER_AGENT']; 
     $this->visitDate = time(); 
    } 

    public function addBan(){ 
     $sql = "Insert into banned (visitIP, visitAgent, visitDate,) values (?, ?, ?)"; 
     $stmt = mysqli_prepare($this->db, $sql); 
     mysqli_stmt_bind_param($stmt, "ssi", $this->visitip, $this->visitAgent, $this->visitDate); 
     mysqli_stmt_execute($stmt); 
     mysqli_stmt_close($stmt); 
    } 

} 

$banned = new banAss($db); 
$banned->addBan(); 

值得注意的是,我確實有一個有效的數據庫連接,已使用mysqli打開。我一直在玩關於這個錯誤消息的whackamole。目前他們站在:

Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given in /home/c9/public_html/admin/login.php on line 16 

Warning: mysqli_stmt_execute() expects parameter 1 to be mysqli_stmt, boolean given in /home/c9/public_html/admin/login.php on line 17 

Warning: mysqli_stmt_close() expects parameter 1 to be mysqli_stmt, boolean given in /home/c9/public_html/admin/login.php on line 18 

我不明白這些消息。他們也許建議,可能造成變量$ stmt的'mysqli_prepare'這行不知怎麼搞亂了,但是怎麼做?

回答

2

警告:mysqli_stmt_bind_param()預計參數1被mysqli_stmt,布爾在...

定的讀取密切:它告訴你,你在一個布爾值傳遞時,功能不期待它在那裏。當它遇到一個錯誤時,mysqli_prepare()返回一個布爾值FALSE,這就是你試圖傳遞到mpsqli_stmt_bind_param()函數的內容,從而產生一個錯誤和一個布爾值FALSE值,該值只是慢慢下降。

使用mysqli_error()可以獲得您正在獲取的確切錯誤,並可能瞭解如何解決上述錯誤。

+0

謝謝!我按照你的建議做了,它在sql中是一個簡單的語法錯誤(最後一個參數visitDate後面的尾隨逗號)。我認爲學習一項新技術使我能夠首先尋找最神祕的原因,而不是最微不足道的原因。謝謝你幫助我看到在我面前的是什麼。 – Frankie

2

您的查詢有語法錯誤,這意味着所有的準備和後續調用失敗:

$sql = "Insert into banned (visitIP, visitAgent, visitDate,) etc... 
                  ^---dangling comma 

永遠不要假設一個DB操作成功。你需要檢查失敗,這在你的情況下是一個返回值爲布爾值FALSE:

$stmt = mysqli_prepare(....); 
if ($stmt === false) { 
     ... oops something blew up 
} 
+0

你用三個等號表示的結構是什麼意思? – Frankie

+0

http://www.php.net/manual/en/language.operators.comparison.php –

相關問題