2

Webサイトの「メンバー」部分で作業しているWebサイトの非常に基本的なユーザーログインインターフェイスを作成しています。情報を格納するために$_SESSION変数に使用しています。['access']は、ユーザーがアクセスを許可されているかどうかに関するブール値を格納します。['invalid']は、ユーザー名/パスワードが一致しない場合はtrue(エラー処理の場合)、['no_attempt']はtrueの場合はtrueです。ユーザーがログインせずに制限されたページにアクセスしようとすると、['uri']はログインせずにアクセスしようとしたページのURIを保存します。

これまでのページのコーディング方法では、['no_attempt']がtrueの場合にエラーメッセージが表示されないことを除いて、すべてが機能します。以下は私のページからの抜粋です。

login.php

session_start();
if(md5($_POST['username']) === '[username hash]' && md5($_POST['password']) === '[password hash]') {
    // allow access to members pages    
    $_SESSION['login']['allow'] = true;

    // clear error messages
    $_SESSION['login']['invalid'] = false;
    $_SESSION['login']['no_attempt'] = false;

    // if a url hasn't been stored for redirect, direct to the members home page
    if (!isset($_SESSION['login']['redirect']) || empty($_SESSION['login']['redirect'])) $_SESSION['login']['redirect'] = '/members';
    header("Location: {$_SESSION['login']['redirect']}");
}
else {
    $_SESSION['login']['invalid'] = true;
    header('Location: /');
}

制限された各ページの先頭は、次のコードで始まります。

session_start();
if($_SESSION['login']['allow'] != true) {
    $_SESSION['login']['redirect'] = $_SERVER['REQUEST_URI'];
    $_SESSION['login']['no_attempt'] = true;
    header('Location: /');
}
require ('../assets/includes/site-header.php');

site-header.php
このページは、私のWebサイトの各ページの先頭にあります。タイトルやナビゲーションバーなどがあります。以下は、サイドバーのメンバーログイン部分のみです。

if(isset($_SESSION['login']['allow']) && $_SESSION['login']['allow'] == true) {
    echo "<li><a href=\"/members\" id=\"members\">Members</a></li>\n";
}
else {
    echo "<li>\n";
    echo "<div class=\"expandable\">Members <span class=\"show-hide\">+</span></div>\n";
    echo "<div class=\"nav-details\">\n";
    if (isset($_SESSION['login']['invalid']) && $_SESSION['login']['invalid'] == true) {
        echo "<div id=\"login-error\">The username or password you<br />entered was incorrect.</div>\n";                                    
    }
    elseif (isset($_SESSION['login']['no_attempt']) && $_SESSION['login']['no_attempt'] == true) {
        echo "<div id=\"login-error\">You must login before<br />accessing that page.</div>\n";
    }
    echo "<form method=\"post\" action=\"/members/login.php\" id=\"login-form\">\n";
    echo "Username:<br />\n";
    echo "<input type=\"text\" name=\"username\" /><br /><br />\n";
    echo "Password:<br />\n";
    echo "<input type=\"password\" name=\"password\" /><br /><br />\n";
    echo "<input type=\"submit\" value=\"Login\" id=\"login-button\" />\n";
    echo "</form>\n";
    echo "</div>\n";
    echo "</li>\n";
}
$_SESSION['login']['invalid'] = false;
$_SESSION['login']['no_attempt'] = false;
4

2 に答える 2

0

私はついに私の問題を解決することができました!エラーは、制限されたすべてのページの上部に含めていたコードのスニペットにありました。私が変更され:

session_start();
if($_SESSION['login']['allow'] != true) {
    $_SESSION['login']['redirect'] = $_SERVER['REQUEST_URI'];
    $_SESSION['login']['no_attempt'] = true;
    header('Location: /');
}
require ('../assets/includes/site-header.php');

これに:

session_start();
if($_SESSION['login']['allow'] != true) {
    $_SESSION['login']['redirect'] = $_SERVER['REQUEST_URI'];
    $_SESSION['login']['no_attempt'] = true;
    header('Location: /');
}
else {
    require ('../assets/includes/site-header.php');
}

$_SESSION['login']['invalid'] = false; $_SESSION['login']['no_attempt'] = false;これは、site-header.phpでの設定と関係があると思います。私はまだphpの初心者ですが、site-header.phpのphpコードは、ページがページをリダイレクトする前に必要だったために処理されたとheader('Location: /');思います。これが私の問題が修正された理由であるかどうかを誰かが知っている場合は、またはそれが何か他のものであったなら、私はそれを聞いてうれしいです!

于 2013-02-07T20:09:42.977 に答える
-1

コードのこのセクションを分離します...

   elseif (isset($_SESSION['login']['no_attempt']) && $_SESSION['login']['no_attempt'] == true) {
    echo "<div id=\"login-error\">You must login before<br />accessing that page.</div>\n";
}

次へ...

    elseif(isset($_SESSION['login']['no_attempt'])
    {
        if($_SESSION['login']['no_attempt'] === true)
          {
                echo "<div id=\"login-error\">You must login before<br />accessing that page.</div>\n";
          }
    }

それが機能するかどうかを確認します。'==='演算子を使用したことに注意してください...これにより、'同一'であることが保証されます

于 2013-02-02T23:56:10.377 に答える