【问题标题】:php, mySQL & AJAX: Unable to use sessions across the scripts in the same domainphp、mySQL 和 AJAX:无法跨同一域中的脚本使用会话
【发布时间】:2010-05-08 18:17:20
【问题描述】:

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

代码:

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

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

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

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

谢谢。

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

【问题讨论】:

    标签: php mysql ajax


    【解决方案1】:

    来自 SWFUpload 文档:

    Cookie 问题

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

    开发者应手动通过 会话和身份验证 cookie 信息并手动恢复 服务器端的会话,如果他们 希望使用会话

    SWFUpload 包包含 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();
    

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

    【讨论】:

    • 看起来您可能一针见血。我正在尝试手头的脚本,实际上,令我非常失望的是,只要使用上传库,SESSIONS 甚至都没有正确回显。但是,如果我在独立的基础上测试脚本,那么它们可以正常工作。这意味着图书馆确实存在一些问题。通过检查我的 javascript 以获取您给我的代码,我有点不确定您的意思。您是要我检查它是否存在或如果存在则删除?请告诉我。谢谢。
    • 我在 page2.php 上使用了我的 PHP 脚本,但仍然无法正常工作。看起来像他们那么你有没有碰巧发现如何用当前脚本解决这个问题?
    【解决方案2】:

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

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

    从您描述的事件来看,在我看来,表单正在直接提交到 page3。

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

    【讨论】:

    • 感谢您的回复。只是想为您的问题发布一个快速摘要: 1. .upload 确实来自一个库,这就是 SWFupload。我只是将其重命名以进行测试。 2. 是的,move_uploaded_file() 确实成功获取了文件。我可以在文件夹中看到它。 3. 是的,不是的。提交指向表单的 page3.php。提交到 page2.php 是通过 AJAX 调用并使用文件类型提交文件。所以 page1.php 表单中的这个上传按钮是一个独立的 btn,当点击它时,会向 page2.php 发布一个帖子并返回一个回显成功或错误值。
    • 另外 $_SESSION 成员 a b c 是保存用户登录信息的变量。由于这是敏感数据,因此我将其替换为样本。这些会话变量在用户登录时创建并在用户注销时销毁。这是否有助于填补至少一些缺失的信息?
    • 不幸的是,我不知道 Flash 在 cookie 方面是如何工作的。如果文件是通过 Flash 小程序上传的,而 Flash 小程序不与浏览器共享 cookie,则会话不会自动通过。相反,您需要传递 session_name() .'='。 session_id() 作为 url 的参数(GET 数据)。我相信 PHP 应该自动选择它。请参阅 PHP 手册的会话处理部分。
    • 虽然是 Flash 为 AJAX 前端提供了一些支持,但会话是在 PHP 中创建的。此外,我正在根据收到的文件在 page2.php 中创建会话。所以我在会话中保存文件大小和其他属性,以便当用户实际按下 page1.php 上的提交按钮时,我可以将它们插入到 page3.php 上的数据库中。此外,我想避免通过 GET 或 POST 传递数据,这样用户就看不到它,从而为幕后发生的事情提供了额外的安全层。那么这是否有助于我们进一步前进?
    • +1 为我指明了正确的方向。我考虑了您提供给我的 cookie 信息并做了一些实验,得出的结论是库本身存在一些错误。鲍勃对确切的问题提出了更多的看法。感谢您的所有帮助。
    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2012-01-28
    • 1970-01-01
    • 2016-08-01
    • 2023-03-15
    相关资源
    最近更新 更多