0

私はPHPを少し扱うことができ、それについてもっと学びたいです! 私は今、2人のキャラクターの間である種の戦いをシミュレートしています. 問題は、1 ラウンドしか実行できないため、Fight ボタンをクリックすると 1 ラウンドしか実行されないということです。もう一度 [ファイト] をクリックしてもヒットポイントが変わらない理由がわかりません。これはコードです:

<body>
<?php 
$Hitpoints1 = 30;
$Hitpoints2 = 30;

?>
<form name="frmFight" form action="" method="post">
<table width="700" border="0" align="left" cellpadding="0" cellspacing="0">
  <tr>
    <td align="center">Character 1</td>
    <td align="center">Character 2</td>
  </tr>
  <tr>
    <td align="center"><?php 
    if (isset($_POST['btnFight'])) {
    $Damage1 += mt_rand(2,9); }
    $Total1 = $Hitpoints1 - $Damage1;
    echo $Total1; ?></td>
    <td align="center"><?php 
    if (isset($_POST['btnFight'])) {
    $Damage2 += mt_rand(2,9); }
    $Total2 = $Hitpoints2 - $Damage2;
    echo $Total2; ?></td>
  </tr>
  <tr>
    <td align="center">&nbsp;</td>
    <td align="center">&nbsp;</td>
  </tr>
</table>
<p><input name="btnFight" type="submit" value="Submit" /></p>

</form>
</body>
4

6 に答える 6

2

変数をユーザーセッションに入れてみてください。

<?php
session_start(); 
if(!isset($_SESSION['hitpoints_1'])) {
    $_SESSION['hitpoints_1'] = 30;
}
if(!isset($_SESSION['hitpoints_2'])) {
    $_SESSION['hitpoints_2'] = 30;
}
$Hitpoints1 = $_SESSION['hitpoints_1'];
$Hitpoints2 = $_SESSION['hitpoints_2'];

?>

ただし、SQLやファイルなどのより耐久性のあるストレージについて考える必要があります。

于 2012-07-20T19:38:02.787 に答える
2

PHP の動作に関するいくつかの重要なポイントを見逃しているようです。スクリプトは、リクエストされるたびに最初から実行され、ボタンを押すたびにリクエストされます。これの意味は; ボタンを押すたびにヒットポイントが 30 に設定され、ダメージが差し引かれます。

各リクエスト間で変数を保存するには、サーバーに保存する (セッションを調べる) か、HTML がリクエストの一部として返送できるように保存する (HTML の隠しフィールドに保存する) 必要があります。

于 2012-07-20T19:39:19.423 に答える
0

フォームが送信された後、ヒットポイントの値を「保存」しているわけではありません。ページがリロードされたら、POSTデータを確認し、との値を編集する必要があります$Hitpoints1$Hitpoints2

したがって、フォームを送信するときは、新しいヒットポイント値のPOSTデータも送信する必要があります。だから持っている

<input type="hidden" name="hitpoint1" value="$Total1" />
<input type="hidden" name="hitpoint2" value="$Total2" />

次に、ページが読み込まれたときに、次の変数を探します。

if (isset($_POST['hitpoint1']) {
    $Hitpoints1 = $_POST['hitpoint1']
}
if (isset($_POST['hitpoint2']) {
    $Hitpoints1 = $_POST['hitpoint2']
}
于 2012-07-20T19:38:38.143 に答える
0

ボタンをクリックするなどしてフォームを送信するたびに、新しい PHP リクエストが作成されます。1 つの要求からのデータが、次の要求に自動的に続くわけではありません。

これには2つのアプローチがあります

  1. セッションを使用して、リクエスト間でデータを保存します。このアプローチは、内部データがフロントエンド (変更可能な場所) に提供されないため、より安全です。今のところ、これはおそらくあなたが行きたい方法です。
  2. 続行したいデータをフォームに入れて、フォームの送信時にスクリプトにポストバックして処理します。このアプローチは安全性は低くなりますが (ユーザーはポストバックされたデータを編集できるため)、スケーラビリティは高くなります (サーバーに状態がないため)。
于 2012-07-20T19:40:34.067 に答える
0

ページを送信するとデータがリセットされるため、$hitpoints は再び 30 になり、押した乱数が生成されても差し引かれます。

セッションを使用します。

于 2012-07-20T19:39:06.577 に答える
0

ページをロードするたびに、3 行目と 4 行目のヒットポイントをリセットします。合計をエコーする代わりに、入力ボックスに合計を設定し、パラメーターを返す必要があります。

echo $Total1;

になる

echo '<input type="text" value=".'$Total1'." name="hitpoints1" title="Total Hitpoints for 1">;

次に、ファイルの先頭にある $_POST 変数を読み取ります。

if(isset($_POST['hitpoints1']){
  $Hitpoints1=$_POST('hitpoints1');
} else {
   $Hitpoints1=30;
}

hitponts2 についても同じことを行います。

于 2012-07-20T19:42:19.463 に答える