Php 如何使用mysqli prepare语句以电子邮件或用户名(非PDO)登录?

Php 如何使用mysqli prepare语句以电子邮件或用户名(非PDO)登录?,php,mysqli,Php,Mysqli,我已经看到了很多关于使用用户名或电子邮件登录php的答案,但我找不到“Mysqli Prepare Statement”的解决方案,它们都使用PDO 我的问题是,为什么我不能使用两个?来选择用户名或电子邮件 我的代码在这里: 数据库 table user --id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, --username varchar(20), --password varchar(255), --email varchar(30), html

我已经看到了很多关于使用用户名或电子邮件登录php的答案,但我找不到“Mysqli Prepare Statement”的解决方案,它们都使用PDO

我的问题是,为什么我不能使用两个
来选择用户名或电子邮件

我的代码在这里:

数据库

table user
--id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
--username varchar(20),
--password varchar(255),
--email varchar(30),
html


你的问题可能不在电视上

$login_stmt->bind_param('ss', $account, $account);
正如你所想

这看起来不错,除非你的
$\u POST['account']
是一个数组,而不是单个变量,我对此表示怀疑。在这种情况下,它将在那里失败。但是您的WHERE语句和bindparam看起来是正确的

但是,这是不正确的:

$login_stmt->bind_result($password);
因为您尝试只绑定一个变量,并且在SELECT语句中返回了3列(
SELECT username、password、email

由于您的代码中并不真正需要
电子邮件
用户名
,因此只需按如下方式更改查询:

$login_query = 'SELECT password FROM user WHERE username = ? OR email = ?';

而且它应该有效“为什么我可以使用两个
…”=>在一个准备好的语句中只允许一个
是没有意义的。它们是占位符。当mysqli(和PDO,因为它也可以使用?语法)执行查询时,它会告诉您的数据库使用您传递到bind_param中的值来代替问号。也许现在是查阅手册的好时机?问题在于mysqli\u stmt::bind\u result()。您选择了3列,但只绑定了1个变量。@riggsfully我不使用mysqli,所以我不确定。我认为OP要么完全放弃它,要么传入正确数量的变量。
$login_stmt->bind_param('ss', $account, $account);
$login_stmt->bind_result($password);
$login_query = 'SELECT password FROM user WHERE username = ? OR email = ?';