Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Pobieranie Danych I Wyświetlanie
Forum PHP.pl > Forum > Bazy danych > MySQL
qtchb
Witam!

W bazie MySQL są tabele: ksiazki(id, tytul, wydawca, rok, dzial), autorzy(id, nazwisko, tytuł naukowy, miejsce, inne). Relacja między nimi to "wiele do wiele". Dlatego stworzyłem też tabelę: autorzyksiazek(id_ksiazki, id_autora).

Mam stronkę, na której jest wyświetlana lista książek. Dane rekordów pochodzą tylko z tabeli ksiazki. Dane prezentowane są w formie listy:

Kod wygląda tak:
"
$db_name = "nuke";
$con = mysql_connect("localhost", "root", "") or die("Blad otwarcia bazy");
$db = mysql_select_db($db_name, $con) or die("Otwarcie tabeli nie powiodło się");

$sql = "select * from k_ksiazki";
$result = mysql_query($sql, $con) or die("Błąd połączenia");

print "<html><body>";

while ($record = mysql_fetch_array($result)) {
$id_ksiazki = $record[0];
$tytul_ksiazki = $record[1];
$n_wydawcy = $record[2]; $rok = $record[3];
$dzial = $record[4];
$indeks = $record[5];
print "<br>ID Książki: $id_ksiazki, Tytuł: <b>$tytul_ksiazki</b><br>Wydana przez: <b>$n_wydawcy</b> w roku <b>$rok</b>. Przypisana do działu: <b>$dzial</b>. <br> Autorzy: NIE_WIEM_CO_TU_WPISAĆ";
}

print "</body></html>";
"

Chciałbym, aby za słowem Autorzy (na końcu skryptu), pojawiła się lista wszystkich autorów. Problem polega na tym, że aby wyświetlić listę autorów, trzeba najpierw:
1. wskazać id książki z tabeli ksiazki,
2. sprawdzić w tabeli autorzyksiazek, jakie numery id autorów przypisane są do danego numeru id ksiązki,
3. sprawdzić, jakie jest nazwisko autora, który ma dane id.

Najlepiej byłoby za słowem "Autorzy" wstawić nazwę zmiennej, ale nie wiem jak ją zdefiniować i w którym miejscu umieścić.

Ponieważ to jest mysql, to złożony select odpada. Prawdopodobnie bedę musiał wykonywać jakieś operacje na zmiennych bedących wynikami poszczególnych poleceń select.

Nie mam pojęcia jak się do tego zabrać.
Czy ktoś mógłby pomóc? Proszę wskazać choćby metodę, o gotowe rozwiązanie nei mam odwagi prosić smile.gif

