Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在准备好的语句中使用变量两次_Php_Sql_Mysqli_Prepared Statement - Fatal编程技术网

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

Php 在准备好的语句中使用变量两次,php,sql,mysqli,prepared-statement,Php,Sql,Mysqli,Prepared Statement,我开始在php的sql查询中使用准备好的语句,从这里开始,我提出了一个问题 我有一个函数,可以在登录时从表中获取用户id。我希望用户能够使用他们的用户名或电子邮件地址进行登录 因此,我的sql语句是: 从“登录”中选择*其中“用户名”=?或者“电子邮件地址”= 现在,在这个查询中,用户名和emailAddress基本上是相同的,因为它可以是或 因此,在绑定语句时,是否要绑定变量两次: bind_param('ss', $user, $user); 因此用户名和emailAddress的值必须相

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

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

因此,我的sql语句是:

从“登录”中选择*其中“用户名”=?或者“电子邮件地址”=

现在,在这个查询中,用户名和emailAddress基本上是相同的,因为它可以是或

因此,在绑定语句时,是否要绑定变量两次:

bind_param('ss', $user, $user);
因此用户名和emailAddress的值必须相同。实际上,我希望$user是这两个占位符的值


我的问题是:我做得对吗?有没有更有效的方法?

是的。bind_param调用中的变量数量必须与查询中的占位符数量相同。如果你有:

SELECT * FROM login
WHERE username = ? and emailAddress = ? and country = ?
你想把他们绑得太少了:

bind_param("ss", $user, $country);
如何知道应该为额外的占位符重复哪个变量


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

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

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

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

您尝试过吗?这样行吗?你的问题到底是什么?你想知道它是否有效吗?然后请尝试一下,如果没有,请用错误消息更新您的问题。@victorantunes我想我应该问的是:有更好的方法吗?这是正确的方法吗?我+1会这样做,因为我有一个类似的问题,除了我不是从我同意的代码中填充绑定参数,只包含它两次或更多是微不足道的,而是从一个笨重的GUI中,需要为查询中的每个绑定创建并填充额外的插槽。因此,能够将每个绑定引用为?1、?2、?3,然后在多个位置使用?2,实际上可以节省时间。@EvanStoddard我希望您不会使用此扭曲查询仅保存绑定参数,您不知道这意味着什么。我只是想阻止注射。我正在使用OR。事实上,当用户登录时,你不知道他们是否会使用他们的电子邮件地址或用户名。因此,每个占位符的值必须相同。所以我想我应该问的是:有什么更好的方法可以做到这一点?