Php - 变量名变量

时间:2014-03-06 08:35:43

标签: php mysql

我有一个包含多个复选框的表单。如果选中,这些框在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)";

5 个答案:

答案 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)";