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