Удаление и выборка нескольких записей
В web-программировании, особенно при создании различных панелей администрирования, часто встает задача множественного выбора или удаления сразу нескольких записей из базы данных. Пусть имеется таблица items, содержащая два поля: первичный ключ таблицы id и текстовое поле title.
Для удаления записей обычно создается HTML-форма с набором флажков:
<input type="checkbox" name="item[]" value="5" /><br/>
<input type="checkbox" name="item[]" value="7" /><br/>
<input type="checkbox" name="item[]" value="12" /><br/>
<input type="checkbox" name="item[]" value="25" /><br/>
<input type="checkbox" name="item[]" value="32" /><br/>
<input type="checkbox" name="item[]" value="7" /><br/>
<input type="checkbox" name="item[]" value="12" /><br/>
<input type="checkbox" name="item[]" value="25" /><br/>
<input type="checkbox" name="item[]" value="32" /><br/>
Скрипт, формирующий список элементов input формы, и удаляющий выбранные записи может выглядеть так:
<?php
echo '<h2>Список</h2>';
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">';
$query = "SELECT id, title FROM items WHERE 1";
$res = mysql_query( $query );
echo '<table border="1">';;
echo '<tr><th>ID</th><th>Наименование</th><th>Удл.</th></tr>';
while ( $item = mysql_fetch_array( $res ) )
{
echo '<tr>';
echo '<td>'.$item['id'].'</td>';
echo '<td>'.$item['title'].'</td>';
echo '<td><input type="checkbox" name="item[]" value="'.$item['id'].'" /></td>';
echo '</tr>';
}
echo '</table>';
echo '<input type="submit" name="submitForm" value="Удалить отмеченные" />';
echo '</form>';
if ( isset ( $_POST['item'] ) )
{
$ids = implode( ',', $_POST['item'] );
$query = 'DELETE FROM items WHERE id IN ('.$ids.')';
mysql_query( $query );
header( 'Location: '.$_SERVER['PHP_SELF'] );
}
?>
echo '<h2>Список</h2>';
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">';
$query = "SELECT id, title FROM items WHERE 1";
$res = mysql_query( $query );
echo '<table border="1">';;
echo '<tr><th>ID</th><th>Наименование</th><th>Удл.</th></tr>';
while ( $item = mysql_fetch_array( $res ) )
{
echo '<tr>';
echo '<td>'.$item['id'].'</td>';
echo '<td>'.$item['title'].'</td>';
echo '<td><input type="checkbox" name="item[]" value="'.$item['id'].'" /></td>';
echo '</tr>';
}
echo '</table>';
echo '<input type="submit" name="submitForm" value="Удалить отмеченные" />';
echo '</form>';
if ( isset ( $_POST['item'] ) )
{
$ids = implode( ',', $_POST['item'] );
$query = 'DELETE FROM items WHERE id IN ('.$ids.')';
mysql_query( $query );
header( 'Location: '.$_SERVER['PHP_SELF'] );
}
?>
Массив $_POST['item'] содержит ID всех отмеченных checkbox-ов (не отмеченные на сервер не передаются). Запрос к БД на удаление выглядит так
DELETE FROM items WHERE id IN (6,9,11,12);
Если стоит задача не удаления записей, а их выборки, то вместо оператора DELETE следует использовать оператор SELECT.
Dimka:
$ids = implode( ‘,’, $_POST['item'] );
3 Ноябрь 2008, 4:30Прошу заметить что в этой строче необходимо проверить значения массива item.
Так как это очень большая уязвимость и лакомый кусочек для любого хакера
admin:
Dimka, да согласен. Если для панели администрирования это не критично, то для общедоступной части сайта - весьма опасно. Следовало бы написать примерно так:
{
$items = array();
foreach( $_POST['item'] as $value ) {
if ( ctype_digit($value) ) $items[] = $value;
}
if ( count($items) > 0 ) {
$ids = implode( ',', $items );
$query = 'DELETE FROM items WHERE id IN ('.$ids.')';
mysql_query( $query );
}
header( 'Location: '.$_SERVER['PHP_SELF'] );
}
Polzovatel:
благодарю за простой, понятный, удобный и скрипт!!! ))))
31 Май 2009, 12:08очень помогло
Petrovich69:
Большое спасибо, оч помогли.
2 Декабрь 2009, 23:54Yurla:
Спасибо, помогло!
31 Июль 2012, 12:06