2010-09-15 95 views
0

我有一個登錄表單從數據庫中抓取散列密碼問題。如果「提交檢查」<input type="hidden">等於1(下面的示例將更好地解釋這一點),則顯示頁面內容,如果不等於1,則顯示登錄表單。形式如下:

<div id="login" style="<?php echo $style ?>"> //$style is by default "visibility:visible;" but will change to "visibility:hidden;" when correct login info is given 
<p>Log in</p> 
<form method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>"> 
<input type="text" id ="username" name="username" value="Username" onfocus="if (this.value == 'Username') this.value=''"> 
<input type="password" id="password" name="password" value="passpass" onfocus="if (this.value == 'passpass') this.value=''"> 
<br> 
<input type="submit" name="submit" value="Log Ind"> 
<input type="hidden" name="_submit_check" value="1"> //Submit checker. if set, process login information 
</form> 
</div> 
<p>No user? Make one <a href="register.php">here.</a></p> 
</div> 

這與我的PHP示例很好,但有一個小煩人的事情......你必須登錄每一個簡單的時間你查看頁面。因此,我在我的PHP腳本這樣做:

<?php 

    session_start(); 

    $db = DB::connect('mysql://username:[email protected]/database'); 
    if (DB::isError($db)){ 
     die("Can't connect: " . $db->getMessage()); 
    } 
$style = "visibility:visible;"; 

$passwordHash = sha1($_POST['password']); 
$_SESSION['login'] = $_POST['_submit_check']; //This is the submit checker I mentioned before 

$sql = 'SELECT username FROM user WHERE username = ? AND passwordHash = ?'; 
$result = $db->query($sql, array($_POST['username'], $passwordHash)); 
if ($_SESSION['login'] == 1) { 
    if ($result->numRows() < 1) 
    { 
     echo '<p>Correct your username and password please</p>'; 
    } 
    else { 
     $style = "visibility: hidden;"; 
     echo '<p>This is the page content</p>'; 
    } 
} 
?> 

如若不是我添加$ _ POST [「_ submit_check」]值到$ _SESSION []變量稱爲「登錄」使用戶只需要對事實每24分鐘登錄一次?這就是我想要的,但它沒有發生......

我希望你明白我的問題,如果沒有,留下什麼你不明白的註釋。我很難在這個問題上解釋我的想法;)

回答

2

要覆蓋$_SESSION['login']每一項要求,因爲你不檢查,如果它真的設定分配$ _ POST值。

if(isset($_POST['_check_submit'])) { 
    $_SESSION['login'] = $_POST['_check_submit']; 
} 
+0

仍然沒有工作,但...同樣的輸出作爲前:它記錄的,當我去到另一個網頁和背部,都再次登錄:(如果我得到它的權利,存儲會話變量裏面的字符串/變量中的所有頁面訪問(與在session_start()),在接下來的24分鐘(默認情況下)吧? – Latze 2010-09-15 09:04:12

+0

嗯,因爲你需要用戶名和密碼POST'ed每一個請求,你應該重新考慮你的身份驗證系統 – halfdan 2010-09-15 09:07:31

+0

好的,謝謝。 – Latze 2010-09-15 09:09:42

1

我不是100%確定,因爲沒有給出其他代碼,但你似乎錯過了啓動或加載會話所需的session_start()調用。可悲的是$_SESSION不足以代表你開始會議。沒有這個調用,$_SESSION將在每個腳本的開始處爲空,並且永遠不會初始化爲會話數據。

話雖如此,假設您有足夠的控制來改變這一點,那麼可以配置PHP爲每個腳本自動啓動會話,使用php.ini指令session.auto_start

+0

此外,halfdan有一個很好的觀點,我錯過了! – DMI 2010-09-15 08:57:43

+0

將在session_start()是第一個樣品中:)不知道爲什麼,移動它...... – Latze 2010-09-15 09:04:48