【问题标题】:Text posted by 'echo' function still persists when refresh button is pressed.-- PHP按下刷新按钮时,'echo' 函数发布的文本仍然存在。-- PHP
【发布时间】:2012-10-08 14:31:04
【问题描述】:
<?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();
?>

如果首先正确填写了所有字段并按下了提交按钮,则网页上会打印“you're in”文本,并且字段中的文本会消失。但是如果我再次刷新页面,即使我调用了 session_destroy() 函数,“你在里面”的打印文本仍然存在。我不明白为什么会话没有被破坏。任何帮助将不胜感激。

【问题讨论】:

  • 这里的问题到底是什么?
  • 你到底错在哪里?
  • F5 经常重新发送数据 - 所以是的。
  • 您的数据库表members 是否只包含一个条目?您只检索第一个进行比较的对象。
  • 一两句话会很棒。

标签: php html echo page-refresh forms http-post


【解决方案1】:

关于session_start()session_destroy() 的位不影响POST 变量。正如 BugFinder 所指出的,刷新页面通常会重新提交您刚刚提交的任何数据。这就是为什么再次显示“你在”消息的原因。

防止这种行为的一种方法是在处理提交的数据后进行重定向。然后,您可以设置一个会话变量来跟踪您仍需要显示的消息(或者,如果用户已登录或未登录)。

您的代码将如下所示:

<?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'] 获取当前页面的位置)。如果您知道文件名或在处理表单输入后重定向到不同的页面,它会更直观地工作。

【讨论】:

    【解决方案2】:

    isset($_POST["submit"]) 在 elseif 中删除此检查。

    在提交表单并显式刷新页面 $_POST["submit"] 后,如果您手动转到该页面,则不会设置 $_POST["submit"]。

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2022-12-19
      相关资源
      最近更新 更多