0

page_form.php

echo '<div style="text-align:center;margin-left:25px;">
          <form action="grad.php" method="post">               
            <table width-"100%">
                  <tr><th style="padding:12px;">LETTER </th>
                      <th style="padding:12px;">INTERVAL</th>
                      <th style="padding:12px;">GT</th>
                  </tr>';
                 for($i=0;$i<=5;$i++)
                  {
                   echo '<tr><td style="padding:12px;"><input type="text" name="letter_'.$i.'"></td>
                             <td style="padding:12px;"><input type="text" name="interval'.$i.'"></td>
                             <td style="padding:12px;"><input type="text" name="gt'.$i.'"></td>
                         </tr>';
                  }
                  echo '<tr><td><input type="submit" name="submit" value="submit"></td></tr>';
           echo '</table>
         </form>
        </div>';

grad.php

$letter = $_POST['letter']; 
     $interval = $_POST['interval']; 
     $gt = $_POST['gt']; 
$s = mysql_query("INSERT INTO grad_table(letter,markint,gradepoint) VALUES('$letter',$interval,$gt) ");

forloop ですべてのテキストボックスを指定しました。送信をクリックすると、5 つのテキスト ボックスの値をすべて取得する必要がありますが、現在は 1 行目しか取得できません。

データベース構造

   Field   Type          Collation      Attributes     Extra
     id    bigint(10)                    UNSIGNED     AUTO_INCREMENT
   letter  varchar(255)  utf+general_ci  
   markint  bigint(10)
     gt     bigint(10)
4

3 に答える 3

1

テキストボックス名はletter、使用しているため、ではありません-それらはletter_0、、letter_1などです。

また、intervalMySQL の予約語であり、バックティックを使用してエスケープする必要があります: `interval`

それらすべてを取得するには、 などのすべての名前をハードコードする$letter1 = $_POST['letter_1'];か、別のループでそれを実行できます。

for ($i=0; $i<5; $i++) {
    $letter = $_POST['letter_' . $i]; 
    $interval = $_POST['interval' . $i]; 
    $gt = $_POST['gt' . $i]; 
    $s = mysql_query("INSERT INTO `grad_table` (`letter`, `interval`, `gt`) VALUES ('$letter',$interval,$gt)");
}

ここで注意すべき重要な点の 1 つは、データベースに挿入する前に、ユーザー入力を実際に検証する必要があるということです。まず、isset()変数にアクセスする前に を使用して、ユーザーがデータを送信したことを確認できます。mysql_real_escape_string()次に、文字列入力とintval()整数をサニタイズするために使用できます。

for ($i=0; $i<5; $i++) {
    // check that each field is posted
    if (!isset($_POST['letter_' . $i]) || !isset($_POST['interval' . $i]) || !isset($_POST['gt' . $i])) continue;

    // assign & sanitize
    $letter = mysql_real_escape_string($_POST['letter_' . $i]); 
    $interval = intval($_POST['interval' . $i]); 
    $gt = intval($_POST['gt' . $i]); 
    $s = mysql_query("INSERT INTO `grad_table` (`letter`, `interval`, `gt`) VALUES ('$letter',$interval,$gt) ");
}

これはデータを「検証」するものではありませんが、少なくとも SQL インジェクションと単に PHP エラーを防ぐのに役立ちます。

于 2012-08-14T12:45:50.820 に答える
0

投稿データには、、、...が含まれている必要$_POST['interval0']$_POST['interval1']あります。$_POST['interval2']

$_POSTすべての答えを得るには、それぞれをトロールする必要があります。コードをそのまま使用して投稿データを取得していることに率直に驚いています。

于 2012-08-14T12:46:29.243 に答える
0

以下を変更する必要があります

for($i=0;$i<=5;$i++)
{
  echo '<tr><td style="padding:12px;"><input type="text" name="letter['.$i.']"></td>
  <td style="padding:12px;"><input type="text" name="interval['.$i.']"></td>
  <td style="padding:12px;"><input type="text" name="gt['.$i.']"></td>
  </tr>';
}

その後、次のことができます

foreach($_POST['letter'] as $i=>$v) {
    mysql_query("INSERT INTO grad_table(letter,interval,gt) VALUES('{$_POST['letter'][$i]}',{$_POST['interval'][$i]},{$_POST['gt'][$i]}) ");
}
于 2012-08-14T12:47:49.363 に答える