mysql 根据选中的复选框数更新语句
mysql Update Statement depending on number of checkbox checked
问题陈述:
- 我有一个包含多个复选框字段的表单,我已经对其进行了验证
用户可以 select 最多 9 个复选框和至少 1 个 jquery。
- 我使用 Post 方法收集表单检查值。
我有 mysql table 12 列。
前 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'];
}
}
?>
这取决于用户select编辑了多少复选框。
- 我不知道如何编写 UPDATE sql 查询来更新列数 == 数组大小的值。
例如:
用户 1 selected 3 复选框并提交了表单,我们有大小为 3 的数组和 table 的更新 3 列。
用户 1 selected 6 复选框并提交了表单,我们有大小为 6 的数组和 table.
的更新 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">
这样,您可以轻松循环并更新 table(我假设子列是 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)));
问题陈述:
- 我有一个包含多个复选框字段的表单,我已经对其进行了验证
用户可以 select 最多 9 个复选框和至少 1 个 jquery。
- 我使用 Post 方法收集表单检查值。
我有 mysql table 12 列。
前 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']; } } ?>
这取决于用户select编辑了多少复选框。
- 我不知道如何编写 UPDATE sql 查询来更新列数 == 数组大小的值。
例如: 用户 1 selected 3 复选框并提交了表单,我们有大小为 3 的数组和 table 的更新 3 列。 用户 1 selected 6 复选框并提交了表单,我们有大小为 6 的数组和 table.
的更新 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">
这样,您可以轻松循环并更新 table(我假设子列是 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)));