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

时间:2018-05-02 13:44:49

标签: 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

<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);

1 个答案:

答案 0 :(得分:0)

您的问题可能不在

$_POST['account']

正如你想的那样。

这看起来不错,除非你的$login_stmt->bind_result($password); 是一个数组,而不是一个变量,我怀疑。在这种情况下,它会在那里失败。但是你的WHERE语句和bindparam看起来是正确的

但这不正确:

SELECT username,password,email

因为您尝试仅绑定一个变量,并且在SELECT语句中返回了3列(email

由于您的代码中并不真正需要username$login_query = 'SELECT password FROM user WHERE username = ? OR email = ?'; ,只需更改您的查询:

X = [ [ xi if mi else None for xi, mi in zip(x,m) ] for x, m in zip(X, mask) ]

它应该有效