2012-08-04 94 views
1

這是一個任務,但香港專業教育學院做了很多對我的部分研究,但我覺得香港專業教育學院達成了牆。我需要創建一個用戶可以登錄的頁面(login.php),登錄後他們被重定向到索引頁面。他們點擊登錄的鏈接應該用註銷鏈接替換。創建一個簡單的PHP登錄/註銷系統

然而,所有這些指出,第一件事我先進入會議部分和ive呼應變量和檢索他們,但它不做重定向到index.php也當我手動點擊後index.php後記錄會話變量是空的。我在這裏做錯了什麼?

,所以這是在我的login.php PHP代碼

  $found = false; 
      //read the read.txt until the end of file 
      while(!feof($inputFile) && $found == false) 
      { 

      $line = fgets($inputFile); 
      // replace the special charater within the lines by there proper entity code 
      $lineArray = preg_split("/\,/", (string)$line); 

      if(strcmp($_REQUEST['email'],$lineArray[2]) && strcmp($_REQUEST['pwd'],$lineArray[4])) 
      { 
         $found = true; 
         echo "<script>alert(' FOUND!')</script>"; 
         session_start(); 
         $myuseremail=$_REQUEST['email']; 
         $mypassword= $_REQUEST['pwd']; 

         $_SESSION['login_email']=$myuseremail; 
         $_SESSION['login_pwd']=$mypassword; 
         setcookie("login_email", $_SESSION['login_email'], time()+60*60*24); 
         setcookie("login_pwd", $_SESSION['login_pwd'], time()+60*60*24); 
         header('Location:index.php'); 
      } 
      } 
      fclose($inputFile); 

,然後在我的index.php我包含我的HTML

<?php 

     session_start(); 
    if(isset($_SESSION['login_email']) && isset($_SESSION['login_pwd'])) 
    { 
    $user_check=true; 
    echo $_SESSION['login_email']; 
    } 
    else 
    { 
    $user_check=false; 
    } 

?> 

在索引中的身體在這之前的代碼。 PHP的我也有這個代碼排隊爲我的鏈接

 <li><a href="index.php">Home</a></li> 
<li><a href="register.php">Register</a></li> 

<?php 

if ($user_check){ 
       print "<li><a href='logout.php'>Logout</a></li>"; 
} 
else{ 
print "<li><a href='login.php'>Login</a></li>"; 
} 
?> 
      <li><a href="#"> Link 4</a></li> 
+4

哦。禮包。以明文cookie存儲密碼/用戶名。這是安全的... – 2012-08-04 00:41:26

+0

@MarcB是的好事你注意到了,但就像我之前說過的一個任務,它需要一個txt文件而不是數據庫。如果需要,我不會在txt中完成它。 – KSM 2012-08-04 00:51:20

+0

@JohnConde如果有人回答我很樂意接受他們。 – KSM 2012-08-04 00:58:35

回答

3

我在代碼中發現了一些錯誤,所有的問題都回到了相同的地步:你開始輸出其他數據後,你不能發送任何自定義頭文件

你上哪兒去這樣做呢?

這裏:

echo "<script>alert(' FOUND!')</script>"; 
session_start();//session_start() sends a cookie to the clients machine. 
//How are cookies sent to clients browsers? Through headers. 

在這裏:

setcookie("login_email", $_SESSION['login_email'], time()+60*60*24); 
setcookie("login_pwd", $_SESSION['login_pwd'], time()+60*60*24); 
header('Location:index.php'); 

就個人而言,我覺得你的代碼是一個完整的混亂。因爲我沒有更好的辦法可做,所以我會重新寫給你,在我走的時候解釋每一步。

讓我們開始吧:

所以,你想工作的第一件事就是你的文本文件,其中存儲了所有用戶的詳細信息。

我們應該使用JSON將用戶的詳細信息(從用戶到用戶)分開,而不是使用普通線或其他方式。

所以這裏的文本文件將會是什麼樣兩個用戶在它:

{"navnav":{"username":"navnav","pass":"deb1536f480475f7d593219aa1afd74c"},"user2":{"username":"user2","pass":"deb1536f480475f7d593219aa1afd74c"}} 

通知我怎麼也使用的用戶名作爲鍵也和我是如何散列密碼。所以我們把這個文件叫做user.txt並將其存儲在安全的地方。

現在,對於登錄頁面,我們只需通過POST方法獲取數據,比較它,設置會話並告訴用戶去別的地方(重定向它們)。

session_start();//need to start our session first, of course 

//check if any login data has been posted our way 
if (isset($_POST['login']) && !empty($_POST['username']) && !empty($_POST['password'])) 
{ 

//assign input data to temp vars 
$username = $_POST['username']; 
$password = md5($_POST['password']);//notice how I hash the password 

// get the data fro the text file 
$userData = file_get_contents('path to your text file'); 

//decode the json data to an assoc array 
$userData = json_decode($userData , true); 

//check if the user exists 
if (array_key_exists($username , $userData) === false) 
{ 

echo 'the username '.$username.' is invalid.';//notify the user 
exit();//bye bye 

}//end of user does not exist 

//so now we know the user name exists (because we've got to this line) 
//we shall compare with the password 

if ($userData['$username']['password'] !== $password) 
{ 

echo 'Your password is incorrect';//notify the user 
exit();//bye bye 


}//end of incorrect password 
else 
{ 

//time to set sessions and stuff 
$_SESSION['username'] = $username; 
$_SESSION['password'] = $password; 

//send the redirect header 
header('Location: index.php'); 
exit(); 

}//end of password is correct 


}//end of login data has been sent 

這就是您的所有登錄代碼,但您需要正確設置html表單才能正確使用正確的名稱進行發佈。所以使用這種HTML格式:

<form action="login.php" method="post" name="login" target="_self" id="login"> 
    <p> 
    <label for="username">Username</label> 
    <input type="text" name="username" id="username" /> 
    </p> 
    <p> 
    <label for="password">Password</label> 
    <input type="text" name="password" id="password" /> 
    </p> 
</form> 

這就是您的登錄頁面完全排序。

現在你的index.php:

像之前,檢查用戶登錄和扔狀態在VAR:

session_start();//resume your session (if there is one) or start a new one 

//set default user status 
$userStatus = false; 

if (isset($_SESSION['username']) && isset($_SESSION['password'])) 
{ 

$userStatus = true; 

}//end of user is logged in 

爲了您的HTML登錄/註銷:

<li><a href="index.php">Home</a></li> 
<li><a href="register.php">Register</a></li> 

<?php 
if ($userStatus === true){ 
echo "<li><a href='logout.php'>Logout</a></li>"; 
} 
else{ 
echo "<li><a href='login.php'>Login</a></li>"; 
} 
?> 
<li><a href="#"> Link 4</a></li> 

而你有它。

讓我知道你是否有任何問題。

一兩件事:

這是從安全的。爲什麼?您正在使用文本文件,您正在使用文本文件並且正在使用文本文件。

編輯:

要由用戶分開JSON數據,只需手動編輯文本文件(見我的評論)。

或者你可以粘貼到您的文本文件:

{"navnav":{"username":"navnav","pass":"deb1536f480475f7d593219aa1afd74c"}, 
"user2":{"username":"user2","pass":"deb1536f480475f7d593219aa1afd74c"}} 

看怎麼有上面沒有\n?因爲我剛剛手動創建了一個新行(只需按Enter鍵)。 \n將使JSON代碼無效,所以這就是爲什麼你應該避免它。這種方法只是意味着如果您必須創建新用戶,並且您需要爲每個用戶創建一個新行,那麼您必須手動完成。

+0

感謝您的建議我去,現在試試這個! – KSM 2012-08-04 13:09:44

+0

但是分配是基於一個txt文件,也順便你做的JSON,即時通訊如果適用不知道,對於其書面「打開一個文本文件,members.txt和寫的所有用戶 註冊信息到分配部分該文件(格式取決於你),應該可以進行多次註冊,並且每個新註冊應該用空行分開。「可以將JSON格式化爲用戶新行嗎? – KSM 2012-08-04 13:37:20

+0

如果它說「格式取決於你」,那麼不要擔心,它應該沒問題。 – 2012-08-04 21:26:15

2

其實你的腳本與你可能相反意在:

strcmp並比較這兩個參數,但它不返回一個布爾值。

做「第一件事d爲改變這一行:

if ($_REQUEST['email'] === $lineArray[2] && $_REQUEST['pwd'] === $lineArray[4]) { 
+0

嘿拉爾斯我本來的代碼,但是上面這不是比較它我想它也順便說一下,一旦我改變了==到strcmp提到的線它檢查了值。 – KSM 2012-08-04 02:00:01

1

首先,從來沒有送頭髮生一些輸出後,也就是當你做echo "<script>alert(' FOUND!')</script>";這被視爲輸出和一個頭將由PHP生成,稍後您的標題行將被忽略。

嘗試使用報頭沒有任何輸出第一被髮送,這樣就可以解決問題重定向。

至於爲什麼會話信息被擦除,請嘗試以下行重定向:

header('Location:index.php?'.SID); 

它不應該要求,但它值得給它一個鏡頭。

+0

嘿馬什,我改變了我的代碼到以下,但沒有工作。我刪除了回聲並放置了給定的代碼行。 – KSM 2012-08-04 01:53:54

+0

請結合這個答案和我的。 strcmp在平等時返回0,所以在你的情況下,用戶應該只能在他們的憑證**錯誤的情況下才能使用**! – 2012-08-04 02:03:45

+0

@LarsKnickrehm我重新放置的行你現在給我,當我把正確的密碼和正確的電子郵件似乎並沒有走,如果,我還放着「打印」內,既$ _REQUEST和$ lineArray包含相同值。這是怎麼回事? – KSM 2012-08-04 02:19:30