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

Posted

技术标签:

【中文标题】SQLSTATE[HY093]:无效的参数号 - PDO Select 语句【英文标题】:SQLSTATE[HY093]: Invalid Parameter number - PDO Select statement 【发布时间】:2017-07-21 20:51:55 【问题描述】:

我正在开发用户登录功能,但遇到了一个奇怪的问题“列数无效”。我用谷歌搜索了它,很多人都有同样的问题,他们的问题有点不同。

这是我的代码:

//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();

注册查询有效,但这会引发异常。我知道,会有一个小错误,但我花了一整天都想不通。

我们将不胜感激!

【问题讨论】:

我唯一的建议是尝试bindParam(带大写“P”)而不是bindparam。其他一切对我来说都是正确的。 肯定是 pdo 而不是 mysqli? 你有 3 个占位符和 2 个绑定......想知道“无效的列数”来自哪里。 @YvesLeBorg 这是另一回事,但 OP 似乎通过不回复之前发布的其他 cmets 离开了这个问题。所以,我认为我什至提到另一个最有可能的可能性对我来说没有多大意义。 检查您的 php 系统文件以查看是否设置了仿真。如果不是,您既不会打开它也不会重命名重复的占位符名称之一。这就是您收到该错误的原因@Alena 【参考方案1】:

正如我在 cmets 中提到的,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 上的以下问答中了解更多信息:

Support server side prepared statements with PDO?

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

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

如果在测试期间尚未使用以下链接,请按照以下链接使用错误检查:

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

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

另一件事;过去发生过这种情况,人们实际上必须在 Camel Case 中使用 bindParam 而不是 bindparam 全部使用小写;这是一种可能。

【讨论】:

非常感谢@Fred -ii-,问题是因为使用了相同的占位符。 :) 不客气@Alena 我很高兴看到它已解决,干杯 :-)

以上是关于SQLSTATE[HY093]:无效的参数号 - PDO Select 语句的主要内容,如果未能解决你的问题,请参考以下文章

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

SQLSTATE [HY093]:参数号无效:未定义参数 - php

SQLSTATE[HY093]:参数号和 PDO::ATTR_EMULATE_PREPARES 无效

致命错误:未捕获PDOException:SQLSTATE [HY093]:参数号无效:无参数

Pdo - 将值插入数据库错误 SQLSTATE [HY093] [重复]

PDOStatement :: execute():SQLSTATE [HY093],批量插入时的奇怪行为