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 异常导致的致命错误

PDO 查询不起作用,但生成的 SQL 在 PHPMyAdmin 上运行

PDO 语句错误 #1064

我的 PDO 查询对 SQL 注入安全吗?

Zend 启用 SQL 查询日志记录