Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP]Problem z dynamicznym generowaniem formularza
Forum PHP.pl > Forum > Przedszkole
sebap123
Witam
Od niedawna tworzę coś w JavaScript i dlatego postanowiłem umieścić ten problem tutaj, ale nie wiem czy należy on do błędów podstawowych. Ale do rzeczy.
Znalazłem w necie dosyć prostą instrukcję, a raczej gotowy skrypt, który przy zmianie wybranej opcji pola typu select pobiera z bazy danych dane na ten temat i wyświetla bez przeładowania na stronie.
Mi jest potrzebny podobny skrypt, jednak ten ma pod wpływem wyboru w jednym polu select pobrać dane z tablicy i umieścić je jako opcje w drugim polu select. Trochę już nad tym siedzę, dlatego postanowiłem tutaj spytać się co może robię źle.
Oto całość:
index.html
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  4. <script type="text/javascript">
  5. function showColor(nr)
  6. {
  7. if(window.XMLHttpRequest){
  8. xmlhttp = new XMLHttpRequest();
  9. }
  10. else{
  11. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  12. }
  13. xmlhttp = new onreadystatechange = function()
  14. {
  15. if(xmlhttp.readyState==4 && xmlhttp.status==200){
  16. document.getElementById("selector_c").innerHTML=xmlhttp.responseText;
  17. }
  18. }
  19. xmlhttp.open("GET","getproduct.php?pr="+nr,true);
  20. xmlhttp.send();
  21. }
  22. <title>Untitled Document</title>
  23. </head>
  24.  
  25. <div class="selector2">
  26. <label for="rozmiar">rozmiar:</label>
  27. <select name="rozmiar" id="selector_r" onchange="showColor(this.value)">
  28. <option value="0"></option>
  29. <option value="1">czarny</option>
  30. <option value="2">marka1</option>
  31. </select>
  32. </div>
  33.  
  34. <div class="selector2">
  35. <label for="kolor">kolor:</label>
  36. <select name="color" id="selector_c">
  37. <option value=""></option>
  38. </select>
  39. </div>
  40. </body>
  41. </html>

