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]:参数号无效:无参数