2016-09-20 117 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

我很擔心'$ subject'是數據庫中的一列... – NDM

+0

你需要描述你的確切問題。但'$ sub'是一個整數值,看起來並不是你想要的結果。使用'「SELECT * FROM ca WHERE class ='$ class'」'然後改變你的表單控件' ' – fyrye

回答

0

根據您的意見,您希望將表單條目與其相應的數據庫行,學生或其他標識符相關聯。

爲了關聯表單字段,您需要提交值的form fields as an array以供更新腳本處理。您可以使用方括號作爲表單字段名稱屬性的後綴。像name="field[]"一樣,並可選地提供一個通用標識符,如數據庫錶行ID,以便不存在缺少記錄的問題。

數據視圖

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

,這將給你$_POST值與此類似所得。

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