Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP][JavaScript] Dynamiczna lista rozwijalna
Forum PHP.pl > Forum > Przedszkole
agentmullder
Witam wszystkich. Z ajaxem mam stycznosc po raz pierwszy. A od razu chyba na gleboka wode sie rzucilem ;(
Taki problem: chcalem za pomoca ajaxa zrobic, aby po wyborze pozycji w liscie rozwijalnej nr1 pobralo mi dane z jednej kolumny tabeli dla pewnego zbioru A. Dane z kolumny (zbior A) automatycznie ajaxem ladowany jest do listy rozwijalnej nr2.
Do tego momentu mi dziala smile.gif Tutaj nasuwa sie problem.
Teraz z listy rozwijalnej nr2 zawierajacej zbior A wybieram pozycje, ktora zawezi mi zbior A do mniejszego zbioru obiektow z tej samej kolumny.

Nie wiem jak sie odwolac do drugiego onchange w liscie nr2 zeby stworzyc zawartosc listy rozwijlnej nr3.

Oto kod skryptu:

[JAVASCRIPT] pobierz, plaintext
  1. function showUser(str)
  2. {
  3. if (str=="")
  4. {
  5. document.getElementById("txtHint").innerHTML="";
  6. return;
  7. }
  8. if (window.XMLHttpRequest)
  9. {// code for IE7+, Firefox, Chrome, Opera, Safari
  10. xmlhttp=new XMLHttpRequest();
  11. }
  12. else
  13. {// code for IE6, IE5
  14. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  15. }
  16. xmlhttp.onreadystatechange=function()
  17. {
  18. if (xmlhttp.readyState==4 && xmlhttp.status==200)
  19. {
  20. document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
  21. }
  22. }
  23. xmlhttp.open("GET","rejestracja333.php?q="+str,true);
  24.  
  25. xmlhttp.send();
  26. }
[JAVASCRIPT] pobierz, plaintext


A tutaj kod:

  1. <?php
  2. include ('includes/config_includes.php'); // Odniesienie Do pliku który łączy z DB
  3. $q=$_GET["q"];
  4. $sql="SELECT * FROM flota WHERE flota_oddzial = '".$q."'";
  5. $result = mysql_query($sql);
  6.  
  7. echo '<table id="txtHint" rules="all" class="tabelka" align="center"><tr>';
  8. echo "<td class='title'>Oddział:</td>";
  9. echo "<td class='info'>";
  10.  
  11. // to jest lista rozwijalna nr1. Wybieram miasto z ktorego bede wybieral samochody.
  12.  
  13. echo "<form>";
  14. echo "<select name='txtHint' onchange='showUser(this.value)'>";
  15. echo "<option value='Warszawa'>Warszawa</option>";
  16. echo "<option value='Wroclaw'>Wroclaw</option>";
  17. echo "<option value='Gdansk'>Gdansk</option>";
  18. echo "</form></td></tr><tr>";
  19.  
  20. //wybralem miasto, z ktorego do tej listy nizej wstawia sie klasay aut z oddzialu z danego miasta
  21.  
  22. $sql2="SELECT flota_klasa FROM flota WHERE flota_oddzial = '".$q."'";
  23. $result2 = mysql_query($sql2);
  24.  
  25. echo "<td class='title'>Klasa:</td>";
  26. echo "<td class='info'>";
  27. echo "<select name='klasa' onchange='showUser(this.value)'>";
  28. echo "<option value=''>Wybierz</option> ";
  29. while($row2 = mysql_fetch_array($result2))
  30. {
  31. echo "<option value='".$row2['flota_oddzial']."'>".$row2['flota_klasa']."</option>";
  32.  
  33. }
  34. echo '</option>';
  35. echo '</td>';
  36. echo '</td>';
  37. echo '</tr>';
  38.  
  39. //i tutaj zacinam sie, nie wiem jak stworzyc liste nr3, ktora zawezi grupe samochodow o danych: samochody z miasta .... (np Warszawa) nalezace do klasy ... (np Klasa A). I z tych samochodow chce stworzyc trzecia liste rozwijalna zawierajaca modele tych samochodow. Czyli beda tylko modele samochodow, ktore znajduja sie w oddziale Warszawa i ich klasa to A.
  40.  
  41. echo "</table>";
  42.  


W komentarzach wyjasnilem o co chodzi. Prosze o pomoc.
Pozdrawiam
bastard13
przechowaj sobie swoje $_GET['q'] w zmiennej sesji np. $_SESSION['q'], a w kodzie zrób coś takiego:
  1. //wyświetlanie miast
  2.  
  3. if($_GET['q'])
  4. { //wysłany ajax
  5. if(isset($_SESSION['q']))
  6. { /*pobieranie aut z danego miasta i klasy.
  7.   flota_oddzial = $_SESSION['q']
  8.   flota_klasa = $_GET['q']
  9.   */
  10. }
  11. else
  12. { /*pobieranie aut z danego miasta
  13.   flota_oddzial = $_GET['q']
  14.   */
  15. //zapis do sesji
  16. $_SESSION['q'] = $_GET['q'];
  17. }
  18. /*w powyższych instrukcjach tworzysz odpowiednie zapytanie, a teraz je wykonujesz i wyświetlasz tabelę*/
  19.  
  20. }
agentmullder
Nie no to dla mnie za trudne sad.gif

Spoko, robie sesje, ale jak raz wybiore z listy rozwijalnej i zarejestruje zmienna sesyjna to ona ciagle bedzie rowna tej zmiennej.
bastard13
dopisz po includzie:
  1. <?php
  2. $oddzial=(isset($_SESSION['oddzial']) ? $_SESSION['oddzial'] : $_GET['q']);
  3. $klasa=(isset($_SESSION['oddzial']) ? $_GET['q'] : false);
  4. if(isset($_SESSION['oddzial']))
  5. { unset($_SESSION['oddzial']);
  6. }
  7. else
  8. { $_SESSION['oddzial']=$_GET['q'];
  9. }
  10.  
  11. //zamień drugie zzapytanie na
  12. $sql2="SELECT * FROM flota WHERE flota_oddzial = '".$oddzial."' and flota_klasa='".$klasa."'";

Pisane na sucho, ale powinno zadziałać.
agentmullder
Cytat(bastard13 @ 21.08.2010, 19:01:16 ) *
dopisz po includzie:
  1. <?php
  2. $oddzial=(isset($_SESSION['oddzial']) ? $_SESSION['oddzial'] : $_GET['q']);
  3. $klasa=(isset($_SESSION['oddzial']) ? $_GET['q'] : false);
  4. if(isset($_SESSION['oddzial']))
  5. { unset($_SESSION['oddzial']);
  6. }
  7. else
  8. { $_SESSION['oddzial']=$_GET['q'];
  9. }
  10.  
  11. //zamień drugie zzapytanie na
  12. $sql2="SELECT * FROM flota WHERE flota_oddzial = '".$oddzial."' and flota_klasa='".$klasa."'";

Pisane na sucho, ale powinno zadziałać.


Nic nie dziala. Moze pokaze do czego sam doszedlem. Oto kod:

  1. $q=$_GET["q"];
  2. $_SESSION["q"]=$_GET["q"];
  3. $sql="SELECT * FROM flota WHERE flota_oddzial = '".$q."'";
  4. $result = mysql_query($sql);
  5.  
  6. echo '<table id="txtHint" rules="all" class="tabelka" align="center"><tr>';
  7. echo "<td class='title'>Oddział:</td>";
  8. echo "<td class='info'>";
  9.  
  10. echo "<form>";
  11. echo "<select name='txtHint' onchange='showUser(this.value)'>";
  12. echo "<option value='Warszawa'>Warszawa</option>";
  13. echo "<option value='Sejny'>Sejny</option>";
  14. echo "<option value='Gdansk'>Gdansk</option>";
  15.  
  16. echo "</form></td></tr><tr>";
  17.  
  18.  
  19.  
  20.  
  21.  
  22. $sql2="SELECT flota_klasa FROM flota WHERE flota_oddzial = '".$_SESSION["q"]."'";
  23. $result2 = mysql_query($sql2);
  24.  
  25. echo "<td class='title'>Klasa:</td>";
  26. echo "<td class='info'>";
  27. echo "<select name='klasa'>";
  28. echo "<option value=''>Wybierz</option> ";
  29. while($row2 = mysql_fetch_array($result2))
  30. {$_SESSION["klasa"]=$row2['flota_klasa'];
  31. echo "<option value='".$row2['flota_oddzial']."'>".$row2['flota_klasa']."</option>";
  32. }
  33. echo '</option>';
  34. echo '</td>';
  35. echo '</td>';
  36. echo '</tr>';
  37. ////////////////
  38.  
  39. $sql3="SELECT flota_marka FROM flota WHERE flota_oddzial = '".$_SESSION["q"]."' AND flota_klasa = '".$_SESSION["klasa"]."'";
  40. $result3 = mysql_query($sql3);
  41.  
  42. echo "<td class='title'>Marka:</td>";
  43. echo "<td class='info'>";
  44. echo "<select name='marka'>";
  45. echo "<option value=''>Wybierz</option> ";
  46. while($row3 = mysql_fetch_array($result3))
  47. {
  48. echo "<option value='".$row3['flota_klasa']."'>".$row3["flota_marka"]."</option>";
  49. }
  50. echo '</option>';
  51. echo '</td>';
  52. echo '</td>';
  53. echo '</tr>';
  54. ////////////////
  55.  
  56.  
  57.  
  58. echo "</table>";
  59. ?>


Jaki jest tego efekt: z pierwszej listy rozwijalnej wybieram miasto, w drugiej pojawiaja sie dostepne klasy w oddziale z wybranego miasta. Do tej pory jest ok. Wybieram z dostepnych klas jedna to powinny sie pojawic conajmniej tyle samo marek w kolejnej liscie roziwjalnej co w liscie klas. W bazie mam wstawione 3 rekordy z danego miasta. Trzy klasy i trzy marki. A po wyborze klasy z listy rozwijalnej, bez wzgledu co wybiore, to w liscie marek pojawia sie tylko jedna (powinny byc 3) i w dodatku nie tej klasy co wybralem. Zauwazylem ze co nie wybiore w liscie klas to pojawia mi sie zawsze marka ostatnia w kolumnie, ktora spelnia warunek przynaleznosci do danego miasta ale nie do klasy.

Wnioskuje, ze nie chce dzialac to zapytanie:
  1. $sql3="SELECT flota_marka FROM flota WHERE flota_oddzial = '".$_SESSION["q"]."' AND flota_klasa = '".$_SESSION["klasa"]."'";


Zmienna sesyjna "q" zawiera wybrane miasto, a zmienna "klasa" klase samochodu. Zmienna q jest przekazywana do zapytania, ale juz zmienna klasa nie ;/
bastard13
Dodaj sobie w pętli while var_dump($row2) i pokaż co ci wyrzuca.
A dodatkowo przykład, który powinien działać:
Tabela: Samochody; kolumny: id, oddzial, klasa, marka
a kod:
  1. //wyświetlanie miast
  2. //sprawdzam czy został wysłany get
  3. if(isset($_GET['q']))
  4. { //get został wysłany, więc albo oddzial albo klasa
  5. if(isset($_SESSION['oddzial']))
  6. { //oddział został wybrany, więc get przesyła nazwę klasy
  7. //więc zapytanie wygląda tak:
  8. $qry='select * from Samochody where oddzial=\''.$_SESSION['oddzial'].'\' and klasa=\''.$_GET['q'].'\'';
  9. }
  10. else
  11. { //pierwszy get, więc get przesyła nazwę oddziału
  12. //zapytanie
  13. $qry='select * from Samochody where oddzial=\''.$_GET['q'].'\'';
  14. //zapis sesji
  15. $_SESSION['oddzial']=$_GET['q']
  16. }
  17. //pobieranie wyniku zapytania i wyświetlanie wyniku
  18. }
  19. else
  20. { //nie został przesłany żaden get
  21. //czyścimy sesje
  22. unset($_SESSION['oddzial']);
  23. }
agentmullder
A moglbys to przedstawic razem z listami rozwijalnymi ten przyklad wyzej, tak jakby kopletnie wygladal dla 3 takich list?
Tak na marginesie to musze zrobic ponad 5 takich list rozwijalnych, ktore kazda wplywa na inna. Ale tutaj na 3 sie zawieszam. Gdybym widzial taki przyklad dla 3 to bym poradzil z nastepnymi.
bastard13
Nie chce mi się stukać kodu, ale mniej więcej coś takiego:
1) otwierasz tabelę;
2) wyświetlasz select z wybieraniem miasta
3) sprawdzasz czy został wysłany get:
GET ZOSTAŁ WYSŁANY:
A) sprawdzasz czy jest ustawiona sesja z nazwą oddziału:
SESJA USTAWIONA:
I) tworzysz zapytanie i pobierasz odpowiednie auta (oddział (sesja) i klasa (get))
II) wyświetlasz wynik, czyli wybrane auta
SESJA NIE USTAWIONA:
I) wyświetlasz select z wybieraniem klas
II) zapisujesz zmienną do sesji
GET NIE ZOSTAŁ WYSŁANY:
A) jeżeli jest ustawiona zmienna w sesji to ją usuwasz

