Борьба со скрытыми основами поля формы (PHP) - PullRequest
0 голосов
/ 11 апреля 2009

Мне трудно использовать скрытые формы с данными PHP. Я не могу на всю жизнь понять, что я делаю неправильно.

Мой код должен

  1. Проверьте, была ли атака успешной;
  2. Если это удалось, вычтите урон из здоровья;
  3. Перепишите переменную $ health.
  4. Используйте новое значение $ здоровья для следующего раунда.

Проблема в том, что он продолжает сбрасывать значение здоровья.

Вот мой код (он настроен так, что атака всегда успешна):

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

Ответы [ 2 ]

10 голосов
/ 11 апреля 2009

Если вы хотите, чтобы $ health следовал за вами на следующую страницу, используйте сеансы.

Руководство по PHP для сессий

Обычно вы начинаете свои страницы с

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.

Если вы продолжаете использовать скрытые поля, игрок может изменить эту информацию, прежде чем отправлять ее вам (к тому же, им будет труднее отслеживать).

редактирование:


Однако ваши ошибки заключаются в том, что вы сбрасываете свое здоровье до 50 в 5-й строке кода, не используете правильное имя переменной для здоровья из запроса и у вас нет никаких тегов формы.


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

Редактировать: Извините за все странности, форматирование нарушается этим блоком кода, поэтому мне пришлось вручную вставлять каждый < в код с &lt;. Этот код работает сейчас, однако.

У вас все еще есть ошибка с отрицательным здоровьем. Я не пишу твою игру для тебя.

1 голос
/ 11 апреля 2009

Извините, вы не упомянули область действия переменной $ health. Это относится к сеансу или просто для времени жизни запроса?

Я бы настоятельно рекомендовал использовать переменные сеанса, т.е.

$_SESSION["health"] = $_SESSION["health"] - $_REQUEST["DAMAGE"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...