1

これは課題ですが、私は研究のために多くのことをしましたが、壁に到達したような気がします。ユーザーがサインインできるページ(login.php)を作成する必要があります。サインインすると、インデックスページにリダイレクトされます。彼らがログインするためにクリックしたリンクは、ログアウトリンクに置き換える必要があります。

ただし、これらすべてに注意して、最初にセッション部分に入り、変数をエコーし​​て取得しましたが、セッション変数をログに記録した後に手動で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; 
   }

?>

index.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

3 に答える 3

2

実際、スクリプトはおそらく意図したものとは逆のことをします。

strcmp両方のパラメーターを比較しますが、ブール値を返しません。

最初に行うことは、その行を次のように変更することです。

if ($_REQUEST['email'] === $lineArray[2] && $_REQUEST['pwd'] === $lineArray[4]) {
于 2012-08-04T01:39:01.777 に答える
2

コードにいくつかのエラーが見つかりましたが、すべて同じポイントになります。他のデータの出力を開始した後は、カスタムヘッダーを送信できません。

どこでこれをしましたか?

ここ:

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を使用してユーザーの詳細をユーザー間で分割する必要があります。

したがって、2人のユーザーが含まれるテキストファイルは次のようになります。

{"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のために:

前と同じように、ユーザーがログインしていて、ステータスが変数にあるかどうかを確認します。

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キーを押すだけで)新しい行を作成したためです。\nJSONコードが無効になるため、回避する必要があります。この方法は、新しいユーザーを作成する必要があり、ユーザーごとに新しい行が必要な場合は、手動で作成する必要があることを意味します。

于 2012-08-04T03:12:56.960 に答える
1

まず第一に、何らかの出力が発生した後にヘッダーを送信しないでください。つまり、echo "<script>alert(' FOUND!')</script>";これを実行すると出力と見なされ、ヘッダーはPHPによって生成され、後でヘッダー行は無視されます。

最初に出力を送信せずにヘッダーを使用してみてください。これにより、リダイレクトの問題が修正されます。

セッション情報が消去される理由については、リダイレクトで次の行を試してください。

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

必須ではありませんが、試してみる価値はあります。

于 2012-08-04T01:47:54.920 に答える