Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP][MYSQL]dodanie rekordu do powiązanych tabel, jak dodac rekord do tabeli, która jest powiązana z dwoma innymi?
unnamed
post 21.10.2008, 10:28:24
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.09.2006

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


mam taką bazę danych:

  1. CREATE TABLE `autor` (
  2. `id_autor` int(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `imie` varchar(20) DEFAULT NULL,
  4. `nazwisko` varchar(45) NOT NULL,
  5. PRIMARY KEY (`id_autor`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  7.  
  8. CREATE TABLE `wydawn` (
  9. `wydawnictwo_id` int(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  10. `wydawnictwo` varchar(255) DEFAULT NULL,
  11. PRIMARY KEY (`wydawnictwo_id`)
  12. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  13.  
  14. CREATE TABLE `ksiazki` (
  15. `id` int(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  16. `id_autor` int(5) UNSIGNED NOT NULL,
  17. `tytul` varchar(255) NOT NULL,
  18. `wydawnictwo_id` int(5) UNSIGNED NOT NULL,
  19. PRIMARY KEY (`id`)
  20. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;



i skrypt php, który powinien dodawać rekordy do powyższej bazy danych:

  1. <?php
  2. $nazwisko=$_POST[nazwisko];
  3. $imie=$_POST[imie];
  4. $id_autor=$_POST[id_autor];
  5. $tytul=$_POST[tytul];
  6. $wydawnictwo_id=$_POST[wydawnictwo_id];
  7. $wydawnictwo=$_POST[wydawnictwo];
  8.  
  9. if(empty($nazwisko))
  10. {echo 'Wybierz autora!';
  11. exit;}
  12. else{echo "Autor: ".$nazwisko;}
  13.  
  14. if(empty($tytul))
  15. {echo '<br />Podaj tytuł!';
  16. exit;}
  17. else{echo "<br />Tytuł: ".$tytul;}
  18.  
  19. if(empty($wydawnictwo))
  20. {echo '<br>Wybierz wydawnictwo!';
  21. exit;}
  22. else{echo "<br />Wydawnictwo: ".$wydawnictwo;}
  23.  
  24.  
  25. $host="localhost";
  26. $db_user="";
  27. $db_password="";
  28. $database="baza";
  29. mysql_connect($host,$db_user,$db_password);
  30. mysql_select_db($database);
  31.  
  32. $sql='insert into autor values (NULL, NULL,"'.$nazwisko.'")';
  33. $id_autor=mysql_query("select id_autor from autor where nazwisko='$nazwisko'");
  34.  
  35. $sql='insert into autor values (NULL, "'.$wydawnictwo.'")';
  36. $wydawnictwo_id=mysql_query("select wydawnictwo_id from  wydawn where wydawnictwo='$wydawnictwo_id'");
  37.  
  38. $sql='insert into ksiazki values (NULL,"'.$id_autor.'", "'.$tytul.'","'.$wydawnictwo_id.'")';
  39. $rezultat=mysql_query($sql);
  40. if($rezultat==true)
  41. {echo 'Dane poprawnie zapisane w tabeli. <br />';}
  42. else{echo 'dane nie zostaly wstawione';
  43. ?>



niestety ten skrypt nie działa i nie potrafię sobie sama z nim poradzić, nie dodaje prawidłowo wartości do id_autor i wydawnictwo_id w tabeli książki no i nie chce dodać odpowiednich rekordów do tabel autor i wydawn :/

w tabeli ksiazki w wyniku dodania rekordu uzyskuje wartości:
id_autor: 0
tytuł: cos tam
wydawnictwo_id: 0


HELP!!!!
Go to the top of the page
+Quote Post
golaod
post 21.10.2008, 10:50:47
Post #2





Grupa: Zarejestrowani
Postów: 419
Pomógł: 42
Dołączył: 12.08.2008
Skąd: Wrocław

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


  1. <?php
  2. $sql="insert into autor values (NULL, NULL,'".$nazwisko."')";
  3. $id_autor=mysql_insert_id();
  4.  
  5. $sql="insert into wydawn values (NULL, '".$wydawnictwo."')";
  6. $wydawnictwo_id = mysql_insert_id();
  7.  
  8. $sql="insert into ksiazki values (NULL,'".$id_autor."', '".$tytul."','".$wydawnictwo_id."')";
  9. $rezultat=mysql_query($sql) or die(mysql_error());
  10. ?>


Ten post edytował golaod 21.10.2008, 10:51:29
Go to the top of the page
+Quote Post
JoShiMa
post 21.10.2008, 10:54:32
Post #3





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Najlepiej byłoby skorzystać z trigera, jeśli Twoja wersja bazy danych to dopuszcza.


--------------------
Go to the top of the page
+Quote Post
-gex-
post 21.10.2008, 11:01:20
Post #4





Goście







A nie lepiej to wszystko zrobić w jednej tabeli? Mniej zapytani do bazy a efekt i możliwości większe w konstruowaniu zapytań...
  1. CREATE TABLE `ksiazka` (
  2. `id` int(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `imie` varchar(20) DEFAULT NULL,
  4. `nazwisko` varchar(45) NOT NULL,
  5. `tytul` varchar(255) NOT NULL,
  6. `wydawnictwo` varchar(255) DEFAULT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
Go to the top of the page
+Quote Post
JoShiMa
post 21.10.2008, 11:03:32
Post #5





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Nie, nie lepiej. Tak zbudowana baza jest nieefektywna.


--------------------
Go to the top of the page
+Quote Post
-gex-
post 21.10.2008, 11:16:01
Post #6





Goście







Czyli mam przez to rozumieć że lepiej robić 3 zapytania niż jedno tak ? co mniej obciąży bazę?
Go to the top of the page
+Quote Post
JoShiMa
post 21.10.2008, 11:24:52
Post #7





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Cytat(gex @ 21.10.2008, 12:16:01 ) *
Czyli mam przez to rozumieć że lepiej robić 3 zapytania niż jedno tak ? co mniej obciąży bazę?

Jeśli baza będzie skonstruowana dobrze, to w tym wypadku trzy zapytania są lepsze niż jedno. Mogłabym się tu rozwodzić na temat optymalizacji bazy, ale lepiej będzie jak poczytasz fachową literaturę aaevil.gif


--------------------
Go to the top of the page
+Quote Post
mike
post 21.10.2008, 11:26:24
Post #8





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

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


Cytat(gex @ 21.10.2008, 12:16:01 ) *
Czyli mam przez to rozumieć że lepiej robić 3 zapytania niż jedno tak ? co mniej obciąży bazę?
Zbyt płytko to oceniasz.
Co wykonujesz na bazie częściej? Zapis czy odczyt?

Masz rację, szybciej zapisac rekord do jednej tabeli niż do trzech. Choć różnica jest pomijalna i nie to jest najważniejsze. Najważniejsze jest optymalne przechowywanie dancyh i szybki dostęp do nich. A przy rozbiciu na tebele jest lepiej, szybciej i optymalniej.

Podana przez Ciebie konstrukcja jest zła. Tragiczna bym rzekł.
Jak sobie wyobrażasz dodanie 100 książek tego samego autora? 100 razy to samo w tabeli? Pomyłka.
Go to the top of the page
+Quote Post
unnamed
post 21.10.2008, 11:54:52
Post #9





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.09.2006

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


No właśnie, teraz zastanawiam się nad tym aby skrypt sprawdzał czy dana pozycja już istnieje w bazie zanim ją doda, samo dodawanie już działa dzięki użytkownikowi golaod (bardzo dziękuję).
Go to the top of the page
+Quote Post
-gex-
post 21.10.2008, 12:21:26
Post #10





Goście







Faktycznie po przemyśleniu tego zagadnienia optymalniej jest przechowywać jest raz jedno nazwisko niż tyle samo ile wydał książek. Burza mózgów czasem wskazana guitar.gif
Go to the top of the page
+Quote Post
golaod
post 21.10.2008, 13:27:33
Post #11





Grupa: Zarejestrowani
Postów: 419
Pomógł: 42
Dołączył: 12.08.2008
Skąd: Wrocław

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


Tu nie ma co się zastanawiać nad optymalnością. Czemu ludzie wymyślili programowanie obiektowe ? Bo wszystko da się dobrze zilustrować dzięki OOP można nawet skonstruować w banalny sposób człowieka (tzn imitacje)
Czemu zatem nie ma co się zastanawiać nad konstrukcją tabel ? Bo istnieje coś takiego jak schemat drzewa który jest po prostu wszechmocny do czegoś takiego. Zatem oczywiste jest, że baz powinna wyglądać tak: lista_autorow->lista_ksiazek(lista_autorow_id,gatunek_id)<-gatunek(lista_autorow_id)
Go to the top of the page
+Quote Post
unnamed
post 21.10.2008, 15:48:46
Post #12





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.09.2006

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


aj, teraz sobie nie daje rady z tym aby sprawdzało przed wstawieniem rekordu do bazy czy np. dana osoba lub wydawnictwo już czasem nie istnieje sad.gif kombinowałam z zapytaniem select a potem z if-ami, ale nie wychodzi mi nic sad.gif

  1. <?php
  2. $id_autor=mysql_query("select id_autor from autor where nazwisko='$nazwisko'");
  3. if(empty($id_autor))
  4. {
  5. $wynik = mysql_query('SELECT 0 FROM autor WHERE id_autor='.$nazwisko');
  6. if (mysql_num_rows($wynik)>0) {
  7.    echo 'autor istnieje';
  8. }
  9. else {
  10.    $sql="insert into autor values (NULL, NULL,'".$nazwisko.")";
  11.    mysql_query($sql) or die(mysql_error());
  12.    $id_autor=mysql_insert_id();
  13.    $rezultat=mysql_query($sql);
  14. }
  15. }
  16. ?>
Go to the top of the page
+Quote Post
Spawnm
post 21.10.2008, 16:02:32
Post #13





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




zamiast:
$wynik = mysql_query('SELECT 0 FROM autor WHERE id_autor='.$nazwisko');
daj
$wynik = mysql_num_rows(mysql_query('SELECT 0 FROM autor WHERE id_autor='.$nazwisko.'));
Go to the top of the page
+Quote Post
unnamed
post 21.10.2008, 16:27:13
Post #14





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.09.2006

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


lipa, bo nadal nie sprawdza czy autor istnieje, dodaje go na nowo:( takim sposobem mam dwóch Kwiatkowskich sad.gif
Go to the top of the page
+Quote Post
Spawnm
post 21.10.2008, 16:31:53
Post #15





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




na podstawie tego co napisałem już bys sobie sam mógł to zrobić ....

  1. <?php
  2. $id_autor = mysql_num_rows(mysql_query('SELECT id_autor FROM autor WHERE nazwisko='.$nazwisko.));
  3. if($id_autor<1){
  4. //reszta
  5. }
  6. ?>


Ten post edytował Spawnm 21.10.2008, 16:55:24
Go to the top of the page
+Quote Post
unnamed
post 22.10.2008, 15:45:27
Post #16





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.09.2006

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


jestem za tępa na to:/ nie dodaje dwa razy tego samego autora, ale w tabeli ksiazki wywala 0 zamiast pobierać id_autor sad.gif

  1. <?php
  2. $id_autor = mysql_num_rows(mysql_query("SELECT id_autor FROM autor WHERE nazwisko='.$nazwisko.'"));
  3. if($id_autor<1)
  4. {
  5. $wynik = mysql_num_rows(mysql_query("SELECT 0 FROM autor WHERE nazwisko='".$nazwisko."'"));
  6. if (mysql_num_rows($wynik)>=0) {
  7.    echo 'autor istnieje';
  8.    $id_autor=mysql_insert_id();
  9. } else {
  10. $sql="insert into autor values (NULL, NULL,'".$nazwisko."')";
  11. $id_autor=mysql_insert_id();
  12. $rezultat=mysql_query($sql);
  13. }
  14. }
  15. ?>



aaa no i jeszcze błąd: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Program Files\WebServ\httpd\cos\dod.php on line 48 (linia 48 to: if (mysql_num_rows($wynik)>=0) { )

Ten post edytował unnamed 22.10.2008, 15:47:22
Go to the top of the page
+Quote Post
Spawnm
post 22.10.2008, 15:54:32
Post #17





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




$id_autor = mysql_num_rows(mysql_query("SELECT id_autor FROM autor WHERE nazwisko='.$nazwisko.'"));
powinno być ... where nazwisko='".$nazwisko."' "));


dalej

$wynik = mysql_num_rows(mysql_query("SELECT 0 FROM autor WHERE nazwisko='".$nazwisko."'"));
if (mysql_num_rows($wynik)>=0) {

2 razy num_rows ?
Go to the top of the page
+Quote Post
unnamed
post 22.10.2008, 16:00:24
Post #18





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.09.2006

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


a da się raz? wydawało mi sie ze tak jak chciałam zrobić powinno być poprawnie, ale ja się nie znam :] powoli się uczę smile.gif
Go to the top of the page
+Quote Post
golaod
post 22.10.2008, 16:02:07
Post #19





Grupa: Zarejestrowani
Postów: 419
Pomógł: 42
Dołączył: 12.08.2008
Skąd: Wrocław

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


W ogóle nie rozumiem tej dziwnej i pogmatwanej konstrukcji a ty Spawnm zamiast ją nakierować na dobrą to dajesz słabo ukierunkowane podpowiedzi.

  1. <?php
  2. $id_autora = mysql_query("SELECT id_autor FROM autor WHERE nazwisko='.$nazwisko.'") or die(mysql_error()); // Stworzenie zapytania
  3. // po co tworzyc drugie ktore selectuje 0 dla znalezionych nazwisk ?
  4. if(mysql_num_rows($id_autora)==0) // sprawdzenie czy ilosc znalezionych rozna od zera
  5. {
  6.   // jesli tak
  7.  $insert = "INSERT...";
  8.   mysql_query($insert) or die(mysql_error());
  9.  
  10. }
  11. else
  12. {
  13.  $pobierz = mysql_fetch_array($id_autora,MYSQL_ASSOC);
  14. }
  15. ?>


Ten post edytował batman 22.10.2008, 18:22:31
Powód edycji: poprawiłem bbcode ~batman
Go to the top of the page
+Quote Post
unnamed
post 22.10.2008, 16:22:03
Post #20





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.09.2006

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


ja się chyba potnę, drugi dzień myślę nad tym i mam dość:/ teraz ponownie poprawnie pobiera id_autor ale za to tym razem dodaje autora pomimo, ze jest on już w bazie sad.gif
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 24.04.2024 - 09:50