PHP会话变量未在其他页面上显示

时间:2013-04-02 19:34:40

标签: php ajax session session-variables

我有一个页面,我从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取出该数据并显示它。

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

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

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

3 个答案:

答案 0 :(得分:4)

请务必在每个页面的开头调用session_start() ...

声明后你忘记了分号。

$_SESSION['time'] = $date

应该是

$_SESSION['time'] = $date;

答案 1 :(得分:1)

你忘记了session_start()

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

答案 2 :(得分:0)

我正在尝试重建哪些组件在您的方案中起作用。

首先你提到一个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脚本写入数据库,反之亦然。

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