PHP SESSION变量已更改,但视为空

时间:2016-07-31 21:32:58

标签: php ajax session

我有一个用户输入数据和提交的表单。当用户提交并使用Ajax将信息中继到PHP时,此表单不会刷新。提交后,用户转到新页面(实际上它是同一页面,但用户将其视为另一页面)。如果需要,用户可以返回上一页以更改某些信息。当用户首次提交页面时,我对它没有任何问题。当用户返回并决定再次更改时,我遇到了麻烦。使用我当前的代码,我在刷新时启动一个空的SESSION [" prevUrl"]。之后,当用户提交表单时,会为SESSION [" prevUrl"]分配新的POST数据。让我们说用户决定再次提交,我有的if / else语句应该转到else语句,因为SESSION变量不为空,而是决定调用if块。我已经为if和else块使用了INSERT语句来查看正在调用的语句,并且两次都调用了if语句。这是我的代码:

session_start();
ob_start();
$_SESSION["prevUrl"] = "";

    if (isset($_POST["articleType"], $_POST["articleTitle"], $_POST["articleUrl"], $_POST["numberOfPages"], $_POST["typeOfArticle"]))
    {
        $_SESSION["articleType"] = $_POST["articleType"];

        $_SESSION["articleTitle"] = filter_data($_POST["articleTitle"]);
        $_SESSION["articleUrl"] = friendlyUrl(filter_data($_POST["articleUrl"]));
        if (empty($_SESSION["prevUrl"]))
        {
            $db->query("INSERT INTO Stories (`url`) VALUES ('hi')");
            $_SESSION["prevUrl"] = friendlyUrl(filter_data($_POST["articleUrl"]));
        }

        else
        {
            $db->query("INSERT INTO Stories (`url`) VALUES ('bye')");
            $db->query("UPDATE Stories SET url = '{$_POST['articleUrl']}' WHERE url = '{$_SESSION['prevUrl']}'");
            $_SESSION["prevUrl"] = friendlyUrl(filter_data($_POST["articleUrl"]));
        }   

        $_SESSION["numberOfPages"] = $_POST["numberOfPages"];
        $_SESSION["typeOfArticle"] = $_POST["typeOfArticle"];
    }

如何修复它以便第二次调用else块?为什么第二次,我的会话[" prevUrl"]被认为是空的?

2 个答案:

答案 0 :(得分:1)

我会做以下事情:

  1. 重置没有$_POST变量的所有内容,因为这意味着该页面是新加载的
  2. 向第一次提交时设置为true的会话添加标记。
  3. 每次都要寻找那面旗帜。如果未设置,表示自上次重新加载后表单尚未提交,请清空prevUrl
  4. 将这些步骤放在一起:

    session_start();
    ob_start();
    
    //reset all session vars when page is freshly loaded
    if(empty($_POST)) session_unset(); 
    
    //clear prevURL only on first submission after a page load
    if(empty($_SESSION['inserted'])  $_SESSION["prevUrl"] = "";
    
    ...
    if (empty($_SESSION["prevUrl"]))
    {       
        $result = $db->query("INSERT INTO Stories (`url`) VALUES ('hi')");
        if(!$result) die($db->error);
        $_SESSION['inserted'] = true;
        $_SESSION["prevUrl"] = friendlyUrl(filter_data($_POST["articleUrl"]));
    }
    
    else...
    

答案 1 :(得分:0)

因为在代码的开头你编写了$_SESSION["prevUrl"] = "";(第3行),因此,每次页面执行时,SESSION ['prevUrl']都会为空。要解决这个问题,请将其命名为:

if(!isset($_SESSION['prevUrl'])){
    $_SESSION['prevUrl'] = "";
}