Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dropdown z lokalizacją
Forum PHP.pl > Forum > Przedszkole
aerospeed
Witam szanowne grono forumowiczów smile.gif

Mam problem z działaniem potrójnego selecta z lokalizacją (klasyczne country, state, city).

index.php
  1. <select id="countrydd" onChange="changeCountry()">
  2. <option value="0">Select Country</option>
  3. <?php
  4. $countries_count = $connect->query("SELECT * FROM countries");
  5. while($cc = $countries_count->fetch_assoc())
  6. {
  7. echo '<option value="'.$cc['id'].'">'.$cc['name'].'</option>';
  8. }
  9. ?>
  10. </select>
  11.  
  12. <div id="state">
  13. <select>
  14. <option>Select State</option>
  15. </select>
  16. </div>
  17.  
  18. <div id="city">
  19. <select>
  20. <option>Select City</option>
  21. </select>
  22. </div>
  23.  
  24. <script type="text/javascript">
  25. function changeCountry()
  26. {
  27. var xmlhttp = new XMLHttpRequest();
  28. xmlhttp.open("GET", "ajax.php?country="+$("#countrydd").val(), false);
  29. xmlhttp.send(null);
  30. $("#state").html(xmlhttp.responseText);
  31. }
  32.  
  33. function changeState()
  34. {
  35. var xmlhttp = new XMLHttpRequest();
  36. xmlhttp.open("GET", "ajax.php?state="+$("#statedd").val(), false);
  37. xmlhttp.send(null);
  38. $("#city").html(xmlhttp.responseText);
  39. }
  40.  
  41. </script>


ajax.php
  1. <?php
  2.  
  3. require_once "connection.php";
  4. mysqli_report(MYSQLI_REPORT_STRICT);
  5.  
  6. $connect = new mysqli($host, $db_user, $db_password, $db_name);
  7. $country = $_GET["country"];
  8. $state = $_GET["state"];
  9.  
  10. if(isset ($country))
  11. {
  12.  
  13. $states_count = $connect->query("SELECT * FROM states WHERE country_id='$country'");
  14.  
  15. if($states_count->num_rows > 0)
  16. {
  17. echo '<select id="statedd" onChange="changeState()">
  18. <option>Select State</option>';
  19.  
  20. while($sc = $states_count->fetch_assoc())
  21. {
  22. echo '<option value="'.$sc['id'].'">'.$sc['name'].'</option>';
  23. }
  24.  
  25. echo '</select>';
  26. }
  27. else
  28. {
  29. echo '<select><option>Select State</option></select>';
  30. }
  31.  
  32. }
  33.  
  34. if(isset($state))
  35. {
  36.  
  37. $cities_count = $connect->query("SELECT * FROM cities WHERE state_id='$state'");
  38.  
  39. if($cities_count->num_rows > 0)
  40. {
  41. echo '<select>
  42. <option>Select City</option>';
  43.  
  44. while($cc = $cities_count->fetch_assoc())
  45. {
  46. echo '<option value="'.$cc['id'].'">'.$cc['name'].'</option>';
  47. }
  48.  
  49. echo '</select>';
  50. }
  51. else
  52. {
  53. echo '<select><option>Select City</option></select>';
  54. }
  55.  
  56. }
  57.  
  58. ?>


Teraz, problem w tym, że pomimo iż skrypt działa, bo wyświetla prawidłowe wyniki z bazy danych, to z jakiegoś powodu php wyrzuca na ekran błędy:

  1. Notice: Undefined index: state in C:\xampp\htdocs\test\ajax.php on line 8
  2. Notice: Undefined index: country in C:\xampp\htdocs\test\ajax.php on line 7


Próbowałem już na wszystkie znane mi sposoby to naprawić i nadal nie wiem w czym problem.
Z góry dzięki za pomoc.
Pozdrawiam wink.gif
nospor
Komunikat bledu jest dosc wyrazny...
W necie pelno rzeczy na ten temat...

Przenosze. Problem nie ma zadnego zwiazku z AJAX.

Co do problemu:

nie:
$country = $_GET["country"];

a:
$country = isset($_GET["country"]) ? $_GET["country"] : null;

