У меня есть этот код,
$q = $dbc -> prepare ("SELECT * FROM tasks ORDER BY date_time LIMIT 0, 15"); $q -> execute(); echo '<form action="/adminpanel?tab=process" method="post"> <input type="hidden" name="deletetask" />'; while ($todo = $q -> fetch(PDO::FETCH_ASSOC)) { echo '<div id="update"><div><strong>' . $todo['date_time'] . '</strong><span>' . $todo['type'] . '</span></div><p>' . $todo['message'] . '</p><input class="checkbox" name="deletetask" value="' . $todo['date_time'] . '" type="checkbox" /></div>'; } echo '<input type="submit" value="Delete Tasks" /></form>';
Теперь все работает так, как ожидалось, кроме одной вещи, и я не нашел никаких ответов в Интернете. Мой цикл while всегда будет содержать более одной строки и почти всегда будет хотеть больше одного удаления из него.
Поскольку этот скрипт поддерживает форму, она работает, но она удаляет только последний установленный флажок . Я понимаю, почему это делается, но я не понимаю, как преодолеть эту проблему. Я использую PDO и подготовленные заявления.
Вы назначаете одно и то же name="deletetask"
для каждого флажка. Таким образом, при deletetask
формы вы получаете только последнее выбранное значение deletetask
. Итак, ваша ошибка здесь
<input class="checkbox" name="deletetask" value=
Должно быть
<input class="checkbox" name="deletetask[]" value=
Поэтому вам нужно переименовать deletetask
в deletetask[]
чтобы ваши флажки были отправлены в виде массива и чем что-то вроде
$todelete = $_POST['deletetask']; //or $_GET, if you are submitting form through get. But I would recommend you using POST $stmt = $pdo->prepare("DELETE FROM table WHERE id = ?"); foreach ($todelete as $id) $stmt->execute($id);
Вот простой способ сделать несколько удалений из вашей базы данных:
HTML
<input type="checkbox" name="del[]" value="your id"> <input type="checkbox" name="del[]" value="your id"> <input type="checkbox" name="del[]" value="your id"> <input type="checkbox" name="del[]" value="your id">
PHP
$ids = array(); foreach ($_POST['del'] as $pval) { $ids[] = (int)$pval; } $ids = implode(',',$ids); $query = $db->prepare("DELETE FROM `pages` WHERE `pages_id` IN ( $ids )"); $query->execute();