PDO SQL 我正在尝试将我的 SQL 查询设置为检查多个列,但它不起作用 [重复]
Posted
技术标签:
【中文标题】PDO SQL 我正在尝试将我的 SQL 查询设置为检查多个列,但它不起作用 [重复]【英文标题】:PDO SQL I'm trying to set my SQL query to check multiple columns but it is not working [duplicate] 【发布时间】:2018-01-06 04:40:00 【问题描述】:我已经建立了一个登录系统,我可以使用他们的用户名或电子邮件地址检查用户是否存在。
这是我的代码:
// DB Connection Included
$q = $dbcon->prepare("SELECT * FROM table WHERE (username=:e OR email=:e)");
$q->execute(array('e'=>$user));
但它不起作用。如果我将查询更改为:
$q = $dbcon->prepare("SELECT * FROM table WHERE username=:e)");
或
$q = $dbcon->prepare("SELECT * FROM table WHERE email=:e)");
我以前使用过这段代码,它一直运行良好,所以我不确定为什么这次它不起作用。
我得到的实际错误是我的代码中的验证错误。我使用 rowCount() 函数检查用户是否存在;使用所需的查询,rowCount() 返回 0。
我也试过了:
$q = $dbcon->prepare("SET @user = :user SELECT * FROM table WHERE (username=@user OR email=@user)");
这是我在 Google 上找到的另一篇文章中建议的,但这也没有用。
有人有什么建议吗?
提前致谢。
【问题讨论】:
where 子句不需要括号 【参考方案1】:根据PDO::Prepare
您必须为希望添加的每个值添加一个唯一的参数标记 调用 PDOStatement::execute() 时传入语句。你 不能多次使用同名的命名参数标记 一个准备好的语句,除非仿真模式开启。
那就试试吧-
$q = $dbcon->prepare("SELECT * FROM table WHERE (username=:e1 OR email=:e2)");
$q->execute(array(':e1'=>$user,':e2'=>$user));
【讨论】:
prepare()
中的@PrateikDarji 分号是必需的,但在execute()
***.com/a/17386503/689579 和***.com/a/38925175/689579 中是可选的
@PrateikDarji 它只能使用一个参数来完成,如果作为文档状态 - 除非仿真模式开启。所以如果 OP 做了$dbcon->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
,它会起作用
这行得通。但是,我在我构建的另一个站点上使用了我提供的代码(即使用相同的参数标记),并且运行良好。所以我仍然不明白为什么它当时有效,但现在不行。无论如何,谢谢你的帮助。
@JustSomeGuy 可能其他网站默认打开了emulation mode
。
哦,我明白了,我会尽量记住将来考虑这一点。谢谢。【参考方案2】:
除了括号外,我觉得没问题。试试...
$q = $dbcon->prepare("SELECT * FROM table WHERE username=:e OR email=:e");
【讨论】:
除了括号,你是说mysql实际上关心你是否放置这些括号?它确实没有,但我个人认为没有它们的查询看起来更好。这可以是一个建议,但不是一个答案。 使用不同的参数名称解决了我的问题,但是,我确实采用了您的方法并删除了括号。感谢您的建议。以上是关于PDO SQL 我正在尝试将我的 SQL 查询设置为检查多个列,但它不起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 PDO 驱动程序 PHP 在 sql-server 查询中循环
由于带有动态 PHP 输入的 SQL 查询导致的 PDO 异常导致的致命错误