【问题标题】:Cannot Keep Ajax Preserved Session Variables无法保留 Ajax 保留的会话变量
【发布时间】:2016-09-09 16:07:55
【问题描述】:

我正在尝试编写代码以将会话变量从一个 php 带到另一个而无需刷新。我尝试按照我在网上找到的示例进行操作,如下所示。加载ajax页面时似乎成功带来了价值。但是,即使我使用session_start() 命令,创建的会话变量似乎也无法保留。它没有加载数据,而是显示以下错误消息:

注意:未定义索引:C:\xampp\htdocs\test\update.php 第 5 行中的 numSum

如果有人能建议如何处理代码以使其正确,我将不胜感激。

index.php

<html>
<?php
    session_start();
?>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
    j_TOC = [1,2,3,4,5];

    $.ajax({
      method: "POST",
      url: "update.php",
      data: { numSum: j_TOC}
    })

      .done(function( msg ) {
        alert( "Data Saved: " + msg );
      });

 </script>
</html>

update.php

<html>
<?php
    session_start();
    session_save_path('/session_data/');
    $_SESSION['numSum1'] = $_POST['numSum'];

    ?>
<script type="text/javascript">
    function atest() {

        var id_toc = <?php echo json_encode($_SESSION['numSum1']); ?>;
        window.alert(id_toc);
    {

</script>
    <input type="button" id="clickme" onclick="atest()" value="update session"></>
</html>

【问题讨论】:

    标签: php ajax session-variables


    【解决方案1】:

    您的代码存在一些问题,例如:

    • 正常代码流程:当你第一次访问index.php时,会触发AJAX请求,随后会设置session变量;这样当您访问 update.php 页面时,您就会得到想要的结果。
    • 你的代码流程:说了上面一点,如果你直接访问update.php页面而不访问index.php中的首先,你会得到这个错误,

      注意:未定义的索引:numSum in ...

      那是因为$_POST['numSum']没有设置,实际上整个超全局$_POST数组是空的。

      所以解决方案是这样的,

      将此语句 $_SESSION['numSum1'] = $_POST['numSum']; 包装在 if 块中,如下所示:

      if(!isset($_SESSION['numSum1']) || empty($_SESSION['numSum1'])){
          $_SESSION['numSum1'] = isset($_POST['numSum']) ? $_POST['numSum'] : array();
      }
      
    • 您的代码中还有一个小语法错误,

      function atest() {
      
          var id_toc = <?php echo json_encode($_SESSION['numSum1']); ?>;
          window.alert(id_toc);
      {   <============ See here, it should be }
      

      您忘记添加右括号}

    • 最后,来自the documentation

      ... 会话数据路径。如果指定,将更改保存数据的路径。 为此,需要在session_start() 之前调用session_save_path()

    编辑:

    按以下方式更改您的 if 块,

    if(!isset($_SESSION['numSum1']) || empty($_SESSION['numSum1']) || (isset($_POST['numSum']) && $_POST['numSum'] != $_SESSION['numSum1'])){
        $_SESSION['numSum1'] = isset($_POST['numSum']) ? $_POST['numSum'] : array();
    }
    

    另外,了解 PHP 中的比较运算符,尤其是三元运算符。您所说的问号(?:)与三元运算符有关。以下是必要的参考资料,

    【讨论】:

    • 非常感谢您的解决方案。它在某种程度上说。我现在可以在 update.php 上获取会话变量数据。但是,它无法更改。具体来说。当我将 j_TOC 更改为 2、2、3、4、5 时,例如在 index.php 中并重新加载 index.php,update.php 仍然给我 1、2、3、4、5。这个问题有解决办法吗?
    • 另外,你能解释一下你提供的语法,因为我是 php.ini 新手。具体来说,“?”是什么意思?在语句“$_SESSION['numSum1'] = isset($_POST['numSum']) ? $_POST['numSum'] : array();”的中间? “$_POST['numSum'] : array()”是什么意思?最后,我看到您的整个语句似乎在检查会话变量是否为空或存在,并且从未看到您将 $_POST 值分配给会话变量,哪个语句实际上占用了这项工作?非常感谢!
    • @CL.L 我已经更新了我的答案,请参阅我的答案的已编辑部分。
    • 非常感谢,现在我了解了三元运算符。我可以有一个后续问题吗?我了解您的代码有效,但仅在更新 update.php 之后才有效。但是,我们是否可以在不刷新页面 update.php 的情况下更新值,而只需单击“更新会话”按钮?或者我们必须刷新页面才能运行 php 部分才能使其正常工作?
    • @CL.L 会话变量只能通过 index.php 页面更新,因为这是您传递新值的地方,而不是数组。如果您单击更新会话按钮,它只会显示$_SESSION['numSum1'] 中的任何内容,仅此而已。如果您想更新 update.php 页面上的会话,通过单击 update session 按钮,创建一个包含新会话值和此 update 会话的 form 按钮,在表单处理过程中,更新$_SESSION['numSum1']
    【解决方案2】:

    session_save_path() 应该在session_start() 之前调用,如果您要使用它,请在使用session_start() 的两个脚本中使用它

    update.php 应该只为alert() 返回一个字符串。当您直接加载该页面时,$_POST 为空,这就是您看到的错误。

    【讨论】:

    • 感谢您的及时回复。那么它可以不设置会话路径吗?你能告诉我如何优化代码以便我可以在页面之间传递值吗?
    • 我正在尝试使用此代码进行发布问题: if ($_SESSION['numSum1']=="") { $_SESSION['numSum1'] = $_POST['numSum'] ; } 其他 { 回声 $_SESSION['numSum1']; }
    猜你喜欢
    • 2023-03-19
    • 2011-04-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多