Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][MySQL][PHP]Podwójna lista rozwijana nie działa przy wyborze pierwszego
Forum PHP.pl > Forum > Przedszkole
Stron: 1, 2
timeo
Mam dwa pliki cennik5.php i getdata.php. Chcę mieć dwie listy rozwijane zależne od siebie pobierające dane z bazy sql. Pierwsza pięknie pobiera druga nie. Połączenie w configbase i jest połączenie. Podpowiedzcie co robię nie tak.
  1. <?php include('../configbase.php'); ?>
  2. <!Doctype html>
  3. <html>
  4. <head>
  5. <title></title>
  6. </head>
  7.  
  8. <body>
  9. <label>Marka</label>
  10. <select name="marka" onchange="getId(this.value);">
  11. <option value=""> Wybierz Markę</option>
  12. <?php
  13. $result = $db->prepare("SELECT * FROM Marki");
  14. $result ->execute();
  15. foreach($result as $marki){
  16. ?>
  17. <option value="<?php echo $marki["CID"]; ?>"><?php echo $marki["Marka"];
  18. print_r($marki); ?> </option>
  19. <?php
  20. }
  21.  
  22. ?>
  23.  
  24. </select>
  25.  
  26. <label>Model</label>
  27. <select name="model" id="listamodeli">
  28. <option value=""></option>
  29. </select>
  30. <scritp src="//code.jquery.com/jquery-1.12.0.min.js"></script>
  31. <script>
  32. function getId(val){
  33.  
  34. $.ajax({
  35. type: "POST",
  36. url: "getdata.php",
  37. data: "CID="+val,
  38. success: function(data){
  39. $(#listamodeli).html(data);
  40. }
  41.  
  42. });
  43. }
  44. </script>
  45.  
  46. </body>
  47. </html>


getata.php
  1. <?php
  2. include ("../configbase.php");
  3.  
  4. if (!empty($_POST["CID"])){
  5.  
  6. //$cid = $_POST["CID"];
  7. $result = $db->prepare("SELECT * FROM cennikmobi10 WHERE CID = :cid");
  8. $result -> bindValue(':cid', $_POST["CID"], PDO::PARAM_INT);
  9. $result -> execute();
  10.  
  11. foreach ($result as $model)
  12. {
  13. ?>
  14. <option value="<?php echo $model["Model_ID"]; ?>"><?php echo $model["Model"]; ?></option>
  15. <?php
  16. }
  17. }
  18. ?>
trueblue
Metoda execute zwraca prawdę, albo fałsz, czyli w obydwu przypadkach nie pobierasz wyników.
W pierwszym przypadku prepare nie jest potrzebne, wystarczy query+fetch/fetchAll.
timeo
Zmieniłem i nadal nic. Spójrzcie.
Wszystkie kolumny w db są. Rekordy w rozwijaku mi się pojawiają, bo zrobiłem print_r i jest to co mi potrzebne. Być może coś z AJAX jest nie tak. Nie wiem już gdzie szukać.
  1. <?php include('../configbase.php'); ?>
  2. <!Doctype html>
  3. <html>
  4. <head>
  5. <title></title>
  6. </head>
  7.  
  8. <body>
  9. <label>Marka</label>
  10. <select name="marka" onchange="getId(this.value);">
  11. <option value=""> Wybierz Markę</option>
  12. <?php
  13. $result = $db->query("SELECT * FROM Marki");
  14. // $result ->execute();
  15. //
  16.  
  17. //$marki = $result ->fetch(PDO::FETCH_ASSOC)
  18. foreach($result as $marki)
  19. {
  20. ?>
  21. <option value="<?php echo $marki["CID"]; ?>"><?php echo $marki["Marka"];
  22. print_r($marki); ?> </option>
  23. <?php
  24. }
  25.  
  26. ?>
  27.  
  28. </select>
  29.  
  30. <label>Model</label>
  31. <select name="model" id="listamodeli">
  32. <option value=""></option>
  33. </select>
  34. <scritp src="//code.jquery.com/jquery-1.12.0.min.js"></script>
  35. <script>
  36. function getId(val){
  37.  
  38. $.ajax({
  39. type: "POST",
  40. url: "getdata.php",
  41. data: "CID="+val,
  42. success: function(data){
  43. $(#listamodeli).html(data);
  44. }
  45.  
  46. });
  47. }
  48. </script>
  49.  
  50. </body>
  51. </html>


  1. <?php
  2. include ("../configbase.php");
  3.  
  4. if (!empty($_POST["CID"])){
  5.  
  6. //$cid = $_POST["CID"];
  7. $result = $db->prepare("SELECT * FROM cennikmobi10 WHERE MODEL_ID = :cid");
  8. $result -> bindValue(':cid', $_POST["CID"], PDO::PARAM_INT);
  9. //$result -> execute();
  10.  
  11. foreach ($result as $model)
  12. {
  13. ?>
  14. <option value="<?php echo $model["Model_ID"]; ?>"><?php echo $model["Model"]; ?></option>
  15. <?php
  16. }
  17. }
  18. ?>
trueblue
Nadal nie pobierasz rekordów.
Jeśli masz coś w zmiennej $marki, to na pewno nie z powyższego kodu, bo w nim nigdzie nie ustalasz wartości tej zmiennej.
timeo
Poniższy kod nic nie daje.
  1. $marki = $result ->fetch(PDO::FETCH_ASSOC)

Jest tylko jeden rekord i nie przekazuje dalej zmiennej.
Szukam dalej. Może jakaś podpowiedź z czym ten fetch zestawić?
TAK?
  1. while($result = $marki ->fetch()) // foreach($result as $marki)
  2. {
  3. ?>
  4. <option value="<?php echo $marki["Marka_ID"]; ?>"><?php echo $marki["Marka"];
  5. print_r($marki); ?> </option>
  6. <?php
  7. }
  8.  
  9. ?>
trueblue
Możesz fetchAll, tak jak pisałem?
timeo
Zrobiłem tak, ale efekt mizerny
  1. <?php
  2. $result = $db->query("SELECT * FROM Marki");
  3. // $result ->execute();
  4. //
  5. $marki = $result->fetchAll();
  6. {
  7. ?>
  8. <option value="<?php echo $marki["CID"]; ?>"><?php echo $marki["Marka"];
  9. //print_r($marki); ?> </option>
  10. <?php
  11. }
  12.  
  13. ?>
trueblue
Może dlatego, że nie iterujesz po elementach tablicy? Czyli brak np. foreach.
timeo
Dobrze zapytam.. No nadal nic
  1. $result = $db->query("SELECT * FROM Marki");
  2.  
  3. $key = $result->fetchAll();
  4. foreach ($key as $marki) {
  5.  
  6.  
  7. ?>
  8. <option value="<?php echo $marki["CID"]; ?>"><?php echo $marki["Marka"];
  9. ?> </option>
  10. <?php
  11. }
  12.  
  13. ?>
trueblue
Pokaż co wyświetla wynik: var_dump($key); (po fetchAll).
timeo
Na stronie nic nie pokazuje, jest tylko lista z wszystkimi markami.
Mogę podać kod źródłowy strony, jeśli to coś pomoże.
viking
Wstaw pierwszy wiersz tablicy, żeby określić czy faktycznie są takie klucze jak piszesz.
timeo
Nie bardzo rozumiem. Z bazy danych mam wstawić wiersz?
viking
Pierwszy element z tablicy var_dump($key); albo inaczej var_dump($key[0]);
timeo
Na stronie nic mi nie pokazuje. Są tylko dwie optionlist z czego jedna ma marki (czyli pokazuje mi wszystkie elementy z tablicy) a druga jest pusta. Wrzuciłem to
  1. <?php
  2. $result = $db->query("SELECT * FROM Marki");
  3. // $result ->execute();
  4. //
  5. $key = $result->fetchAll(PDO::FETCH_ASSOC);
  6. var_dump($key[0]);
  7. foreach ($key as $marki)
  8. {
  9. ?>
  10. <option value="<?php echo $marki["Marka_ID"]; ?>"><?php echo $marki["Marka"];?> </option>
  11. <?php
  12. }
  13. ?>
viking
Czyli wychodzi z tego że zapytanie nic nie zwraca.
timeo
Czy w związku z tym jakoś inaczej pytanie wprowadzić?
Jednak lista marek jest - pytanie dlaczego?
Mogę ewentualnie podać adres odnośnika, żeby pokazać Wam gdzie leży błąd. Nie wiem jak regulamin.
viking
Wstaw bo tak można gdybać. I włącz raportowanie błędów.
timeo
Ups - a jak włączyć raportowanie błędów - podpowiedz.
  1. ini_set('display_errors',1);

Testy
viking
Po stronie php masz <b>Notice</b>: Undefined offset: 0 in <b>/home/vol2_1/byethost15.com/b15_3428001/bdp.22web.org/htdocs/mobidoktor/cennik5.php</b> on line <b>24</b><br /> Co jest w tej linii?
Po stronie JS: SyntaxError: illegal character $(#listamodeli).html(data); powinno być $('#listamodeli')

timeo
Już poprawiam - usuwam:
  1. var_dump($marki[0]);

I JS też poprawiam

KOD wygląda tak
  1. <?php include('../configbase.php');
  2. ini_set('display_errors',1);
  3. ?>
  4. <!Doctype html>
  5. <html>
  6. <head>
  7. <title></title>
  8. </head>
  9.  
  10. <body>
  11. <label>Marka</label>
  12. <select name="marka" onchange="getId(this.value);">
  13. <option value=""> Wybierz Markę</option>
  14. <?php
  15. $result = $db->query('SELECT * FROM Marki');
  16. // $result ->execute();
  17. //
  18. $key = $result->fetchAll(PDO::FETCH_ASSOC);
  19. var_dump($key[0]);
  20. foreach ($key as $marki)
  21. {
  22. ?>
  23. <option value="<?php echo $marki["Marka_ID"]; ?>"><?php echo $marki["Marka"];?> </option>
  24. <?php
  25. }
  26. ?>
  27. </select>
  28.  
  29. <label>Model</label>
  30. <select name="model" id="listamodeli">
  31. <option value=""></option></select>
  32. <scritp src="//code.jquery.com/jquery-1.12.0.min.js"></script>
  33. <script>
  34. function getId(val){
  35.  
  36. $.ajax({
  37. type: "POST",
  38. url: "getdata.php",
  39. data: "Marka_ID="+val,
  40. success: function(data){
  41. $('#listamodeli').html(data);
  42. }
  43.  
  44. });
  45. }
  46. </script>
  47.  
  48. </body>
  49. </html>


GETDATA PHP
  1. <?php
  2. include ("../configbase.php");
  3.  
  4. if (!empty($_POST["Marka_ID"])){
  5.  
  6. //$cid = $_POST["CID"];
  7. $result = $db->query("SELECT * FROM cennikmobi10 WHERE ID = :cid");
  8. $result -> bindValue(':cid', $_POST["Marka_ID"], PDO::PARAM_INT);
  9. //$result -> execute();
  10.  
  11. foreach ($result as $model)
  12. {
  13. ?>
  14. <option value="<?php echo $model["Marka_ID"]; ?>"><?php echo $model["Model"]; ?></option>
  15. <?php
  16. }
  17. }
  18. ?>
viking
Masz jeszcze błędy w JS ReferenceError: $ is not defined, opakuj to w
Kod
$(function() {
});


Zresztą marki ci dzialają.

I script nie scritp.
timeo
Poprawiłem, ale nadal nie widzę poprawy. Niestety moja wiedz ogranicza się do prośby o Waszą pomoc.
viking
Zerknij czasami w konsolę. Teraz masz ReferenceError: getId is not defined
Całe script wrzuć do head.
timeo
Przerzuciłem i pokazuje mi to samo. Nie wiem czy gdzieś w JS trzeba definiować ten parametr?
viking
Zamiast inline przrzuć to do script
  1. $('select[name="marka"]').on('change', function(e) {
  2. getId(this.value);
  3. });
timeo
W ten sposób?
  1. <script>
  2.  
  3. $(function() {
  4.  
  5. function getId(val){
  6. $.ajax({
  7. type: "POST",
  8. url: "getdata.php",
  9. data: "Marka_ID="+val,
  10. success: function(data){
  11. $('select[name="marka"]').on('change', function(e) {
  12. getId(this.value);
  13. });
  14. }
  15. });
  16. }
  17. });
  18. </script>
viking
No nie. getId wywołujesz na zmianę selecta. Pomyśl chwilkę logicznie.
Pod tę funkcję.
timeo
Czyli, że tak?
  1. <label>Marka</label>
  2. <select name="marka" onchange="$('select[name="marka"]').on('change', function(e) {
  3. getId(this.value);
  4. });">
  5. <option value=""> Wybierz Markę</option>
  6.  


cennik5.php:28 Uncaught SyntaxError: Invalid or unexpected token
viking
No nie. Wywalasz to całe onchange z selecta i zapominasz o takim pisaniu JS. A kod który podałem wklejasz pod funkcję.
timeo
Już się boję pytać, ale spróbuję
Za GETID odpowiedzialna jest funkcja w JS, więc teraz myślę, że myślę dobrze.
  1. <script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
  2. <script>
  3.  
  4. $(function() {
  5.  
  6. function getId(val){
  7. $('select[name="marka"]').on('change', function(e) {
  8. getId(this.value);
  9. });
  10. $.ajax({
  11.  
  12. type: "POST",
  13. url: "getdata.php",
  14. data: "Marka_ID="+val,
  15. success: function(data){
  16. $('#listamodeli').html(data);
  17. }
  18. });
  19. }
  20. });
  21. </script>
viking
Pfff. Tym sposobem byś nigdzie funkcji nie wywołał.
Cytat
function getId(val){...}

$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
timeo
Zmieniłem i konsola pokazuje mi:
(link jest cały czas aktywny jakby co smile.gif)
  1. POST <a href="http://nastrone.eu/mobidoktor/getdata.php" target="_blank">http://nastrone.eu/mobidoktor/getdata.php</a> 500 (Internal Server Error)send @ jquery-1.12.0.min.js:4ajax @ jquery-1.12.0.min.js:4getId @ cennik5.php:10onchange @ cennik5.php:27ListPicker._handleMouseUp @ about:blank:686
viking
Gdzieś w getdata masz problem. Zobacz logi serwera i włącz też wyświeltanie błędów.
timeo
Wrzuciłem do GETDATA i niestety nic nie pokazuje.
Żadnego błędu. Poszukam jak dojadę do domu.
viking
Ja tam widzę:
Cytat
<b>Fatal error</b>: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or
access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near ':cid' at line 1'


A wynika to stąd, że query nie binduje parametrów tylko prepare.
trueblue
I znów nie pobierasz wyników w getdata.php.
query w pierwszym przypadku, tak jak pisałem, bo nie bindujesz, więc nie trzeba. W drugim zgodnie ze wskazówką viking'a, prepare.
timeo
Panowie czapki z głów. Dziękuję - jesteście WIELCY. Od dzisiaj to forum jest moim forum.
Nie zrobiłbym niczego bez Waszej pomocy!!!
Każdemu piwq
A tutaj kod jaki działa.
  1. <?php include('../configbase.php');
  2. ini_set('display_errors',1);
  3. ?>
  4. <!Doctype html>
  5. <html>
  6. <head>
  7. <title></title>
  8. <script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
  9. <script>
  10. function getId(val){
  11.  
  12. $.ajax({
  13. type: "POST",
  14. url: "getdata.php",
  15. data: "Marka_ID="+val,
  16. success: function(data){
  17. $('#listamodeli').html(data);
  18. }
  19.  
  20. });
  21. }
  22. $('select[name="marka"]').on('change', function(e) {
  23. getId(this.value);
  24. });
  25. </script>
  26. </head>
  27. <body>
  28. <label>Marka</label>
  29. <select name="marka" onchange="getId(this.value)">
  30. <option value=""> Wybierz Markę</option>
  31. <?php
  32. $result = $db->query('SELECT * FROM Marki');
  33. // $result ->execute();
  34. //
  35. $key = $result->fetchAll(PDO::FETCH_ASSOC);
  36.  
  37. foreach ($key as $marki)
  38. {
  39. ?>
  40. <option value="<?php echo $marki["Marka_ID"]; ?>"><?php echo $marki["Marka"];?> </option>
  41. <?php
  42. }
  43. ?>
  44. </select>
  45.  
  46. <label>Model</label>
  47. <select name="model" id="listamodeli">
  48. <option value=""></option></select>
  49.  
  50.  
  51. </body>
  52. </html>


getdada
  1. <?php
  2. include ("../configbase.php");
  3. ini_set('display_errors',1);
  4.  
  5. if (!empty($_POST["Marka_ID"])){
  6.  
  7. //$cid = $_POST["CID"];
  8. $result = $db->prepare("SELECT * FROM cennikmobi10 WHERE ID = :cid");
  9. $result -> bindValue(':cid', $_POST["Marka_ID"], PDO::PARAM_INT);
  10. $result -> execute();
  11.  
  12. foreach ($result as $model)
  13. {
  14. ?>
  15. <option value="<?php echo $model["Marka_ID"]; ?>"><?php echo $model["Model"]; ?></option>
  16. <?php
  17. }
  18. }
  19. ?>

viking
Miałeś się pozbyć onchange="getId(this.value)" z select.

To teraz jeszcze pomyśl co się stanie w przypadku błędu. Nie oprogramowałeś wyjątków PDO, nie robisz nic w przypadku błędu żądania ajaxowego - done/fail. I produkcyjnie informacje debugowe (error_reporting) mają być wyłączone. Brak ci odpowiednich nagłówków. Czemu takie stare jquery? Jest już v3.
timeo
Już poprawiam.
To będzie zahasłowane i zaszyfrowane logowaniem i nikt nie będzie miał dostępu. Będę to eweluuował, ale trochę później. Na szybko jest mi potrzebne. Nie znam zbytnio JS i Ajaxa muszę się nauczyć.
Teraz mam pytanie i prośbę. Działa, ale jest jeden mały problem - modeli jest kilka do jednej marki. Co zrobić żeby one się grupowały? Wystarczy Group By? - wystarczy
Wyrzuciłem onchange tak jak kazałeś, ale przestaje działać.

  1. <script src="//code.jquery.com/jquery-3.1.1.min.js"></script>

P.S.
Dopiero do tego usiadłem i już zmieniam.

Plik configbase
  1. try {
  2. $db = new PDO('mysql:host=localhost;dbname=artykuly', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
  3. $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  4. } catch (PDOException $e) {
  5. die( "Połączenie nie mogło zostać utworzone: {$e->getMessage()}");
  6. }
  7.  


A teraz dziwne pytanie jakbym chciał zrobić jeszcze 3 listę zależną od drugiej? Da się jakoś z tego co mam?
viking
Dokładnie tak samo jak drugą. A co nie działało konkretnie z zapisem moim? Jakieś błędy w konsoli?
timeo
To miałem wyrzucić select
  1. onchange="getId(this.value)"
a coś tam trzeba wstawić za to?
Czyli kolejny plik GETDATA, żeby pobierał i tam całe zapytanie?
viking
Kod który ci podałem
Cytat
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});


