Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]dodanie rekordu do powiązanych tabel
Forum PHP.pl > Forum > Przedszkole
unnamed
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!!!!
golaod
  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. ?>
JoShiMa
Najlepiej byłoby skorzystać z trigera, jeśli Twoja wersja bazy danych to dopuszcza.
gex
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;
JoShiMa
Nie, nie lepiej. Tak zbudowana baza jest nieefektywna.
gex
Czyli mam przez to rozumieć że lepiej robić 3 zapytania niż jedno tak ? co mniej obciąży bazę?
JoShiMa
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
mike
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.
unnamed
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ę).
gex
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
golaod
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)
unnamed
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. ?>
Spawnm
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.'));
unnamed
lipa, bo nadal nie sprawdza czy autor istnieje, dodaje go na nowo:( takim sposobem mam dwóch Kwiatkowskich sad.gif
Spawnm
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. ?>
unnamed
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) { )
Spawnm
$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 ?
unnamed
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
golaod
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. ?>
unnamed
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
Spawnm
Unnamed, pewnie dlatego że Golaod nie poprawił błędu o którym pisałem post wyżej tongue.gif
czyli:

  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. ?>
unnamed
jeśli poprawie to na
  1. <?php
  2. $id_autora = mysql_query("SELECT id_autor FROM autor WHERE nazwisko='".$nazwisko."' ")
  3. ?>

to nie dość, że wstawia nazwisko, które już istnieje w bazie (w tabeli autor) to jeszcze wypisuje 0 dla id_autor w tabeli ksiazki, poprzednia wersja jest pod tym względem lepsza, poprawnie zczytuje id_autor dla tabeli ksiazki, tylko jeszcze jak sprawić aby sprawdzała czy autor już istnieje w bazie?

HELP!!!! ja już pomysłów nie mam, kombinowałam z rożnymi możliwościami i albo nie działa nic albo działa tylko częściowo:(
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.