PHP mysqli ->bindValue SQL 错误

标签 php mysql

我有一个 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/

相关文章:

php用汉字执行mysql查询,SQL语法错误

PHPMailer 加载一段时间,然后给出 500 - 内部服务器错误

php - Laravel 和批量分配保护

sql - 国际化 - 支持所有语言的字符集?

mysql - 如何存储关键字/标签

php - jQuery 中删除一项后计算一张动态表的总和

mysql - 如何在 MySQL 中查找列的名称?

javascript - 在服务器端使用带有 PHP 的 JQuery Ajax 提交文件和文本数据。

mysql - 需要使用 SQL 数据库的任何报告引擎创建图形/报告

php - Laravel 5.1 将多个重复记录输入数据库