Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] relacja wiele do wielu
Forum PHP.pl > Forum > PHP
fantaff
witam mam 3 tablice

department:
id_department
name

employee:
id_employee
fname
lname
pesel
fee

employee_has_department - tablica relacji
id_employee
id_department


probuj zrobic cos takiego aby po wejsciu do jakiegos dzialu wyswietlilo liste aktualnie przypisanych pracownikow. zrobilem to za pomoca zapytania:
  1. SELECT em.fname, em.lname, em.pesel, em.fee FROM employee em, employee_has_department ed WHERE em.id_employee = ed.id_employee AND ed.id_department = '$id'


i dalej chce aby byl link edytuj ktory przekieruj do kolejnej strony gdzie zostana wyswietleni wszyscy pozostali pracownicy ktorzy jeszcze nie sa przyporzadkowani do tego danego dzialu.

problem polega na tym ze nie chce mi wyswietlac wynikow. pokazuje mi sie blad:
  1. Warning: mysql_numrows() expects parameter 1 to be resource, boolean given in C:\xampp\xampp\htdocs\company\depedit.php on line 43


kod:
  1. <table width="1000" border="0" cellspacing="0" cellpadding="0">
  2. <?php
  3.  
  4. $id = $_GET['ID'];
  5. $empquery = "SELECT em.fname, em.lname, em.pesel, em.fee FROM employee em, employee_has_department ed WHERE em.id_employee = ed.id_employee AND ed.id_department = '$id'";
  6. $result=mysql_query($empquery);
  7.  
  8. $num=mysql_numrows($result); //to jest linia 43
  9.  
  10. $i=0;
  11. while ($i < $num) {
  12.  
  13. $imie=mysql_result($result,$i,"em.fname");
  14. $nazwisko=mysql_result($result,$i,"em.lname");
  15. $pesel=mysql_result($result,$i,"em.pesel");
  16. $pensja=mysql_result($result,$i,"em.fee");
  17. ?>
  18. <tr>
  19. <td><?php // echo $id; ?></td>
  20. <td><?php echo $imie; ?></td>
  21. <td><?php echo $nazwisko; ?></td>
  22. <td><?php echo $pesel; ?></td>
  23. <td><?php echo $pensja; ?></td>
  24. </tr>
  25. <?php
  26. $i++;
  27. }
  28. ?>
  29. <tr>
  30. <td colspan="5">
  31. <a href="depedit.php?ID=<?php echo $id; ?>">edytuj</a>
  32. </td>
  33. </tr>
  34.  
  35. </table>


z gory dziekuje za wszelkie sugestie
tehaha
1. zapoznaj się z podstawami pobierania wyników z bazy http://www.php.net/manual/en/function.mysql-fetch-array.php
2. Nie sprawdziłeś, czy zapytanie się wykonało i nie wywala błędu, jako początkujący stosuj:
  1. $result=mysql_query($empquery) or die(mysql_error());

3. Czytaj treści błędów, masz dokładnie napisane, że miałeś przekazać do funkcji zasób, a przekazałeś typ logiczny(boolean)
4. poczytaj o sql injection i zabezpieczaniu zapytania, bo masz tutaj lukę w zabezpieczeniach, a najlepiej to używaj PDO i prepared statements
5. Taka struktura zapytania sql jest dopuszczalna, ale lepiej jest używać LEFT JOIN, jest o wiele czytelniejsza, zwłaszcza jak z czasem zaczniesz pisać bardziej skomplikowane kwerendy
fantaff
1. zapoznaj się z podstawami pobierania wyników z bazy http://www.php.net/manual/en/function.mysql-fetch-array.php

dopiero pozniej pomyslalem zeby sprawdzic czy zapytanie sql wogole sie wykona. takze tutaj byl blad.

4. poczytaj o sql injection i zabezpieczaniu zapytania, bo masz tutaj lukę w zabezpieczeniach, a najlepiej to używaj PDO i prepared statements

to jest tylko praca przykladowa i pisze narazie tylko glowny zarys projektu takze w tym stadium rozwoju zadne zabezpieczenia nie sa konieczne a raczej powodowalyby utrudnienia w czytaniu kodu.

5. Taka struktura zapytania sql jest dopuszczalna, ale lepiej jest używać LEFT JOIN, jest o wiele czytelniejsza, zwłaszcza jak z czasem zaczniesz pisać bardziej skomplikowane kwerendy

zamiast left joina uzylem:
  1. $empquery = "SELECT em.fname, em.lname, em.pesel, em.fee FROM employee em WHERE em.id_employee NOT IN ( SELECT ed.id_employee FROM employee_has_department ed WHERE ed.id_department ='$id')";


dzieki za odpowiedz bede mial na uwadze to co napisales:)
mortus
Pierwsze Twoje zapytanie działa prawidłowo, tzn. wybiera wszystkich pracowników, którzy pracują w określonym oddziale. Drugie zapytanie działa odwrotnie, tzn. wybiera wszystkich pracowników, którzy nie pracują w tym okreslonym oddziale. Złączenia są lepsze nie tylko ze względu na "łatwość czytania" (a tutaj zresztą bywa różnie), ale przede wszystkim ze względu na wydajność.
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.