Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
登录PHP脚本用户名和密码正确,但不会登录_Php_Login - Fatal编程技术网

登录PHP脚本用户名和密码正确,但不会登录

登录PHP脚本用户名和密码正确,但不会登录,php,login,Php,Login,我不得不用我的PHP登录脚本修复一些错误,当用户使用大写字母创建帐户时,它不会让他使用所有小写字母登录,因此我决定修复这些错误,但是,它不会登录,它只是重定向到登录,并显示我的消息意外错误发生 它会通过用户名检查,但不会返回密码,并且不会返回密码错误 我尝试创建一个新帐户,但它仍然会转到那个错误页面,但这次,它实际上让我登录了,但并没有使用您已成功登录的帐户,并且现有用户无法登录,但我创建的新帐户做到了 我确实尝试了密码重置,它可以工作,但不会导致成功登录消息 我做的另一个更改是对密码进行哈希处

我不得不用我的PHP登录脚本修复一些错误,当用户使用大写字母创建帐户时,它不会让他使用所有小写字母登录,因此我决定修复这些错误,但是,它不会登录,它只是重定向到登录,并显示我的消息意外错误发生

它会通过用户名检查,但不会返回密码,并且不会返回密码错误

我尝试创建一个新帐户,但它仍然会转到那个错误页面,但这次,它实际上让我登录了,但并没有使用您已成功登录的帐户,并且现有用户无法登录,但我创建的新帐户做到了

我确实尝试了密码重置,它可以工作,但不会导致成功登录消息

我做的另一个更改是对密码进行哈希处理,因为我使用用户名密码Salt,我从$hash=hash'sha256',$username.$Password.$Salt;到$hash=hash'sha256',strtolower$Username.$Password.$Salt;因为,当用户名是大写或小写时,它会影响密码检查

我的代码:

<?php
    /* Mysql data */
    $MysqlUsername = "root";
    $MysqlPassword = "*********";
    $MysqlHostname = "localhost";
    $MysqlDatabase = "teamgamersnet";
    $Salt = "******";
    $Username = $_POST['Username'];
    $Password = $_POST['Password'];
    $Remember = $_POST['Remember'];
    $Cookie = "TGN";
    $IP       = $_SERVER['REMOTE_ADDR'];
    if (empty($Username) || empty($Password)) { die("Please fill in all the fields"); }


    $hash = hash('sha256',strtolower($Username).$Password.$Salt);

    $Sql = new mysqli($MysqlHostname, $MysqlUsername, $MysqlPassword, $MysqlDatabase);
    if ($Sql->connect_error){ echo $Sql->connect_error; }
    $sUser = $Sql->real_escape_string($Username);
    $sPass = $Sql->real_escape_string($Password);
    $xPass = $Sql->real_escape_string($hash);


    $CheckUser = $Sql->query("SELECT Username FROM `users` WHERE `Username` = '".$sUser."'");
    $CheckPass = $Sql->query("SELECT Password FROM `users` WHERE `Username` = '".$sUser."'");
    $CheckActive = $Sql->query("SELECT Activated FROM `users` WHERE `Username` = '".$sUser."'");
    if ($CheckUser->num_rows == 0) { header("Location: /?p=Login&wrongusr=true"); die(); }
    $xCheckUser = $CheckUser->fetch_array(MYSQLI_ASSOC);
    $xCheckPass = $CheckPass->fetch_array(MYSQLI_ASSOC);
    $xCheckAct =  $CheckActive->fetch_array(MYSQLI_ASSOC);
    if ($xCheckAct['Activated'] == "false") { header("Location: /?p=Login&activate=true"); die(); }
    if(strtolower($Username) == strtolower($xCheckUser['Username'])) { // Check if username match
        if($hash == $xCheckPass['Password']) { // Check if password is correct
        if(isset($Remember)){
                setcookie ($Cookie."User", htmlspecialchars($Username));
                setcookie ($Cookie."Pass", $hash);
        }
        else
        {
                setcookie ($Cookie."User", htmlspecialchars($Username), time() + 3600);
                setcookie ($Cookie."Pass", $hash, time() + 3600);
        }
                header("Location: /?login=true"); // Send them to home page 
    }

    else
    {
        header("Location: /?p=Login&wrongpwd=true"); // Send them to home page 
    }
    header("Location: /?p=Login&unxer=true"); // Username error, Idk why
    }
?>

默认字符集和排序规则是latin1和latin1_swedish_ci,因此默认情况下非二进制字符串比较不区分大小写。这意味着,如果使用col_name(如“a%”)进行搜索,则会得到以a或a开头的所有列值

要使此搜索区分大小写,请确保其中一个操作数具有区分大小写或二进制排序规则。例如,如果要比较都具有拉丁字符集的列和字符串,可以使用COLLATE运算符使任一操作数具有拉丁1\u general\u cs或拉丁1\u bin排序规则


您只需使用latin1_general_cs或latin1_bin更改用户名和密码字段的排序规则,然后它就会相应地工作。

不要像这样使用Cookie,您应该检查@lucianie。错误是,当您登录时,它会记录您的inn,但它会重定向到登录页面,并出现一个无法接受的错误,再试一次。。我设置了,但没有成功登录到主页。您是否尝试使用var_dumpstrotlower$Username和var_dumpstrotlower$xCheckUser[Username]来查看它们不相等的原因?另外,为什么要执行3个查询而不是一个查询?选择用户名、密码,改为激活?$CheckUser=$Sql->QUERYSE从用户名为“.$sUser.”的用户中选择用户名;是绝对不必要的,您可以使用密码并检查是否激活,或者选择激活状态(如果您希望在同一查询中)。因此,您在3个查询中所做的一切都应该在一个查询中完成。这是mysql的一个非常糟糕的用法,因为代码是不必要的,而且很复杂,所以调试也很困难。另外,您确定激活的字段是字符串吗?我认为这是合乎逻辑的bool@icrew激活的字段是一个字符串,是的,我应该只使用一个查询而不是3个查询是。改进您的答案演示将为您赢得更多的选票