我开始在php中使用我的sql查询准备好的语句,从这开始我提出了一个问题。
我有一个函数可以在登录时从表中获取用户的id。我希望用户能够使用他们的用户名或电子邮件地址进行登录。
所以我的sql语句是:
SELECT * FROM`login` WHERE`username` =?或`emailAddress` =?
现在基本上在此查询中username
和emailAddress
将是相同的,因为它可以是或。
因此,在绑定我的语句时,我将变量绑定两次:
bind_param('ss', $user, $user);
因此username
和emailAddress
的值必须相同。基本上我希望$user
成为两个占位符的值。
我的问题是:我这样做是否正确? 是否有更有效的方式?
答案 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,但它可能会允许它,但我不知道是否可以预测哪个列将放入变量。