2012-11-06 210 views
0

我必須用我的PHP登錄腳本修復一些錯誤,當用戶使用大寫字母的帳戶時,它不會讓他登錄全部小寫,所以我決定解決,但是,它不會登錄,它只是重定向到登錄與我的消息「意外的錯誤發生」。登錄PHP腳本用戶名和密碼是正確的,但不會登錄

它通過用戶名檢查,但不是密碼,並且它不返回密碼是不正確的。

我試着做一個新的帳戶,它仍然進入該錯誤頁面,但是這一次,它實際上登錄了我,但沒有與您已成功登錄,並且現有用戶無法登錄,但是我做了一個新的。

而且我嘗試了密碼重置,它的工作原理,但不會導致成功登錄消息。

我做的其他更改是密碼散列,因爲我使用用戶名密碼鹽,而我從$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 
    } 
?> 
+0

而不是像這樣使用cookie,你應該檢查到[Sessions](http://www.php.net/manual/en/book.session.php) – h2ooooooo

+0

你有什麼錯誤嗎? – Bajrang

+0

@lucianie錯誤是,當你登錄時,它會記錄你的旅館,但它會重定向到登錄頁面,出現錯誤「發生了失敗的錯誤,請重試..」,我設置了,而不是成功登錄的主頁。 – Teknikk

回答

3

默認字符集和校對規則是latin1latin1_swedish_ci,所以非二進制字符串比較是區分默認情況下不區分大小寫。這意味着如果使用col_name LIKE 'a%'進行搜索,則會獲得以Aa開頭的所有列值。

要使此搜索大小寫敏感,請確保其中一個操作數具有區分大小寫或二進制排序規則。例如,如果要比較列和字符串均具有latin1字符集,則可以使用COLLATE運算符使任一操作數具有latin1_general_cslatin1_bin排序規則。

您只需要將UsernamePassword字段的排序規則更改爲latin1_general_cslatin1_bin,然後它就會相應地工作。

+0

改進您的答案演示文稿將爲您贏得更多選票 – dove

相關問題