Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Problem z porównaniem danych z jednej tabeli zdanymi w drugiej
Forum PHP.pl > Forum > Przedszkole
jaqb04
Witam.
Mam serwis dotyczacy zapisów studentów na specjalizacje. Mam 2 tabele:
zapisy_na_specjalizacje z kolumnami:
Id_zapisu_specjalizacja<PK>,
Id_specjalizacja<FK>,
Id_student<FK>,
Data_zapisu_specjalizacja
oraz
Specjalizacje z kolumnami:
Id_specjalizacja<PK>,
Nazwa_specjalizacji,
Liczba_miejsc,

Student logując się na serwis wybiera z listy rozwijanej specjalizację. Chodzi o to, że ilość miejsc na każdej specjalizacji jest ograniczona, więc trzeba zrobić coś takiego jak zliczanie dla każdego przedmiotu ile osób sie juz na niego zapisało i porównanie tych wyników z Liczba_miejsc. Jeżeli ilość zapisanych studentów jest mniejsza od liczby miejsc dostępnych to specjalizacja sie wyświetla na liście rozwijanej, a jeżeli liczba studentów zapisanych na specjalizacje jest równa Liczba_miejsc to specjalizacja nie wyświetla sie w liście rozwijanej.
Niby proste ale próbowałem już kilkoma sposobami i coś mi nie wychodzi. Poniżej przedstawiam kod formularza do zapisów:
  1. <body>
  2. <?php
  3. #Uruchomienie sesji
  4. #Sprawdzenie czy istnieje zmienna sesyjna login
  5. if ($HTTP_SESSION_VARS['login'])
  6. {
  7. # Dane potrzebne do polaczenia sie z baza i wybraniu odpowiedniej tabeli
  8. $host="localhost";
  9. $user="root";
  10. $pass="";
  11. $baza="zak";
  12. $tabela="Specjalizacje";
  13.  
  14.  
  15. $login=$HTTP_SESSION_VARS['login'];
  16. print"zapisy na specjalizacje<br>";
  17.  
  18. #laczenie sie z baza
  19. @mysql_connect ("$host", "$user", "$pass")
  20.               or die ("Nie mozna polaczyc sie z baza");
  21. #wybieranie tabeli
  22. @mysql_select_db ("$baza") or die ("Nie mozna wybrac bazy");
  23.  
  24.  
  25. #formularz w ktorym uzytkownik wybiera specjalizacje na ktora chce sie zapisac
  26. print"<form action=\"zapis_s.php\" method=\"post\">";
  27. #wyswietlenie nazwiska uzytkownika
  28. print "<center><h2>Jestes zalogowany jako ".$login."</h2></center><br><br>";
  29. print"<TABLE>";
  30. print "<tr><td><center><h3>PROSZE WYBRAC SPECJALIZACJE</h3></center></td>
  31.      <td><center><h3><select name=\"spec\">";
  32.  
  33.      #zapytanie wyswietlajace rekordy
  34.      $zapytanie1 = "SELECT * FROM $tabela";
  35.      #wykonanie zapytania
  36.  
  37.      
  38.      $wynik1 = mysql_query($zapytanie1);
  39.           #Wyswietlenie specjalizacji w liscie rozwijanej
  40.           while($rekord1=mysql_fetch_array($wynik1))
  41.  
  42.           {print"<option value=".$rekord1["Id_specjalizacja"].">"
  43.                  .$rekord1["Nazwa_specjalizacji"]."</option>";}
  44.  
  45.       print"</select></h3></center></td></tr>";
  46.  
  47. print "<TR><TD><center><h3><input type=\"submit\" name=\"submit\"
  48.       value=\"DALEJ->\"></h3></center></TD></TR><br>";
  49.  
  50.  
  51. PRINT"</TABLE>";
  52.        print"</form>";
  53.  
  54. }
  55.  
  56. else
  57. #jezeli niezalogowany uzytkownik znajdzie sie na
  58. #tej stronie to wyswietli mu sie komunikat:
  59. {print "Nie jestes zalogowany";
  60.    }
  61.     ?>
  62. </body>


Z góry dzięki za podpowiedzi
Foxx
Można np. tak, ale nie testowałem tego więc Ty to zrób.
Poza tym pewnie jest jakieś fajne pojedyńcze zapytanie SQL które załatwia sprawę ale ja go nie znam.

  1. <?php
  2. #zapytanie wyswietlajace rekordy
  3. $zapytanie1 = "SELECT * FROM $tabela";
  4. #wykonanie zapytania
  5.    
  6. $wynik1 = mysql_query($zapytanie1);
  7.  
  8. #Wyswietlenie specjalizacji w liscie rozwijanej
  9. while($rekord1=mysql_fetch_array($wynik1))
  10. {
  11.   $zapytanie2 = "SELECT count(*) FROM zapisy_na_specjalizacje WHERE Id_specjalizacja='".$rekord1['Id_specjalizacja']."'";
  12.   $wynik2 = mysql_query($zapytanie2);
  13.   $licz = mysql_fetch_array($wynik2);
  14.   if($licz[0] < $rekord1['Liczba_miejsc']){
  15.      print"<option value=".$rekord1["Id_specjalizacja"].">".$rekord1["Nazwa_specjalizacji"]."</option>";
  16.   }
  17. }
  18. ?>


Btw. tablic $HTTP_SESSION_VARS itp. używali nasi pradziadowie, możesz po prostu $_SESSION chyba że masz jakieś stare PHP, ale wtedy raczej zmień PHP.
Pilsener
Użyj po prostu w zapytaniu GROUP BY - jest to na tyle proste, że chyba nie muszę dodawać przykładu praktycznego? Ale dam:
  1. SELECT count(id),login FROM posty GROUP BY login
- zwróci login - liczba postów. Dobra, dam gotowca:

  1. SELECT specjalizacje.nazwa,count(zapisy.id)/specjalizacje.maks AS wynik
  2. FROM zapisy,specjalizacje WHERE specjalizacje.id=zapisy.id_specjalizacji
  3. GROUP BY specjalizacje.id
  4. HAVING wynik < 1
- nazwy tabel i pól napisałem inne, dostosuj do swoich potrzeb. W wyniku powinna być lista specjalizacji, na które są miejsca + % obłożenia
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.