 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| 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 |
|
| |
|