Php-变量名中的变量

Php-变量名中的变量,php,mysql,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_

我有一张有几个复选框的表格。如果选中,这些框在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_id=array();
对于($i=1;$i请尝试:

尝试:

在开始时创建一个数组。这避免了1的无意义

在开始时创建一个数组。这避免了1的无意义

试试这个

$check_cab["chk_cab_$i"] = ${'chk_cab_'.$i}
试试这个

$check_cab["chk_cab_$i"] = ${'chk_cab_'.$i}

整个结构似乎有点……丑陋。对此表示抱歉。;) 因此,您可以通过对post数据使用简单数组来避免大量不必要的变量

<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
因此,所有post 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
}

就这些。通过这个小示例,您的所有结构和安全问题都应该得到解决。

整个结构似乎有点。。。丑陋的。对不起 因此,您可以通过对post数据使用简单数组来避免大量不必要的变量

<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
因此,所有post 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
}

就这些。通过这个小示例,您的所有结构和安全问题都应该得到解决。

如果可能,我会更改HTML,将复选框重命名如下:

<input name="chk_cab[0]" type="checkbox" value="1" />
...
<input name="chk_cab[5]" type="checkbox" value="1" />
...

重要:这假设所有与
first\u id=
匹配的条目都在
[1..$counter]

中进行了说明,如果可能,我会更改HTML,重命名如下复选框:

<input name="chk_cab[0]" type="checkbox" value="1" />
...
<input name="chk_cab[5]" type="checkbox" value="1" />
...

重要:这假设所有与
first\u id=
匹配的条目都在
[1..$counter]

中说明,您的代码甚至没有提到此解决方案具有可怕的SQL注入漏洞。其次,Ricudo,我指出了为什么他的查询在执行时出现问题。当我给出SQL示例时,我写得既不完美也不完美。这些例子只是为了向正确的方向提供提示,而不仅仅是复制和粘贴。我知道SQL注入的问题。我编写sql的目的是以一种简单的方式展示我将如何使用数组。您的代码甚至没有提到此解决方案存在的可怕的sql注入漏洞。其次,Ricudo,我指出了他的查询在执行时出现问题的原因。当我给出sql示例时,我既没有将其完美地编写出来。这些例子只是为了向正确的方向提供提示,而不仅仅是复制和粘贴。我知道SQL注入的问题。我编写sql的目的是以一种简单的方式展示如何使用数组。您可以使用
立即获得数组。您可以使用
立即获得数组。我随时愿意听取建议。你眼中的sql注入问题在哪里?哎呀,那是错误的(绑定阻止了sql注入)。。但这真的管用吗?我希望以占位符值的形式传入CSV字符串。是的,这甚至有效。您之前已经使用intval()验证了post数据,之后pdo甚至在语句中使用进行了额外的转义。这很好用我的意思是,为什么这个占位符(:秒)会导致
。。在('1'、'2'、'3')
中,而不是
。。在('1,2,3')
?刚刚在本地主机上测试了它,因为我不太确定。但它工作得很好。占位符不会被替换为字符串。很好,逗号分隔的整数值。;)我总是乐于听取意见。你眼中的sql注入问题在哪里?哎呀,那是错误的(绑定阻止了sql注入)。。但这真的管用吗?我希望以占位符值的形式传入CSV字符串。是的,这甚至有效。您之前已经使用intval()验证了post数据,之后pdo甚至在语句中使用进行了额外的转义。这很好用我的意思是,为什么这个占位符(:秒)会导致
。。在('1'、'2'、'3')
中,而不是
。。在('1,2,3')
?刚刚在本地主机上测试了它,因为我不太确定。但它工作得很好。占位符不会被替换为字符串。很好,逗号分隔的整数值。;)Wrt“反向查询”;它在语义上不是严格等价的,在这里可能会错误地删除数据——总体来说,这可能是一个更好的解决方案,但我宁愿保持与原始解决方案相同的方法,以避免并发问题(例如“幻影删除”。@user2864740,虽然这在技术上是可能的;查询受查询的第一部分限制;在任何情况下,我已经更新了答案,使OP停止并首先思考;它在语义上不是严格等价的,在这里可能会错误地删除数据——总体来说,这可能是一个更好的解决方案,但我宁愿保持与原始解决方案相同的方法,以避免并发问题(例如“幻影删除”。@user2864740,虽然这在技术上是可能的;查询受查询的第一部分限制;无论如何,我已经更新了答案,让OP停下来先思考。
$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)";
}