Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [php] Usuwanie poprzez pola typu "checkbox"
mysql_php
post
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 1.08.2006

Ostrzeżenie: (0%)
-----


Witam,

Wykonałem skrypt php usuwania rekordów, chciałby teraz go ulepszyć i postawiłem sobie za zadanie
zrobić to za pomocą pól "checkbox". Otóż chodzi mi o to, że:

Mamy na stronie WWW listę rekordów z tabeli a w ostatniej kolumnie znajdują się "checkboxy" które zaznaczam jeśli chcę zaznaczyć jakiś rekord do usunięcia. Po zaznaczeniu kilku - wciskam jakiś submit
i usuwam zaznaczone.


Powiedzcie mi proszę jak powinien wyglągać przykładowy kod bo nie mogę nigdzie znaleźć a bardzo mi na tym zależy.

Dziękuję bardzo! Pozdrawiam.
Go to the top of the page
+Quote Post
kossa
post
Post #2





Grupa: Zarejestrowani
Postów: 1 165
Pomógł: 9
Dołączył: 9.04.2002
Skąd: Toruń

Ostrzeżenie: (0%)
-----


Tu masz jak dobrać się do tablicy zaznaczonych elementów: link

Łukasz


--------------------
Go to the top of the page
+Quote Post
mysql_php
post
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 1.08.2006

Ostrzeżenie: (0%)
-----


...kurcze a może znacie jakiś prostrzy przykład bo pamiętam, że kiedyś to widziałem i dodawało się oprócz checkboxa jeszcze "hidden". Ale nie jestem pewien...
Go to the top of the page
+Quote Post
-Gość-
post
Post #4





Goście







ja to robię w ten sposób

  1. <?php
  2.  
  3. $wynik = ...;
  4.  
  5. $ile = $wynik->num_rows;
  6.  
  7. <table>
  8. for ($i=0; $i <$ile; $i++)
  9. {
  10. $wiersz = $wynik->fetch_assoc();
  11. echo '<tr><td>';
  12. echo $wiersz['dana'];
  13. echo '<td>';
  14. echo '<form method=post>
  15. echo '<input type="checkbox" name="opcja'.($i+1).'" value="'.$wiersz['id'],'">';
  16. echo '<input type='hidden' name='ile' value='".$ile."'>';
  17. echo '</form>';
  18. }
  19. </table>
  20.  
  21. for ($i=0; $i <$ile; $i++)
  22. {
  23.  $sql =" delete from nazwa_tabeli where id = '".$_POST['opcja'.($i+1)]."'";
  24.  $usun = $db->query($sql);
  25. }
  26.  
  27. if($usun)
  28. {
  29.  echo 'Zaznaczone elementy zostały usunięte';
  30. }
  31. ?>


pisałem w locie więc mogłem gdzieś popełnić jakiś błąd

pozdrawiam
Go to the top of the page
+Quote Post
-Gość-
post
Post #5





Goście







Poprawka.
  1. <?php
  2.  
  3. $wynik = ...;
  4.  
  5. $ile = $wynik->num_rows;
  6.  
  7. <table>
  8. for ($i=0; $i <$ile; $i++)
  9. {
  10. $wiersz = $wynik->fetch_assoc();
  11. echo '<tr><td>';
  12. echo $wiersz['dana'];
  13. echo '<td>';
  14. echo '<form method=post>';
  15. echo '<input type="checkbox" name="opcja'.($i+1).'" value="'.$wiersz['id'],'">';
  16. echo "<input type='hidden' name='ile' value='".$ile."'>";
  17. echo '<input type="submit" name="usun" value="Usuń"';
  18. echo '</form>';
  19. }
  20. </table>
  21.  
  22. if($_POST['usun'] == 'Usuń') {
  23. for ($i=0; $i <$ile; $i++)
  24. {
  25.  $sql =" delete from nazwa_tabeli where id = '".$_POST['opcja'.($i+1)]."'";
  26.  $usun = $db->query($sql);
  27. }
  28. echo 'Zaznaczone elementy zostały usunięte';
  29. }
  30. else {}
  31. ?>
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




A nie prosciej tak?

  1. <input type="checkbox" name="inputy[]" value="<?=$id; ?>">


a potem

  1. <?php
  2. $tablica=$_POST['inputy'];
  3.  
  4. //tutaj foreach
  5. ?>


Ten post edytował Cysiaczek 6.08.2006, 21:20:54


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
MagnuM
post
Post #7





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 7.05.2004
Skąd: Jelenia Góra

