2016-09-20 1 views
1

私は学校のポータルを設計しています。教師が私のテーブルの科目のリストから特定の科目を選択し、数多くの学生を入力できる状況が必要です。どのように特定のテーブルフィールドを動的に選択するのですか?

その後、選択した科目の個々の学生の得点がデータベースに入力されます。

以下は私のテーブル構造です。

my table structure

形態はwhileループによって生成されます。アイデアは、一度にクリックして得点を得ることです。以下は

Form for the scores

私のコードです。私が間違っているのはどうですか?

$moreDetails = mysqli_query(
    $con, 
    "select id,reg_num,$subject,term,pin from ca where class='$class'" 
); 
if ($moreDetails) { 
    while($row = mysqli_fetch_assoc($moreDetails)){ 
     $id = $row['id']; 
     $reg = $row['reg_num']; 
     $sub = $row[$subject]; 
     echo " 
      <tr> 
       <td>$id</td> 
       <td>$reg</td> 
       <td><label for='score'></label> 
        <input type='text' class='form-control' name='$sub' /> 
        <input type='hidden' name='assessment'/> 
       </td> 
      </tr> 
     "; 
    } 
} 
+0

あなたのコードはSQLインジェクション攻撃に対して脆弱です。隠された入力は目的を果たさない。あなたは何を間違っているのですか?良い質問...何がうまくいかないか説明できませんでした... – NDM

+0

私は '$件名 'がデータベースの列であることをかなり心配しています... – NDM

+0

あなたはあなたの正確な問題を記述する必要があります。しかし、 '$ sub'は整数値になりますが、これはあなたの意図した結果には見えません。 '' class = '$ class' "' 'フォームコントロールを変更する' 'input type = 'text' class = 'form-control' name = '$ subject' value = '$ sub' /> ' – fyrye

答えて

0

あなたのコメントによれば、フォームエントリは、対応するデータベースの行、学生、または他の識別子に関連付けることを目指しています。

フォームフィールドを関連付けるには、処理する更新スクリプトの値のform fields as an arrayを送信する必要があります。これを行うには、フォームフィールド名属性の接尾辞として角括弧を使用します。 name="field[]"のように、オプションでデータベーステーブルの行IDのような共通の識別子を指定すると、レコードの欠落に問題は発生しません。あなたはこれに類似$_POST値の結果として生じるが得られます

データビュー

<?php 
while ($row = mysqli_fetch_assoc($moreDetails)) { 
    $id = $row['id']; 
    $reg = $row['reg_num']; 
    $sub = $row[$subject]; 
    ?> 
    <tr> 
     <td><?php echo $id; ?></td> 
     <td><?php echo $reg; ?></td> 
     <td> 
      <label for="score_<?php echo $id; ?>"></label> 
      <input id="score_<?php echo $id; ?>" type="text" class="form-control" name="student[<?php echo $id; ?>][score]" /> 
      <input type='hidden' name='student[<?php echo $id; ?>][assessment]'/> 
     </td> 
    </tr> 
<?php } ?> 

array(1) { 
    ["student"]=> 
    array(3) { 
    ["86236762057e1df012e662"]=> 
    array(2) { 
     ["score"]=> 
     string(1) "a" 
     ["assessment"]=> 
     string(1) "A" 
    } 
    ["40443582357e1df012e668"]=> 
    array(2) { 
     ["score"]=> 
     string(1) "b" 
     ["assessment"]=> 
     string(1) "A" 
    } 
    ["112264948957e1df012e66c"]=> 
    array(2) { 
     ["score"]=> 
     string(1) "c" 
     ["assessment"]=> 
     string(1) "A" 
    } 
    } 
} 

その後、更新中のデータの配列を処理したり、クエリを挿入し、あなたのニーズにクエリを生成するために、独自のエラートラップと条件を追加する必要があります。

挿入コントローラー

if (false === empty($_POST['student'])) { 
    $queryValues = array(); 
    foreach ($_POST['student'] as $id => $student) { 
     $queryValues[] = "('" . $id . "', '" . $student['score'] . "')"; 
    } 
    echo 'INSERT INTO ca (id, score) VALUES ' . implode(', ', $queryValues); 
} 

挿入クエリ結果

INSERT INTO ca (id, score) VALUES ('86236762057e1df012e662', 'a'), ('40443582357e1df012e668', 'b'), ('112264948957e1df012e66c', 'c') 

更新コントローラー

if (false === empty($_POST['student'])) { 
    foreach ($_POST['student'] as $id => $student) { 
     echo "UPDATE ca 
       SET score = '" . $student['score'] . "' 
       WHERE id = '" . $id . "'"; 
    } 
} 

更新クエリは、ベストプラクティスの注意点としては

UPDATE ca SET score = 'a' WHERE id = '86236762057e1df012e662' 
UPDATE ca SET score = 'b' WHERE id = '40443582357e1df012e668' 
UPDATE ca SET score = 'c' WHERE id = '112264948957e1df012e66c' 

を結果、私は強く、SQLインジェクション攻撃を避けるために準備 ステートメントを使用してに見て、あなたを促します。 http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

関連する問題