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,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);
}
}
Оператор 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>';
?>
А если без соплей, то так: