Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][mysql] Pętla usuwająca dane z bazy
cadavre
post
Post #1





Grupa: Zarejestrowani
Postów: 472
Pomógł: 7
Dołączył: 7.12.2005
Skąd: Gliwice

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


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

Ten post edytował cadavre 27.08.2006, 17:59:57


--------------------
Silesian PHP User Group - www.spug.pl
Symfony2, OAuth2, budowanie API - masz pytania? Pisz!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
krzyszbi
post
Post #2





Grupa: Zarejestrowani
Postów: 251
Pomógł: 13
Dołączył: 15.09.2005

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


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


--------------------
Everything should be made as simple as possible, but not simpler. - A.Eainstein
Go to the top of the page
+Quote Post
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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
Go to the top of the page
+Quote Post
cadavre
post
Post #4





Grupa: Zarejestrowani
Postów: 472
Pomógł: 7
Dołączył: 7.12.2005
Skąd: Gliwice

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


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.


--------------------
Silesian PHP User Group - www.spug.pl
Symfony2, OAuth2, budowanie API - masz pytania? Pisz!
Go to the top of the page
+Quote Post

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: 20.08.2025 - 13:40