2017-09-04 82 views
0

我有我的PHP文件重定向登錄時,檢查用戶數據的問題。頭重定向不工作,用戶檢查不更新SQL表

我認爲,問題可能出在if語句的login_check部分。我已檢查了其他部分,並且:

  • 包含db.php數據是正確的。
  • 當我沒有填寫其中一個字段時,用戶名/密碼if語句返回回顯。
  • 「用戶信息驗證數據庫」似乎是正確的,該表被稱爲「用戶」
  • 如果有意輸入錯誤的密碼,最後的else語句也會返回。
  • 我用Google搜索和三重檢查頭重定向語句,並相信它是正確的語法(我周圍飾)

我注意到該列「LAST_LOGIN」不會與現在更新()值。這就是爲什麼我認爲問題出現在這個領域,但我無法弄清楚。

PHP版本:30年6月5日

這裏是php文件:

<? 
    /* Check User Script */ 
    session_start(); // Start Session 

    include 'db.php'; 
    // Conver to simple variables 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    if((!$username) || (!$password)){ 
     echo "Please enter ALL of the information! <br />"; 
     include 'login_form.html'; 
     exit(); 
    } 

    // Convert password to md5 hash 
    $password = md5($password); 

    // check if the user info validates the db 
    $sql = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password' AND activated='1'"); 
    $login_check = mysql_num_rows($sql); 

    if($login_check > 0){ 
     while($row = mysql_fetch_array($sql)){ 
     foreach($row AS $key => $val){ 
      $$key = stripslashes($val); 
     } 
      // Register some session variables! 
      session_register('first_name'); 
      $_SESSION['first_name'] = $first_name; 
      session_register('last_name'); 
      $_SESSION['last_name'] = $last_name; 
      session_register('email_address'); 
      $_SESSION['email_address'] = $email_address; 
      session_register('special_user'); 
      $_SESSION['user_level'] = $user_level; 

      mysql_query("UPDATE users SET last_login=now() WHERE userid='$userid'"); 

      header("Location: login_success.php"); 
     } 
    } 

    else { 
     echo "You could not be logged in! Either the username and password do not match or you have not validated your membership!<br /> 
     Please try again!<br />"; 
     include 'login_form.html'; 
    } 
    ?> 

任何想法,將不勝感激。

+0

嘗試運行使用相同的用戶名和密碼,你已經試過登錄您的SQL查詢,看看是否有任何結果的話。 – Calimero

+1

您首先需要停止使用'mysql'它已被棄用切換到'mysqli_ *'或'PDO'並學習如何使用準備好的語句您的代碼是開放的,可以使用SQL注入來破解。 – Sand

+1

mysql的PHP擴展已經死了 - 停止使用mysql的PHP擴展。這是舊的,從PHP 5.5開始不推薦使用,並且在PHP 7.0中完全刪除。改用mysqli或PDO_mysql。並且不要混合他們 –

回答

0

我冒昧地更改了代碼,告訴你它是如何在PDO中完成的,並且在UPDATE聲明中也有變化。

注:Link來支持時區

<? 
    /* Check User Script */ 
    session_start(); // Start Session 

    include 'db.php'; 
    // Conver to simple variables 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    //Set time 
    date_default_timezone_set("America/Adak");//Set the correct time zone 
    $now = date("Y-m-d H:i:s"); 

    if((!$username) || (!$password)){ 
     echo "Please enter ALL of the information! <br />"; 
     include 'login_form.html'; 
     exit(); 
    } 

    // Convert password to md5 hash 
    $password = md5($password); 

    // check if the user info validates the db 
    $sql = ("SELECT * FROM users WHERE username=:username AND password= :password AND activated='1'"); 
    $login_check = $dbConnect -> prepare($sql); 
    $login_check -> bindParam(':username',$username); 
    $login_check -> bindParam(':password',$password); 
    $login_check -> execute(); 

    $rowCount = $login_check -> rowCount(); 

    if($rowCount > 0){ 
     while($row = $login_check -> fetch(PDO::FETCH_ASSOC)){ 
     foreach($row AS $key => $val){ 
      $$key = stripslashes($val); 
     } 
      // Register some session variables! 
      $_SESSION['first_name'] = $first_name;    
      $_SESSION['last_name'] = $last_name; 
      $_SESSION['email_address'] = $email_address; 
      $_SESSION['user_level'] = $user_level; 

      $upstmt=("UPDATE users SET last_login=:now WHERE userid= :userid"); 
      $query = $dbConnect -> prepare($upstmet); 
      $query -> bindPara(':userid', $userid); 
      $query -> bindPara(':now', $now); 
      $query -> execute(); 

      header("Location: login_success.php"); 
     } 
    } 

    else { 
     echo "You could not be logged in! Either the username and password do not match or you have not validated your membership!<br /> 
     Please try again!<br />"; 
     include 'login_form.html'; 
    } 
    ?> 
+0

由於在date()調用中使用「」,這將產生語法錯誤。您也只使用PDO更新了其中一個查詢。另一個仍在使用mysql_。 while循環將無法工作,因爲它依賴於mysql_ still。 – ADyson

+0

好的,這樣更好。但爲什麼「now()」需要更改爲「date()」調用?除非last_login是一個字符串字段,但即使如此,它應該只是將字符串版本的日期轉儲到字段中。但我們不知道。此外,代碼將嘗試使用MySQL日期函數,而不是PHP版本,並且它是無效的用法,因爲它不接受任何參數,並且還會生成沒有時間分量的輸出。我認爲,如果你使用它,它需要在引號之外並與'.'連接。 – ADyson

+1

是的,你是對的我沒有想到它會改變那個thx。 – Sand

0

快速更新,當我刪除4了session_register()的列表;行:

// Register some session variables! 
      **session_register('first_name');** 
      $_SESSION['first_name'] = $first_name; 
      **session_register('last_name');** 
      $_SESSION['last_name'] = $last_name; 
      **session_register('email_address');** 
      $_SESSION['email_address'] = $email_address; 
      **session_register('special_user');** 
      $_SESSION['user_level'] = $user_level; 

(該文件的名稱)的checkuser.php腳本運行,然後重定向我到login_success.php頁面。這是session_register('');導致它由於折舊。運行後,它更新了表'用戶'中需要更新的內容(last_login數據)。

不過,我應該在我的文件,並更新到mysqli的