Pozdrawiam
BŁażej
delorian
  1. <?php
  2.  
  3. function pobierz_autorow($id_ksiazki) 
  4. {
  5.  $sql = &#092;"SELECT nazwisko FROM autorzy INNER JOIN autorzyksiazek ON autorzy.id=autorz
    y
  6. siazek.id_autora WHERE autorzyksiazek.id_ksiazki=$id_ksiazki\";
  7.  
  8. $result = mysql_query($sql, $con) or die(\"Błąd połączenia\");
  9.  
  10. $autorzy = '';
  11.  
  12. while ($record = mysql_fetch_array($result)) {
  13.  $autorzy .= $record['nazwisko'];
  14.  
  15. return $autorzy;
  16.  
  17. }
  18.  
  19. ?>


NIE_WIEM_CO_TU_WPISAĆ -> wpisz pobierz_autorow($id_ksiazki)

No i oczywiście ta funckja jest jeszcze daleka od piękności i cudowności ;P
qtchb
Witam!

Dzięki, ale nie działa sad.gif

Przerobiłem to trochę, żeby dostosować do mojej bazy, ale wywala mi "Błąd połączenia 2".

Kod, który napisałeś, wstawiłem (bez <? i ?>) zaraz za mysql_connect i mysql_select_db.

Wygląda to teraz tak:
"
function pobierz_autorow($id_ksiazki)
{
$sql2 = "SELECT n_autor FROM k_autorzy
INNER JOIN k_autorzyksiazek
ON k_autorzy.id_autora=k_autorzyksiazek.id_autora
WHERE k_autorzyksiazek.id_ksiazki=$id_ksiazki";

$result2 = mysql_query($sql2, $con) or die("Błąd połączenia 2");

$autorzy = '';

while ($record = mysql_fetch_array($result2)) {
$autorzy .= $record['n_autor'];
}


return $autorzy;

}
"

Natomiast w liście napisałem tak:

"
print "<html><body>";

while ($record = mysql_fetch_array($result)) {
$id_ksiazki = $record[0];
$tytul_ksiazki = $record[1];
$n_wydawcy = $record[2]; $rok = $record[3];
$dzial = $record[4];
$indeks = $record[5];
print "<br>Tytuł książki: <b><font size=\"4\">$tytul_ksiazki</b></font> Numer grzebietowy: <b>$id_ksiazki</b><br>Wydana przez: <b>$n_wydawcy</b> w roku <b>$rok</b>. Przypisana do działu: <b>$dzial</b>. <br> Autorzy: ";
print pobierz_autorow($id_ksiazki);

print "<br>";
}

print "</body></html>";
"

Na czym polega błąd?

Może samo zapytanie SELECT jest źle przeze mnie poprawione?

Wyjaśnię może, że tabele nazywają się:
k_ksiazki(id_ksiazki-PRIMARY KEY, tytul_ksiazki, n_wydawcy; brak innych kluczy),
k_autorzy(id_autora-PRIMARY KEY, n_autor - KLUCZ typu INDEX, ZAWIERA NAZWISKA AUTORÓW, tyt_autor; brak innych kluczy),
k_autorzyksiazek(id_autora, id_ksiazki; PRIMARY KEY na obu polach łącznie).
adism
Oto kod potrzebnej funkcji:

  1. <?php
  2.  
  3. function pobierz_autorow($id_ksiazki) {
  4.  $sql = &#092;"SELECT id_autora FROM autorzyksiazek WHERE id_ksiazki=$id_ksiazki\";
  5.  $result = mysql_query($sql) or die(&#092;"Błąd połączenia\");
  6.  $count = mysql_num_rows($result);
  7.  
  8.  $query = &#092;"SELECT nazwisko FROM autorzy WHERE 1\";
  9.  for ($i = 0; $i < $count; $i++) {
  10. $wiersz = mysql_fetch_array($result);
  11. $query .= &#092;" AND id=\".$wiersz['id_autora']; 
  12.  }
  13.  $rekordy = mysql_query($query) or die(&#092;"Błąd połączenia\");
  14.  
  15.  $autorzy = '';
  16.  
  17.  while ($record = mysql_fetch_array($rekordy)) {
  18. $autorzy .= $record['nazwisko'];
  19.  } 
  20.  
  21.  return $autorzy;
  22. }
  23.  
  24. ?>


nie testowana, ale powinna zadzialac
qtchb
coś jednak nie działa,

Naniosłem porawki, żeby dostosować kod do mojej bazy. Cały kod wygląda teraz tak:

  1. <?php
  2. $module_name = &#092;"Listak\";
  3.  
  4. if (!eregi(&#092;"modules.php\", $PHP_SELF)) { die (\"Nie możesz odczytać tej strony inaczej, jak tylko poprzez Portal Kancelarii
    .
  5. .\"); }
  6.  
  7. $index = 0;
  8. global $admin, $user, $module_name;
  9. include(\"header.php\");
  10. OpenTable();
  11.  
  12.  
  13. echo \"<h1> Lita wszystkich książek Kancelarii</h1>\";
  14. echo \"<h3> Poniższa tabela zawiera informacje o wszystkich książkach, jakie zostały wp
  15. owadzone do naszej <b>Biblioteki</b>.</h3>\";
  16.  
  17. $db_name = \"nuke\";
  18. $con = mysql_connect(\"localhost\", \"root\"\"l\") or die(\"Blad otwarcia bazy\");
  19. $db = mysql_select_db($db_name, $con) or die(\"Otwarcie tabeli nie powiodło się\");
  20.  
  21. function pobierz_autorow($id_ksiazki) {
  22. $sql2 = \"SELECT id_autora FROM k_autorzyksiazek WHERE id_ksiazki=$id_ksiazki\";
  23. $result2 = mysql_query($sql2, $con) or die(\"Błąd połączenia 3\");
  24. $count = mysql_num_rows($result2);
  25.  
  26. $query2 = \"SELECT nazwisko FROM autorzy WHERE 1\";
  27. for ($i = 0; $i < $count; $i++) {
  28. $wiersz = mysql_fetch_array($result2);
  29. $query2 .= \" AND id=\".$wiersz['id_autora']; 
  30. }
  31. $rekordy = mysql_query($query2) or die(\"Błąd połączenia 2\");
  32.  
  33. $autorzy = '';
  34.  
  35. while ($record = mysql_fetch_array($rekordy)) {
  36. $autorzy .= $record['nazwisko'];
  37.  
  38. return $autorzy;
  39. }
  40.  
  41. $sql = \"select * from k_ksiazki\";
  42. $result = mysql_query($sql, $con) or die(\"Błąd połączenia\");
  43.  
  44.  
  45.  
  46.  
  47. print \"<html><body>\";
  48.  
  49. while ($record = mysql_fetch_array($result)) { 
  50. $id_ksiazki = $record[0];
  51. $tytul_ksiazki = $record[1]; 
  52. $n_wydawcy = $record[2]; $rok = $record[3];
  53. $dzial = $record[4];
  54. $indeks = $record[5];
  55. print \"<br>Tytuł książki: <b><font size=\"4\">$tytul_ksiazki</b></font> Numer grzebietowy: <b>$id_ksiazki</b><br>Wydana przez: <b>$n_wydawcy</b> w roku <b>$rok</b>. Przypisana do działu: <b>$dzial</b>. <br> Autorzy: \"
  56. print pobierz_autorow($id_ksiazki);
  57.  
  58. print \"<br>\";
  59. }
  60.  
  61. print \"</body></html>\";
  62.  
  63. CloseTable();
  64.  
  65. ?>


Na stronie wyświetlane sa informacje wyłącznie o pierwszym rekordzie z tabeli k_ksiazki, a po słowie Autorzy, pojawia się błąd:
"Błąd połączenia 3", czyli coś jest nie tak z SELECTEM.

A może w złym miejscu umieściłem kod (definicję) funkcji?

Teraz wychodzi na to, że w definicji funkcji "pobierz_autorow" pojawia się zmienna "$id_ksiazki", której wartość jest przypisywana dopiero w dalszej części kodu? Czy to ma jakieś znaczenie? Czy powiniene function pobierz_autorow($id_ksiazki) wstawić w innym miejscu?
adism
po pierwsze: zastap slowa "Blad polaczenia 3" na mysql_error() i zobaczysz na czym polega blad

a po drugie: usun cala definicje funkcji i zamiast jej wywolania [czyli linia: print pobierz_autorow ($id_ksiazki);] wstaw ten oto kod:

  1. <?php
  2.  
  3. $sql2 = &#092;"SELECT id_autora FROM k_autorzyksiazek WHERE id_ksiazki=$id_ksiazki\";
  4. $result2 = mysql_query($sql2, $con) or die(&#092;"Błąd połączenia 3\");
  5. $count = mysql_num_rows($result2);
  6.  
  7. $query2 = &#092;"SELECT nazwisko FROM autorzy WHERE 1\";
  8. for ($i = 0; $i < $count; $i++) {
  9. $wiersz = mysql_fetch_array($result2);
  10. $query2 .= &#092;" AND id=\".$wiersz['id_autora']; 
  11. }
  12. $rekordy = mysql_query($query2) or die(&#092;"Błąd połączenia 2\");
  13.  
  14. $autorzy = '';
  15.  
  16. while ($record = mysql_fetch_array($rekordy)) {
  17. $autorzy .= $record['nazwisko'];
  18. } 
  19.  
  20. echo $autorzy;
  21.  
  22. ?>


to jest po prostu tresc tej funkcji
qtchb
Świetnie!

Prawie działa smile.gif

Teraz wyświetla mi na stronie listę wszystkich ksiązek, ale jeśli chodzi o autorów, to podaje mi dane tylko po jednym autorze do 2 z 6 książek, przy pozostałych 4 książkach za słowem Autorzy nie pojawia się nic.

Sprawdziłem w bazie, do dwóch książek przypisany jest jeden autor, do pozostałych po dwóch, trzech.

Wyświetlani są więc tylko autorzy tych książek, przy których jest jeden autor. Jeśli autorów jest więcej, nie wyświetla niczego.

Jak to ugryźć?

Oto cały kod strony:
  1. <?php
  2. $module_name = &#092;"Listak\";
  3. $module_name2 = &#092;"Dodajk\";
  4.  
  5. if (!eregi(&#092;"modules.php\", $PHP_SELF)) {    die (\"Nie możesz odczytać tej strony inaczej, jak tylko poprzez Portal Kancelarii
    .
  6. .\"); }
  7. $index = 0;
  8.     global $admin, $user, $module_name;
  9.     include(\"header.php\");
  10.     OpenTable();
  11.  
  12. echo \"<h1> Lita wszystkich książek Kancelarii</h1>\";
  13. echo \"<h3> Poniższa tabela zawiera informacje o wszystkich książkach, jakie zostały wp
  14. owadzone do naszej <b>Biblioteki</b>.</h3>\";
  15.  
  16. $db_name = \"nuke\";
  17. $con = mysql_connect(\"localhost\", \"root\"\"\") or die(\"Blad otwarcia bazy\");
  18. $db = mysql_select_db($db_name, $con) or die(\"Otwarcie tabeli nie powiodło się\");
  19.  
  20. $sql = \"select * from k_ksiazki\";
  21. $result = mysql_query($sql, $con) or die(\"Błąd połączenia\");
  22.  
  23. print \"<html><body>\";
  24.  
  25. while ($record = mysql_fetch_array($result)) { 
  26. $id_ksiazki = $record[0];
  27. $tytul_ksiazki = $record[1]; 
  28. $n_wydawcy = $record[2]; $rok = $record[3];
  29. $dzial = $record[4];
  30. $indeks = $record[5];
  31.  
  32. print \"<br>Tytuł książki: <b><font size=\"4\">$tytul_ksiazki</b></font> 
  33. Numer grzebietowy: <b>$id_ksiazki</b>
  34. <br>Wydana przez: <b>$n_wydawcy</b> 
  35. w roku <b>$rok</b>. 
  36. Przypisana do działu: <b>$dzial</b>. 
  37. <br> Autorzy: \"; 
  38.  
  39. $sql2 = &#092;"SELECT id_autora 
  40. FROM k_autorzyksiazek 
  41. WHERE id_ksiazki=$id_ksiazki&#092;";
  42.  
  43. $result2 = mysql_query($sql2, $con) or die (mysql_error());
  44. $count = mysql_num_rows($result2);
  45.  
  46. $query2 = &#092;"SELECT n_autor FROM k_autorzy WHERE 1\";
  47. for ($i = 0; $i < $count; $i++) {
  48.   $wiersz = mysql_fetch_array($result2);
  49.   $query2 .= &#092;" AND id_autora=\".$wiersz['id_autora']; 
  50. }
  51. $rekordy = mysql_query($query2, $con) or die (mysql_error());
  52.  
  53. $autorzy = '';
  54.  
  55. while ($record = mysql_fetch_array($rekordy)) {
  56.   $autorzy .= $record['n_autor'];
  57. } 
  58.  
  59. echo $autorzy;
  60.  
  61. print &#092;"<br>\";
  62. }
  63.  
  64. print &#092;"</body></html>\";
  65.  
  66.     CloseTable();
  67.  
  68. ?>


blink.gif
adism
a sproboj tak:

  1. <?php
  2.  
  3. $sql2 = &#092;"SELECT id_autora FROM k_autorzyksiazek WHERE id_ksiazki=$id_ksiazki\";
  4. $result2 = mysql_query($sql2, $con) or die(&#092;"Błąd połączenia 3\");
  5. $count = mysql_num_rows($result2);
  6.  
  7. $wiersz = mysql_fetch_array($result2);
  8. $query2 = &#092;"SELECT nazwisko FROM autorzy WHERE id=\".$wiersz['id_autora'];
  9. for ($i = 1; $i < $count; $i++) {
  10.  $wiersz = mysql_fetch_array($result2);
  11.  $query2 .= &#092;" OR id=\".$wiersz['id_autora']; 
  12. }
  13. $rekordy = mysql_query($query2) or die(&#092;"Błąd połączenia 2\");
  14.  
  15. $autorzy = '';
  16.  
  17. while ($record = mysql_fetch_array($rekordy)) {
  18.   $autorzy .= $record['nazwisko'];
  19. } 
  20.  
  21. echo $autorzy;
  22.  
  23.  
  24.  
  25. ?>
qtchb
SUPER!!!!!


Działa prawie idealnie.

Pozostała jeszcze jedna mała rzecz: skrypt nie wstawia spacji pomiędzy nazwiska poszczególnych autorów. Czy można jakoś zmusić go do umieszczania po każdym nazwisku ", " bez zmiany wpisów w bazie danych?

Pozdrawiam i serdecznie dziękuję za dotychczasową pomoc!

Błazej
adism
nie ma problemu:

nastepujacy kod:

  1. <?php
  2.  
  3. while ($record = mysql_fetch_array($rekordy)) {
  4.   $autorzy .= $record['nazwisko'];
  5. } 
  6.  
  7. echo $autorzy;
  8.  
  9. ?>


trzeba zastapic na:

  1. <?php
  2.  
  3. while ($record = mysql_fetch_array($rekordy)) {
  4.   $autorzy .= $record['nazwisko'].&#092;", \";
  5. } 
  6.  
  7. echo substr($autorzy, 0, -2);
  8.  
  9. ?>
qtchb
REWELACJA!!!

Bardzo, bardzo dziękuję!

Błazej
scanner
Przeniesione: Skrypty obsługi baz danych => MySQL
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.