登录PHP脚本用户名和密码正确,但不会登录
我不得不用我的PHP登录脚本修复一些错误,当用户使用大写字母创建帐户时,它不会让他使用所有小写字母登录,因此我决定修复这些错误,但是,它不会登录,它只是重定向到登录,并显示我的消息意外错误发生 它会通过用户名检查,但不会返回密码,并且不会返回密码错误 我尝试创建一个新帐户,但它仍然会转到那个错误页面,但这次,它实际上让我登录了,但并没有使用您已成功登录的帐户,并且现有用户无法登录,但我创建的新帐户做到了 我确实尝试了密码重置,它可以工作,但不会导致成功登录消息 我做的另一个更改是对密码进行哈希处理,因为我使用用户名密码Salt,我从$hash=hash'sha256',$username.$Password.$Salt;到$hash=hash'sha256',strtolower$Username.$Password.$Salt;因为,当用户名是大写或小写时,它会影响密码检查 我的代码:登录PHP脚本用户名和密码正确,但不会登录,php,login,Php,Login,我不得不用我的PHP登录脚本修复一些错误,当用户使用大写字母创建帐户时,它不会让他使用所有小写字母登录,因此我决定修复这些错误,但是,它不会登录,它只是重定向到登录,并显示我的消息意外错误发生 它会通过用户名检查,但不会返回密码,并且不会返回密码错误 我尝试创建一个新帐户,但它仍然会转到那个错误页面,但这次,它实际上让我登录了,但并没有使用您已成功登录的帐户,并且现有用户无法登录,但我创建的新帐户做到了 我确实尝试了密码重置,它可以工作,但不会导致成功登录消息 我做的另一个更改是对密码进行哈希处
<?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个查询是。改进您的答案演示将为您赢得更多的选票