getproduct.php
  1. <?
  2. include('engine/config.php');
  3. $p=$_GET['pr'];
  4. echo'<option value="1">nowy</option>';
  5. $sql=mysql_query("SELECT FROM colors WHERE id='".$p."'");
  6. if(mysql_fetch_array($sql)==1){
  7. $size=mysql_fetch_array($sql);
  8. {
  9. echo'<option value="'.$size['s_id'].'">'.$size['size'].'</option>';
  10. }
  11. else{
  12. <option value=""></option>
  13. <option value="1">r</option>
  14. <option value="2">rodzaj1</option>';
  15. }
  16. ?>

Oba pliki są na tym samym poziomie.
Możliwe, że jest to jakiś głupi błąd, ale ja jakoś patrzę i nic nie widzę.
CuteOne
  1. if(mysql_fetch_array($sql)==1){
  2. $size=mysql_fetch_array($sql);
  3. {

zamień na
  1. if(mysql_fetch_array($sql)==1){
  2. {
  3. $size=mysql_fetch_array($sql);
sebap123
Zamieniłem tak jak mówiłeś i nadal nic. Prawdę powiedziawszy, to nie wiem za bardzo co dała twoja zmiana. Jedyne co zauważyłem, to to, że mam dwa nawiasy klamrowe po if, a tylko jeden jest mi potrzebny dlatego drugiego wywaliłem. Aktualnie kod getproduct.php wygląda tak:
  1. <?
  2. include('engine/config.php');
  3. $p=$_GET['pr'];
  4. echo'<option value="1">nowy</option>';
  5. $sql=mysql_query("SELECT FROM colors WHERE id='".$p."'");
  6. if(mysql_fetch_array($sql)==1)
  7. {
  8. $size=mysql_fetch_array($sql);
  9. echo'<option value="'.$size['s_id'].'">'.$size['size'].'</option>';
  10. }
  11. else{
  12. <option value=""></option>
  13. <option value="1">r</option>
  14. <option value="2">rodzaj1</option>';
  15. }
  16. ?>


I co najgorsza, cały czas nie chce się ruszyć nic.
lord2105
Dlaczego tak:
  1. if(mysql_fetch_array($sql)==1)
  2. {

a nie tak:
  1. if(mysql_num_rows($sql)==1)
  2. {
sebap123
Prawdę powiedziawszy to nie do końca wiem czemu akurat tak, ale nawet po zmianie nie chce się ruszyć, tak więc to nie to.
markonix
Przetestowałeś poprawność działania AJAX?
Na początek sprawdzić czy jest ok dając jakieś echo.

Jeśli się wyświetla idziesz krok dalej, pobranie zmiennej - czy działa.

Jeśli tak to coś z zapytaniem.

Kod
mysql_query("SELECT FROM colors WHERE id='".$p."'");


Nie wystarczy:
Kod
mysql_query("SELECT FROM colors WHERE `id` = $p ");

? Oczywiście jeśli id jest numeryczne.

Potem jeśli jest wszystko ok to pętla i warunek.
Tu już bym ponowił zalecenia Lord'a.
lord2105
dziwisz się ze nie działa skoro tego nie chcesz, karzesz wyciągać z bazy ale co?

  1. $sql=mysql_query("SELECT FROM colors WHERE id='".$p."'");


a może:

  1. $sql=mysql_query("SELECT s_id,size FROM colors WHERE id='".$p."'");
sebap123
Dobra, ten pomysł się sprawdził, w pewnym sensie. Sprawdziłem, czy zwykła komenda ruszy.
Wszystko oprócz getproduct.php zostało takie samo.
Teraz skrypt ma pobierać wartość wybranej opcji, a następnie umieszczać ją w kolejnym selekcie.

Taki jest kod gedproduct.php:
  1. $p=$_GET['pr'];
  2. echo'<option value="1">&nbsp;-&nbsp;'.$p.'</option>';


No i teraz też milczy. Czyli mam podejrzewać, że AJAX nie działa?
markonix
Heh, nie zauważyłem tego byka, a nawet go zacytowałem wacko.gif

Edit: ogólnie to bym polecił AJAXem bawić się za pomocą jakiejś biblioteki np. jQuery.
sebap123
No wiem, że można bawić się bibliotekami, ale jakoś nigdy nie miałem ochoty żadnej się nauczyć. A ten cały skrypt to jest moja modyfikacja skryptu wziętego z wydaje mi się bardzo dobrej strony ->http://www.w3schools.com/PHP/php_ajax_database.asp
No i albo ja coś zupełnie poplątałem, albo tego nie da się przerobić (tutaj już wątpię, żeby się nie dało).
CuteOne
Może najpierw odpal plik PHP bez AJAXA i sprawdź czy nie wywali błędów
sebap123
Tak jak poleciłeś, sprawdziłem plik PHP bez AJAXA.No wszytko działa. Dodam tylko, że nieco pozmieniałem kod, żeby był w miarę prosty, żeby móc stwierdzić, gdzie leży błąd.
Teraz kod wygląda tak:
getproduct.php
  1. <?
  2. if($_GET['pr']==1){
  3. $p=$_GET['pr'];
  4. echo'Zmienna wynosi '.$p.'';}
  5. else{
  6. echo'brak zmiennej';
  7. }
  8. ?>


plik w którym jest AJAX (nazwałem go testowa.html (a tak na marginesie, czy mogę też uruchomić AJAXA w plikach z rozszerzeniem php?):
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  4. <script type="text/javascript">
  5. function showColor(nr)
  6. {
  7. if(window.XMLHttpRequest){
  8. xmlhttp = new XMLHttpRequest();
  9. }
  10. else{
  11. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  12. }
  13. xmlhttp = new onreadystatechange = function()
  14. {
  15. if(xmlhttp.readyState==4 && xmlhttp.status==200){
  16. document.getElementById("selector2").innerHTML=xmlhttp.responseText;
  17. }
  18. }
  19. xmlhttp.open("GET","getproduct.php?pr="+nr,true);
  20. xmlhttp.send();
  21. }
  22. <title>Untitled Document</title>
  23. </head>
  24.  
  25. <div class="selector2">
  26. <label for="rozmiar">rozmiar:</label>
  27. <select name="rozmiar" id="selector_r" onchange="showColor(this.value)">
  28. <option value="0"></option>
  29. <option value="1">czarny</option>
  30. <option value="2">marka1</option>
  31. </select>
  32. </div>
  33.  
  34. <div id="selector2">
  35. <b>tekścik</b>
  36. </div>
  37. </body>
  38. </html>


Może, teraz ktoś mi coś pomoże, bo ja jeszcze nie umiem na tyle dobrze JavaScript, żeby móc coś samemu orzec.
cycofiasz
Zamień:

xmlhttp = new onreadystatechange

Na:

xmlhttp.onreadystatechange


Polecam Ci zaglądać w konsolę błędów w przeglądarce oraz zainstalować sobie firebuga
sebap123
Dzięki wielkie. Teraz już działa. A teraz powiedz mi jeszcze jedno, czy jak chcę mieć jakiś efekt (np. rozsuwanie się tekstu czy jakiś błysk, no cokolwiek) to wtedy muszę użyć jQuery, czy sam też mogę coś takiego napisać?
Dobra może średnio dobrze zadane pytanie. Chodzi mi o to, czy napisanie własnych takich efektów jest rzeczą trudną, czy bardzo trudną (może lepiej będzie użyć słowa - pracochłonną.)
Po drugie, czy jest jakaś różnica, jeśli ten skrypt umieszczę nie bezpośrednio w kodzie, tylko przez dopisanie

<script type="text/javascript" src="ścieżka_do_skryptu"></script>

No i jeśli jeszcze mogę się spytać o coś, to powiedz mi czy mogę podobny kod umieścić w pliku o rozszerzeniu php a nie html jak teraz zrobiłem?

A co do konsoli błędów i firebuga, to muszę powiedzieć, że słyszałem już takie rady, ale ja używam Chrome i średnio nawet wiem, czy coś takiego już jest dla Chrome. Tak więc jakby ktoś miał jakieś info co do tego to będę wdzięczny.
cycofiasz
Co do efektów to można znaleźć w sieci gotowe funkcje (niekoniecznie wielkie frameworki typu jQuery). Napisanie samemu takowych nie jest zbyt skomplikowane ale wymaga dobrej znajomości css i js.
Co do <script type="text/javascript" src="ścieżka_do_skryptu"></script> to nie ma różnicy (zakładając że wszystko jest poprawnie).
Rozszerzenie pliku pobieranego przez ajax nie ma znaczenia.
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.