如何动态选择特定的表字段?

时间:2016-09-20 15:20:44

标签: php mysql

我正在设计一个学校门户网站。我想要一种情况,老师可以从我的表格中的主题列表中选择一个特定的主题,并输入分数。

之后,所选科目的个别学生的分数将输入数据库。

下面是我的表结构。

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>
        ";
    }
}

1 个答案:

答案 0 :(得分: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