无法保持Ajax保留的会话变量

时间:2016-09-09 16:07:56

标签: php ajax session-variables

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

  

注意:未定义的索引:第5行的C:\ xampp \ htdocs \ test \ update.php中的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>

2 个答案:

答案 0 :(得分:1)

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

  • 正常代码流程:当您第一次访问 index.php 时,它将触发AJAX请求,并随后设置会话变量;因此,当您访问 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_save_path()之前调用 session_start()

编辑:

按以下方式更改if块,

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

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

答案 1 :(得分:0)

应该在getImage('imgUrl').then(function(successUrl){ //do stufff }).catch(function(errorUrl){ //do stuff }) 之前调用

session_save_path(),如果您打算使用它,请在您使用session_start()

的两个脚本中使用它

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