我正在创建一个执行某些数据库查询的图表,然后使用GD函数构建图形,然后将数据库中的信息放入存储在$ _SESSION ['my_data']中的数组中。该图表使用img标签显示在网页上。
<img src="my_graph.php?time=$time">
<?
print_r($_SESSION['my_data']);
?>
问题是当我从会话变量print_r()数组时,它不会打印当前的图形数据;它会在上次加载页面时打印图表中的数据。它就像一个cookie。
我已经尝试在将数组存储到会话后立即放入session_write_close(),因为我认为$ _SESSION可能已被锁定,直到my_graph.php完成加载图像。那没用。
在打印数组之前,我也尝试过睡眠(10),但是没有用。
为什么会这样?
答案 0 :(得分:2)
我想,当您的Web服务器执行绘制我们页面的PHP代码时,它已经初始化了$ _SESSION数组。并且此数组在当前脚本运行时中未更新。当浏览器找到图像标记时,它向Web服务器发出另一个请求,该服务器执行图像生成脚本,该脚本在另一个运行时更新$ _SESSION数组。
你可以:
答案 1 :(得分:1)
如果您在$_SESSION['my_data']
中设置mygraph.php
,则在浏览器请求$_SESSION
之前,您永远不会看到mygraph.php
更改。在将输出刷新到浏览器之后(在您已经print_r()
$_SESSION
之后),这种情况永远不会发生。
你可以尝试flush()
并希望浏览器在你完成执行之前请求图像,我从来没有尝试过(不确定它是否会起作用)。虽然,有时你必须用空格填充输出,直到大约2k(如果我没有记错)。不过,我不会推荐这个。
另一种解决方案是在src
中请求您拥有上述代码的页面。因此,如果上面的代码位于test.php
,您可以放置<img src="test.php?img=true&time=$time">
。然后,如果你得到$_GET['img']
,则显示图像,否则执行一些代码。这有意义吗?
答案 2 :(得分:0)
事件顺序:
需要注意的重要一点是整个第2点发生在第5点发生之前。这意味着graph.php对$ _SESSION执行的任何操作都不会对主页中的代码可见,从而导致您看到的效果。
这是网页的本质:图形文件与主PHP程序是分开的。
你不能像使用单独的图形文件那样解决这个问题。
有一种方法我可以想到实现它,但它将是一个完全重写(由你来决定它是否值得!)
可以使用Javascript创建图表。如果您在主页面中生成javascript代码以执行此操作,则可以在图形生成代码期间设置$ _SESSION,并且稍后可以在程序中使用。
如果你决定这样做,你应该查看gRaphael库来帮助你。
希望有所帮助。