2010-10-25 98 views
2

我创建了一个图表,它执行一些数据库查询,然后使用GD函数构建图形,然后将数据库中的信息放入存储在$ _SESSION ['my_data']中的数组中。该图形使用img标签显示在网页上。

<img src="my_graph.php?time=$time"> 

<? 
    print_r($_SESSION['my_data']); 
?> 

问题是,当我从会话变量print_r()数组它不打印当前图数据;它会打印上次加载页面时图形中的数据。它就像一个饼干。

我试图把session_write_close()存储在会话中后立即因为我认为$ _SESSION可能已被锁定,直到my_graph.php完成加载图像。这没有用。

我也尝试在打印数组之前放入睡眠(10),但没有奏效。

任何想法,为什么会发生这种情况?

+0

将html图片导入php标签没有错误? – MatTheCat 2010-10-25 19:23:15

+1

你在my_graph.php中设置$ _SESSION吗?如果是这种情况,则必须重新加载才能看到更改。所请求的页面被呈现(你已经存在的代码),那么浏览器请求my_graph.php。但是你已经print_r-ed你的$ _SESSION。 – Jason 2010-10-25 19:23:52

+0

@MatTheCat对不起,键入它到stackoverflow错误 – Mark 2010-10-25 19:25:01

回答

2

我想,当你的web服务器执行PHP代码,它绘制我们的页面时,它已经有$ _SESSION数组初始化了。而且这个数组在当前的脚本运行时没有更新。当浏览器找到图像标记时,它会向Web服务器发出另一个请求,该服务器执行图像生成脚本,该脚本会在另一个运行时更新$ _SESSION数组。

您可以:

  • 要么使所有的计算在你的网页生成的代码
  • 或图像生成脚本完成计算,并在$ _SESSION数组中的所有必要的数据后刷新页面
1

如果您在mygraph.php中设置$_SESSION['my_data'],那么在您的浏览器请求mygraph.php之前,您将永远无法看到您的$_SESSION更改。直到输出被刷新到浏览器(这将在您已经print_r(),$_SESSION之后)之后才会发生。

您也许可以尝试flush()并希望浏览器在完成执行前请求图像,我从来没有尝试过(不知道它是否会起作用)。虽然,有时你必须用空格填充输出,直到大约2k(如果我没有弄错)。但我不会推荐这个。

另一种解决方案是请求您在src以上的代码页。所以如果你的代码在test.php你可以把<img src="test.php?img=true&time=$time">。然后如果你得到$_GET['img'],显示一个图像,否则执行一些代码。那有意义吗?事件

0

顺序:

  1. 浏览器请求的主网页。
  2. PHP运行主页面并将内容发送到浏览器。
  3. 浏览器收到页面。
  4. 浏览器查看页面并发送加载图形的请求等。
  5. PHP运行graph.php并将图形发送到浏览器。
  6. 浏览器将图形插入页面。

重要的是要注意的是,点2的全部发生在任何点5发生之前。这意味着graph.php对$ _SESSION所做的任何操作都不会显示在主页面中的代码中,从而导致您看到的效果。

这是网页的性质:图形文件与主PHP程序是分开的。

你无法像你这样使用单独的图形文件来解决这个问题。

还有就是我能想到实现它的方法之一,但它是一个完全重写(这是由你来决定它是否是值得的!)

它可以使用JavaScript创建一个图表。如果您在主页面中生成JavaScript代码来执行此操作,则可以在图形生成代码期间设置$ _SESSION,并且稍后可以在程序中使用它。

如果你决定这样做,你应该看看gRaphael库来帮助你。

希望有所帮助。

相关问题