Jest dokładnie odpowiednikiem tego onchange liniowego. Możesz nowy plik albo dodatkową wartość.
Cytat
data: {"Marka_ID": val, costam2: y}

i w getdata sprawdzac czy występuje $_POST['costam2']
timeo
Ale on jest w script w head a nie w select. Select - jak to usunąłem to nie działał
Cytat
Cytat
$('select[name="marka"]').on('change', function(e) {
getId(this.value);
});
viking
Niesamowite, czary jakieś
https://jsfiddle.net/vgmnv7ez/
timeo
Cytat(viking @ 11.10.2016, 12:53:35 ) *
Niesamowite, czary jakieś
https://jsfiddle.net/vgmnv7ez/


Fakt tutaj tak, a u mnie nie. smile.gif
Mozesz sam zobaczyć.
Klik
nospor
Tak z czystej ciekawosci: kiedy ty w koncu zaczniesz zagladac w konsole bledow js? Juz nie raz w tym temacie cie o to upominano a ty dalej swoje.... toz masz bledy tam.
timeo
Cytat(nospor @ 11.10.2016, 13:46:18 ) *
Tak z czystej ciekawosci: kiedy ty w koncu zaczniesz zagladac w konsole bledow js? Juz nie raz w tym temacie cie o to upominano a ty dalej swoje.... toz masz bledy tam.

Jak skończę wszystko co jest potrzebne mi a potem zabiorę się za błędy. Szybko potrzebuję strony, a potem kosmetyka.... i... nauka...
kapslokk
Czyli po prostu wolisz truć dupę na forum bo "nie działa" niż spojrzeć w konsole błedów, która mówi dlaczego nie działa, tak ? :/
timeo
Myślę, że ta dyskusja nie ma dalej sensu. Napiszę jak poprawię błędy i podeślę. Obiecuję, że to zrobię... smile.gif

OK, pokazuje, że brakuje linii pomocnej, już szukam w googlu i poprawiam
  1. Uncaught SyntaxError: Unexpected token <


Podpowiedzcie, czy ten kod jest poprawny
  1. <script>
  2. $.ajax({
  3. type: "POST",
  4. url: "getdata.php",
  5. data: "Marka_ID="+val,
  6. success: function(data){
  7. $('select[name="marka"]').on('change', function(e) {
  8. getId(this.value);
  9. });
  10. }
  11. });
  12. </script>
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.