【问题标题】:mysql Update Statement depending on number of checkbox checkedmysql更新语句取决于选中的复选框数量
【发布时间】:2018-09-02 07:11:39
【问题描述】:

问题陈述:

  • 我有一个包含多个复选框字段的表单,我已经对其进行了验证 用户可以使用 jquery 选择最多 9 个复选框和至少 1 个复选框。
  • 我使用 Post 方法收集表单检查值。
  • 我有 12 列的 mysql 表。

  • 前 3 列是“id”、“rollnum”、“selectStatus”

  • 通过登录期间创建的会话变量,我得到学生的卷号。所以我可以在特定行上运行更新查询。

  • 问题:我如何根据用户检查的输入更新这 9 个主题列。注意:我将这些检查的输入字段值存储在一个数组中。

  • 代码

    <form action="index.php" id="form-3" method="post">
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="ucs303">UCS303 Operating Systems
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="ucs406">UCS406 Data Structures and Algorithms
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec401">UEC401 Analog Communication Systems
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec612">UEC612 Digital System Design
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec307">UEC307 Electromagnetic Field Theory & Trans Lines
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec502">UEC502 Digital Signal Processing
        <input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="uec510">UEC510 Computer Architecture
        <button type="submit" name="year-3-submit">Submit Selection</button>
    </form>
    <?php
        if(isset($_POST['year-3-submit'])){
            if(!empty($_POST['year-3-checkbox'])){
                $subjectCheckList = array();
                $subjectCheckList = $_POST['year-3-checkbox'];
            }
        }
    ?>
    
  • 这取决于用户选择了多少复选框。

  • 我不知道如何编写更新列数的值 == 数组大小的 UPDATE sql 查询。

例如: 用户 1 选择了 3 个复选框并提交了表单,我们有大小为 3 的数组和更新表的 3 列。 用户 1 选中了 6 个复选框并提交了表单,我们有大小为 6 的数组和 UPDATE 6 列的表。

  • 我不想为所有可能的大小编写 9 个 switch case 语句 的数组。任何想法?请?

【问题讨论】:

  • 简单地遍历数组并通过连接 sql 字符串使用循环准备更新查询
  • @MadhurBhaiya ,如果您与示例代码/sn-p 交谈会很有帮助。
  • 例如:$sql = "Update table SET "; foreach ($post_values as $post) { $sql .= $post['field'] . " = " . $post['value']; }
  • 另外,请提供您为其中一种情况创建的查询,我将对其进行修改以使其通用
  • 好的,不用担心。我很快就会给出答案。

标签: php mysql sql sql-update checkboxlist


【解决方案1】:

基于OP的cmets,可以使代码通用如下:

// Check if atleast one subject has been selected
$selectedSubjects = array_filter($subjectCheckList);

// If no subject selected
if (empty($selectedSubjects)) {
    $sql = "UPDATE subjectmaster 
            SET substatus = 0 
            WHERE rollno = '" . mysqli_real_escape_string($rollnumber) . "'";
} else {
    // Initialize the sql string
    $sql = "UPDATE subjectmaster 
            SET substatus = 1 ";

   $i = 1;
   foreach ($subjectCheckList as $subject) {
       $sql .= ", sub" . $i . " = '" . mysqli_real_escape_string($subject) . "' ";
   }

   $sql .= " WHERE rollno = '" . mysqli_real_escape_string($rollnumber) . "'";
}

另外,请注意mysqli_real_escape_string 的使用。它有助于防止 SQL 注入。想要更好的防止SQL注入,可以查看How can I prevent SQL injection in PHP?

【讨论】:

  • 感谢您的明确答复。请支持我的问题,每次我在stackoverflow中提出问题时,都会有人故意对其进行否决
【解决方案2】:

嗯,首先,不清楚每列的默认值应该是什么。 由于您的 MySQL 列是由数字(sub1、sub2 等)设置的,因此您的表单应该相应地表示它们,并具有适当的值。例如:

<input class="form-check-input" name="year-3-checkbox[]" type="checkbox" value="1">

这样,您可以轻松循环并更新表(我假设子列是 TINYINT(1) DEFAULT NULL):

<?php
    if(isset($_POST['year-3-submit'])){
        if(!empty($_POST['year-3-checkbox'])){
            $subjectCheckList = array();
            $query = "UPDATE table SET ";
            foreach ($_POST['year-3-checkbox'] as $key => $value) {
              $query .= " sub" . $value . " = 1, " 
            }
            $query = substr($query, 0, -1);
        }
    }
?>

希望这会有所帮助 伙计

【讨论】:

  • 我需要这些值作为主题代码,任何情况下都不能更改
  • 那么您应该将它们存储在某种键表中,例如:标题 subs, values 和诸如 sub1,ucs303 之类的值等
  • 我得到了最适合我的答案,谢谢你的帮助。
  • @krupeshAnadkat 接受的答案是好的,但是由于完全不同的原因,去规范化的 subN 列仍然是糟糕的数据库设计。详情请查看“正常形式”。
【解决方案3】:

您还可以使用 array_filter、array_combine 和 array_slice。

<?php

$subs = [':sub1',
         ':sub2',
         ':sub3',
         ':sub4',
         ':sub5',
         ':sub6',
         ':sub7',
         ':sub8',
         ':sub9'
];

// use $dataFromForm = array_filter($_POST['year-3-checkbox'])

$dataFromForm = ['11111',
                 '222222',
                 '3333333'];

$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '*******');


$sql = 'UPDATE test SET sub1 = :sub1, sub2 = :sub2, sub3 = :sub3, sub4 = :sub4, sub5 = :sub5, sub6 = :sub6, sub7 = :sub7, sub8 = :sub8, sub9 = :sub9';
$sth = $dbh->prepare($sql);
$sth->execute(array_combine(array_slice($subs, 0, count($dataFromForm), $dataFromForm)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多