簡體   English   中英

PHP mysqli-> bindValue SQL錯誤

[英]PHP mysqli ->bindValue SQL error

我有一個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>";
}

它返回此錯誤:

連接錯誤:您的SQL語法有誤; 檢查與您的MariaDB服務器版本相對應的手冊以在第1行的':login,:passwd,FALSE,NOW(),NULL'附近使用正確的語法

我該如何解決?

我在Linux Fedora上使用MariaDB。

該錯誤表明您正在使用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() ,您應該改用它。 手冊包含這些功能的示例。

還值得注意的是,錯誤僅應在開發中顯示。 對於實時版本,您不應顯示此類錯誤,因為它們可能被利用。

參考文獻

缺少VALUES()中的方括號

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM