【问题标题】:How do I pass an Object between Web Pages through POST in PHP?如何在 PHP 中通过 POST 在网页之间传递对象?
【发布时间】: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 的评论之前输入了它 - 有趣的是第一行是多么相似

标签: php html object webpage


【解决方案1】:

你必须做一些补充和更正:

<?php 

//... your previous code

$player = serialize($player);
?>

<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>

使用 serialize() 函数创建一个可以传递到您的其他页面的字符串,您可以按如下方式 unserialize():

secondPage.php:

$player = $_POST['playerObject'];
$player = unserialize($player);

另外,你忘了在这里使用 echo:

改变

value="<?php $player ?>"

value="<?php echo $player; ?>"

【讨论】:

  • 我完全按照建议进行了更改。我还有另一个错误:序列化/反序列化不起作用。我从 PHP 中得到错误消息: 注意:unserialize(): Error at offset 0 of 4 bytes in C:\xampp\htdocs\BattleRoyale\View\displayPlayerStatsView.php on line 12 Call Stack # Time Memory Function Location 1 0.0006 135672 {main }( ) ..\displayPlayerStatsView.php:0 2 0.0013 163088 unserialize ( ) ..\displayPlayerStatsView.php:12 ( !) 致命错误:调用 C:\xampp\htdocs\BattleRoyale 中布尔值的成员函数 displayPlayerStats() \View\displayPlayerStatsView.php 第 26 行
  • 如果我执行$playerSerial = filter_input(INPUT_POST, 'playerObject'); print_r($playerSerial); $player = unserialize($playerSerial);,我从print_r($playerSerial); 得到的输出是O:6:,我知道这是不正确的,因为该对象具有包含玩家姓名的属性,数量、健康、力量等
  • @TechAus10 你在另一个文件中也有require_once '../Model/player.php'; // To Enable Creation of a New Player Object 吗?
  • 是的,require_once '../Model/player.php'; 代码存在于两个 PHP 文件中,并且在执行任何其他代码之前它位于两个文件的顶部。
【解决方案2】:

让自己进入序列化:从对象生成字符串的过程,将来可以从字符串反序列化回对象。

一些可能对您有用的文档:

PHP - How object serialize/unserialize works?

http://php.net/manual/ru/oop4.serialization.php

http://www.phpinternalsbook.com/classes_objects/serialization.html

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多