0

PHP の学習を始めたばかりで、単純なログイン ページを機能させるのに問題があります。このスクリプトを初めてロードすると、「間違ったパスワード/ユーザー名」というテキストが表示されます。およびログアウトボタンは印刷されますが、ログインフォームは印刷されません。なぜこのようなことが起こるのでしょうか? また、ログイン フォームとログアウト ボタンが期待どおりに連携するようにコードを変更するにはどうすればよいでしょうか?

<?php

if (isset($_POST['log_out'])) { // If the page was reloaded as a result of the user having clicked the logout button,
session_destroy(); // kill session.
}

session_start(); // Start a new session with

$_SESSION['user'] = 'foo'; // a static username, and
$_SESSION['pass'] = 'bar'; // a static password.
// If I insert $_SESSION['logged_in'] = 'false'; here to start things off, a blank alert box will be returned no matter from where on the page I alert() the value with JS. On the other hand, without this line the same alert will return "1" both here and further down in the script.

if (($_POST['username'] == $_SESSION['user']) && ($_POST['password'] == $_SESSION['pass'])) { // If the username and password filled in before the page reload match the static ones,
    $_SESSION['logged_in'] = true; // the user is logged in.
} else { // If there is no match ...
    echo 'Wrong password/username.';
}

include("head.php"); // HTML snippet with everything from the DOCTYPE to the opening BODY tag.

?>
            <div> // HTML interlude ...
<?php

// If the user is logged in, print out a logout button in HTML at the top of the page:

if (isset($_SESSION['logged_in']) && ($_SESSION['logged_in'] == true)) {
    echo '          <form action="index.php" method="post">';
    echo '            <input type="submit" name="log_out" value="Log out">';
    echo '          </form>';
}

?>
                <p>HTML interlude ...</p>

<?php

// If the user is not logged in, print out a login form in HTML at the bottom of the page:

if ($_SESSION['logged_in'] != true) {

    echo '            <form action="index.php" method="post">';
    echo '              <label for="username">Username</label><br>';
    echo '              <input type="text" name="username" id="username"><br>';
    echo '              <label for="password">Password</label><br>';
    echo '              <input type="text" name="password" id="password"><br>';
    echo '              <input type="submit" name="submit" id="submit" value="Log in">';
    echo '            </form>';

}

?>
            </div>
<?php include("footer.php"); ?>
4

4 に答える 4

1
if (($_POST['username'] == $_SESSION['user']) && ($_POST['password'] == $_SESSION['pass'])) { the static ones,
    $_SESSION['logged_in'] = true; // the user is logged in.
} else { 
    echo 'Wrong password/username.';
}

この部分は、ページが最初にロードされたときに「パスワード/ユーザー名が間違っています」と表示され$_POST['username']ます。

isset($_POST['username']) && isset($_POST['password'])両方のオプションに条件を追加します。そのようです:

if(isset($_POST['username']) && isset($_POST['password'])){
    if (($_POST['username'] == $_SESSION['user']) && ($_POST['password'] == $_SESSION['pass'])) { the static ones,
        $_SESSION['logged_in'] = true; // the user is logged in.
    } else { 
        echo 'Wrong password/username.';
    }
}

この方法では、ページが最初に読み込まれたときに何も評価されませんが、資格情報が投稿された場​​合にのみ評価されます。

于 2012-04-27T08:05:50.370 に答える
0

コードは問題ないように見えますが、実際には「学習中」の人にとってはよくできています。

コードに明らかな問題がないことを考えると (いくつかの粗いエッジ - ブール値を比較するときに「==」の代わりに「===」を使用することを検討する必要があります)、問題はおそらくセッションです。

試す...

print_r($_SESSION);

session_start() の直後; ログアウトボタンを表示するかどうかを選択する条件の前。

間違った値を投稿した場合だけでなく、パラメータをページに投稿しなかった場合にも、間違ったユーザー名メッセージが表示されます。これを試して:

if (($_POST['username'])
    && ($_POST['username'] == $_SESSION['user']) 
    && ($_POST['password'] == $_SESSION['pass'])) {

ところで、セッションはユーザー名とパスワードを保存するのに適したリポジトリではありません。現在のユーザーに固有のものです。マルチユーザーシステムの場合、これらは別のデータベースに保存されます。

if (($_POST['username']) && lookup($_POST['username'], $_POST['password'])) {
...
于 2012-04-27T08:07:26.127 に答える
0

スクリプトをデバッグすることで確認できます: 期待値を変数に保存し、出力します。次に例を示します。

$isLoggedIn = $_SESSION['logged_in']; # Give things a name! (always useful)
echo 'isLoggedIn: ', var_dump($isLoggedIn), "\n"; # debugging
if ($isLoggedIn != true) {

    echo '            <form action="index.php" method="post">';
    echo '              <label for="username">Username</label><br>';
    echo '              <input type="text" name="username" id="username"><br>';
    echo '              <label for="password">Password</label><br>';
    echo '              <input type="text" name="password" id="password"><br>';
    echo '              <input type="submit" name="submit" id="submit" value="Log in">';
    echo '            </form>';

}
于 2012-04-27T07:59:52.007 に答える
0

ページを初めてロードするとき、必要な投稿変数を渡さない限り、条件チェック

if (($_POST['username'] == $_SESSION['user']) && ($_POST['password'] == $_SESSION['pass']))

失敗するため、Wrong password/username.メッセージが表示されます。

于 2012-04-27T08:02:57.590 に答える