在这种特殊情况下在 PHP 脚本之间传递值

Posted

技术标签:

【中文标题】在这种特殊情况下在 PHP 脚本之间传递值【英文标题】:Passing values between PHP scripts in this particular situation 【发布时间】:2012-07-29 12:45:53 【问题描述】:

所以在我的 html 标记中,我有一个像这样的图像标签:

<img src="image_generation.php"  id="image" />

“src”属性链接到一个 PHP 脚本,该脚本使用其中定义的几个变量生成图像,这些变量大多是随机生成的。

现在,我想做的是访问包含图像生成脚本的页面中的那些随机变量。我想我可以发送 cookie 并在图像标签之后访问它们,因为它们在技术上应该可以随时用于包含文件。我不想发送太多信息,只是几个(10-20)变量。不确定在这种情况下会话是否是更好的选择,因为我必须发送几个 cookie。会话也会带来问题,因为包含脚本会获取旧会话,我必须刷新页面才能获取先前生成的图像的值。我想我也可以设置一个数据库并在包含脚本中访问数据库,但变量是临时的,我必须删除它们,这对我来说似乎很麻烦。

图像生成脚本结束于:

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

在标头调用之前不能向浏览器发送任何内容,否则图像将不会显示。如果我使用 cookie 或会话,image_generation.php 必须同时发送图像并设置 cookie/会话。

没有一个选项(cookies、会话或数据库)能真正说服我,因为在这种特殊情况下每个选项都存在问题。你能想出解决这个问题的方法吗?谢谢。

主要编辑 #1: 包括脚本获取先前生成的图像的会话而不刷新/设置 cookie 和/或包含脚本中的会话之前/之后发送图像而没有输出缓冲不会造成问题。

【问题讨论】:

【参考方案1】:

您可以使用$_SESSION,但要使会话在包含&lt;img&gt; 标记(将在图像脚本之前执行)的同一脚本中可用,您需要通过javascript 进行AJAX 调用。在window.onload 运行的AJAX 处理程序应该可以访问由图像脚本创建的$_SESSION,因为图像在执行时应该已经完全加载。

示例 PHP 处理程序 getsession.php:

header('Content-type: application/json');
// Simply part of the session into JSON
// Obviously you would want to limit this to only the variables 
// that should be sent back, so you don't expose the session on the client side!
echo json_encode(array($_SESSION['var1'],$_SESSION['var2']));
exit();

AJAX 调用示例(使用 jQuery,因为它很容易上手)

// Variable to hold the object returned by PHP
var imgPHPSession;
$(window).load(function() 
  $.ajax(
    url: 'getsession.php',
    dataType: 'json',
    success: function(data) 
      imgPHPSession = data;
    
  );
);

更新:

它可以完全在 PHP 中完成,但需要稍微更改您的设计,以便生成图像所需的变量由主脚本在 $_SESSION 中创建。然后它们可以在 $_SESSION 到 image_generation.php 中根据需要使用,但主脚本已经知道它们。

更新 2:

由于图像变量包含有关如何创建的信息,如果图像不是太大,您实际上可以在主脚本中创建它并将其存储到磁盘。 image_generation.php 脚本仍然可以用作&lt;img src&gt;,但其目的是从磁盘中检索正确的图像并将其提供给浏览器,并在不再需要时将其从磁盘中删除。然后$_SESSION 可用于主脚本和图像脚本。

【讨论】:

这很好,Michael,但你能想出一种主要使用 PHP 的方法吗?当然,除了使用数据库。 @hallaplay835 我能想到的唯一方法是在主脚本中将变量设置为$_SESSION,然后从图像脚本中的$_SESSION 中检索它们。 变量是在图像生成脚本中而不是在主脚本中设置的,因为它们包含有关如何生成随机图像的信息。问题是从主脚本中的图像生成脚本中检索这些变量(在 img 标记之后)并显示它们,而无需刷新页面。 @hallaplay835 图片是不是很大?你能在主脚本中生成它并在那里临时保存到磁盘吗?然后您可以使用 image_generation.php 作为 src 从磁盘读取并输出,如果不再需要则将其删除。 谢谢,这就是我要做的。图像大小为 5KB;如果服务器负载太高,我会切换到 AJAX 方法。【参考方案2】:

您可以将参数传递给 src 属性,例如:

<img src="image_generation.php/user/1/name/tom/param1/variable2"

<img src="image_generation.php?user=1&name=tom

这个解决方案让你忘记会话、cookies - 它是无状态的

php 可以通过 ob_* 函数对缓冲区进行巧妙的处理,因此在脚本的开头您可以调用 ob_start() 来缓冲每个 php 输出,它可以让您避免所有“标头已发送”错误。

您的 image_generation.php 不需要发送任何 cookie。该脚本将接收带有 sessionid 的 cookie(浏览器将 cookie 信息附加到对服务器的每个请求),这使得在 php 端识别用户会话成为可能 - 之后您可以访问每个会话参数。

【讨论】:

如果我理解 OP 的问题,变量是 图像脚本设置的,因此它们将无法放置在 img src 中。 @Michael - 是的,我同意,我以相反的方式理解它。希望hallaplay835 可以改造他/她的设计。 @Michael - 确切地说,变量是由图像脚本设置的,所以我不能在 src 中使用它们。即使我使用输出缓冲 $_SESSION 的内容在我刷新页面之前也无法从包含脚本访问,但是在刷新后 $_SESSION 中的值将是先前生成的图像的值,而不是当前正在显示的图像(这是为什么呢?)。 @hallaplay835 如果当您刷新时,图像脚本被再次调用(因为它会)并且您不注意在其中设置新的随机变量,新的随机变量将被设置,但包含脚本首先执行,从而获得旧会话。您必须使用我在回答中描述的 ajax 才能在不刷新的情况下在原始页面上获取会话。或者更改设计,使其不是设置会话的图像脚本。

以上是关于在这种特殊情况下在 PHP 脚本之间传递值的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 segue 的情况下在视图控制器之间传递图像

在 Swift 3 中使用 didSelect 和 navigationController 在没有情节提要的情况下在 TableViewControllers 之间传递数据

如何在不使用单例的情况下在多个视图控制器之间传递数据?

通过值或引用传递容器

如何在不引用 React 中的动态值的情况下在 URL 中传递“:”?

如何在不传递值和 rowid 的情况下在 H base-shell 中创建表?