[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Множественное удаление комментов
Хозяин Огня
Решил сделать функцию множественного удаления комментов и столкнулся с проблемой.
Значит у меня циклом в таблицу выводятся все комменты из базы, в цикле же находится форма с чекбоксом, где каждому флажку соответствует id коммента:

PHP
#........вывод комментов........
   
<td>
     <
form method="POST" action="delcomm.php">
       <
input type="hidden" name="id_news" value="<?php echo $rw['id_news']?>">
       <
input type="hidden" name="newcomm" value="1">
       <
input type="checkbox" name="id" value="<?php echo $rw['id']?>">

   </
td>
 </
tr
 
 <?
}} 
# К О Н Е Ц  цикла

?>
 <tr>
   <td colspan=7 align="right">
               <input type="submit" value="Удалить">

     </form>
   </td>


Как видите кнопка формы находится вне цикла (в чём судя по всему и проблема)

Файл - обработчик формы:
PHP
if (isset ($_POST['page']))
$page $_POST['page'];

if (isset(
$_POST['id']))
$id $_POST['id'];
else echo 
"error";
if (isset(
$_POST['id_news']))
$id_news $_POST['id_news'];

$q "DELETE FROM comments
      WHERE id="
.$id;
if (
mysql_query($q))
{
 if (isset (
$_POST['newcomm']))
 
header("Location: newcomments.php");
 else
 
header("Location: editcommentform.php?id=$id_news&page=$page");
}
else echo 
mysql_error();


Сейчас коммент удаляется если ставить галку в самый нижний флажок. Если пробую удалять не последний(самый старый) коммент - выходzт ошибки
Цитата
error
Notice: Undefined variable: id in j:\home\newlenta.ru\www\admin\delcomm.php on line 14
You have an error in your SQL syntax near '' at line 2


14 - это
Код
WHERE id=".$id;


Подскажите в чём ошибка.



Спустя 24 минуты, 16 секунд (3.11.2009 - 12:43) Dezigo написал(а):
у тебя id - как 1 элемент. а нужен массив

первый способ: (не лучший вариат - много запросов пойдёт)
у тебя имя у checkbox name="id"
сделай это как массив.
PHP
name="id[]"


после того как у тебя есть массив ID
вытаскивай каждый ID из массива значения с помощью foreach
и в каждом проходе цикла делаешь удаления.

второй способ: (быстрый)
есть записи с id 1,2,4,...56,.60
выбрали галочками записи где
id 1
id 2
id 45
такой же массив id[];
токо объедени его в строчку с помощью
PHP
$del = implode(",",$arr);

тогда уже имееи строку:

PHP
$del = '1,2,45';


и удаляем их в таком виде
SQL
DELETE FROM [web_test].[dbo].[test_count] WHERE name in($del)

Спустя 1 час, 11 минут, 36 секунд (3.11.2009 - 13:55) Хозяин Огня написал(а):
Сначала попробую первый вариант, потом переделаю во второй...

Dezigo, значит в файле с формой нужно только поменять name="id" на name="id[]"? Ок. Но обработчик delcomm.php всё равно не распознаёт id, если я пытаюсь удались какой-нибудь другой коммент, кроме последнего.

А в delcomm.php

PHP
$q "DELETE FROM comments
      WHERE id="
.$id;


Заменил на
PHP
foreach ($id as $val)


$query$val;
$q "DELETE FROM comments
      WHERE id="
.$query;
}

Спустя 9 минут, 17 секунд (3.11.2009 - 14:04) Kuliev написал(а):
Хозяин Огня
PHP
$id = array();

echo "<form method=post>";
// Примерно как должно выглядеть
while ($row = mysql_fetch_assoc($result))
{
    echo $row['name']." <input type=checkbox name=id[] value='".$row['id']."'>";
}

// тра лял ля 
// сам запрос

$sql = "DELETE FROM `table` WHERE `id` IN (".join(",",$_POST['id']).")";
$result = mysql_query($sql) or die (mysql_error() ."<br/>". $sql);

Спустя 39 секунд (3.11.2009 - 14:05) Dezigo написал(а):
последний id работает -так как ты перезаписываешь свой id каждый раз.
поэтому у тебя и берётся последние значения.


