Удаление и выборка нескольких записей

В 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 формы, и удаляющий выбранные записи может выглядеть так:

<?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'] );
}
?>

Массив $_POST['item'] содержит ID всех отмеченных checkbox-ов (не отмеченные на сервер не передаются). Запрос к БД на удаление выглядит так

DELETE FROM items WHERE id IN (6,9,11,12);

Если стоит задача не удаления записей, а их выборки, то вместо оператора DELETE следует использовать оператор SELECT.

Комментариев: 5

  1. Dimka:

    $ids = implode( ‘,’, $_POST['item'] );
    Прошу заметить что в этой строче необходимо проверить значения массива item.
    Так как это очень большая уязвимость и лакомый кусочек для любого хакера ;)

  2. admin:

    Dimka, да согласен. Если для панели администрирования это не критично, то для общедоступной части сайта - весьма опасно. Следовало бы написать примерно так:

    if ( isset ( $_POST['item'] ) )
    {
      $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'] );
    }
  3. Polzovatel:

    благодарю за простой, понятный, удобный и скрипт!!! ))))
    очень помогло

  4. Petrovich69:

    Большое спасибо, оч помогли.

  5. Yurla:

    Спасибо, помогло!

Оставьте свой отзыв