php - 如何使用 mysqli prepare 语句使用电子邮件或用户名(不是 PDO)登录?
问题描述
我看过很多关于使用用户名或电子邮件登录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
<form action="login.php" id="login_form" method="post">
<input type="text" name="account" placeholder="username or email" />
<input type="password" name="password" placeholder="password" />
<div class="login_submit">
<button type="submit" name="submit">Login</button>
</div>
</form>
PHP
<?php
$con = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT);
$con->query('SET CHARACTER SET utf8');
if (isset($_POST['submit'])) {
$account = $_POST['account'];
$get_password = $_POST['password'];
$login_query = 'SELECT username,password,email FROM user WHERE username = ? OR email = ?';
$login_stmt = $con->stmt_init();
if ($login_stmt->prepare($login_query)) {
$login_stmt->bind_param('ss', $account, $account);
$login_stmt->execute();
$login_stmt->bind_result($username, $password, $email);
$login_result = $login_stmt->get_result();
while ($login_row = $login_result->fetch_assoc()) {
$check_password = $login_row['password'];
}
} else {
echo 'Login Error';
exit();
}
if ($login_result->num_rows == 0) {
$account_error = $lang_account_not_exist;
$login_permit = false;
} elseif (!password_verify($get_password, $check_password)) {
$password_error = $lang_wrong_password;
$login_permit = false;
}
编辑
bind_result($username, $password, $email);
解决方案
你的问题可能不在
$login_stmt->bind_param('ss', $account, $account);
如你所想。
这看起来不错,除非你$_POST['account']
是一个数组而不是一个变量,我对此表示怀疑。在这种情况下,它将在那里失败。但是您的 WHERE 语句和 bindparam 看起来是正确的
然而,这是不正确的:
$login_stmt->bind_result($password);
因为您尝试只绑定一个变量,并且在 SELECT 语句中返回了 3 列 ( SELECT username,password,email
)
由于您的代码中并不真正需要email
and username
,因此只需像这样更改您的查询:
$login_query = 'SELECT password FROM user WHERE username = ? OR email = ?';
它应该可以工作
推荐阅读
- python-3.x - PyInstaller 可执行文件不显示 GUI
- android - 关闭并启动应用程序后无法访问 chromedriver。网络驱动程序异常
- swift - AVAudioEngine没有声音
- javascript - 如何正确地将 eslint 配置添加到 NuxtJS?
- android - 打开具有多个内部意图的应用程序并等待结果
- elasticsearch - 弹性堆栈映射器解析
- html - 如何在响应式网页的可滚动表格下方的 W3.CSS 中创建粘性页脚?
- django - 序列化来自多个模型 django 的数据
- json - 使用适当的转义从 Nustache 生成 JSON
- json - 如何使用 REST API 在 TFS Source Control 2015 中移动/重命名文件?