代码之家  ›  专栏  ›  技术社区  ›  Devner

php、mysql和ajax:无法跨同一域中的脚本使用会话

  •  0
  • Devner  · 技术社区  · 14 年前

    我有以下页面:page1.php、page2.php和page3.php。它们中的代码如下

    代码:

    第1页.php

    <script type="text/javascript">
    
    $(function(){
        $('#imgID').upload({
            submit_to_url: "page2.php",
            file_name: 'myfile1',
            description : "Image",
            limit : 1,      
            file_types : "*.jpg",
    
        })
    }); 
    
    </script>
    
    <body>
    <form action="page3.php" method="post" enctype="multipart/form-data" name="frm1" id="frm1">
    //Some other text fields
      <input type="submit" name="submit" id="submit" value="Submit" />
    </form>
    
    </body>
    

    第2页.php

    <?php session_start();
    $a = $_SESSION['a'];
    $b = $_SESSION['b'];
    $c = $_SESSION['c'];
    
    $res = mysql_query("SELECT col FROM table WHERE col1 = $a AND col2 = $b AND col3 = $c LIMIT 1");
    $num_rows = mysql_num_rows($res);
    echo $num_rows; //echos 0 when in fact it should have been 1 because the data in the Session exists.
    
    //Ok let's proceed further
    //... Do some stuff...
    //Store some more values and create new session variables (and assume that page1.php is going to be able to use it)
    $_SESSION['d'] = 'd';
    $_SESSION['e'] = 'e';
    $_SESSION['f'] = 'f';
    
    if (move_uploaded_file($_FILES['file']['tmp_name'], $file)) 
    { 
      echo "success"; 
    } 
    else 
    {
     echo "error ".$_FILES['file']['error'];
    }
    
    ?>
    

    第3页.php

    <?php session_start(); 
    if( isset($_POST['submit']) )
    {
      //These sessions are non-existent although the AJAX request 
      //to page2.php may have created them when called via AJAX from within page1.php 
      echo $_SESSION['d'].$_SESSION['e'].$_SESSION['f']; ?> 
    }
    ?>
    
    1. 正如代码所说,我正在通过ajax调用从page1.php发布一些信息到page2.php。page2.php应该能够使用page1.php中的会话值,即$_session['a']、$_session['b']和$_session['c'],但它不能。为什么?我该怎么解决?

    2. page2.php在完成一些处理并将响应发送回page1.php之后,将创建更多的会话。点击page1.php上表单的submit按钮,页面就会发送到page3.php。但是,当在page2.php中创建的会话信息被回显时,它是空白的,表示不使用page2.php中的会话。我该怎么解决?

    在得出上述结论之前,我查阅了大量信息,花了大约50个小时尝试用我的脚本做不同的事情。我的应用程序。是使用函数(而不是oops)定制的,并且不使用任何php框架&我甚至不打算使用任何框架,因为我对oop概念的知识有限任何许多框架都是面向对象的。我遇到了种族问题,但提供的解决方案并没有太大帮助。另一个解决方案是使用db来保存会话,并从db中查找和检索,这是我最不想想到的,我真的希望避免为一个任务创建表、编码和维护代码,就像在同一个域中跨页面保存会话一样简单。

    所以我的要求是: 在目前的情况下,有没有办法通过简单的编码来解决上述问题?如有任何帮助,我们将不胜感激。

    谢谢您。

    编辑: 此外,我在会话中包含敏感信息,无法使用get或post通过页面来回传递这些信息。所以使用会话对我很有帮助。因此,如果任何代码可以帮助我实现这一点,那将是非常有帮助的。谢谢。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Bob Fanger    14 年前

    来自swfupload文档:

    Cookie问题

    Windows上的非IE Flash播放器 插件(Firefox、Opera、Safari等) 将发送ie cookies 使用的浏览器。这次中断 许多人的身份验证和会话 服务器端脚本技术。

    开发人员应该手动通过 会话和身份验证cookie 信息和手动还原 服务器端的会话 希望使用会话

    swfupload包包含 处理php和 asp.net

    我怀疑是swfupload引起了你的问题。

    检查javascript是否发布会话id:

    new SWFUpload({
       ...
       post_params: {
         "PHPSESSID" : "<?php echo session_id(); ?>"
       }
    }
    

    如果php脚本对发送的会话id有反应。

    if (isset($_POST["PHPSESSID"])) {
        session_id($_POST["PHPSESSID"]);
    }
    session_start();
    

    ( session.auto_start 应该在php.ini或.htaccess中禁用)

        2
  •  0
  •   AllenJB    14 年前

    什么是.upload()?它来自库/插件吗?如果是,是什么?

    move_uploaded_file()调用是否成功执行?

    从你描述的事件来看,我觉得这张表格是直接提交到第3页的。

    您发布的代码似乎非常不完整(缺少javascript、缺少表单字段、缺少$u会话成员a b和c的设置位置)。您应该创建一个极简的示例并发布完整的代码。