2017-02-07 46 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