【发布时间】:2016-04-21 20:45:57
【问题描述】:
是否可以使用 $_POST 通过 HTML 表单中的隐藏字段传递对象并在表单链接到的页面上检索该对象?
在第一页,我有一个类似下面的表格:
<?php
session_start();
require_once '../Model/player.php'; // To Enable Creation of a New Player Object
$playerName = filter_input(INPUT_POST, 'playerName');
$playerNumber = 1;
$player = new player($playerName, $playerNumber);
if (isset($player))
{
echo '<p>Successfully created your player!</p><br>';
?>
<form class="viewStats" action="../View/displayPlayerStatsView.php" method="post">
<input type="hidden" name="playerObject" value="<?php echo $player; ?>">
<input type="submit" value="View Your Player's Stats">
</form>
<?php
}
?>
在第二个(接收)页面上,我有如下代码:
session_start();
require_once '../Model/player.php'; // To Use Player Object
$player = filter_input(INPUT_POST, 'playerObject'); // ERROR: Thinks the Player Object is a string.
我的错误似乎是从 $_POST 数组中检索“playerObject”的接收页面的行为就像 Object 是一个字符串。
谁能指导我如何使用 $_POST 数组将对象从一个页面传递到另一个页面?这甚至可能吗? 提前谢谢你。
更新: 根据序列化对象的建议,我现在收到以下错误:
如果我将第一个(发送)页面上的代码更改为:
$playerSerial = serialize((object) $player);
<form class="viewStats" action="../View/displayPlayerStatsView.php" method="post">
<input type="hidden" name="playerObject" value="<?php echo $playerSerial; ?>">
<input type="submit" value="View Your Player's Stats">
</form>
并将第二个(接收)页面上的代码更改为:
$playerSerial = filter_input(INPUT_POST, 'playerObject');
print_r($playerSerial);
$player = unserialize($playerSerial);
那么我从print_r($playerSerial); 得到的输出是O:6:,我知道这是不正确的,因为该对象具有包含玩家姓名、号码、健康、力量等的属性。
require_once '../Model/player.php'; 代码存在于两个 PHP 文件中,并且在执行任何其他代码之前它位于两个文件的顶部。
【问题讨论】:
-
这很有趣,但是你通过 POST 得到的所有东西都是一个字符串,这与 http 的工作方式有关。您必须对其进行序列化,并在接收端对其进行反序列化;但肯定更好的是简单地使用会话来完成这样的事情
-
如果它是通过嵌入在请求中的网络发送的,它是一个字符串。这就是http的工作方式。您始终可以序列化对象、代码图像等并以这种方式发送它们,但这基本上只是将它们转换为字符串,然后您可以将它们转换回来。简短的回答:没有。长答案:无论您想发送什么属性,将这些值作为字符串发送,然后在另一端新建另一个具有相同值的对象
-
作为记录,我在看到@MarkBaker 的评论之前输入了它 - 有趣的是第一行是多么相似