【问题标题】:PHP session variable not showing on other pagePHP会话变量未显示在其他页面上
【发布时间】:2013-03-24 06:14:12
【问题描述】:

我有一个页面 a,我将来自 python 脚本的数据发布到该页面。我正在处理该数据,将数据存储到 SQL 中。我想存储发出此帖子请求的时间。 请注意,发布请求是连续发出的。所以会话变量不断变化。好吧,这里是那个小代码-

<?PHP
session_start();
include 'db.inc.php';

if(isset($_POST['data']){
$data_decode = (array)json_decode($_POST['data']);
$data_var1 = $data_decode['var1'];
$data_var2 = $data_decode['var2'];
$data_var3 = $data_decode['var3'];
$date = date('Y-m-d H:i:s');
$_SESSION['time'] = $date;  //Set the session with current time
$sql = "UPDATE `table` SET row1=$data_var1, row2=$data_var2 WHERE row3=$data_var3";
$result = mysqli_query($db,$link) or die('Table could not be updated');
echo "Following data inserted: row1=$data_var1, row2=$data_var2, at $_SESSION['time']"; //Echoing the data and time as expected
?>

现在,我在同一个域上有另一个页面,它发出 ajax 请求并每秒从我刚刚插入数据的 SQL 表中取出数据。所以这是整个场景——客户端python脚本向网页发出post请求,用接收到的数据更新sql,设置会话变量。另一个页面同时使用 ajax 获取该数据并显示它。

现在我在另一个页面上调用会话变量,如图所示-

<?php
session_start();
if(isset($_SESSION['time']){ echo $_SESSION['time']; } //Didn't echoes anything
?>

我用&lt;?php print_r($_SESSION) ?&gt;检查会话变量是否设置,它回显“Array()”,这意味着我的会话变量没有设置。所以我的问题是,我做错了什么,我该如何纠正?

【问题讨论】:

  • 在每一页调用session_start();
  • 对不起,我忘了说,我在每一页都叫它
  • 您是否验证过数据正在发布?由于会话时间是基于 if(isset($_POST['data']) 设置的,所以可能没有设置
  • 是的,我看到每一秒,数据都被插入到 SQL 表中,并显示抛出了 ajax 调用。唯一缺少的是没有为任何呼叫设置会话。
  • $result = mysqli_query($db,$sql)

标签: php ajax session session-variables


【解决方案1】:

确保在每一页的开头调用session_start()...

您忘记了声明后的分号。

$_SESSION['time'] = $date

应该是

$_SESSION['time'] = $date;

【讨论】:

  • 对不起,我重新检查了。在这里打字是错误的。但是那个也让我没有成功
  • 那一定是少了点什么……据我所知,现在一切都很好。
  • 我也这么认为。可能是因为我使用的客户端脚本在网页的一部分上进行 POST 调用,所以它只为该部分设置会话变量SET。也许其他事情正在发生。但无论如何我都会做这件事。我将看到另一种方式。我们是程序员。
【解决方案2】:

你忘记了 session_start()

<?php
session_start();
if(isset($_SESSION['time']){ echo $_SESSION['time']; } //Didn't echoes anything
?>

【讨论】:

  • 我编辑了我的答案。我忘了说,我已经按照你说的做了
【解决方案3】:

我正在尝试重构哪些组件在您的场景中起作用。

首先你提到了一个 Python 脚本。它如何与 PHP 一起工作?它实际上是自己发出 HTTP 请求,还是只将 HTML 发送到浏览器,然后再发送到 PHP?如果 Python 的行为类似于 HTTP 客户端,这很重要,因为 PHP 会话使用 cookie,因此您的 Python 脚本必须能够接受“Set-cookie”HTTP 标头并处理它,尤其是在以后的请求中将其发回。

第二个信息是有一些 Ajax 正在进行。这指向一个浏览器和一些 Javascript 作为客户端,这个组合显然能够接受 PHP 设置的任何 cookie。

但是浏览器和 Python 脚本是如何通信的呢?浏览器如何知道 Python 脚本从 PHP 中取回了哪个 cookie,从而可以加载会话数据?

我希望你能看到你方法中的漏洞。将数据从 Python 发布到数据库是一回事,保存此事件的时间可能是全局信息(上次数据库更新的日期),而不是会话信息(每个 Python 客户端不同)。因此,会话是错误的存储位置。另一个障碍是您的 Ajax 客户端无法从您的 Python 客户端共享会话 ID!会话的最后一个缺点:如果它有效,您将不断干扰两个请求,因为会话使用锁定来防止两个请求删除彼此的数据。这尤其糟糕,因为挂起的 Ajax 请求可能会阻止 Python 脚本写入数据库,反之亦然。

找到一种在您的服务器上存储全局信息的方法。您已经有一个数据库,为什么不使用它呢?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2017-09-11
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多