【问题标题】:PDO SQL I'm trying to set my SQL query to check multiple columns but it is not working [duplicate]PDO SQL 我正在尝试将我的 SQL 查询设置为检查多个列,但它不起作用 [重复]
【发布时间】: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 子句不需要括号

标签: php mysql sql pdo


【解决方案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() stackoverflow.com/a/17386503/689579stackoverflow.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实际上关心你是否放置这些括号?它确实没有,但我个人认为没有它们的查询看起来更好。这可以是一个建议,但不是一个答案。
  • 使用不同的参数名称解​​决了我的问题,但是,我确实采用了您的方法并删除了括号。感谢您的建议。
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 2013-08-20
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
相关资源
最近更新 更多