Php 验证和存储密码的问题

Php 验证和存储密码的问题,php,mysqli,Php,Mysqli,我最近在我的注册页面中添加了密码加密 注册页摘录: $hashed_password = crypt('pass1'); mysqli_query($mysqli, "INSERT INTO Persons (Username, Password, Email, Gender) VALUES ('$euser', '$hashed_password', '$eemail', '$gender')"); 这很好,据我所知,所有数据都正确地输入到数据库中 但登录页面不验证表单 登录页面提取 if

我最近在我的注册页面中添加了密码加密

注册页摘录:

$hashed_password = crypt('pass1'); 
mysqli_query($mysqli, "INSERT INTO Persons (Username, Password, Email, Gender) VALUES ('$euser', '$hashed_password', '$eemail', '$gender')");
这很好,据我所知,所有数据都正确地输入到数据库中

但登录页面不验证表单

登录页面提取

if( $page_mode == 'Login' )
{
    $username = $_POST['username'];
    $password = $_POST['password'];
    if( trim($username) == '' || trim($password) == '' )
    {
        $error_string .= '<font color=red>You have left either the username or password field blank!</font>';
    }
    else
    {
        require "globe.php";
        $result = mysqli_query("SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");
        $has_pass = crypt($password, $row['Password']); 
        if( !($row = mysqli_fetch_assoc($result)) || ($row['Password'] != $has_pass) )
        {
            $error_string .= '<font color=red>Please check your username or password. Your details weren\'t correct.</font> ';
        }
        else 
        {
        $error_string .= '<font color=red>login not ready </font> ';
        mysqli_close($mysqli);
        }
    }
}
这似乎不起作用。我也不明白为什么?有人知道吗

如果用户名和密码字段为空,唯一能起作用的就是错误消息

编辑:

假设密码是测试的,我输入了测试页面来验证它,所以登录页面只返回背景

如果我输入其他内容,也会出现同样的问题

编辑:

添加了中的所有支持。但是仍然没有运气

$has_pass=crypt'$password'

您试图在单引号内插入变量。只用

crypt$密码

除了其他答案所指出的关于地穴的bug之外

$mysqli_query(...

更不用说您有条件地关闭mysqli连接,而您应该始终关闭它

编辑

试试这个

if( $page_mode == 'Login' )
{
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);

    if( ($username == '') || ($password == '') ) {
        $error_string .= '<font color=red>You have left either the username or password field blank!</font>';
    } else {
        require "globe.php";

        $query = sprintf("SELECT PlayerID, Username, Password FROM Persons WHERE Username='%s' LIMIT 1",
                                                mysqli_real_escape_string($mysqli, $username) );


        $result = mysqli_query( $query );

        if( ($result !== false) && (mysqli_num_rows($result) == 1) ) { 
          $row = mysqli_fetch_assoc($result);
          if( $row['Password'] != crypt($password, $row['Password']) ) {
              $error_string .= '<font color=red>Please check your username or password. Your details weren\'t correct.</font> ';
          } else {

              // OK

          }
        } else {
            $error_string .= '<font color=red>Please try again</font> ';
        }

        mysqli_close($mysqli);
    }
}

您仍然需要检查$result以确保查询成功,还需要检查$row以确保该用户可以从中获取密码的salf,但我故意将其作为您的家庭作业:

您必须向crypt提供原始salt

编辑:您需要将数据库句柄传递给mysqli\u查询。比如:

$result = mysqli_query($mysqli, "SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");

尝试将mysqli handle添加为mysqli_real_escape_字符串的第一个参数,并检查您是否得到一行-mysqli_real_esacpe_string$handle,$string

这看起来像是一个调试案例,而不是堆栈溢出问题。您有哪些输入值,以及在比较它们时会发生什么?如果您能给出一个示例,那就太好了。您是否有任何MySQL错误?使用mysql\u error并检查您的mysqli\u查询是否错误。看我的编辑。不确定“插值”这个词是否正确,尽管我觉得它很酷。。。字符串插值是一种准引号形式,在许多编程语言中很常见,这些语言大量使用数据的字符串表示形式,如Ruby、PHP、Perl等。它意味着插入字符串或用其值替换变量。它使字符串格式设置和指定内容更加直观。添加了,但仍然没有成功:
$has_pass = crypt($password, $row['password']); 
$result = mysqli_query($mysqli, "SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");