Удалить несколько строк с PDO и флажками с помощью подготовленных операторов?

У меня есть этот код,

$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();