【问题标题】:Use a variable twice in prepared statement在准备好的语句中使用变量两次
【发布时间】:2013-09-03 19:50:32
【问题描述】:

我开始在 php 中对我的 sql 查询使用准备好的语句,从这个开始我提出了一个问题。

我有一个函数可以在登录时从表中获取用户 ID。我希望用户能够使用他们的用户名或电子邮件地址进行登录。

所以我的sql语句是:

SELECT * FROM `login` WHERE `username`=?或者 `emailAddress`=?

现在,在这个查询中,usernameemailAddress 基本上是相同的,因为它可以是或。

所以当绑定我的语句时,我是否绑定了我的变量两次:

bind_param('ss', $user, $user);

所以usernameemailAddress 的值需要相同。本质上,我希望 $user 成为两个占位符的值。

我的问题是:我这样做是否正确? 有没有更有效的方法?

【问题讨论】:

  • 你试过了吗?这行得通吗?
  • 您的问题到底是什么?你想知道它是否有效吗?那么请尝试一下,如果没有,请使用任何错误消息更新您的问题。
  • @victorantunes 我想我应该问的是:有没有更好的方法来做到这一点?这是正确的方法吗?
  • 我 +1 了,因为我有一个 similar 问题,只是我没有从代码中填充绑定参数(我同意,只包含它是微不足道的两次或更多),但在笨重的 GUI 中需要创建额外的“插槽”,然后为查询中的每个绑定填充。因此,能够将每个绑定引用为 ?1、?2、?3,然后在多个位置使用 ?2,实际上可以节省时间。

标签: php sql mysqli prepared-statement


【解决方案1】:

是的,您必须绑定两次。如果您出于某种原因反对,您可以将查询改写为:

SELECT *
FROM `login` l cross join
      (select ? as thename) const
WHERE l.`username` = thename OR `emailAddress` = thename;

这是使用子查询来命名参数,以便在查询中多次引用它。

【讨论】:

  • @EvanStoddard 我希望你不会只使用这个扭曲的查询来保存绑定参数,对吗?
  • 不知道这是什么意思。我只是想防止注射。
【解决方案2】:

是的。 bind_param() 调用中的变量必须与查询中的占位符一样多。考虑一下你是否有:

SELECT * FROM login
WHERE username = ? and emailAddress = ? and country = ?

而您尝试绑定的数量太少:

bind_param("ss", $user, $country);

它应该如何知道应该为额外的占位符重复哪个变量?

两次使用同一个变量没有问题。不过,我不会推荐它与 bind_result 一起使用——它可能会允许它,但我不知道是否可以预测将哪一列放入变量中。

【讨论】:

  • 我正在使用OR。事实是,当用户登录时,您不知道他们是否会使用他们的电子邮件地址或用户名。因此,每个占位符的值需要相同。所以我想我应该问的是:有什么更好的方法来做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2016-05-22
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多