SQLSTATE[HY093]:参数编号无效 - PDO 选择语句



我正在开发用户登录功能,并面临一个奇怪的问题"无效的列数"。我谷歌了一下,很多人都有同样的问题,他们的问题有点不同。

这是我的代码:

//this is a function inside user class. And function receives $user_data array
try{
$stmt = $this->db_connection->prepare("SELECT `id` FROM `aaa_users` WHERE (`user_email` = :user_email OR `user_name` = :user_email) AND `user_pass` = :user_pass");
$stmt->bindparam(':user_email', $user_data['email']);
$stmt->bindparam(':user_pass', $user_data['password']);
$stmt->execute();
$count = $stmt->rowCount();
} catch (PDOException $e){
echo $e->getMessage();
}

注册查询有效,但会引发异常。我想知道是否有小错误,但我无法弄清楚。

正如我在评论中提到的,PDO的仿真可能未在您的服务器上启用,并且使用相同的命名占位符(可能是(导致此错误。

我分别将:user_mail重命名为:user_email_1:user_email_2

$stmt = $this->db_connection->prepare("
SELECT `id` FROM `aaa_users` 
WHERE (`user_email` = :user_email_1 
OR `user_name` = :user_email_2) 
AND `user_pass` = :user_pass
");
$stmt->bindparam(':user_email_1', $user_data['email']);
$stmt->bindparam(':user_email_2', $user_data['email']);
$stmt->bindparam(':user_pass', $user_data['password']);
$stmt->execute();

您可以在以下关于Stack的问答中阅读更多相关信息:

  • 是否支持使用 PDO 的服务器端准备语句?

里面接受的答案提供了一个很好的解释。

注意:确保与$user_data['X_values']相关的所有值都包含值。这表明它可能来自以前的查询,并且不知道它们的起源/值。

使用以下链接使用错误检查(如果在测试期间尚未使用其中任何一个链接(:

  • http://php.net/manual/en/pdo.error-handling.php
  • http://php.net/manual/en/function.error-reporting.php

同时确保所有列实际上都存在。您的数据库/表可能极有可能区分大小写,因此也要检查该(字母大小写(。

另一件事;过去发生过人们实际上不得不在骆驼大小写中使用bindParam而不是bindparam全部使用小写;这是一种可能性。

最新更新