A kod w uproszczeniu:
  1. <table id="id">
  2. <select onchange="funkcja">wartości do wyboru</select>
  3. <?php
  4. if(wysłany get)
  5. { if(ustawiona sesja)
  6. { mysql_query(pobieranie aut z danego oddziału i klasy)
  7. while(istnieje wiersz)
  8. { ?>wyświetlanie auta<?php }
  9. }
  10. else
  11. { mysql_query(pobieranie klas danego oddzaiłu)
  12. ?><select onchange="funkcja"><?php
  13. while(istnieje wiersz)
  14. { ?><option value="klasa">nazwa klasy</option><?php
  15. }
  16. ?></select><?php
  17. sesja_oddzial = get_q
  18. }
  19. }
  20. else
  21. { unset(zmienne sesji);
  22. }
  23. ?>
  24. </table>

everth
Zamiast bawić się w sesje wysyłaj ograniczniki POSTem i ograniczaj za ich pomocą bazę np.
[JAVASCRIPT] pobierz, plaintext
  1. xmlhttp.open("POST","mojabaza.php");
  2. xmlhttp.send(baza[id:2,name:'hihi']);
[JAVASCRIPT] pobierz, plaintext

Konstruujesz zapytanie z tylu warunków ile dostałeś postem i zwracasz wynik. Gdzie wynik ma trafić organizujesz sobie po stronie JSa
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.