Analogicznie reszta
viking
Albo w PHP7 $country = $_GET['country'] ?? null; (trzymam się wersji że v7 była tak dawno wydana że nie stanowi już problemu, zwlaszcza że niedługi 7.2).
Poza tym korzystasz z jquery zatem poc co ci ten obiekt XMLHttpRequest? Nigdzie nie sprawdzasz co zwraca zapytanie a że jest podatne na sql injection zwrócić może cokolwiek. I tak masz śmietnik ale możesz zacząć od wyrzucenia onChange="changeState()" -> zewnętrzny plik i .on() https://prophp.pl/article/15/jquery%2C_zdar...e_metoda_%24.on
nospor
@viking jeszcze troche minie zanim zaczne podawac na forum skladnie php7. Ludzie tutaj potrafia siedziec na starociach smile.gif
viking
Rok i 10 miesięcy to staroć tongue.gif Nie spotkałem hostingu który by nie miał 7.
nospor
Mialem na mysli starsze starocie wink.gif
I co z tego ze hostingi maja php7. Ja mowie o szarych uzytkownikach, ktorzy pomimo, ze maja php7 na hostingu to nadal siedza na php5.3 tongue.gif

@aerospeed sorry za lekki offtopic ktory tu ci robimy ale takie nudy na forum.... biggrin.gif
aerospeed
Dzieki panowie smile.gif

Oba sposoby działają. Zakładam, że to jest to samo wyrażenie tylko pod inne wersje php?

Cytat(viking)
Nigdzie nie sprawdzasz co zwraca zapytanie(...)


Nie bardzo rozumiem tongue.gif

Cytat(nospor)
sorry za lekki offtopic ktory tu ci robimy ale takie nudy na forum....


Jęsli o to chodzi to dla mnie to żaden problem na forum się rozmawia o wszystkim wink.gif

Cytat(viking)
Poza tym korzystasz z jquery zatem poc co ci ten obiekt XMLHttpRequest?
I tak masz śmietnik ale możesz zacząć od wyrzucenia onChange="changeState()" -> zewnętrzny plik i .on()


Korzystałem z poradnika jak napisać ten skrypt i bardzo nie podobało mi się użycie document.getElementByID, co mogłem zamieniłem na jquery. Jednakże nie jestem jakiś biegły w javascipt (pewnie widać tongue.gif ) i nie mam za bardzo pomysłu czego użyć zamiast XMLHttpRequest i jak zamienić kod z użyciem .on()
nospor
Cytat
Oba sposoby działają. Zakładam, że to jest to samo wyrażenie tylko pod inne wersje php?
Podane przez vikinga dziala tylko na php7. Podane przeze mnie dziala na kazdej wersji php. Co nie zmienia faktu, ze jednak masz php7 co sie chwali i lepiej bys uzywal skladni php7 (tej od vikinga) bo jest lepsza/krotsza/piekniejsza/laski szaleja jak jej uzywasz... wink.gif
aerospeed
Słowem podsumowania: czy zawsze, kiedy robię porównanie zmiennej w ajax, powinienem dodać na końcu "?? null;"?
Bo nie wiem czy to jest kwestia tego konkretnego przykładu, czy też taki błąd będzie zawsze.

Cytat('nospor')
lepiej bys uzywal skladni php7 (tej od vikinga) bo jest lepsza/krotsza/piekniejsza/laski szaleja jak jej uzywasz...

hehe wink.gif
nospor
to nie jest zadna zmienna AJAX. To jest zmienna ktora pochodzi z URL i niewazne czy to idzie przez normalny link czy przez AJAX.
Kolejna sprawa tu nie chodzi o zmienne URL tylko o generalnie dobieranie sie do indexu tablicy (tak, $_GET to tablica), ktory nie istnieje.


Generalnie lezysz na podstawach i moze wpierw wypadaloby ogarnac podstawy php, zmienne, tablice, teksty, petle, if a dopiero potem brac sie za budowanie czegos.
viking
Zamiast XHR http://api.jquery.com/jquery.ajax/
mysqli::query http://php.net/manual/en/mysqli.query.php ma definicję
  1. mixed mysqli::query ( string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
gdzie to mixed to
Cytat
Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.

Czyli u ciebie może się zdarzyć kod false->num_rows > 0
O sql injection już pisałem. Poczytaj o prepare.
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.