[英]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.