php - SHA 函数问题

标签 php mysql authentication

我的 login.php 中有这段 php 代码

if (isset($_POST['logIn'])) {
    $errmsg = "";
    $logname = mysqli_real_escape_string($dbc, trim($_POST['usernameIn']));
    $logpassword = mysqli_real_escape_string($dbc, trim($_POST['passwordIn']));

    $query = "SELECT user_id, username FROM members WHERE username = '$logname' AND password = SHA('$logpassword')";
    $data = mysqli_query($dbc, $query);

    if (mysqli_num_rows($data) == 1) {
        $row = mysqli_fetch_array($data);
        setcookie('user_id', $row['user_id'], time() + (60 * 60 * 24 * 30)); //expires after 30 days
        setcookie('username', $row['username'], time() + (60 * 60 * 24 * 30));
        $home = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/index.php';
        header('Location: ' . $home);
    }
    else {
        $errmsg = '<p class="errormsg">Username or password is incorrect.</p>';
    }
}

出于某种原因,它总是在 else 语句中设置 $errmsg。我确信我输入的信息(用户名、密码)是正确的并且存在于数据库中。

我使用此查询插入我的值(来自注册脚本):

$query = "INSERT INTO members (username, password, email) VALUES ('$username', SHA('$password'), '$email')";

有人看到这个脚本的问题吗?谢谢!

最佳答案

我没有注意到您的代码中有任何重大错误,但我有一些建议可以帮助调试它:

  1. 再次检查用户名和密码。在查询之前回显这两个,以确保它们在转义后仍然与数据库中的内容匹配。
  2. 回显查询字符串并在 phpmyadmin 或 shell 中运行它。
  3. 确保值以 POST 而不是 GET 的形式发送。
  4. if (mysqli_num_rows($data) == 1) { 更改为 if (mysqli_num_rows($data) > 0) { 以防两行具有相同的用户名和密码

关于php - SHA 函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2520667/

相关文章:

php - MySQL 更新 'n' 按行 [id] 包含新信息的行数?

php - 访问我的网络中的本地 MySQL 服务器

javascript - 日期 不专门在 laravel 中工作

php - MySQL 存储过程 PHP JSON 响应

php - 具有多个绑定(bind)参数的 MySQL UTF-8 全文搜索

iphone - 如何管理 Web 驱动的 Iphone 应用程序中的 session

ruby-on-rails - 为什么需要将 JWT 作为 Bearer Token header 发送?

php - 在种子 laravel 中没有正确地从环境变量中提取

php - 如何使用 PHP 从字符串中删除主机名?

php - 使用混合身份验证恢复 session