Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL]Mysql jak sprawdzic ID rekordów ktore usunołem
set4812
post 1.06.2013, 19:25:28
Post #1





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 13.04.2010

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


Pisze forum i mam tabele kategorie i gdy chce usunac kategorie automatycznie usuwam wszystkie dzialy bo tabele sa polaczone. I pojawia sie problem skad wziasc id dzialow ktore usunolem bo chce przy okazji usunac wszystkie tematy ktore do dzialu należa tongue.gif
Go to the top of the page
+Quote Post
wujek2009
post 1.06.2013, 19:48:11
Post #2





Grupa: Zarejestrowani
Postów: 350
Pomógł: 31
Dołączył: 23.05.2010

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


W MySQLu jest coś tak genialnego jak więzy integralności - powinieneś tym się zainteresować. Już na etapie projektowania bazy nadajesz takie więzy i później właśnie podczas usuwania głównego forum - automatycznie usuwa Ci tematy.

PS. Jeśli nic nie znajdziesz pod hasłem "więzy integralności" to spróbuj pod hasłem "klucze obce mysql"

Jednak jeśli chodzi o Twój problem to proponuje coś w stylu:
(ps. fajnie jakbyś takie usuwanie oparł o transakcje w mysql - poczytaj o tym);
  1. $forum_id = $_GET['forum']; // id forum do usunięcia:
  2.  
  3. // sprawdź czy w ogóle takie forum istnieje o identyfikatorze $forum_id - zwykłe zapytanie SQL
  4.  
  5. $dzialyZapytanie = 'select dzial_id from forum_dzialy where forum_id = '. $forum_id;
  6. $pobierzWszystkieDzialy = mysql_query, itd dla zmiennej $dzialyZapytanie; // pobieramy wszystkie działy krótko mówiąc
  7. $dzialyTablica = array(); // przechowujemy ID działów
  8.  
  9. if ( $pobierzWszystkieDzialy )
  10. {
  11. foreach ( $pobierzWszystkieDzialy as $dzial_data )
  12. {
  13. $dzialyTablica[$dzial_data['dzial_id']] = $dzial_data['dzial_id'];
  14. }
  15.  
  16. if ( count($dzialyTablica) )
  17. {
  18. // usuwamy tematy z działów:
  19. mysql_query('delete from forum_tematy where temat_dzial_id IN ('. implode(',', $dzialyTablica) )');
  20. }
  21. }
  22.  
  23. // później to:
  24. - usuwamy powyższe działy
  25. - usuwamy forum
  26. - synchornizujemy liczniki (ilość postów, ostatni autor, itd - typowy schemat dla for dyskusyjnych)


PS. Kod pisany z palca, przepraszam za literówki w kodzie ;-)
PS2. Kod pisany luźnie - musisz go dostosować do swoich potrzeb. Nazwy kolumn, nazwy tabel, itd pisałem na domysł.

Ten post edytował wujek2009 1.06.2013, 19:50:15
Go to the top of the page
+Quote Post
set4812
post 1.06.2013, 20:32:05
Post #3





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 13.04.2010

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


Do kluczów obcych zawsze musze dodawać tabele dodatkową?
Klucze obce sie sprawdzą przy schemacie takim ze usuwam 1 kategorie to usuwają się : dzialy, tematy ktore są w działach, i posty ktore sa w temacie.
Wychodza 3 dodatkowe tabele przy czyms takim.
Jakbym mial kontrolowac tranzakcje to nie za duzo zapytan bede robic do bazy aby pobierac dane i nie bedzie podobny schemat to co napisałeś?
Go to the top of the page
+Quote Post
viking
post 2.06.2013, 06:08:16
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Klucze obce to integralna część tabel. Nie musisz nic więcej tworzyć, dajesz tylko ON DELETE CASCADE czy co tam chcesz.


--------------------
Go to the top of the page
+Quote Post
wujek2009
post 2.06.2013, 09:55:58
Post #5





Grupa: Zarejestrowani
Postów: 350
Pomógł: 31
Dołączył: 23.05.2010

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


Udostępniam Ci mój przykład związany z kluczami obcymi. Dwie tabele:

a) tabela użytkowników (identyfikator to kolumna "id")
cool.gif tabela sesji (sesji dla danego użytkownika = zwróć uwagę na kolumnę "user_id" - łączy się z tabela użytkowników dla kolumny "id")

Tabela użytkowników
  1. CREATE TABLE IF NOT EXISTS `users`
  2. (
  3. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  4.  
  5. `name` varchar(25) NOT NULL,
  6. `surname` varchar(32) NOT NULL,
  7. `username` varchar(32) NOT NULL,
  8. `email` varchar(127) NOT NULL,
  9. `password` varchar(64) NOT NULL,
  10.  
  11. UNIQUE KEY `uniq_username` (`username`),
  12. UNIQUE KEY `uniq_email` (`email`)
  13. ) engine = innodb DEFAULT charset = utf8;


Tabela sesji
  1. CREATE TABLE IF NOT EXISTS `sessions`
  2. (
  3. `session_id` varchar(24) NOT NULL PRIMARY KEY,
  4. `last_active` int(10) UNSIGNED NOT NULL,
  5. `contents` text NOT NULL,
  6. `user_id` int(10) UNSIGNED NOT NULL DEFAULT 1,
  7. `user_ip` varchar(15) NOT NULL,
  8.  
  9. UNIQUE KEY `uniq_sid` (`session_id`, `user_id`),
  10. INDEX fk_active_index (`last_active`),
  11. INDEX fk_uid_index (`user_id`),
  12.  
  13. FOREIGN KEY (user_id) REFERENCES users (id) ON UPDATE cascade ON DELETE cascade
  14. ) engine = innodb DEFAULT charset = utf8;


Zapis:
Kod
foreign key (user_id) references users (id) on update cascade on delete cascade


można tłumaczyć: ~ kolumnę "user_id" (z tabeli sessions) połącz z tabelą "users" i odwołaj się do kolumny "id" (z tabeli "users") w przypadku:
a) aktualizacji rekordu ("on update"),
cool.gif usunięcia rekordu ("on delete")

I gdybyś zastosował takie rozwiązanie w swoim projekcie to ograniczyłbyś zapytania typu pobierz ID działów, usuń tematy z danego działu, itd.

Ten post edytował wujek2009 2.06.2013, 09:58:07
Go to the top of the page
+Quote Post
set4812
post 2.06.2013, 10:52:07
Post #6





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 13.04.2010

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


Miałem klucze obce na zajecia z baz danych ale jakos nie przywiazalem do tego uwagi. Narazie tabele mam zrobiona z phpmyadmina i wypelniana byle czym wiec moge sobie modyfikowac dowolnie.
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 Wersja Lo-Fi Aktualny czas: 25.04.2024 - 14:46