PHP MySQLi认证使用if_num_rows不匹配数据库信息


PHP MySQLi authentication using if_num_rows not matching database information

我是PHP/MySql编程新手。我已经买了一本帮助学习语言的书,到目前为止我做得很好,除了当我试图创建一个认证系统。

我想能够匹配的记录,数据库使用MD5加密,如果发现发送到网站。如果用户名和密码不正确,请将它们重新发送到登录页面。

在某一点上,它只匹配第一个记录。现在它不匹配任何。我可以准确地输入数据库中的内容,结果仍然是0或返回登录页面。

我还想为用户名和auth_level设置一个会话变量,以便我可以在整个网站/应用程序中调用它。

如果有帮助的话,我在Mac上使用XAMPP。

身份验证脚本:

if ((!isset($_POST['username'])) || (!isset($_POST['password']))) {
    header('Location: login.html');
    exit;
}
$mysqli = mysqli_connect('localhost', 'username', 'password', 'testDB')
      or die(mysql_error($mysqli));
$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$password = mysqli_real_escape_string($mysqli, $_POST['password']);
$auth_sql ="SELECT username , auth_level FROM auth_users WHERE
username ='".$username."' AND password =MD5('".$password."')";
$auth_sql_res = mysqli_query($mysqli, $auth_sql) or die(mysqli_error($mysqli));
if (mysqli_num_rows($auth_sql_res) == 1) {
    $_SESSION['username'] = $username;
    header('Location: homebeta.php');
} else {
    header("Location:index.php");
    exit;
}
PHP v5.3.1

感谢每一个花时间观察、分析和/或帮助我的人。我真的很感谢你的时间。

您在第一次调用header后忘记了exit:

header('Location: homebeta.php');
exit;

是否检查PHP错误?阅读如何在PHP中获得有用的错误消息?了解更多。

我认为你的脚本可能会在开始时输出一些东西,阻止头或会话信息被发送。

试试这个:

if ((!isset($_POST['username'])) || (!isset($_POST['password']))) {
    header('Location: http://www.replacethis.com/login.html');
} else {
    $mysqli = mysqli_connect('localhost', 'username', 'password', 'testDB')
        or die(mysql_error($mysqli));
    $username = mysqli_real_escape_string($mysqli, $_POST['username']);
    $password = mysqli_real_escape_string($mysqli, $_POST['password']);
    $auth_sql = "SELECT `username`, `auth_level`
        FROM `auth_users`
        WHERE `username` = '$username' AND `password` = MD5('$password')";
    $auth_sql_res = mysqli_query($mysqli, $auth_sql)
        or die(mysqli_error($mysqli));
    if (mysqli_num_rows($auth_sql_res) > 0) {
        $_SESSION['username'] = $username;
        header('Location: http://www.replacethis.com/homebeta.php');
    } else {
        header("Location: http://www.replacethis.com/index.php");
        exit;
    }
}
  1. 新增Else声明。
  2. 在你的SQL query反勾(只是为了安全起见)
  3. header location .

并尝试从您的查询中删除MD5 hashing,并在您的HTML-form中复制并粘贴用户名和密码,然后登录。

好吧,你可能不会得到你的错误消息,因为你使用mysql_error而不是mysqli像其他所有东西,特别是在连接,有mysqli_connect_error()。

另外,根据手册,对于mysqli_connect_error:

,括号内应该为空。
$mysqli = mysqli_connect('localhost', 'username', 'password', 'testDB')
  or die(mysqli_connect_error());