【问题标题】:Struggling with hidden form field basics (PHP)与隐藏的表单字段基础知识(PHP)作斗争
【发布时间】:2025-12-29 21:05:10
【问题描述】:

我在使用带有 PHP 数据的隐藏表单时遇到了困难。我终其一生都无法弄清楚自己做错了什么。

我的代码应该

  1. 检查攻击是否成功;
  2. 如果成功,则从生命值中减去伤害;
  3. 重写 $health 变量。
  4. 在下一轮使用新的 $health 值。

问题是,它一直在重置健康值。

这是我的代码(设置为使攻击总是成功):

<?php
$health = $_REQUEST["health"];
$attack = rand(10,20);
$defend = rand(1,9);
$damage = rand(1,5);
$health =50;

if ($attack>$defend){
    print "<p>Jim hit the robot for $damage.</p>";
    $health = $health - $damage;
    print "<p>The robot has $health health remaining.</p>";
} else {
    print "<p>Jim missed.</p>";
    print "<p>The robot has $health health remaining.</p>";
} // end if statement

print <<<HERE

<input type="text"
   name="openMonsterHealth"
   value="$health">
<input type="hidden"
   name="hdnMonsterHealth"
   value="$health">
<input type="submit"
   value="click to continue">

HERE;
?>

【问题讨论】:

  • 你能否澄清一下这个问题——这与隐藏字段有什么关系?
  • 另外,请在所有代码行前放置 4 个空格...我真的需要编辑能力:p
  • :) 已处理。这闻起来像家庭作业,是吗?家庭作业问题是允许的,我只是好奇。
  • @Paolo,什么样的学校教PHP并使用隐藏字段存储数据?我建议任何人立即放弃该课程。他可能是从书本上自学的。
  • @Frank:嗯,我的一个班级的作业允许我们使用我们选择的编程语言,解释 PHP,他本可以自己做隐藏输入法,因此那是他需要指导的地方。 :)

标签: php forms


【解决方案1】:

如果您希望 $health 跟随您进入下一页,请使用会话。

PHP Manual on Sessions

基本上,您的页面开始于

session_start();
if(isset($_SESSION['health'])) {
    $health = $_SESSION['health'];
}
else {
    //However you normally set health when the user is just starting
}

如果你这样设置,它将从上一页加载健康值:

$_SESSION['health'] = $health;

PHP 脚本会自动编写和关闭会话,因此您无需担心除了在会话全局数组中创建变量之外的任何事情。当您想从上一页检索会话数组中的数据时,不要忘记启动会话。但是,您的用户必须能够接受 cookie。

如果您继续使用隐藏字段,玩家可能会在将信息发回给您之前更改该信息(另外,跟踪这些信息更麻烦)。

编辑:


但是,您的错误是,您在代码的第 5 行将健康值重置为 50,您没有使用请求中的健康变量名称正确,并且您没有任何表单标签。


<?php
if(isset($_REQUEST['hdnMonsterHealth']))
    $health = $_REQUEST['hdnMonsterHealth'];
else 
    $health = 50;
$attack = rand(10,20);
$defend = rand(1,9);
$damage = rand(1,5);

if ($attack > $defend) {
print "<p>Jim hit the robot for $damage.</p>";
$health = $health - $damage;
print "<p>The robot has $health health remaining.</p>";
} else {
    print "<p>Jim missed.</p>";
    print "<p>The robot has $health health remaining.</p>";
} // end if statement

print <<<HERE

<form method="post">
<input type="text"
   name="openMonsterHealth"
   value="$health">
<input type="hidden"
   name="hdnMonsterHealth"
   value="$health">
<input type="submit"
   value="click to continue">
</form>

HERE;
?>

编辑:对于所有奇怪的事情,很抱歉,这段代码破坏了格式,所以我不得不手动将每个&amp;lt; 插入到带有&amp;lt; 的代码中。然而,这段代码现在可以工作了。

你仍然有一个负面健康的错误。不过,我不是为你编写游戏。

【讨论】:

  • 感谢所有回复的人。我会玩弄这些,直到我完全理解发生了什么。
【解决方案2】:

抱歉,您没有提到 $health 变量的作用域。它属于会话,还是仅在请求的生命周期内?

我强烈建议使用会话变量,即:

$_SESSION["health"] = $_SESSION["health"] - $_REQUEST["DAMAGE"];

【讨论】: