2014-02-11 35 views
1

我目前正在PHP中創建登錄腳本。當用戶在短時間內嘗試登錄< 5次時,帳戶會暫時被鎖定,用戶會收到一封電子郵件,以便立即重新激活帳戶。這一切都正常工作,用戶無法登錄,數據庫更新和電子郵件發送。然後,當我嘗試第二次用第二封或第三封電子郵件完成同樣的事情時,數據庫根本不會更新。讓它爲下一封電子郵件工作的唯一方法是刪除從數據庫中第一封電子郵件創建的所有值。數據庫不更新第二次與mysqli

這裏是登錄PHP文件中的相關代碼。

<?php 
include_once 'db_connect.php'; 
include_once 'functions.php'; 

...

} elseif (login($email, $password, $mysqli) == 2) 
     $theid = getId($email, $mysqli); /// this is a function that get´s id based on email located in functions.php 
     if ($stmt = $mysqli->prepare("SELECT emailSent FROM login_attempts WHERE user_id = ? LIMIT 1")) 
     { 
      $stmt->bind_param('i', $theid);     
      $stmt->execute();  
      $stmt->bind_result($skickat); 
      $stmt->fetch(); 
      $stmt->close(); 
      if ($skickat == '0') /// email sent 
      { 
       $thehash = md5(rand(0,10000)); /// Just a random md5 hash for reactivation 
       $emailsent = 1; 
       if ($insert_stmt = $mysqli->prepare("UPDATE `secure_login`.`login_attempts` SET `ResetHash` = ?, `emailSent` = ? WHERE `login_attempts`.`user_id` = ?")) { 
        $insert_stmt->bind_param('sss', $thehash, $emailsent, $theid); 
        if (! $insert_stmt->execute()) { 
         header('Location: ../error.php?err=Registration failure: INSERT'); 
         exit(); 
        } 
       } 
       else { 
        header('Location: ../error.php?err=Registration failure: INSERT'); 
        exit(); 
       } 
      else /// alread sent, we already sent email. Show error that decribe email is sent and it´s locked 
      {   
       $_SESSION['lgnerror']= '<p class="error">Error 2</p>'; 
       header('Location: ../login.php'); 
       exit(); 
      } 
/// Email code starts from here 
$_SESSION['lgnerror']= '<p class="error">Error 1</p>'; 

這裏是位於functions.php的

function getId($email, $mysqli) 
{ 
    if ($stmt = $mysqli->prepare("SELECT id FROM members WHERE email = ? LIMIT 1")) 
    { 
     $stmt->bind_param('i', $email);     
     $stmt->execute();  
     $stmt->bind_result($resultat); 
     $stmt->fetch(); 
     $stmt->close(); 
     return $resultat; 
    } 
    else 
    {   
     // Could not create a prepared statement   
     header("Location: ../error.php?err=Database error: cannot prepare statement");   
     exit();  
    } 
} 

的功能的getId爲什麼代碼只對第一個電子郵件工作,而不是當你嘗試第二次?我認爲這個錯誤出現在上面提供的代碼中,如果需要的話只是評論,我會提供更多的代碼。

上測試的代碼顯示$ _SESSION [「lgnerror」]「錯誤2」在第5 +嘗試時,它schould顯示「錯誤1」五號attemt。這表明$ skickat!='0',即使數據庫指示emailSent =='0'爲第二個電子郵件ID。我認爲這個錯誤可能是因爲用戶ID沒有更新,所以它只是檢查第一個電子郵件ID =='1'。我仍然是PHP和Mysqli的初學者,所以這可能不是錯誤,所以請大家看看,讓我知道你的想法。你認爲這個錯誤是什麼?我怎樣才能解決這個問題,這樣我就可以使用這個賬戶來獲得更多的賬戶,而且最好能夠保證準備好的賬單?

回答

1

林不知道,但我覺得你有一個錯誤在這裏。

在功能getId你做的電子郵件的bind_param爲整數,它應該是一個字符串。

它應該是這樣的:

function getId($email, $mysqli) 
{ 
    if ($stmt = $mysqli->prepare("SELECT id FROM members WHERE email = ? LIMIT 1")) 
    { 
     $stmt->bind_param('s', $email);     
     $stmt->execute();  
     $stmt->bind_result($resultat); 
     $stmt->fetch(); 
     $stmt->close(); 
     return $resultat; 
    } 
    else 
    {   
     // Could not create a prepared statement   
     header("Location: ../error.php?err=Database error: cannot prepare statement");   
     exit();  
    } 
} 
+0

謝謝,這就是問題所在。現在它正在工作! :) – user3297181