2010-09-19 73 views
1

我有一個非常簡單的登錄腳本,使用PHP的會話來限制訪問,但我有一個非常奇怪的問題。即使使用正確的憑證,登錄始終在第一次嘗試時失敗,但第二次和後續嘗試沒有問題。我真的很困惑,所以任何幫助,將不勝感激。PHP登錄需要兩次嘗試才能工作

登錄表單,去掉不相關的代碼(是的,我知道,存儲PHP文件作爲純文本內登錄的東西通常是一個壞主意,但它不是有關在這種情況下):

<?php 

$username = $_POST['username']; 
$password = $_POST['password']; 

$valid_user = "user"; 
$valid_password = "password"; 


if (($_POST['op'] == "ds") && ($username == $valid_user) && ($password == $valid_password)) { 
    session_start(); 
    session_register('valid'); 
    $_SESSION['valid'] = 'yes'; 
    header("Location: valid.php"); 
} 

?> 

<p>Username:<br> 
<input type="text" name="username" size=15 maxlength=25></p> 
<p>Password:</strong><br> 
<input type="password" name="password" size=15 maxlength=25></p> 
<input type="hidden" name="op" value="ds"> 
<p><input type="submit" name="submit" value="login"></p> 

和每個需要authenications頁面有

require "auth.php" 

auth.php:

<?php 

session_start(); 

if($_SESSION['valid'] != 'yes') { 
    header("Location: login.php"); 
} 

?> 
+1

請勿使用'session_register('valid');'。這隻會告訴php將'$ valid'的值放入'$ _SESSION ['valid']'中,但是無論如何你都是這樣做的(這也是它應該如何完成的)。 – poke 2010-09-19 19:08:23

回答

3

嘗試die()

header("Location: valid.php"); 

這可能是因爲該被忽略,因爲你輸出的登錄表單到瀏覽器隨即。

另外,die()是強制性的後

標題( 「位置:login.php中」);

如果您的腳本輸出任何後面的內容。否則,請求客戶端即使未登錄也可能收到敏感信息。

+0

不幸的是,這些修復程序似乎都不起作用。問題似乎是$ _SESSION ['valid']變量無法正確設置,因爲如果我刪除「header(」Location:login.php「)」並嘗試echo $ valid,它會輸出一個空行。 – sslepian 2010-09-19 19:40:32

+0

@sslepian是否可以將'session_start'放入所有腳本的頭部分? – 2010-09-19 19:43:32

+0

顯然,將session_start移出if語句並移入登錄表單的頂部可以解決問題。謝謝! – sslepian 2010-09-19 19:53:31