Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][$_GET] multiple rows delete
Forum PHP.pl > Forum > PHP
hettmix
Witam.

Tym razem mam taki oto problemik. Przekazuję metodą $_GET nr id wierszy tabeli do skryptu pdf_del_all.php:
  1. function arrayToString($array){
  2. $i = 0;
  3. $string = '';
  4.  
  5. foreach ($array as $index => $value ){
  6. if($i != count($array)-1){
  7. $string .= "$value,";
  8. }else $string .= "$value";
  9. $i++;
  10. }
  11.  
  12. $string = '['.$string.']';
  13. return $string;
  14. }
  15.  
  16. while ($z = mysql_fetch_assoc($wynik)) {
  17.  
  18. $ids[$z['id']] = $z['id'];
  19. $pdfs = arrayToString($ids, 1);
  20.  
  21. echo "<table>";
  22. echo "<tr style=\"font-size: 0.9em; font-weight: normal; text-align: right; resize: none;\" bgcolor=$bgcolor>";
  23. echo "<td colspan=\"2\"><a id=\"confirm_button\" style=\"text-decoration: none; text-align: right;\" href='pdf_del_all.php?id_pdfs=$pdfs' onclick=\"return confirmDeleteAll(this);\"><img src='/modules/mod_zbiorczy_pdf/images/x.png' border=0>wszystkie</a></td>";
  24. echo "<td colspan=\"4\">Wszystkich plików:&nbsp;<b>$i<b>&nbsp;&nbsp;</td>";
  25. echo "</tr>";
  26. echo "</table>";
  27. }

Teraz skrytp pdf_del_all.php powinien usunąć z bazy wskazane wiersze oraz pliki z serwera powiązane przez zapisaną ścieżkę:
  1. if (isset($_GET['id_pdfs'])) {
  2.  
  3. $delete_id = explode(",", $_GET['id_pdfs']);
  4. $id = count($delete_id);
  5.  
  6. if (count($id) > 0)
  7. {
  8. foreach ($delete_id as $id_d)
  9. {
  10. $sql = "delete FROM tbl_zwykle_2str_pdf WHERE id='$id_d'";
  11. $delete = mysql_query($sql) or die('Błąd zapytania delete');
  12. }
  13. }
  14. }

