我有一个包含多个复选框的表单。如果选中,这些框在mysql数据库中各有一行。 现在,我需要一个构建查询的循环来删除未检查的所有行。 我尝试了下面的那个,但数组从未填充... 任何帮助表示赞赏...
$chk_cab_1 = isset($_POST['chk_cab_1']) ?: 0;
$chk_cab_2 = isset($_POST['chk_cab_2']) ?: 0;
$chk_cab_3 = isset($_POST['chk_cab_3']) ?: 0;
$chk_cab_4 = isset($_POST['chk_cab_4']) ?: 0;
$chk_cab_5 = isset($_POST['chk_cab_5']) ?: 0;
$chk_cab_6 = isset($_POST['chk_cab_6']) ?: 0;
$chk_cab_7 = isset($_POST['chk_cab_7']) ?: 0;
$chk_cab_8 = isset($_POST['chk_cab_8']) ?: 0;
$chk_cab_9 = isset($_POST['chk_cab_9']) ?: 0;
$chk_cab_10 = isset($_POST['chk_cab_10']) ?: 0;
$chk_cab_11 = isset($_POST['chk_cab_11']) ?: 0;
$check_cab = array();
$del_cab_ids = array();
for($i = 1; $i<=$counter; $i++) {
$check_cab["chk_cab_$i"] = $chk_cab_$i;
if($check_cab["chk_cab_$i"] == 0) {
$del_cab_ids[] = $i;
}
}
$sql = "DELETE FROM mytable
WHERE first_id = $t_key
AND second_id IN ($del_cab_ids)";
答案 0 :(得分:2)
我会更改HTML,如果可能的话,重命名这样的复选框:
<input name="chk_cab[0]" type="checkbox" value="1" />
...
<input name="chk_cab[5]" type="checkbox" value="1" />
...
然后反转查询:
$sql = "DELETE FROM mytable WHERE first_id = ?";
if (isset($_POST['chk_cab']) {
$ids = join(',', array_map('intval', array_keys($_POST['chk_cab'])));
$sql .= " AND second_id NOT IN ($ids)";
}
重要:这假定first_id = <whatever>
匹配的所有条目都在[1 .. $counter]
内。
答案 1 :(得分:1)
在开头创建一个数组。这避免了"variable variables" 1
的无意义$del_cab_ids = array();
for($i = 1; $i<=$counter; $i++) {
# it's easier/cleaner to use a dynamic key than a dynamic variable
$v = isset($_POST['chk_cab_' . $i]) ?: 0;
if ($v == 0) {
$del_cab_ids[] = $i;
}
}
此外,至少使用mysqli_real_escape_string ..但我建议使用占位符并绑定值..
1 虽然我不同意“变量变量”,但用法如下:
$varname = "chk_cab_" . $i;
$value = $$varname;
# or
$value = ${"chk_cab_" . $i}
答案 2 :(得分:1)
试试这个......
$check_cab["chk_cab_$i"] = ${'chk_cab_'.$i}
答案 3 :(得分:1)
完整的结构似乎有点......丑陋。对不起。 ;) 因此,您可以通过为发布数据使用简单数组来避免大量不必要的变量。
<input type="checkbox" value="1" name="my-checkbox[]" id="my-checkbox-1" /> 1
<input type="checkbox" value="2" name="my-checkbox[]" id="my-checkbox-2" /> 2
通过这个,您可以在一行简单的PHP代码中获取所有ID,如下所示:
if (isset($_POST['my-checkbox'])) $myIDs = array_map('intval', $_POST['my-checkbox']);
因此,所有帖子ID都已验证为整数值,因此您可以继续使用数据库语句。为此我建议使用像PDO对象这样的语句为您提供PDO语句以避免安全问题。看看下面的例子:
try {
$pdo = new PDO(...);
$sql = "DELETE FROM mytable WHERE first_id = :first_id AND FIND_IN_SET(CAST(second_id AS char), :second_id)";
$statement = $pdo->prepare($sql);
$statement->execute(array(
':first_id' => $first_id,
':second_id' => implode(",", $myIDs)
));
} catch(PDOException $e) {
// error handling
}
就是这样。有了这个小例子,你所有的结构和安全问题都应该得到解决。
答案 4 :(得分:0)
尝试:
$del_cab_ids = implode(',', $del_cab_ids);
$sql = "DELETE FROM mytable
WHERE first_id = $t_key
AND second_id IN ($del_cab_ids)";