Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie danych (relacje)
Forum PHP.pl > Forum > Bazy danych > MySQL
szubi95
Witam!

Obecnie tworzę skrypt zastępstw dla nauczyciela w szkole i natrafiłem na problem. Może najpierw przedstawię kod:

Na razie dwie tabele

  1. CREATE TABLE dane
  2. (
  3. id INTEGER PRIMARY KEY AUTO_INCREMENT,
  4. nauczyciel_id INTEGER NOT NULL,
  5. lekcja INTEGER NOT NULL,
  6. klasa_id INTEGER NOT NULL,
  7. przedmiot_id INTEGER NOT NULL,
  8. zastepca_id INTEGER NOT NULL,
  9. DATA DATE NOT NULL,
  10. CONSTRAINT fk_dane_nauczyciele FOREIGN KEY (nauczyciel_id)
  11. REFERENCES nauczyciele(id)
  12. );


  1. CREATE TABLE nauczyciele
  2. (
  3. id INTEGER PRIMARY KEY AUTO_INCREMENT,
  4. imie VARCHAR (35) NOT NULL,
  5. nazwisko VARCHAR (35) NOT NULL
  6. );


oraz skrypt php, który ma za zadanie pobierać dane z tabel

  1. <?php
  2.  
  3. try
  4. {
  5. $db_conn = new PDO('mysql:host=localhost; dbname=szubi2', 'root', '');
  6.  
  7. $stmt = $db_conn -> query('
  8. SELECT dane.id, dane.nauczyciel_id, dane.lekcja, dane.klasa_id, dane.przedmiot_id, dane.zastepca_id, dane.data
  9. FROM dane
  10. INNER JOIN nauczyciele
  11. ON dane.nauczyciel_id = nauczyciele.id
  12.  
  13. WHERE dane.nauczyciel_id = nauczyciele.id
  14. ');
  15.  
  16. echo '<table>
  17. <tr>
  18. <th>Data</th>
  19. <th>Nauczyciel</th>
  20. <th>Godzina</th>
  21. <th>Klasa</th>
  22. <th>Przedmiot</th>
  23. <th>Zastepstwo</th>
  24. </tr>
  25. <tr>
  26. <td></td>
  27. <td></td>
  28. <td></td>
  29. <td></td>
  30. <td></td>
  31. <td></td>
  32. </tr>
  33. ';
  34.  
  35. while ($row = $stmt->fetchRow()):
  36. if (strlen($row['dane.nauczyciel_id']>0) && strlen($row['data']>0)):
  37. echo '
  38. <tr>
  39. <td class="wazne">'.$row['data'].'</td>
  40. <td class="wazne">'.$row['nauczyciel_id'].'</td>
  41. <td>'.$row['lekcja'].'</td>
  42. <td>'.$row['klasa_id'].'</td>
  43. <td>'.$row['przedmiot_id'].'</td>
  44. <td>'.$row['zastepca_id'].'</td>
  45. </tr>
  46. ';
  47.  
  48. else:
  49.  
  50. echo '
  51. <tr>
  52. <td></td>
  53. <td></td>
  54. <td>'.$row['lekcja'].'</td>
  55. <td>'.$row['klasa_id'].'</td>
  56. <td>'.$row['przedmiot_id'].'</td>
  57. <td>'.$row['zastepca_id'].'</td>
  58. </tr>
  59. ';
  60.  
  61. endif;
  62.  
  63. endwhile;
  64.  
  65. echo'</table>';
  66.  
  67. $stmt -> CloseCursor();
  68.  
  69.  
  70. }
  71. catch(PDOException $e)
  72. {
  73. echo 'Wystąpił błąd biblioteki: ' .$e->getMessage();
  74. }
  75.  
  76. ?>



I właśnie chyba z pobieraniem jak i wyświetlaniem jest tutaj problem. Pokazuje mi błąd:
Fatal error: Call to undefined method PDOStatement::fetchRow() in D:\sciezka on line 83

Mógłbym prosić o wskazówki w jaki sposób napisać to zapytanie SELECT(myślę że tam coś źle zrobiłem) oraz jak w przypadku powiązania napisać wyświetlanie (czy ma się tyczyć już napisu tzn: $row('nazwisko') czy też po prostu jako id.

Pozdrawiam szubi
nithajasz
W PDO nie ma metody fetchRow() zamiast tego użyj po prostu fetch(PDO::FETCH_ASSOC)

http://www.php.net/manual/en/pdostatement.fetch.php
szubi95
Dzięki wink.gif
Już sobie poradziłem błąd tkwił w zapytaniu SELECT wink.gif

Pozdrawiam szubi
Fifi209
Przy okazji baza jest źle skonstruowana

id - INT UNSIGNED

nauczyciel_id - dużo masz nauczycieli? Więcej niż 255? Zastosuj: TINYINT UNSIGNED
to samo tyczy się lekcji, przedmiotu, zastępcy etc.

imię - 35 znaków? Myślę że do 15 możesz skrócić.

Brakuje jeszcze tabeli przedmioty

Czemu nie użyjesz LEFT JOIN?

Jeżeli wybierasz wszystko z data to możesz napisać SELECT `data.*` z tego co pamiętam.
Właściwie nie wiem po co wybierasz wszystko skoro, potrzebujesz datę i lekcję ? Resztę czyli nazwisko, imię nauczyciela, nazwę przedmiotu wybierasz z innej tabeli przecież, od tego masz JOIN'a

Co do przedmiotów to nie jest ich tak dużo i zastosowałbym chyba typ wyliczeniowy ENUM ?
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.