Puki co skrypt usuwa z bazy wiersze lecz nie wszystkie - pozostaje jeden wiersz mimo że print_r($id_d) pokazuje wszystkie wiersze będące w tabeli.
Nie wiem też jak pobrać z bazy ścieżkę do pliku, a następnie usunąć go z serwera.
  1. CREATE TABLE IF NOT EXISTS `tbl_zwykle_2str_pdf` (
  2. `id` smallint(6) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `pdf_uzytkownik` varchar(30) COLLATE utf8_polish_ci NOT NULL,
  4. `pdf_czas_dodania` time NOT NULL,
  5. `pdf_data_dodania` date NOT NULL,
  6. `pdf_nazwa_pliku` varchar(200) COLLATE utf8_polish_ci NOT NULL,
  7. `pdf_typ_pliku` varchar(100) CHARACTER SET utf8 NOT NULL,
  8. `pdf_rozmiar_pliku` int(9) NOT NULL,
  9. PRIMARY KEY (`id`),
  10. KEY `pdf_uzytkownik` (`pdf_uzytkownik`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=4 ;

Jakaś wskazówka....
mokry
  1. SELECT * FROM tbl_zwykle_2str_pdf WHERE id IN($_GET['id_pdfs']);

Oczywiście zmienna GET powinna zostać zabezpieczna przez ew. atakiem.

Następnie foreach po pobranych wierszach oraz unlink() wg ścieżki z kolumny `pdf_nazwa_pliku`.

Na końcu:
  1. DELETE FROM tbl_zwykle_2str_pdf WHERE id IN($_GET['id_pdfs']);


Edit:
Zamiast stosować jakieś dziwne funkcje do składania i rozkładania string'u do/z tablicy zastosuj implode() i explode().
hettmix
Cytat(mokry @ 7.01.2013, 20:31:48 ) *
  1. SELECT * FROM tbl_zwykle_2str_pdf WHERE id IN($_GET['id_pdfs']);

Oczywiście zmienna GET powinna zostać zabezpieczna przez ew. atakiem.

Następnie foreach po pobranych wierszach oraz unlink() wg ścieżki z kolumny `pdf_nazwa_pliku`.

Na końcu:
  1. DELETE FROM tbl_zwykle_2str_pdf WHERE id IN($_GET['id_pdfs']);


Edit:
Zamiast stosować jakieś dziwne funkcje do składania i rozkładania string'u do/z tablicy zastosuj implode() i explode().

No właśnie pętla foreach ładnie wybiera wskazane wiersze, lecz usuwane są wszystkie poza jednym - nie wiem dlaczego...
mokry
Zobacz jakie zapytanie do bazy generuje Ci PHP, wyświetl je i sprawdź, czy wszystie id się zgadzają z tymi, które posiadasz w bazie danych.
Możliwe, że gdzieś masz podane złe id i dlatego Ci go nie chwyta.
hettmix
Cytat(mokry @ 7.01.2013, 22:20:44 ) *
Zobacz jakie zapytanie do bazy generuje Ci PHP, wyświetl je i sprawdź, czy wszystie id się zgadzają z tymi, które posiadasz w bazie danych.
Możliwe, że gdzieś masz podane złe id i dlatego Ci go nie chwyta.

OK - podmieniłem funkcję zamieniającą tablicę na string na implode i teraz usuwanie rekordów ładnie działa. Nie mogę sobie poradzić w dalszym ciągu z wybraniem z bazy poszczególnych ścieżek do plików, które później usunę unlink'iem.

  1. foreach ($delete_id as $id_d)
  2. {
  3. mysql_query("delete FROM tbl_zwykle_2str_pdf WHERE id='$id_d'") or die('Błąd zapytania delete');
  4. $pdf_nazwa_pliku = mysql_query("select * FROM tbl_zwykle_2str_pdf WHERE id in('.implode(',',$delete_id).')") or die('Błąd zapytania select');
  5. $target_path = "/volume1/web/Joomla_1.5/modules/mod_zbiorczy_pdf/tmp/zwykle_1_strona/";
  6. $file = $target_path . $pdf_nazwa_pliku;
  7. echo $file;
  8. }

w wyniku dostaję:
/volume1/web/Joomla_1.5/modules/mod_zbiorczy_pdf/tmp/zwykle_1_strona/Resource id #18
/volume1/web/Joomla_1.5/modules/mod_zbiorczy_pdf/tmp/zwykle_1_strona/Resource id #19
/volume1/web/Joomla_1.5/modules/mod_zbiorczy_pdf/tmp/zwykle_1_strona/Resource id #20
mokry
Masz:
  1. $delete_id = '15,23,59,98,78,26,58'; // Przykladowe id
  2.  
  3. $target_path = "/volume1/web/Joomla_1.5/modules/mod_zbiorczy_pdf/tmp/zwykle_1_strona/";
  4.  
  5. //Zapytanie po rekordy do usuniecia plikow
  6. $result = mysql_query("SELECT * FROM tbl_zwykle_2str_pdf WHERE id IN(".$delete_id.")") or die('Błąd zapytania delete');
  7. while($row = mysql_fetch_assoc($result)) //Iteracja po wynikach z bazy danych
  8. {
  9. $file = $target_path . $row['pdf_nazwa_pliku']; // Dobranie sie do kolumny aktualnie iterowanego wiersza
  10. echo $file;
  11. //unlink($file); // Tutaj mozesz sobie usunac plik
  12. }
  13. //Usuwasz wszystkie rekordy
  14. $query = mysql_query("delete FROM tbl_zwykle_2str_pdf WHERE id IN(".$delete_id.")") or die('Błąd zapytania delete');
hettmix
Cytat(mokry @ 8.01.2013, 02:05:48 ) *
Masz:
  1. $delete_id = '15,23,59,98,78,26,58'; // Przykladowe id
  2.  
  3. $target_path = "/volume1/web/Joomla_1.5/modules/mod_zbiorczy_pdf/tmp/zwykle_1_strona/";
  4.  
  5. //Zapytanie po rekordy do usuniecia plikow
  6. $result = mysql_query("SELECT * FROM tbl_zwykle_2str_pdf WHERE id IN(".$delete_id.")") or die('Błąd zapytania delete');
  7. while($row = mysql_fetch_assoc($result)) //Iteracja po wynikach z bazy danych
  8. {
  9. $file = $target_path . $row['pdf_nazwa_pliku']; // Dobranie sie do kolumny aktualnie iterowanego wiersza
  10. echo $file;
  11. //unlink($file); // Tutaj mozesz sobie usunac plik
  12. }
  13. //Usuwasz wszystkie rekordy
  14. $query = mysql_query("delete FROM tbl_zwykle_2str_pdf WHERE id IN(".$delete_id.")") or die('Błąd zapytania delete');

No i problem rozwiązany - poniżej sprawdzony, działający kod:
  1. if (isset($_GET['id_pdfs'])) {
  2.  
  3. $id_pdfs = trim($_GET['id_pdfs']);
  4. $delete_id = explode(",", $_GET['id_pdfs']);
  5. $id = count($delete_id);
  6.  
  7. if (count($id) > 0)
  8. {
  9. $result = mysql_query("SELECT * FROM tbl_zwykle_2str_pdf WHERE id IN(".$id_pdfs.")") or die('Błąd zapytania delete');
  10. while($row = mysql_fetch_assoc($result))
  11. {
  12. $file = $row['pdf_nazwa_pliku'];
  13. unlink($file);
  14. }
  15. //Usuwasz wszystkie rekordy
  16. $query = mysql_query("delete FROM tbl_zwykle_2str_pdf WHERE id IN(".$id_pdfs.")") or die('Błąd zapytania delete');
  17.  
  18. echo "<BR /><div style=\"background-color: #F5F5F5; height: 45px; padding-top: 5px; text-align: center;\"><b>REKORDY <span style=\"color: blue\">\ ".$id_pdfs." \</span> ZOSTAŁY POPRAWNIE USUNIĘTE Z BAZY.<BR /><b></div>";
  19. echo "<div style=\"padding-top: 30px; text-align: center;\"><img height=\"50%\" width=\"20%\" align=\"middle\" src=\"images/ok_icon.png\" title=\"\" alt=\"\" /></div><BR />";
  20. }
  21. }
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.