我有一个 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。
最佳答案
该错误表明您正在使用 MySQLi 连接,而不是 PDO 连接。如果这是真的,那么这里就会出现一些错误 - 因为 PDO 和 MySQLi 不能混合。
MySQLi 不提供命名占位符(例如 PDO 提供的 :placeholder
),因此您必须使用 ?
来代替。此外,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包含这些函数的示例。
还值得注意的是,错误只能像开发中那样显示。对于实时版本,您不应显示此类错误,因为它们可能会被利用。
引用文献
关于PHP mysqli ->bindValue SQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42080394/