воспользуйся так:
PHP
foreach ($id as $val)
{
 
        mysql_query
("DELETE FROM comments&nbs

Спустя 4 часа, 19 минут, 36 секунд (3.11.2009 - 18:24) Хозяин Огня написал(а):
Понял почему обработчик не распознавал АЙДИ - у меня в цикле для каждого чекбокса создавалась отдельная форма.

Сделал так:

PHP
<form method="POST" action="delcomm.php">

<?
for (
$i=1;$i<=$total_new_com;$i)
{
while (
$rw mysql_fetch_array($rs))
{
//Выбираем название новости
$head "SELECT head, id FROM newslent
         WHERE id="
.$rw['id_news']."";
$res mysql_query($head);
$row mysql_fetch_array($res);
 
?>
 <tr align=center>
   <?php 
   
if (($rw['new']=='new'))
   echo 
"
   <th>"
.$i++."</th>
   <th>"
.$rw['name_com']."</th>
   <th align=left>"
.$rw['comm']."</th>
   <th>"
.$rw['date_reg']."</th>
   <th><a href=editcommentform.php?id="
.$row['id'].">".$row['head']."</a></th>
   "
;
   else echo
"
   <td>"
.$i++."</td>
   <td>"
.$rw['name_com']."</td>
   <td align=left>"
.$rw['comm']."</td>
   <td>"
.$rw['date_reg']."</td>
   <td><a href=editcommentform.php?id="
.$row['id'].">".$row['head']."</a></td>
   "
;
   
?>
   
   <td width=40>&nbsp;
   </td>
   <td>
       <input type="hidden" name="id_news" value="<?php echo $rw['id_news']?>">
       <input type="hidden" name="newcomm" value="1">
       <input type="checkbox" name="id[]" value="<?php echo $rw['id']?>">
 
 <?
}
}
?>
   </td>
 </tr>
 </table>
        
     <input type="submit" value="Удалить">
     </form>



По одному сообщению уже можно удалять. Но проблема в том, что мне в цикле нужна ещё одна форма - кнопка, которая передаёт комментарий в форму редактирования вниз страницы. Вот она -

PHP
<form method="POST" action="newcomments.phpstyle="display:inline">
       <
input type="submit" name="edit" value="Р" title="Редактировать коментарий">
       <
input type="hidden" name="date_reg" value="<?php echo $rw['date_reg']?>">
       <
input type="hidden" name="name_com" value="<?php echo htmlspecialchars($rw['name_com'])?>">
          <
input type="hidden" name="comm" value="<?php echo htmlspecialchars($rw['comm'])?>">
          <
input type="hidden" name="id" value="<?php echo $rw['id']?>">
       <
input type="hidden" name="id_news" value="<?php echo $rw['id_news']?>">
       <
input type="hidden" name="newcomm" value="1">
     </
form>


Первоочередная задача - засунуть эту форму в цикл. Как это можно сделать?

Спустя 3 часа, 22 минуты, 28 секунд (3.11.2009 - 21:47) Kuliev написал(а):
Цитата (Dezigo @ 3.11.2009 - 16:05)
последний id работает -так как ты перезаписываешь свой id каждый раз.
поэтому у тебя и берётся последние значения.


воспользуйся так:
foreach ($id as $val)

     mysql_query("DELETE FROM comments WHERE id='$val');
}

Что за порнография все это делается одним запросом и не нужны ЦИКЛЫ, пример я уже дал....

Спустя 15 минут, 33 секунды (3.11.2009 - 22:02) Хозяин Огня написал(а):
Kuliev , да, всё оказалось много проще:

PHP
$q "DELETE FROM comments
      WHERE id in ("
.implode(",",$id).")";


А как на счёт проблемы с двумя формами?

Спустя 3 часа, 1 минута, 43 секунды (4.11.2009 - 01:04) twin написал(а):
А не надо создавать проблему, и не придется её решать. Зачем куча форм и куча хидденов там... Все в одной форме решается.

Спустя 5 часов, 40 минут, 21 секунда (4.11.2009 - 06:44) Хозяин Огня написал(а):
А что делать, если параметры нужно передавать? Приходится хидденсы использовать.

Спустя 10 минут, 58 секунд (4.11.2009 - 06:55) Хозяин Огня написал(а):
Вобщем буду объединять в одну форму.

Спустя 2 часа, 45 минут, 15 секунд (4.11.2009 - 09:41) Хозяин Огня написал(а):
Хм, получается, что оба обработчика должны быть в том же файле, что и форма..

Спустя 1 минута, 22 секунды (4.11.2009 - 09:42) Dezigo написал(а):
передавай с помощью $_GET

Спустя 41 минута, 1 секунда (4.11.2009 - 10:23) Хозяин Огня написал(а):
Хочу кнопки!
А если серьёзно нужно находить выход а не искать лёгких путей.

Спустя 1 минута, 6 секунд (4.11.2009 - 10:24) Хозяин Огня написал(а):
Кстати никто и не заметил, что для чекбокса нужна одна форма а для кнопок - на каждую по одной

Спустя 2 часа, 11 минут, 34 секунды (4.11.2009 - 12:36) Gabriel написал(а):
Хозяин Огня
мульен чекбокстов, текст, полей, селектов, кнопок и прочей лабуды влазит в одну форму.

Спустя 6 минут, 49 секунд (4.11.2009 - 12:43) Хозяин Огня написал(а):
Други, помогите, я в тупике.
Для передачи в форму редактирования я теперь и имя и текст сообщения заношу в массив (т.к форма одна, а кнопка для каждого коммента отдельная). Вот так:

HTML
<input type="hidden" name="name_com[]" value="<?php echo htmlspecialchars($rw['name_com'])?>">

Этот инпут находится в цикле.

Теперь при нажатии на кнопку данные (имя и текст) передаются в форму ниже.

И нужно, чтобы вот в это текстовое поле попадало имя:

HTML
<td><input type="text" name="name_com" size=50% value="<?echo $name_com;?>"></td>

Эта форма отдельная, она будет передавать данные другому обработчику.

Как это сделать?

Gabriel, это и ежу ясно. Если бы ты внимательно посмотрел мой пример, понял бы что я имею ввиду.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.