SQLSTATE [HY093]:无效的参数号 - PDO Select语句

时间:2017-07-21 20:51:55

标签: php mysql 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();
}

注册查询有效但会引发异常。我知道,会有一个小小的错误,但我已经花了一整天而无法弄明白。

非常感谢帮助!

1 个答案:

答案 0 :(得分:2)

正如我在评论中提到的,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();

您可以在以下Q& A on Stack中了解更多相关信息:

里面的accepted answer提供了一个很好的解释。

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

如果在测试过程中尚未使用任何错误,请按照以下链接使用错误检查:

确保所有列确实存在。您的数据库/表可能会出现区分大小写的可能性,因此请检查(字母大小写)。

另一件事;在过去,人们实际上不得不在Camel Case中使用bindParam而不是bindparam小写;这是一种可能性。