-3
<?php
    session_start();
    $root = 'root';
    mysql_connect('localhost',$root,'') or die(mysql_error()); 
    mysql_select_db("test_create_database") or die(mysql_error()); 

    $result = mysql_query("SELECT * FROM members");
    $row = mysql_fetch_assoc($result);


    $username="";
    $password="";
    $id="";

    if(isset($_POST["submit"]))
    {
        if(isset($_POST["submit"]) && !empty($_POST["username"]) && !empty($_POST["password"]) && !empty($_POST["id"]))
        {
            if(isset($_POST["username"]) && isset($_POST["password"]) && isset($_POST["id"]))
            {   $username = $row["username"];
                $password = $row["password"];
                $id       = $row["id"];
                if($username == "John" && $password =="1234" && $id =="1")
                {
                    echo "you're in";
                }
                else
                {
                    echo "you're out!";
                }
            }
        }
        elseif (isset($_POST["submit"]) && (empty($_POST["username"]) || empty($_POST["password"]) || empty($_POST["id"])))
        {
                echo "enter all fields please!!!!";
        }

    }
    session_destroy();
?>

最初にすべてのフィールドが正しく入力され、送信ボタンが押されると、「あなたがいる」というテキストが Web ページに印刷され、フィールド内のテキストが消えます。しかし、ページを再度更新すると、session_destroy() 関数を呼び出したにもかかわらず、印刷されたテキスト「you're in」が残ります。セッションが破棄されなかった理由がわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

2

session_start()およびに関するビットsession_destroy()は、POST 変数に影響を与えません。BugFinder が指摘したように、ページを更新すると、送信したばかりのデータが再送信されることがよくあります。そのため、'you're in' というメッセージが再び表示されます。

この動作を防ぐ方法は、送信されたデータが処理された後にリダイレクトすることです。次に、セッション変数を設定して、まだ表示する必要があるメッセージ (または、ユーザーがログインしているかどうか) を追跡できます。

コードは次のようになります。

<?php
    session_start();
    $root = 'root';
    mysql_connect('localhost',$root,'') or die(mysql_error()); 
    mysql_select_db("test_create_database") or die(mysql_error()); 

    $result = mysql_query("SELECT * FROM members");
    $row = mysql_fetch_assoc($result);

    $username="";
    $password="";
    $id="";

    if(isset($_POST["submit"]))
    {
        if(isset($_POST["submit"]) && !empty($_POST["username"]) && !empty($_POST["password"]) && !empty($_POST["id"]))
        {
            if(isset($_POST["username"]) && isset($_POST["password"]) && isset($_POST["id"]))
            {   $username = $row["username"];
                $password = $row["password"];
                $id       = $row["id"];
                if($username == "John" && $password =="1234" && $id =="1")
                {
                    //do stuff
                    $_SESSION['message'] = "you're in";
                }
                else
                {
                    $_SESSION['message'] = "you're out!";
                }
            }
        }
        elseif (isset($_POST["submit"]) && (empty($_POST["username"]) || empty($_POST["password"]) || empty($_POST["id"])))
        {
                $_SESSION['message'] = "enter all fields please!!!!";
        }
        $selfLink = $_SERVER['PHP_SELF'];
        if (isset($_SERVER['QUERY_STRING'])) { 
            $selfLink .= "?" . $_SERVER['QUERY_STRING']; 
        }
        header('location: '.$selfLink);
        exit;
    }

    if (isset($_SESSION['message'])) {
        echo $_SESSION['message'];
        unset($_SESSION['message']);
    }
?>

ページ自体へのリダイレクトは少し強制されているように見えることに注意してください ($_SERVER['QUERY_STRING']現在のページの場所を取得するために使用します)。ファイル名がわかっている場合や、フォーム入力を処理した後に別のページにリダイレクトする場合は、より直感的に機能します。

于 2012-10-08T14:56:29.840 に答える
0

isset($ _ POST ["submit"])elseifでこのチェックを削除します。

フォームを送信し、ページの明示的な更新を行った後、$ _ POST ["submit"]が設定されますが、手動でそのページに移動すると、$ _POST["submit"]は設定されません。

于 2012-10-08T14:36:51.927 に答える