PHP, MySQL, checkbox: Как добавить (или удалить) несколько пунктов, отмеченных чекбоксами в бд (из бд)?

Можно ли одним запросом добавить в таблицу сразу несколько записей, которые состоят из отмеченных чекбоксом полей...
т.е. если выделен 1,3 и 5 чекбокс допустим, чтобы в таблице были записи

table
id | text
--+------------------------------------
0 | dfsdf
1 | sdfgsdfg (from checkbox #1)
2 | dfghdf (from checkbox #3)
3 | ryrerty (from checkbox #5)

1 ответов


Насчет добавления одним запросом нескольких записей не уверен что можно, удаление или обновление — можно. Допустим, ваши чекбоксы имеют такие атрибуты: name="chk[1]", name="chk[2]", name="chk[3]" и так далее. Следовательно, PHP-скрипту на обработку из $_POST придет массив chk, и по его значениям уже составляем условие запроса:


$chk=$_POST['chk'];
$c = 0;
$where = '';
foreach ($chk as $id) {
    $c ++;
    $where .= ($c < count($quantity)) ? "id='".$id."'" : " OR id='".$id."'";  
}
mysql_query("DELETE FROM my_table WHERE ".$where."");
 
Как то так. Код не проверял — тут главное принцип понять.

Во-первых:
Оператор INSERT поддерживает множественную вставку (за один запрос), делается это так:

INSERT INTO <tbl_name> (<field1>, <field2>) VALUES (<value01>, <value02>), (<value11>, <value12>), (<value21>, <value22>);

Во-вторых:
Нельзя! напрямую, как в предыдущих примерах, вот так вот просто подставлять занчения в запрос к бд, т. к. вы становитесь уязвимыми для sql-инъекции.
Любые данные, посылаемые с клиента, которые впоследствие будут использоваться в запросах к бд, должны быть обязательно фильтрованы. ( mysql_real_escape_string )

Если я вас правильно понял, и вам нужно обновить список тегов к какому-то материалу(допостим статья), то нет ничего проще:

Алгоритм:
1. Удаляем все теги связанные с данной статьей.
2. Записываем новый список тегов.

Я предпологаю, что в бд вы храните эти теги примерно так:
articles_tags:
id | article_id | tag_id(здесь сам тег(н-р: яблоко, груша))
обычно, правда хранят не сам тег, а идентификатор тега, ссылающийся по внешнему ключу на другую таблицу(tags) на сам тег.


$id = (int)$_GET('id'); // Идентификатор вашей статьи

$tags = $_POST('tags'); // Список тегов

if (!empty($tags) && is_array($tags)) {  
  $query = 'DELETE * FROM articles_tags WHERE article_id = '.$id;
  if (mysql_query($query)) {
   
    $query = 'INSERT INTO articles_tags (article_id, tag_id) VALUES ';
   
    // Далее формируем VALUES-часть запроса
    $values = '';
    foreach($tags as $tag_id) {
      $values .= '(' . $id . ', ' . mysql_real_escape_string($tag_id) . '),'; // Не забываем про экранирование
    }
    $values = substr($values, -1) // Удаляем лишнюю запятую
   
    $query .= $values;
   
    mysql_query($query);
  }
}
 

добавлять/удалять можно повесив на чекбокс onchange="function_name()" который будет отсылать $.post.


Насчет удаления Old_Chroft прав, но запрос можно собрать изящнее:


<?php
if(empty($_POST))
{
    echo "<form action='chk.php' method='POST'>".PHP_EOL;
    echo '    <input type="checkbox" name="ids[]" value="1" /> ID - 1<br/>'.PHP_EOL;
    echo '    <input type="checkbox" name="ids[]" value="2" /> ID - 2<br/>'.PHP_EOL;
    echo '    <input type="checkbox" name="ids[]" value="3" /> ID - 3<br/>'.PHP_EOL;
    echo '    <input type="submit" value="SEND">'.PHP_EOL;
    echo "</form>".PHP_EOL;
    exit();
}

$BQ = 'DELETE FROM `table` WHERE';
$ids1 = implode(',',$_POST['ids']);
$ids2 = implode(' OR `id`=',$_POST['ids']);
$Q1 = $BQ.' `id` IN ('.$ids1.')';
$Q2 = $BQ.' `id`='.$ids2;

echo '<b>VARIANT 1:</b>'.PHP_EOL;
echo '<pre style="border: 1px #0000FF solid; width:400px; padding:10px;">';
echo $Q1;
echo '</pre>';
echo '<hr/><b>VARIANT 2:</b>'.PHP_EOL;
echo '<pre style="border: 1px #0000FF solid; width:400px; padding:10px;">';
echo $Q2;
echo '</pre>';
?>
 

А если без соплей, то так:

$Q = 'DELETE FROM `table` WHERE `id`='.implode(' OR `id`=',$_POST['ids']);
 
или

$Q = 'DELETE FROM `table` WHERE `id` IN ('.implode(',',$_POST['ids']).')';
 
А что значит добавлять по чекбоксам - что-то я не понял... откуда тогда список с чекобоксами берется???