mysql Update Statement取决于选中的复选框的数量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql Update Statement取决于选中的复选框的数量相关的知识,希望对你有一定的参考价值。

问题陈述:

  • 我有一个带有多个复选框字段的表单,我已经验证了它,因此用户可以选择最多9个复选框和至少1个jquery。 Form with Multiple Checkbox
  • 我使用Post方法收集Form检查的值。
  • 我有12列的mysql表。 Mysql Table Image
  • 前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个表和UPDATE 3列表的数组。用户1选择了6个复选框和提交的表单,我们有大小为6和UPDATE 6列表的数组。

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

根据OP的评论,您可以使代码通用如下:

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

另一答案

那么,首先不清楚每列的默认值是什么。由于您的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);
        }
    }
?>

希望这有助于盖伊

另一答案

您还可以使用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)));

以上是关于mysql Update Statement取决于选中的复选框的数量的主要内容,如果未能解决你的问题,请参考以下文章

mySQL on copy,update ... IF statement Question

mysql数据库__Jdbc直接操作__Statement__update

MYSQL 之 JDBC: 增删改查通过Statement执行更新操作

Can’t update table ‘xxx’ in stored function/trigger because it is already used by statement which in

mysql binlog_format row and Statement 比较

mysql Statement violates GTID consistency 的坑