[英]Php - variable in variable name
我有一個帶有多個復選框的表格。 如果選中,這些框在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)";
我將更改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
$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}
嘗試這個....
$check_cab["chk_cab_$i"] = ${'chk_cab_'.$i}
完整的結構似乎有點...難看。 抱歉 ;)因此,您可以通過為帖子數據使用簡單的數組來避免大量不必要的變量。
<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
}
就這樣。 通過這個小例子,您所有的結構和安全問題都應該得到解決。
嘗試:
$del_cab_ids = implode(',', $del_cab_ids);
$sql = "DELETE FROM mytable
WHERE first_id = $t_key
AND second_id IN ($del_cab_ids)";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.