Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Pętla usuwająca dane z bazy
Forum PHP.pl > Forum > Przedszkole
cadavre
Struktura:


Objaśnienia:
1. Wykres. Przedstawia on strukturę przynależności elementów do działów. "idX" to nazwa elementu. Podkreślona nazwa elementu to dział.
2. Tabela.
ID - auto_increment'owany id elementu
BELONGS - określa, do którego ID'u (będącego działem) należy element
DZIAL - przjmuje wartości 1 i 0 (prawda/fałsz). Jeśli 1 - element jest działem
NAZWA - wiadomo...


Co potrzebuję:
Aby znając jeden ID (w tym przypadku np. 1) usunąć wszystkie wpisy, które są z nim powiązane. Czyli by usunąć całość ID=1 - trzeba usunąć działy ID=3 oraz ID=6 oraz ich elementy. Przy okazji potrzebuję odczytać wartość "FILE" (nie narysowałem w tabeli) dla każdego z usuwanych ID'ów.

Próbowałem całość obsłużyć pętlą, ale nie bardzo mam pomysł jak to zrobić. Coś takiego naskubałem:
  1. <?php
  2. $i=0;
  3. do {
  4. $sqlI = "SELECT `id` FROM `menu` WHERE `belongs`='$id'";
  5. $queryI = mysql_query($sqlI);
  6. while ($row = mysql_fetch_row($queryI)) {
  7. $eidy[] = $row[0];
  8. $i++;
  9. }
  10. (...)
  11. ?>

W ten sposób mam w tablicy $eidy, IDy działów, które są w pierwszej kolejności poddziałami. $i zawiera ile ID'ów zostało zapisanych (w celu wykonania pętli). Następnie trzeba wykonać identyczną pętlę by odczytać czy ID'y z tablicy $eidy nie mają w sobie jeszcze jakichś poddziałów.

ID'y wszystkich działów potrzebuję mieć w tablicy (np. jak tutaj $eidy).

Jakieś pomysły? smile.gif
krzyszbi
witam
trzeba by tu uzyć rekurencji
kiedyś miałem podobny problem i mam takie jego rozwiązanie

funkcja
  1. <?php
  2. function grupa(&$tmp,$id)//konieczna referencja inaczej ja nie wiem jak to zrobić
  3.  {
  4. $query_fg = "SELECT id FROM menu WHERE belongs=".$id;
  5. $result_fg = mysql_query ($query_fg);
  6. $li = @ mysql_num_rows($result_fg);
  7. if ($li>0)
  8. {
  9. while($row_fg = mysql_fetch_array($result_fg))
  10. {
  11. $tmp[] = $row_fg['id'];
  12. grupa($tmp,$row_fg['id']);
  13. }
  14. }
  15. else
  16. {
  17.  return false;
  18. }
  19.  }
  20. ?>

wywołanie
  1. <?php
  2. $t = array();
  3. grupa($t,1);// id=1 dla przykładu
  4. echo'<pre>'.print_r($t,1).'</pre>';
  5. ?>

i teraz wystarczy implodem zrobic coś takiego
  1. <?php
  2. $where = 'id='.implode(' OR id=', $t);
  3. $query = 'DELETE FROM menu WHERE ( '.$where.' )';
  4. ?>

powinno działac snitch.gif
mike
Ludzie, ludzie a po co to wszystko.
Przecież to można zrobić wywołując tylko jedno zapytanie:
  1. DELETE FROM tabela WHERE id = x


Wystarczy zadbać trochę o konstrukcję tabeli w jakiej to się odbywa.

Załóż na pole belongs index i załóż relację z polem id a na usuwanie zareaguj kaskadowo. Wtedy jak usuniesz wiersz z id, które jest kluczem obcym dla innego rekordu, tamten zostanie również usunięty.
Potrzeba do tego tabel InnoDB
cadavre
Wcześniej jednak muszę znać wartości pól FILE z każdego ID'a - muszę wybrać je selectem i zapisać do tablicy mike_mech.
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.