Ostrzeżenie: (0%)
-----


Tylko że ten kod który podałeś nie zadziała. Musiałbyć to dać w pętli i dalej $input[$i]. Wtedy owszem ale..

EDIT: Pozatym - w obronie początkujących - nie '<?=' tylko '<?php'.

Ten post edytował MagnuM 6.08.2006, 21:24:35


--------------------
Go to the top of the page
+Quote Post
mysql_php
post
Post #8





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 1.08.2006

Ostrzeżenie: (0%)
-----


Panowie, próbowałem stosować ten kod powyżej (ten dłuższy) i nic.
może podam Wam jak u mnie wygląda kod, podpowiedzcie mi co gdzie mam dodać bo już mi ręce powoli zaczynają opadać z sił sad.gif

Tak wyświetlam tabelę "filmy"

  1. <HTML>
  2. <HEAD>
  3. <LINK REL="stylesheet" TYPE="text/css" HREF="ogolny.css">
  4. <TITLE>[ SOWW - Filmy ]</TITLE>
  5. </HEAD>
  6.  <BODY>
  7.  
  8. <P CLASS="h1"> FILMY </P>
  9.  
  10. <?php
  11. $polacz = mysql_connect('localhost', 'root', 'XXXX');
  12. $wybierz = mysql_select_db('wypozyczalnia');
  13.  
  14. $zapytanie = "SELECT * FROM filmy";
  15. $wynik = mysql_query($zapytanie);
  16. ?>
  17. <TABLE WIDTH="100%">
  18.  <TR CLASS="trg">
  19.  <td>ID Filmu</td>
  20.  <td>Tytul</td>
  21.  <td>Tytul PL</td>
  22.  <td>ID Gatunku</td>
  23.  <td>Czas trwania [min]</td>
  24.  <td>Rok produkcji</td>
  25.  <td>Kraj</td>
  26.  <td>Cena [PLN]</td>
  27.  <td>Status</td>
  28.  <td>Checkbox</td>
  29. </TR>
  30. <?php
  31. while ($row = mysql_fetch_array($wynik))
  32. {
  33. printf ("<tr>
  34.  <td>$row[ID_filmu]</td>
  35.  <td>$row[f_nazwa]</td>
  36.  <td>$row[f_nazwa_pl]</td>
  37.  <td>$row[ID_gatunku]</td>
  38.  <td>$row[f_czas_trwania]</td>
  39.  <td>$row[f_rok_prod]</td>
  40.  <td>$row[f_kraj]</td>
  41.  <td>$row[f_cena]</td>
  42.  <td>$row[f_status]</td>
  43. </tr>");
  44. }
  45. ?>
  46. </FORM>
  47. </TABLE>
  48.  </BODY>
  49. </HTML>


Gdzie mam wstawić ten kod ewentualnie i jaki?
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #9





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




W momencie, gdy użyjesz konstrukcji, którą podałem dostaniesz tablicę (array) indeksowaną liczbami.
Nazwa cię nie obchodzi. Ciebie interesuje tylko to, że ktoś zaznaczył jakiś checkbox. Chcesz kasowac wszystkie zaznaczone elementy - rób to po ich wartości.
  1. <?php
  2. //niech liczby to np. id rekordów
  3. $checkboxy[]=32;
  4. $checkboxy[]=34;
  5. $checkboxy[]=43;
  6.  
  7. print '<pre>';
  8. print_r($checkboxy);
  9. print '</pre>';
  10.  
  11. foreach ($checkboxy as $value){
  12. //np
  13. mysql_query("DELETE * FROM nazwa_tabeli WHERE id=$value");
  14. }
  15. ?>


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
-Gość-
post
Post #10





Goście







Plik1

  1. <?php
  2.  
  3. $zapytanie = "SELECT * FROM filmy";
  4. $wynik = mysql_query($zapytanie);
  5.  
  6. $ile = mysql_num_rows($wynik);
  7.  
  8. echo '<table><tr>
  9. <td>ID Filmu</td>
  10. <td>Tytuł</td>
  11.  .
  12.  .
  13.  .
  14. <td>checkbox</td>';
  15.  
  16. for ($i=0; $i <$ile; $i++)
  17. {
  18. $wiersz = $wynik->fetch_assoc();
  19. echo '<tr><td>';
  20. echo $wiersz['ID_filmu'];
  21. echo '<td>';
  22. echo $wiersz['f_nazwa'];
  23. echo '<td>';
  24. .
  25. .
  26. .
  27. echo '<td>';
  28. echo '<form action='usun.php' method=post>';
  29. echo '<input type="checkbox" name="opcja'.($i+1).'" value="'.$wiersz['ID_filmu'],'">';
  30. }
  31. echo '</table>';
  32. echo "<input type='hidden' name='ile' value='".$ile."'>";
  33. echo '<input type="submit" name="usun" value="Usuń">';
  34. echo '</form>';
  35. ?>


Plik usun.php

  1. <?php
  2. if($_POST['usun'] == 'Usuń') {
  3. for ($i=0; $i <$ile; $i++)
  4. {
  5.  $sql ="DELETE FROM nazwa_tabeli WHWRE id = '".$_POST['opcja'.($i+1)]."'";
  6.  $usun = $db->query($sql);
  7. }
  8.  
  9. if($usun)
  10. {
  11. echo 'Zaznaczone elementy zostały usunięte';
  12.  
  13. //Lub
  14.  
  15. header('Location: adres_do_plik1');
  16. }
  17. }
  18. else {}
  19. ?>
Go to the top of the page
+Quote Post
-Gość-
post
Post #11





Goście







i w tej linijce jest błąd jeszcze:/

echo '<input type="checkbox" name="opcja'.($i+1).'" value="'.$wiersz['ID_filmu'],'">';

zamień na

echo '<input type="checkbox" name="opcja'.($i+1).'" value="'.$wiersz['ID_filmu'].'">';
Go to the top of the page
+Quote Post
dawhol
post
Post #12





Grupa: Zarejestrowani
Postów: 256
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


Pytanie do goscia nie sprawdzałem ale chwilowo niemam na to czasu, jednak wydaje mi sie ze
  1. <?php
  2. echo '<form action='usun.php' method=post>';
  3. ?>

nie powinno sie dawac w kazdej linijce tabelki <form action ..... bo z tego co rozumiem skrypcik to tak wyjdzie winksmiley.jpg nie szlo by tego dac jakos inaczej zeby skrypt nie zwariował smile.gif np. dac to przez wyswietleniem smile.gif calosci tabeli smile.gif

Ten post edytował dawhol 7.08.2006, 07:06:52


--------------------
Go to the top of the page
+Quote Post
mysql_php
post
Post #13





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 1.08.2006

Ostrzeżenie: (0%)
-----


Bardzo wszystkim dziękuję za zainteresowanie się tematem snitch.gif
Teraz coprawda siędzę w pracy i nie moge sprawdzic jak to wszystko działa ale
jak wrócę to siadam i się do tego zabieram.

A linijkę:
  1. <?php
  2. '<form action='usun.php' method=post>';
  3. ?>

można dac przed pętlą FOR np.?

Powiedzcie mi proszę czy ten kod co podał Kolega wcześniej, działa smile.gif
Tak z czystej ciekawosci pytam bo zanim wrocę do domu to trochje minie guitar.gif
Może ktoś próbował?

Powiedzcie mi też czym różni się wstawianie do pliku php znaczników HTMTL po
  1. <?php
  2. echo '
  3. ?>

a czym po
  1. <?php
  2. printf ("
  3. ?>
Go to the top of the page
+Quote Post
-Gość-
post
Post #14





Goście







Tak, <form> można dać przed pętlą, też teraz siedzę w pracy i nie mogę sprawdzić czy on działa na 100%, ale używałem tego skryptu u siebie i działał (tylko, że teraz go pisałem z pamięci więc nie daje 100% pewności) znalazłem jeszcze błąd w pliku usun.php, mianowicie powinna być przed pętlą for jedna zmienna;)

  1. <?php
  2. $ile = $_POST['ile'];
  3. ?>
Go to the top of the page
+Quote Post
mysql_php
post
Post #15





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 1.08.2006

Ostrzeżenie: (0%)
-----


Rozumiem, czyli wstawic tą zmienną od razu na początku, poprostu zrobic podstawienie?
Czy może po "IF" a przed "FOR"em ?
Go to the top of the page
+Quote Post
=kokos=
post
Post #16





Grupa: Zarejestrowani
Postów: 114
Pomógł: 0
Dołączył: 6.08.2006

Ostrzeżenie: (0%)
-----


daj ją na samym początku, przed if'em jeszcze

Ten post edytował =kokos= 7.08.2006, 13:30:28


--------------------
Początkujący
Go to the top of the page
+Quote Post
mysql_php
post
Post #17





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 1.08.2006

Ostrzeżenie: (0%)
-----


OK! Wczoraj sprawdziłem w domu i hula należycie smile.gif

Miałbym taką prośbę jeszcze,
ponieważ lubię wiedziec jak dziala kod który stosuje, mógłby mi ktoś przeanalizowac
dzialanie tego kodu (wiekszosc oczywiscie rozumiem, ale chodzi mi konkretnie o fragment w ktorym zaczyna sie praca z polem checkbox....)
Go to the top of the page
+Quote Post
=kokos=
post
Post #18





Grupa: Zarejestrowani
Postów: 114
Pomógł: 0
Dołączył: 6.08.2006

Ostrzeżenie: (0%)
-----


Do pętli for wrzucasz pole checbox.

  1. <?php
  2. name="opcja'.($i+1).'"
  3. ?>


Ta linijka zmienia nazwą checboxa. Kiedy pętla wykona się przykładowo 3 razy to powstanie tak jakby formularz z trzema różnymi polami checbox. Będą one miały nazwę kolejno: opcja1, opcja2, opcja3. Później do każdego pola checbox przypisujesz nr. ID_filmu.
Do pola hidden przypisujesz liczbę wszystkich filmów z tabeli i wysyłasz formularz.

w pliku usun.php

skracasz nazwę zmiennej $ile = $_POST['ile']. Później jest warunek (wszystko jasne) i kolejna pętla for, która już usuwa wpisy. Pętla wykonuje się tyle razy ile jest wpisów, ale usuwa tylko te zaznaczone wpisy
Linijka za to odpowiadająca

  1. <?php
  2. $sql ="DELETE FROM nazwa_tabeli WHERE id = '".$_POST['opcja'.($i+1)]."'";
  3. ?>


Czyli, usuń z "nazwa_tabeli" wpisy gdzie id jest równe (kolejno j.w.) opcja1 (którego wartość value = 1), opcja2 (którego wartość value = 2), opcja6 (którego wartość value = 6).

Do pliku usun.php z formularza wysyłane są tylko te pola checbox, ktróre są zaznaczone, reszta jest pomijana, dlatego usuwa tylko zaznaczone wpisy.

Ten post edytował =kokos= 8.08.2006, 11:47:51


--------------------
Początkujący
Go to the top of the page
+Quote Post
artur81
post
Post #19





Grupa: Zarejestrowani
Postów: 252
Pomógł: 2
Dołączył: 4.12.2004
Skąd: Skierniewice

Ostrzeżenie: (10%)
X----


Cytat(Cysiaczek @ 6.08.2006, 20:20 ) *
A nie prosciej tak?
  1. <input type="checkbox" name="inputy[]" value="<?=$id; ?>">

a potem
  1. <?php
  2. $tablica=$_POST['inputy'];
  3. //tutaj foreach
  4. ?>


Niby dobre rozwiązanie ale co w przypadku gdy będzie miał do usunięcia 1000000 rekordów??
Tym foreach zarąbie bazę, bo będzie 1000000 zapytań.
Dużo lepiej, jest zrobić to jak poniżej
  1. <?php
  2. $strDel = implode( ',', $_POST['inputy']);
  3. mysql_query ("DELETE FROM `tutaj_wstaw_nazwe_tabeli` WHERE id IN( $strDel )");
  4. ?>

wtedy będzie tylko jedno zapytanie bez znaczenie ile rekordów chce usunąć
PS. usuń sobie ten backslash pomiędzy WHERE id IN( $strDel ) a " bo samoczynnie forum go dodaje


--------------------
Go to the top of the page
+Quote Post
mysql_php
post
Post #20





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 1.08.2006

Ostrzeżenie: (0%)
-----


Super! Dzięki za szczegółowe wytłumaczenie.

Jeszcze o coś Was pomęczę smile.gif

Pierwsza sprawa:

Atrybuty "checkbox": Name i Value - rozumiem, że to co po "Name" wykożysywane jest później po wysłaniu formularza jako $_POST('Name') ale nie do końca wiem po co przypisuje się do atrybutu "Value" zmienną '.$wiersz['ID_filmu'],' questionmark.gif

Drugie pytanko:

Po co się stosuje w skrypcie usun.php takie sprawdzenie:

  1. <?php
  2. if($_POST['usun'] == 'Usuń')
  3. ?>


To chyba sprawdza czy wciśnięto "submit" tak?
Jeśli tak, to nie wiem w jakim celu. Przecież skoro wywołany został ten skrypt, to
znaczy, że użytkownik już wcisnął ten przycisk, prawda ?
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 04:11