Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc
Comunitatea PHP Romania
 

folosire DELETE pt. mai multe stergeri consecutive
Vezi mesajul original

 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> MySQL
Subiectul anterior :: Subiectul următor  
Autor Mesaj
lee



Data înscrierii: 20/Mar/2004
Mesaje: 51

Trimis: Vin Iun 04, 2004 3:08 pm    Titlul subiectului: folosire DELETE pt. mai multe stergeri consecutive  

am ceva gen k.ro, de unde m-am si inspirat de altfel. pe o pagina se afiseaza maxim 10 mesaje, iar utilizatorul poate selecta cite doreste, printr-un checkbox asociat fiecarui mesaj, pt. a le sterge.
intrebarea este cum fac stergerea din tabela. am vazut ca phpmyadmin cind selectezi sa zicem 3 intrari pt. a le sterge te intreaba:
DELETE...
DELETE...
DELETE...
Yes No
am cautat codul care face asta in surse dar inca nu l-am gasit.
eu cred ca pun totul intr-un array, iar apoi cu un foreach execut DELETE pt. fiecare valoare din array. stie cineva pe net un ex. concret.
Sus  
TheWanderer



Data înscrierii: 05/Apr/2004
Mesaje: 142
Locație: Bucuresti

Trimis: Vin Iun 04, 2004 5:39 pm    Titlul subiectului:  

Da, ce ai vazut se face cu un FOR si delete pentru fiecare inregistrare sau
cu unu singur si ii spui sa stearga toate id-urile.

Acum sa presupunem ca ai 10 inregistrari pe pagina, fiecare inregistrare cu checkbox-ul ei de delete. Checkbox-urile au numele delete{id} (adica delete1, delete2 ... n)
Cum faci sa le stergi doar pe cele marcate. Uite ce folosesc eu:


an style="color: #000000"><?php function return_set($content, $root){     $k=0;     foreach ($content as $key=>$value){                             $len=strlen($root);                             if (strlen($key)>$len){             $keyroot=substr($key, 0, $len);             if ($root==$keyroot){                 $id=substr($key, $len);                 $arr[$k]=$id;                 $k++;                     }         }             }     if (isset($arr)){         return $arr;     } else {         return NULL;      } } function main() {     $Array = return_set($_POST, "delete");     for ($i=0; $i<sizeof($Array); $i++)     {         $query = "delete from tabela where id={$Array[$i]}";         exe_query($query);     } } // SAU // function main() {     $Array = return_set($_POST, "delete");     for ($i=0; $i<sizeof($Array); $i++)     {         $Arr[$i] = "id={$Array[$i]}";                 }     $query = implode(" or ", $Arr);     $query = "delete from tabela where ".$query;     exe_query($query); } 

Acum sa explicam cate ceva.
Functia return_set ia o radacina data ($root) si cauta in $content toate elementele continand radacina. In cazul nostru radacina delete este cautata in $_POST. Vor fi gasite delete1, delete2, ....
Este extrasa apoi partea dintre radacina si sfarsit. In cazul noustru 1, 2, .. n
Daca am fi avut deletecon, functia ar fi gasit "con".
Returneaza Array sau NULL.

In main poti face cate un query pentru fiecare stergere sau un singur query ... it's your choice.
Am presupus ca return_set va intoarce ID-uri numerice. Ca sa te protejezi impotriva rezultatelor nerelevante (presupunand ca acestea ar exista) poti sa faci un test de is_numeric.
Sus  
smallAdmin



Data înscrierii: 21/Mai/2004
Mesaje: 117
Locație: Bucuresti

Trimis: Vin Iun 04, 2004 5:51 pm    Titlul subiectului: cel mai simplu  

in pagina aratata userului ii pui asa:
Cod:
<form action="delete_messages.php" method="post">
<input type="checkbox" name="delete[]" value="1">
<input type="checkbox" name="delete[]" value="2">
.....
<input type="checkbox" name="delete[]" value="n">
...
</form>

unde 1,2,...,n sunt id-urile mesajelor afisate

cand a ales cateva din ele, ii da submit.

in delete_messages.php scrii cam asa:
an style="color: #000000"><?php if(!isset($_POST['delete']))     die('alege cel putin un mesaj'); $n=count($_POST['delete']); for($i=0;$i<$n;$i++){     $_POST['delete'][$i]=(int)$_POST['delete'][$i]; // prietenii stiu de ce     mysql_query("delete from table where id=".$_POST['delete'][$i]." limit 1"); // limit 1, just in case... } // done 
Sus  
arond



Data înscrierii: 11/Mar/2004
Mesaje: 580
Locație: 127.0.0.1

Trimis: Vin Iun 04, 2004 10:19 pm    Titlul subiectului:  

Solutia mai eficienta e:

an style="color: #000000"><?php mysql_query("DELETE FROM table WHERE id IN (".implode(",", $ids).")"); 

unde $ids este un array care contine id-urile de sters (int-uri, pentru a face conversia vezi codul lui smallAdmin).

Scapi de for + scapi de trimisul a n query-uri la MySQL (care pot deveni costisitoare) si e si codul mai elegant.

Singura problema poate aparea la un numar mare (mare insemnand probabil zeci de mii) de id-uri.

Numa' bune.

Later edit:
------------
Scuze, am vazut ca principiul a fost aplicat si de smallAdmin in primele posturi... scuze pentru redundanta.
Sus  
PHPRomania Bot
Bot Member


Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google
Trimis: Mie Dec 26, 2007 7:01 pm   Titlul subiectului: Ad  

Sus  
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> MySQL
Pagina 1 din 1


Powered by phpBB 2.0.22 © 2001, 2002 phpBB Group
Varianta în limba română: Romanian phpBB online community