php,mySQL& AJAX:无法在同一域中的脚本之间使用会话

时间:2010-05-08 18:17:21

标签: php mysql ajax

我有以下页面:page1.php,page2.php和page3.php。每个代码如下所示

CODE:

page1.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>

使page2.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'];
}

?>

page3.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. 正如代码所说,我通过从page1.php到page2.php的AJAX调用发布了一些信息。 page2.php应该能够使用来自page1.php的会话值,即$ _SESSION ['a'],$ _SESSION ['b']和$ _SESSION ['c'],但事实并非如此。为什么?我该如何解决这个问题?

  2. page2.php在完成一些处理并将响应发送回page1.php后创建了更多会话。在page1.php上的表单的提交按钮被点击,页面被POST到页面3.php。但是当回显在page2.php中创建的SESSION信息时,它是空白的,表示不使用来自page2.php的SESSIONS。我该如何解决这个问题?

  3. 我查看了很多信息,并且在得出上述结论之前花了大约50个小时尝试用我的脚本做不同的事情。我的应用。是使用函数(不是OOPS)定制的,并且不使用任何PHP框架&amp;我甚至不打算使用任何因为我对OOP概念的了解是有限的,任何许多框架都是面向对象的。我遇到了竞争条件,但所提供的解决方案并没有太多帮助。使用DB来保存会话以及从数据库中查找和检索的另一个解决方案是我的最后一件事,我真的想避免为任务创建表,编码和维护代码,就像在同一个域中保持跨页面的会话一样简单。

    所以我的要求是:有没有办法在现有条件下通过简单的编码解决上述问题?任何帮助表示赞赏。

    谢谢。

    修改 此外,我还有SESSIONS中包含的敏感信息,我无法使用GET或POST通过页面来回传递。所以使用SESSIONS对我来说真的很有帮助。因此,如果任何编码可以帮助我实现这一目标,那将非常有帮助。感谢。

2 个答案:

答案 0 :(得分:1)

来自SWFUpload文档:

  

Cookie问题

     

在Windows上非IE Flash播放器   插件(FireFox,Opera,Safari等)   将发送IE cookie,无论如何   使用的浏览器。这打破了   许多人的身份验证和会话   服务器端脚本技术。

     

开发人员应该手动传递   会话和身份验证cookie   信息和手动恢复   服务器端的会话,如果他们   希望使用Sessions

     

SWFUpload包中包含   解决PHP和PHP的示例代码   ASP.Net

我怀疑SWFUpload会导致您的问题。

检查您的javascript是否发布了session_id:

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

如果您的PHP脚本对发送的session_id作出反应。

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

(应在您的php.ini或.htaccess中禁用session.auto_start

答案 1 :(得分:0)

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

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

从您描述的事件来看,这听起来像是表格直接提交到第3页。

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