2012-07-28 47 views
0

用戶在我的網站上忘記密碼。 他們輸入用戶名,併發送一封電子郵件,其中包含帶有附加到重置頁面的URL的標記的鏈接。 當鏈接被點擊時,標記會被驗證是否存在併到期。 如果不錯,重置密碼錶單會顯示其他錯誤消息,然後重試。 一切都很好,在這裏。 當用戶輸入新密碼並點擊提交時,url的附加部分消失,只是常規頁面url在地址欄中。 重置密碼錶格只是坐在那裏空白。 因爲我使用$ _GET來檢索令牌和$ _POST來處理表單,這可能是我的問題嗎? 包括我的頁面代碼在這裏:經過令牌驗證重置表單不處理

<?php 
require_once ('functions.inc.php'); 
include("header.php"); 
require_once ('config.inc.php'); 
?> 
<body> 
<div data-role="page" id="resetpassword"> 
    <div data-role="header"> 
     <h1>Reset Password</h1> 
    </div> 
    <div data-role="content"> 
<?php 
$page_title = 'ResetPassword'; 
if ($_SERVER['REQUEST_METHOD'] == 'GET') { 
$tk = ($_GET['token']); 
$q1 = "SELECT uname, request_time FROM users WHERE token = '$tk'"; 
    $r1 = mysqli_query($dbconn,$q1)or die("Error: ".mysqli_error($dbconn)); 
    $row = mysqli_fetch_array($r1); 
    $user = $row['uname']; 
    $then = $row['request_time']; 
    //echo $then; 
    $now = time(); 
    //echo $now; 
    $expired = ($now - $then); 
    //echo $expired; 
    $num_rows = mysqli_num_rows($r1);  
    if ($num_rows !== 1 || $expired > 900){ 
    echo "An error has prevented a password change.<br />Most likely the link has  expired.<br />Please try again."; 
    ?> 
    </div> 
    <div data-role="footer" class="ui-bar"> 
    <a href="../index.php" data-role="button">Try Again</a> 
    </div><!-- /footer --> 
    </div> 
    <?php 
    exit(); 
}   
     if ($_SERVER['REQUEST_METHOD'] == 'POST') {   
     $trimmed = array_map('trim', $_POST); 
     if (preg_match ('/^[[:alnum:]]{8,20}$/', ($trimmed['password']))) { 
      $p = mysqli_real_escape_string($dbconn, ($trimmed['password'])); 
      // hash the password 
      require ("passhash.php"); 
      $pass_hash = PassHash::hash($p); 
      } else { 
      echo '<p>Please enter a valid password!</p>'; 
      } 
      if ($pass_hash) { 
      $q2 = "UPDATE `users` SET upass='$pass_hash' WHERE uname='$user'"; 
      $r2 = mysqli_query($dbconn, $q2)or die("Error: ".mysqli_error($dbconn)); 
      if ($r2 == TRUE) { 
      echo "<p>Password Changed!</p>"; 
      } 
      }    
?> 
</div><!-- /content --> 
    <div data-role="footer" class="ui-bar"> 
<a href="../index.php" data-role="button">Login</a> 
    </div><!-- /footer --> 
</div><!-- /page --> 
<?php 
} 
} 
?> 
<form id="passwordreset" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>?token=<?php echo $tk;?>" data-ajax="false"> 
<p>Choose a new password.<br /> 
Letters and numbers only.<br /> 
Minimum of 8 Maximum of 20 characters.</p> 
<label for="password" class="ui-hidden-accessible">New Password:</label> 
<input type="password" name="password" id="password" value="" placeholder="New Password"/> 
<button type="submit" name="submit" value="submit"/>Submit</button> 
</form> 
</div><!-- /content --> 
    <div data-role="footer" class="ui-bar"> 
    </div><!-- /footer --> 
</div><!-- /page --> 
</body> 
</html>    

回答

0

使用POST和GET,因爲它規定在這裏不會造成任何問題: Want to use both GET and POST methods

但是當表單發佈的數據,該帖子的網址還需要包含GET參數(令牌)。所以修改後的URL可以發送你需要的全部數據。

+0

對不起,我花了這麼久才找回來。感謝您的回覆和鏈接。我的表單現在有action =「<?php echo $ _SERVER ['PHP_SELF'];?>?token ='$ tk'」但仍不處理表單。 – 2012-07-29 10:36:35

+0

爲什麼不呢?解釋 – Samson 2012-07-30 07:07:50

+0

嗯,我不確定。當我輸入新密碼並單擊提交時,表格會再次出現,但它是空的。我檢查了我正在嘗試更新的數據庫,沒有發生任何變化。我的腳本的第一部分工作正常。我讓令牌過期,並顯示錯誤。如果我嘗試使用一個不存在的令牌,我會收到錯誤消息。就像它應該的那樣。這是新的密碼部分,只是不工作的更新。 – 2012-07-30 11:47:01