2017-02-07 67 views
0

我有一個SQL查詢:PHP的mysqli - > bindValue SQL錯誤

if($stmt = $connection->prepare("INSERT INTO users(login, passwd, logged, register, last_login) VALUES(:login, :passwd, FALSE, NOW(), NULL")) { 
    $stmt->bindValue(':login', $login, PDO::PARAM_STR); 
    $stmt->bindValue(':passwd', md5($passwd), PDO::PARAM_STR); 
    $stmt->execute(); 
    $stmt->close(); 
} else { 
    echo "query error <b>".$connection->error."</b><br>"; 
} 

並返回該錯誤:

Connection error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':login, :passwd, FALSE, NOW(), NULL' at line 1

我怎樣才能解決呢?

我在Linux Fedora上使用MariaDB。在VALUES括號

+2

你確保它與PDO連接,而不是mysqli的? – Qirel

+0

是的,對不起,你是對的,我改變了標題。 –

+1

'bindValue'是PDO,mysqli只有未命名的佔位符。 – chris85

回答

0

缺少結束()

VALUES(:login, :passwd, FALSE, NOW(), NULL 
VALUES(:login, :passwd, FALSE, NOW(), NULL) 
2

這錯誤表明您使用的是MySQLi的連接,而不是一個PDO。如果這是真的,那麼這裏有一些錯誤 - 因爲PDO和MySQLi不會混合使用。

MySQLi不提供指定的佔位符(如:placeholder,因爲PDO),所以您必須改用?。此外,MySQLi使用bind_param()而不是bindValue()(這是一個PDO函數)。

爲MySQLi的代碼看起來像這樣

if ($stmt = $connection->prepare("INSERT INTO users(login, passwd, logged, register, last_login) VALUES(?, ?, FALSE, NOW(), NULL)")) { 
    $password = md5($passwd); 
    $stmt->bind_param('ss', $login, $password); 
    $stmt->execute(); 
    $stmt->close(); 
} else { 
    echo "query error <b>".$connection->error."</b><br>"; 
} 

還有一個)在您的查詢,這是我的片段添加上述月底失蹤。


還值得注意的是,md5()不是一個很好的函數來存儲密碼。 PHP提供password_hash()password_verify(),您應該使用它。 manual爲這些功能舉例。

還值得注意的是,錯誤應該只顯示在開發中。對於直播版本,您不應該顯示這樣的錯誤,因爲它們可以被利用。

參考

+0

謝謝你!它有幫助。它看起來像我需要閱讀有關pdo和mysli差異;) –

+0

是的,MySQL庫不混合;-)即使有些函數是非常相似的。我建議你學習MySQLi和PDO,並使用你最容易使用的那個,但只要你像這樣綁定你的變量,使用MySQLi肯定沒有錯。 *乾杯* – Qirel