AJAX mehrere Selects und Zurücksetzen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • AJAX mehrere Selects und Zurücksetzen

    Gesplittet von http://www.easy-coding.de/ajax-sql-2-select-felder-t884.html
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Super skript, wär genau das was ich seit Tagen suche...
    Nur leider erscheint bei mir keine 2te Tabelle sondern die Daten die in der func.php aus der DB gelesen werden, werden einfach nur nacheinander rausgeEcho't...
    Hab das Skript 1zu 1 übernommen bis auf die Sql-Sachen halt...

    Hatte das Problem schon jmd bzw weiß jmd woran das liegen kann?

    kann meine func.php ja mal hier posten...

    Quellcode

    1. <?
    2. //db connect
    3. require('includes/connect.php');
    4. echo '<selct name="bundesland">';
    5. $categories_query2 = tep_db_query("select a.categories_id,parent_id, b.categories_name from " . TABLE_CATEGORIES . " as a," . TABLE_CATEGORIES_DESCRIPTION . " as b where parent_id = '".$_GET[s]."' order by categories_name");
    6. while($row = mysql_fetch_object($categories_query2))
    7. {
    8. echo '<option value="'.$row->categories_id.'">'.$row->categories_name.'</option>';
    9. }
    10. echo '</select>';
    11. ?>
    Alles anzeigen


    und der veränderte Teil aus der Hauptphp:

    Quellcode

    1. <p />Wählen Sie einen Eintrag aus um den Inhalt zu laden
    2. <p /><select id="dropdown" onChange="sendRequest()">
    3. <?
    4. $categories_query = mysql_query("select a.categories_id,parent_id, b.categories_name from " . TABLE_CATEGORIES . " as a," . TABLE_CATEGORIES_DESCRIPTION . " as b where a.categories_id = b.categories_id and parent_id ='0' and b.language_id = " . (int)$language_id . " order by categories_name");
    5. while($row = mysql_fetch_object($categories_query ))
    6. {
    7. echo '<option value="'.$row->categories_id.'">'.$row->categories_name.'</option>';
    8. }
    9. ?>
    10. </select>
    11. <div id="select2"></div>
    12. </body></html>
    Alles anzeigen


    Wie gesagt, dachte eigentlich, dass ich ncihts ausser die sql Sachen verändert hatt aber die funktionieren eigentlich...
    Bin etwas ratlos was das sein könnte!
  • "student2312" schrieb:

    Nur leider erscheint bei mir keine 2te Tabelle sondern die Daten die in der func.php aus der DB gelesen werden, werden einfach nur nacheinander rausgeEcho't...


    wie meinst du denn rausgeechot?
    wird der inhalt einfach nur ohne html layout innerhalb des <div id="select2"> ausgegeben?

    erstell doch mal einen rahmen um zu sehen obs innerhalb/außerhalb der box ist

    Quellcode

    1. <div id="select2" style="border:1px solid #afafaf">


    ansonsten debugge ich immer gerne mit alert
    gib doch mal in der handleResponse den Rückgabewert aus

    Quellcode

    1. alert(req.responseText);


    vermutlich eine große ausgabe - aber manchmal hilfts
  • :lol: Sry, mit rausgeEcho't meinte ich, dass alle nur nacheinander ausgegeben werden ohne dropdown sondern einfach nur die Sql ergebnisse in Textform.
    Hab das mit der border mal gemacht, dann zieht er um die sql ergebnisse den Rahmen, also es kommt schon an, aber nicht als Dropdown...
    komischerweise wenn ich, wie du meintest ,mit alert den responseText ausgeb ist der:
    <select name="bundeslans"><option value="41">beschreibung</option></select>
    also müsste doch schon stimmen :?
  • Ok kann ich machen, danke, dass du dir die Zeit nimmst!

    erstmal die add.php wo der hauptteil drin ist:

    Quellcode

    1. <html><head>
    2. <title>AJAX PHP Beispiel mit Select</title>
    3. <script type="text/Javascript">
    4. <!--
    5. function sendRequest() {
    6. try {
    7. req = window.XMLHttpRequest?new XMLHttpRequest():
    8. new ActiveXObject("Microsoft.XMLHTTP");
    9. } catch (e) {
    10. //Kein AJAX Support
    11. }
    12. req.onreadystatechange = handleResponse;
    13. id = document.getElementById('dropdown').value;
    14. req.open('get', 'func.php?s='+ id);
    15. req.send(null);
    16. }
    17. function handleResponse() {
    18. if ((req.readyState == 4) && (req.status == 200)) {
    19. document.getElementById('select2').innerHTML = req.responseText;
    20. alert(req.responseText);
    21. }
    22. }
    23. //-->
    24. </script>
    25. </head>
    26. <body>
    27. <p />Wählen Sie einen Eintrag aus um den Inhalt zu laden
    28. <p /><select id="dropdown" onChange="sendRequest()">
    29. <?
    30. $categories_query = mysql_query("select a.categories_id,parent_id, b.categories_name from " . TABLE_CATEGORIES . " as a," . TABLE_CATEGORIES_DESCRIPTION . " as b where a.categories_id = b.categories_id and parent_id ='0' and b.language_id = " . (int)$language_id . " order by categories_name");
    31. while($row = mysql_fetch_object($categories_query ))
    32. {
    33. echo '<option value="'.$row->categories_id.'">'.$row->categories_name.'</option>';
    34. }
    35. ?>
    36. </select>
    37. <div id="select2" style="border:1px solid #afafaf"></div>
    38. </body></html>
    Alles anzeigen

    Und dann die func.php:

    Quellcode

    1. <?
    2. require('includes/application_top.php');
    3. echo '<selct name="bundesland">';
    4. $categories_query2 = mysql_query("select categories_id,parent_id from " . TABLE_CATEGORIES ." where parent_id = '".$_GET[s]."'");
    5. while($row = mysql_fetch_object($categories_query2))
    6. {
    7. echo '<option value="'.$row->categories_id.'">'.$row->parent_id.'</option>';
    8. }
    9. echo '</select>';
    10. ?>
    Alles anzeigen

    hab noch ein paar Sachen ausprobiert, aber immer mit dem gleichen Ergebniss: keine dropdown...

    greets

    edit:
    ok also am sql liegt es ziemlich sicher nicht, denn wenn ich der zweiten Box die id="dropdown" gebe, wie die der ersten, lädt er die Daten aus func.php ohne Probleme in die erste dorpDown Box rein...

    edit2:
    Huuuui, eine 2te ist erschienen, funktioniert auch soweit...
    Hab statt <div id="select2"...</div> <select id="select2"...</select> eingebaut und dann das <select>,</select> aus der func.php auskommentiert...
    Weiß jetzt nicht ob das irgendwelche Probleme aufwirft im Nachhinein :?
    Vor allem weil da noch mehr Drop Down Boxen hinterher sollen...
    Will versuchen das er die maximale Tiefe der auf meiner Seite vorhandenen Unterkategorien ausliest und dann
    Mit eine For-Schleife soviele Drop Downs einzubauen, wie es Unterkategorien gibt, und man jeweils eine Kategorie auswählen kann und dann in der nächsten alle U-Kategorien erscheinen...
    Aber dass versuch ich erstmal selbst, will hier ja nicht euer Forum zu-spammen :wink:

    Wenns noch Bedenken, wegen der Select Lösung gibt bitte sagen, ansonsten versuch ich mich mal mit der Schleife...

    Achso, und wenn hier schonmal so ein ähnliches Script irgendwo gepostet wurde, würde ich mich natürlich dort schon inspirieren lassen, aber hab auf den ersten Blick noch nichts in die Richtung gesehen!
  • Danke, aber hab mich doch spontan zu einer einzelnen Box umentschieden, weil ich zuerst 7 DropDowns untereinander hatte, was zwar funktioniert hat aber irgendwie nicht so toll aussah...
    Habs jetzt fast so hinbekommen, wie ichs geplant hatte doch ein paar Sachen hab ich nicht gewusst und nicht in Google oder selfthtml gefunden...
    Vielleicht kann mir ja jmd ein bisschen auf die Sprünge helfen...
    Muss leider den kompletten text posten, weil die Probleme etwas verteilt sind
    :roll:

    also erstmal die hauptphp:

    Quellcode

    1. <tr>
    2. <td>
    3. <html><head>
    4. <script type="text/Javascript">
    5. <!--
    6. function sendRequest(a) {
    7. try {
    8. req = window.XMLHttpRequest?new XMLHttpRequest():
    9. new ActiveXObject("Microsoft.XMLHTTP");
    10. } catch (e) {
    11. //Kein AJAX Support
    12. }
    13. req.onreadystatechange = handleResponse;
    14. id = document.getElementById(a).value;
    15. req.open('get', 'func.php?s='+ id);
    16. req.send(null);
    17. /*<problem1> Will es so machen, dass wenn man eine kategorie auswählt über der
    18. DropDownBox die ausgewählte Kategorie aufgeführt wird, bis jetzt noch mit Id...
    19. document.getElementById(a).options[id].text; geht leider nicht, wär aber auch zu einfach...</problem1>*/
    20. vorher = document.getElementById('Auswahl').innerHTML;
    21. document.getElementById('Auswahl').innerHTML = vorher+" --> "+id;
    22. document.getElementById(a).style.backgroundColor = "#afafaf";
    23. document.getElementById(a).style.Color = "#adadad";
    24. // <Problem 2>Hier soll während er auf die Response wartet kurz der Text
    25. //"wird geladen" oder einfach kein Text kommen, weil im Moment noch
    26. //die ausgewählte Option stehen bleibt...
    27. document.getElementById(id).text = "wird geladen...";
    28. //</problem 2>
    29. }
    30. /*<problem 3 > Hier ist die Funktion, falls jemand die "Zurück" Option wählt, weil
    31. da ja nicht nochmal der Pfad mit document.getElementById('Auswahl').innerHTML =
    32. vorher+" --> "+id; angefügt werden soll sondern lediglich eine Kategorie nach
    33. oben...*/
    34. function sendRequestBack(a) {
    35. try {
    36. req = window.XMLHttpRequest?new XMLHttpRequest():
    37. new ActiveXObject("Microsoft.XMLHTTP");
    38. } catch (e) {
    39. //Kein AJAX Support
    40. }
    41. req.onreadystatechange = handleResponse;
    42. id = document.getElementById(a).value;
    43. req.open('get', 'func.php?s='+ id);
    44. req.send(null);
    45. document.getElementById(a).style.backgroundColor = "#afafaf";
    46. document.getElementById(a).style.Color = "#adadad";
    47. document.getElementById(id).text = "wird geladen...";
    48. }
    49. /*Müsste generell funktionieren. Die Zurück Option wird jeweils in der func.php
    50. erstellt und ich hab da ein <option onClick="SendRequestBack(a=1)">eingefügt
    51. allerdings ist das <select onChange="sendRequest()" höhergestellt und so geht
    52. er trotzdem immer in die normale funktion mit der id ausgabe...</problem3>*/
    53. function handleResponse() {
    54. /*alert(b);*/
    55. if ((req.readyState == 4) && (req.status == 200)) {
    56. document.getElementById(a).innerHTML = req.responseText;
    57. document.getElementById(a).style.backgroundColor = "#ffffff";
    58. document.getElementById(a).style.Color = "#000000";
    59. }
    60. }
    61. //-->
    62. </script>
    63. </head>
    64. <tr>
    65. <td>
    66. <body>
    67. <p />Kategorie ausw&auml;hlen
    68. <p />
    69. <div id="Auswahl" style=InfoBoxContents></div>
    70. <select id="1" onChange="sendRequest(a=1)" onMouseDown="" style="width: 160px" >
    71. <?
    72. $categories_query = mysql_query("select a.categories_id,parent_id, b.categories_name from " . TABLE_CATEGORIES . " as a," . TABLE_CATEGORIES_DESCRIPTION . " as b where a.categories_id = b.categories_id and parent_id ='0' and b.language_id = " . (int)$language_id . " order by categories_name");
    73. echo '<option value="nichts">'.'Kategorie w&auml;hlen'.'</option>';
    74. while($row = mysql_fetch_object($categories_query ))
    75. {
    76. echo '<option value="'.$row->categories_id.'">'.$row->categories_name.'</option>';
    77. }
    78. ?>
    79. </select><br>
    80. </body></html>
    81. </td>
    82. </tr>
    Alles anzeigen

    Zum besseren Verständniss noch die func.php (etwas chaotisch noch: :wink: )

    Quellcode

    1. <?
    2. require('includes/application_top.php');
    3. if($_GET[s]!=="back"){
    4. $categories_query2 = tep_db_query("select categories_id from " . TABLE_CATEGORIES . " where parent_id = '".$_GET[s]."'");
    5. $check = Mysql_num_rows($categories_query2);
    6. $categories_query4 = tep_db_query("select parent_id from " . TABLE_CATEGORIES . " where categories_id = '".$_GET[s]."'");
    7. list($parent)= mysql_fetch_row($categories_query4);
    8. if($check !== 0){
    9. while($row = mysql_fetch_object($categories_query2))
    10. {
    11. $idy =$row->categories_id;
    12. $categories_query3 = tep_db_query("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '".$idy."'");
    13. $row2 = mysql_fetch_object($categories_query3);
    14. echo '<option onClick="sendRequest(a=1)" value="'.$row->categories_id.'">'. $row2->categories_name.'</option>';
    15. }
    16. }elseif($check==0){
    17. /*Keine weitere unterkategorie*/
    18. echo '<option>'.'Ordner ausgew&auml;hlt!'.'</option>';
    19. }
    20. if ($_GET[s] !== "0" ){
    21. /* Hier die Zurück option, die Nur kommt wenn es eine höhere Kategorie kommt
    22. mit besagter onClick function...*/
    23. echo '<option onClick="sendRequestBack(a=1)" value="'.$parent.'">'.'<--Zur&uuml;ck'.'</option>';
    24. }
    25. }else
    26. echo '<option value="nichts">'.'Kategorie w&auml;hlen'.'</option>';
    27. ?>
    Alles anzeigen


    zu <problem1>: bräuchte was wie man den text der ausgewählten option ausliest
    zu <problem2>: eigentlich wie 1 :wink:
    edit2 ok seh grad zu 1 und 2 gibts doch einiges bei Google, denk das find ich schon noch...
    edit3: ok habs!:idea:

    zu <problem3>: Dass er falls jmd die zurück Option verwendet die sendRequestBack() function nimmt, damit der die Kategorie über der dropDwonbox nicht nochmal ausgegeben wird...

    edit: Oh hab grad bemerkt, dass wenn man auf Zurück klickt, man ja nicht nur nicht die aktuelle Kategorie an die vorherigen dranhängen darf, sondern auch die letzte wieder weg muss :? ...
    ?

    thx 4 ur support
  • probleme 1 und 2 hast du vermutlich mit innerHTML realisiert, oder?

    problem 3: das"zurück" soll das formular wieder anzeigen, dass beim laden der seite aufgebaut wurde, oder?

    also

    einmal die Auswahl löschen

    Quellcode

    1. document.getElementById('Auswahl').innerHTML = '';


    und das Formular auf Default zurücksetzen
    http://de.selfhtml.org/javascript/objekte/options.htm

    Quellcode

    1. function AuswahlReset () {
    2. for (i = 0; i < document.Testform.Auswahl.length; i++)
    3. if (document.Testform.Auswahl.options[i].defaultSelected == true)
    4. document.Testform.Auswahl.options[i].selected = true;
    5. }


    Hoffe das hilft
  • Na habs glaub ich umständlicher gemacht :wink: :

    Quellcode

    1. document.getElementById(a).selectedIndex = "1";
    2. document.getElementById(a).options[1].text = "wird geladen...";


    Sollte eigentlich nur einen Schritt zurück gehen hab da mal ein Pic gemacht:
    [Blockierte Grafik: http://img110.imageshack.us/img110/1416/kathi1.jpg]
    Quasi wenn man da jetzt auf Zurück klickt der Text sich oben mit verändert und das hzgf nicht mehr erscheint...
    Glaub da muss man den text irgendwie aufteilen mit text=... und dann vielleicht [i-1] wieder löschen, aber meine Versuche dahingehen sind noch alle gescheitert
    irgendwie statt: ...

    Quellcode

    1. text2= document.getElementById(a).options[index].text;
    2. vorher = document.getElementById('Auswahl').innerHTML;
    3. if(text2!="<--Zurück" ){
    4. document.getElementById('Auswahl').innerHTML = vorher+" ->"+text2;
    5. vorher="";
    6. }

    ....so irgendwie

    Quellcode

    1. //Glaub isset() gibts in JS nicht, oder?
    2. //Soll wenn noch Zahl noch nicht belegt worden ist (im ersten Fall)
    3. //mit 0 anfangen...
    4. if(Zahl==null (oder ist des php??) )
    5. Zahl = "0";
    6. }
    7. text[Zahl]= document.getElementById(a).options[index].text;
    8. if(text[Zahl] != "<--Zurück" ){
    9. for (i=0; i<Zahl;i++){
    10. //irgendwie den text zusammenstellen, dass man das im Nachhinein evtl irgendwie steuern kann...
    11. }
    12. ++Zahl;
    13. }
    Alles anzeigen


    nur so vom Prinzip her...
    hab da schon ein paar sachen ausprobiert, aber hat noch nciht funktioniert...
  • klappt der Code überhaupt?
    mir fällt gerade auf, dass du gar kein Select erstellst

    und einen Integer als ID sollte man auch nicht verwenden

    Quellcode

    1. <select id="1" .....


    Außerdem solltest du Attribute immer in Anführungszeichen schreiben

    Quellcode

    1. <div id="Auswahl" style="InfoBoxContents">


    Letztendlich sollten meine beiden Codes dein Problem schon lösen
    Also einmal die eigene box "leeren"
    und dann noch die obere auswahlliste zurücksetzen

    Quellcode

    1. function AuswahlReset () {
    2. var ob = document.getElementById('hauptselect');
    3. for (i = 0; i < ob.length; i++)
    4. if (ob.options[i].defaultSelected == true)
    5. ob.options[i].selected = true;
    6. }
  • Jo der Code funktioniert wunderbar :wink: !
    Das mit dem Integer hab ich gleich mal getauscht und das InfoBoxContents war noch ein überbleibsel aber in Zukunft auch in ""...
    Bin mir immer noch nicht sicher, ob wir vom gleichen reden, das Element 'Auswahl' ist lediglich die textanzeige über der dropDownbox , die die bisher gewählten Kategorien auflistet...
    [Blockierte Grafik: http://img74.imageshack.us/img74/2742/katif1.jpg]
    Das DropDown hieß früher "1" und jetzt "optionen", hab das so gemacht, dass er einfach nochmal die letzten Einträge aus der Datenbank liest, aber glaub deine funktion ist da deutlich besser!

    Naja will hier nicht die ganze Zeit spammen, ich schau erstmal, dass ichs so irgendwie hinbekomm :wink:
    thx
  • "student2312" schrieb:

    Jo der Code funktioniert wunderbar :wink: !
    Das mit dem Integer hab ich gleich mal getauscht und das InfoBoxContents war noch ein überbleibsel aber in Zukunft auch in ""...
    Bin mir immer noch nicht sicher, ob wir vom gleichen reden, das Element 'Auswahl' ist lediglich die textanzeige über der dropDownbox , die die bisher gewählten Kategorien auflistet...
    [Blockierte Grafik: http://img74.imageshack.us/img74/2742/katif1.jpg]
    Das DropDown hieß früher "1" und jetzt "optionen", hab das so gemacht, dass er einfach nochmal die letzten Einträge aus der Datenbank liest, aber glaub deine funktion ist da deutlich besser!

    Naja will hier nicht die ganze Zeit spammen, ich schau erstmal, dass ichs so irgendwie hinbekomm :wink:
    thx


    Versteh ich das hier richtig: Die Hauptkategorie löst man mit parent_id='0' ?
    Wie holt man dann die erste Unterkategorie von dieser Hauptkategorie?
    Ich möchte was ähnliches machen und bin schon soweit das ich erst den Hersteller und das Modell auswähle - dann soll mir von dem gewählten Hersteller und dem Modell deren hauptkategorien angezeigt werden.

    Muß dann nicht die select-Abfrage einfach um where manufacturers_id = Auswahl and products_id = Auswahl erweitert werden?
  • poste doch bitte nochmal tabellenlayout und beispieldaten
    da ja mehrere variablen drinne sind, bei denen man vom snippet nicht beurteilen kann, ob sie interpretiert werden, mach doch noch ein echo mit dem request

    Quellcode

    1. echo "select a.categories_id,parent....";


    die "or die()" Klausel würde ich außerdem fürs Entwickeln zu mysql_error(); ändern um eventuelle Probleme besser analysieren zu können