Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Usuwanie poprzez pola typu "checkbox"
Forum PHP.pl > Forum > Przedszkole
mysql_php
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.
kossa
Tu masz jak dobrać się do tablicy zaznaczonych elementów: link

Łukasz
mysql_php
...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ść
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ść
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. ?>
Cysiaczek
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. ?>
MagnuM
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'.
mysql_php
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?
Cysiaczek
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. ?>
Gość
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ść
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'].'">';
dawhol
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
mysql_php
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ść
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. ?>
mysql_php
Rozumiem, czyli wstawic tą zmienną od razu na początku, poprostu zrobic podstawienie?
Czy może po "IF" a przed "FOR"em ?
=kokos=
daj ją na samym początku, przed if'em jeszcze
mysql_php
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....)
=kokos=
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.
artur81
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
mysql_php
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 ?
artur81
w tym celu że jeżeli by nie było sprawdzania czy jest wciśnięty to skrypt byłby wykonywany za każdym wywołaniem strony niezależnie czy ktoś wcisnął submit czy nie
Cysiaczek
To zależy od budowy aplikacji. Rzadko kto stosuje fizyczne odwzorowanie w postaci: dodaj.php, usun.php. Sprawdzenie zatem staje się koniecznością.
free
  1. <?php
  2. "Value" zmienn&#261; '.$wiersz['ID_filmu'],'
  3. ?>
value odpowiada za tekst na przycisku dla typu"Checkbox"
lub "radio" okresla wartosc przesylana do serwera jezeli pole jest zaznaczone
Co do II pytania
skrypt moze byc wywolany prze nipowolana sosbe bez opcji np usun.php?page=usun by temu zap[obiec asekurujemy sie w skrypcie i nie dopuszczamy by cokolwiek robic gdy nie ma wcisnietego przycisku submit z opcja usun
Gość
Cytat
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


Oprę się na prostym przykładzie. Załóżmy, że wstawiasz do bazy obrazek. W formularzu robisz pole
<input type='file' name='obrazek'> i np. chcesz określić z której strony ma się ona znajdować (chodzi mi tu o wartość align). Wtedy dodajesz do formularza 2 kolejne pole radio

<input type='radio' name='strona' value='left'>
<input type='radio' name='strona' value='right'>

Jeśli w zapytaniu zrobisz tak
  1. <?php
  2. $ins = mysql_query("INSERT INTO tabela VALUES (...., $_POST['strona'];");
  3. ?>


do bazy zostanie dopisane nie name pole input tylko jego value, czyli left lub right w zależności od tego, które pole radio zaznaczysz.

Na pytanie o sprawdzenie już odpowiedział artur81. Ale też oprę się na przykładzie.

Do formularza możesz dodać np. 3 pola

<input type='submit' name='modyfikacja' value='dodaj'>
<input type='submit' name='modyfikacja' value='usuń'>
<input type='submit' name='modyfikacja' value='edytuj'>

wtedy po wysłaniu formularza sprawdzasz który przycisk został pacnięty

  1. <?php
  2. if($_POST['modyfikacja'] == 'usuń')
  3. {
  4. //usuwaj
  5. }
  6. elseif($_POST['modyfikacja'] == 'dodaj')
  7. {
  8. //dodawaj
  9. }
  10. elseif($_POST['modyfikacja'] == 'edytuj')
  11. {
  12. //edytuj
  13. }
  14. else {}
  15. ?>
=kokos=
ten post wyżej to ja winksmiley.jpg
mysql_php
...właśnie tak patrzę, że raz Gosc a raz Kokos guitar.gif

Wieczorem wszystko przeanalizuje bo wytlumaczone terazz mam elegancko! smile.gif
dawhol
Ja postanowiłem sobie to sprawdzic i takze wykorzystac i wszystko było by pieknie ale ...

Przy wyseitlaniu z bazy liczy ile jest wierszy ale wyswietla tylko ostatni wpis tyle razy ile jest wpisów tzn powtarza jeden wpis, po drugie jak zaznaczam kasowanie dwóch teoretycznie takich samych wpisów to kasuje jeden al jest to spowodowane tym ze sa takie same winksmiley.jpg pozatym musiałem tam pare zeczy poprawic smile.gif bo u mnie nie działały smile.gif np w pliku usun nie dzialalo mi $usun = $db => czy jakos tak smile.gif to zmienilem na mysql_query smile.gif i w tym pierwszym pliku tez cos tam musiałem zmienic winksmiley.jpg

EDIT:
W tym pierwszym pliku dałem $wiersz = mysql_fetch_array($wynik); zamiast cos tam smile.gif

bo wyskakiwało mi


Fatal error: Call to a member function on a non-object jak mialem tak jak bylo w orginale winksmiley.jpg
=kokos=
Cytat
pliku usun nie dzialalo mi $usun = $db => czy jakos tak


Nie działało bo w zmiennej $db powinno się znajdować coś takiego :-)

  1. <?php
  2. $db = new mysqli('localhost', 'user', 'haslo', 'baza_danych');
  3. ?>


