在准备好的语句中使用变量两次

时间:2013-09-03 19:50:33

标签: php sql mysqli prepared-statement

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

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

所以我的sql语句是:

  

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

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

因此,在绑定我的语句时,我将变量绑定两次:

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

因此usernameemailAddress的值必须相同。基本上我希望$user成为两个占位符的值。

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

2 个答案:

答案 0 :(得分:3)

是的,您必须将其绑定两次。如果您出于某种原因反对这一点,您可以将查询重新命名为:

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

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

答案 1 :(得分:1)

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

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

并且你试图绑定太少的东西:

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

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

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