Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dropdown z lokalizacją
aerospeed
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 8.10.2017

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post
Post #3





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@viking jeszcze troche minie zanim zaczne podawac na forum skladnie php7. Ludzie tutaj potrafia siedziec na starociach smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post
Post #5





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Rok i 10 miesięcy to staroć tongue.gif Nie spotkałem hostingu który by nie miał 7.


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
aerospeed
post
Post #7





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 8.10.2017

Ostrzeżenie: (0%)
-----


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()
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
aerospeed
post
Post #9





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 8.10.2017

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post
Post #11





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 08:18