W PHP5 znajduje się nowa biblioteka łączenia się z serverem MySQL. Ta biblioteka nazywa sie mysqli i mozna jej używac z serverem MySQL w wersji 4 i wyzej.

2. Taki zapis
  1. <?php
  2. $wiersz = $wynik->fetch_assoc();
  3. ?>


równie dobrze można zapisać w ten sposób

  1. <?php
  2. $wiersz = mysql_fetch_assoc($wynik)
  3. ?>


Tyle, że ten wyżej działa w wersji php5 o ile się nie myle winksmiley.jpg
dawhol
pierwszy zapis mi nie działa drugi natomiast tak ale nie wprowadza to zadnej róznicy wyswietla mi x razy ten sam wiersz z bazy zamiast x róznych ;/

x - liczba wersów w bazie
=kokos=
Nie wiem dlaczego Ci nie działa. Przed chwilką też sprawdziłem skrypt w takiej wersji i wszystko działa tak jak trzeba.

plik.php

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


usun.php

  1. <?php
  2.  
  3. require('polacz.php');
  4.  
  5. $ile = $_POST['ile'];
  6.  
  7. if($_POST['usun'] == 'Usuń') {
  8. for ($i=0; $i <$ile; $i++)
  9. {
  10.  $sql ="DELETE FROM filmy WHERE ID_filmu = '".$_POST['opcja'.($i+1)]."'";
  11.  $usun = mysql_query($sql);
  12. }
  13.  
  14. if($usun)
  15. {
  16. //echo 'Zaznaczone elementy zostały usunięte';
  17.  
  18. //Lub
  19.  
  20. //header('Location: adres_do_plik.php');
  21. else {}
  22. ?>
dawhol
moj blad sorka przestawiłem jedna zmienana po za funkcje for smile.gif przez przypadek smile.gif ale juz działą smile.gif
mysql_php
Hej wszystkim,

jako, że jestem autorem tego posta - żeby nie zaśmiecać forum nowymi - napiszę tutaj swój kolejny problem, otóż nie działa mi takie banalne dodawanie do bazy. Nie robiłem wcześniej tego tak jak tutaj, tzn.
u mnie zawsze po pacnięciu submita wywoływała się inna strone ze skryptem który dodawał do bazy trkord.
Tu chciałem aby wsztstko się odbywało w 1 pliku. Powiedzcie co zchrzaniłem...

  1. <?php
  2.  
  3.  echo '<TABLE>';
  4.  echo '<form method="post">';
  5.  
  6.  echo '<TR>';
  7.  echo '<TD>ID Filmu</TD> <TD><INPUT TYPE="TEXT" NAME="ID_filmu"></TD>';
  8.  echo '</TR>';
  9.  echo '<TR>';
  10.  echo '<TD>ID Klienta</TD> <TD><INPUT TYPE="TEXT" NAME="ID_osoby"></TD>';
  11.  echo '</TR>';
  12.  echo '<TR>';
  13.  echo '<TD>Data planowanego zwrotu</TD><TD><INPUT TYPE="TEXT" NAME="w_data_plan"></TD>';
  14.  echo '</TR>';
  15.  echo '<TR>';
  16.  echo '<TD><INPUT TYPE="submit" NAME="dodaj" VALUE="Dodaj"></TD>';
  17.  echo '</TR>';
  18.  echo '</FORM>';
  19.  echo '</TABLE>';
  20.  
  21. if($_post['dodaj'] == 'Dodaj')
  22. {
  23.  
  24. $polacz = mysql_connect('localhost', 'root', 'XXXXX');
  25. $wybierz = mysql_select_db('wypozyczalnia');
  26.  
  27. $zapytanie = "INSERT INTO `wypozycz` VALUES ('".$_post['ID_filmu']."', '".$_post['ID_osoby']."', 'CURDATE()', 'Wypozyczona', '".$_post['w_data_plan']."', NULL, NULL, NULL)";
  28. $wynik = mysql_query($zapytanie);
  29. };
  30.  
  31. ?>


Halo Panowie... pomożecie?
Cysiaczek
Jaki dostajesz komunikat?
Bo $_post wygląda podejrzanie...
Powinno być chyba $_POST

Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.