Ajax mit Select auswahl

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

  • Ajax mit Select auswahl

    hallo nach vielem Lesen und schaun habe ich das Forum hier gefunden und muss sagen hier ist ein super umgang auch bei Neulingen und den vielen fragen -g- Daher hab ich mich mal angemeldet und muss auch was fragen.

    Und zwar habe ich zum Thema mit der Select box viel gelesen das beste ist: [wiki]Select-Auswahl mit AJAX Abhängigkeit[/wiki]

    Jedoch bin ich noch recht am anfang mit Ajax, verstehe zwar einige abläufe aber dennoch hängt es. PHP und MYSQL sind vorhanden.

    Zu meiner Frage :D

    Also ich will eine Select Box anbieten die daten sollen aus einer DB kommen (1Box )

    Länder auswahl (Diese 3 länder sind in der DB)
    *Deustchland (ID1)
    *Schweiz(ID2)
    *Österreich(ID3)

    Je nach auswahl Soll wiederum eine 2 Box auftauchen wo neue daten ausgelesen werden aus der DB (jedes bundesland hat eine land id)

    Bundersländer:
    *Niedersachen (ID1 / landid1)
    *Bayern (ID2 / landid1)
    *Zürrich ((ID3 / landid2))

    Dann wiederum soll noch eine box kommen mit den Städten wo dann in der DB bei städten die Bundesland id dabei ist)

    Hoffe man versteht mich einigermassen. Sry wenn ich mich schlecht ausdrücken sollte, weis nur nicht wie ich das beschreiben soll sonst.
    Zumindest sind die ansätze die ich hier gesehen habe ja schon das was ich will komme aber jedoch einfach nicht vorran oder weis nicht wie ich das umsetzen soll =(
    ...

    Hab mal was ausprobiert aber irgendendwie passiert nix wenn ich eins auswähle...Die erste Box zeigt er normal an aber soweit ich was auswähle gehts nicht weiter.
    formular.php

    Quellcode

    1. <html><head>
    2. <script type="text/Javascript">
    3. function createXMLHttpRequest() {
    4. var ua;
    5. if(window.XMLHttpRequest) {
    6. try {
    7. ua = new XMLHttpRequest();
    8. } catch(e) {
    9. ua = false;
    10. }
    11. } else if(window.ActiveXObject) {
    12. try {
    13. ua = new ActiveXObject("Microsoft.XMLHTTP");
    14. } catch(e) {
    15. ua = false;
    16. }
    17. }
    18. return ua;
    19. }
    20. var req = createXMLHttpRequest();
    21. function sendRequest(digit) {
    22. // **
    23. // Hier die wichtigen Änderungen. Quelle und Ziel übermitteln
    24. // **
    25. minus = digit-1;
    26. inhalt = document.getElementById('source' + minus );
    27. req.open('get', 'func.php?dest='+ digit + '&s=' + inhalt.value);
    28. req.onreadystatechange = handleResponse;
    29. req.send(null);
    30. }
    31. function handleResponse() {
    32. if(req.readyState == 4){
    33. var response = req.responseText;
    34. var update = new Array();
    35. if(response.indexOf('||' != -1)) {
    36. update = response.split('||');
    37. document.getElementById(update[0]).innerHTML = update[1];
    38. }
    39. }
    40. else
    41. alert("loading" + ajax.readyState);
    42. }</script>
    43. </head>
    44. <body>
    45. <form method="post" action="">
    46. <div style="float:left" id="select1">
    47. <select name="source1" id="source1" onChange="sendRequest(2)">
    48. <option value=""></option>
    49. <?
    50. //CAT = 0 könntest du verwenden um dein hauptmenü zu kennzeichnen
    51. $res = mysql_query("SELECT id, name FROM `land`");
    52. while($row = mysql_fetch_object($res)) {
    53. echo '<option value="'.$row->id.'">'.$row->name.'</option>';
    54. }
    55. ?>
    56. </select>
    57. </div>
    58. <div style="float:left" id="select2" name="select2">
    59. </div>
    60. </form>
    61. </body></html>
    Alles anzeigen

    func.php

    Quellcode

    1. echo 'select'.$_GET['dest'].'|| ';
    2. echo '<select name="source'.$_GET['dest'].'" id="source'.$_GET['dest'].'">';
    3. echo '<option value=""></option>';
    4. //if(!is_int($_GET['s']))
    5. // die('hacking_attempt');
    6. $res = mysql_query("SELECT id, name FROM `bundesland` WHERE `land_id` = ".$_GET['s']."");
    7. while($row = mysql_fetch_object($res)) {
    8. echo '<option value="'.$row->id.'">'.$row->name.'</option>';
    9. }
    10. echo '</select>';
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von sintains ()

  • Guten morgen,

    hmm... dein Code sieht sehr nach meinem alten Wiki Eintrag von mir aus, aber passt nicht zu dem Code den ich hier veröffentlicht habe.
    Ich würde dir empfehlen die download.zip des Beispiels herunterzuladen.

    Das einzige was du anpassen musst, ist folgende ajax.php zu verwenden:

    Quellcode

    1. $data = array();
    2. $res = mysql_query("SELECT id, name AS text FROM `bundesland` WHERE `land_id` = ".mysql_real_escape_string($_GET['id'])."");
    3. while($row = mysql_fetch_object($res)) {
    4. $data[] = $row;
    5. }
    6. echo json_encode($return);
  • Ok habe soweit alles gemacht was gesagt hast! vielen dank erstma ^^.
    1BOX (Land)

    Quellcode

    1. $data = array();
    2. $res = mysql_query("SELECT id, name AS text FROM `land`");
    3. while($row = mysql_fetch_object($res))
    4. {
    5. $data[] = $row;
    6. }
    7. echo json_encode($data);

    Eingebaut und dein beispiel genutzt. Soweit wird nun auch angezeigt und soweit ich drauf gehe kommt auch ne 2 Box dann 3 usw...
    das problem ständig mit den gleichen sachen imemr die länder.
    Nun wie kann ich ihn sagen das er bei der nächsten box ne andere tabelle nehmen soll?

    2BOX (bundesland / "Land_id")
    3BOX (stadt / "bundesland_id")
  • Selbstverständlich. habe das Beispiel aus dem Wiki genommen.

    Index.php

    HTML-Quellcode

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="de">
    3. <head>
    4. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    5. <title>test</title>
    6. <script type="text/javascript" src="script.js"></script>
    7. <style type="text/css">
    8. <!--
    9. body{font-size:11pt;font-family:Verdana,Arial,Sans}
    10. //-->
    11. </style>
    12. </head>
    13. <body onload="sendRequest(null, 'elem1')">
    14. <form method="post" action="" id="ajaxSelect">
    15. <table>
    16. <tr id="elem1" style="display:none">
    17. <td>Land:</td>
    18. <td><select name="land" size="4" onchange="sendRequest(this, 'elem2')"><option value=""></option></select></td>
    19. </tr>
    20. <tr id="elem2" style="display:none">
    21. <td>Bundesland:</td>
    22. <td><select name="bland" size="4" onchange="sendRequest(this, 'elem3')"><option value=""></option></select></td>
    23. </tr>
    24. <tr id="elem3" style="display:none">
    25. <td>Stadt:</td>
    26. <td><select name="stadt" size="4" onchange="sendRequest(this, 'elem4')"><option value=""></option></select></td>
    27. </tr>
    28. </table>
    29. <div>
    30. <input type="submit" />
    31. </div>
    32. </form>
    33. </body></html>
    Alles anzeigen

    ajax.php

    PHP-Quellcode

    1. <?php
    2. include('db.php');
    3. $data = array();
    4. $res = mysql_query("SELECT id, name AS text FROM `land`");
    5. while($row = mysql_fetch_object($res))
    6. {
    7. $data[] = $row;
    8. }
    9. echo json_encode($data);
    10. ?>
    Alles anzeigen

    script.js

    Quellcode

    1. function clearSelect(targetSel) {
    2. for (var i=targetSel.length; i>=0; i--) {
    3. targetSel.options[i] = null;
    4. }
    5. }
    6. function sendRequest(domref, target) {
    7. if(!target) return false;
    8. if(domref) domref.followup = target;
    9. var req;
    10. try {
    11. req = window.XMLHttpRequest ? new XMLHttpRequest():
    12. new ActiveXObject("Microsoft.XMLHTTP");
    13. } catch (e) {
    14. }
    15. req.onreadystatechange = function() {
    16. if ((req.readyState == 4) && (req.status == 200)) {
    17. var data = eval('(' + req.responseText + ')');
    18. var targetRef = document.getElementById(target);
    19. var targetSel = targetRef.getElementsByTagName('select')[0];
    20. targetRef.style.display = 'block';
    21. clearSelect(targetSel);
    22. var i = 0;
    23. for(var x in data) {
    24. targetSel.options[i++] = new Option(
    25. data[x].text,
    26. data[x].id
    27. );
    28. }
    29. while(targetSel.followup) {
    30. targetRef = document.getElementById(targetSel.followup);
    31. targetRef.style.display = 'none';
    32. targetSel = targetRef.getElementsByTagName('select')[0];
    33. clearSelect(targetSel);
    34. }
    35. }
    36. }
    37. req.open('post', 'ajax.php');
    38. req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    39. req.send(domref !== null ? 'id='+domref.value+'&name='+domref.name : '');
    40. return false;
    41. }
    Alles anzeigen
  • du könntest mit js prüfen, welches target ausgewählt wurde und dementsprechend die ajaxrequest verändern:

    Quellcode

    1. switch(target) {
    2. case elem1:
    3. str="foo";
    4. break;
    5. case elem2:
    6. str="Land_id";
    7. break;
    8. case elem3:
    9. str="bundesland_id";
    10. break;
    11. }
    12. req.send(domref !== null ? 'id='+domref.value+'&name='+domref.name+'&target='+str : '');
    Alles anzeigen

    Dann müsste die Abfrage so umgewandelt werden:

    Quellcode

    1. $res = mysql_query("SELECT id, name AS text FROM `{$_REQUEST['target']}`");
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • So habe das js mal angepasst musste aber die case in "" setzen da er sonst fehler anzeigt in der Konsole und die Boxen garnicht erst auftauchen.

    Quellcode

    1. switch(target) {
    2. case "elem1":
    3. str="land";
    4. break;
    5. case "elem2":
    6. str="bundesland";
    7. break;
    8. case "elem3":
    9. str="stadt";
    10. break;
    11. }
    12. req.send(domref !== null ? 'id='+domref.value+'&name='+domref.name+'&target='+str : '');
    Alles anzeigen


    Optisch scheint soweit auch alles zu gehen habe auch mit alert() getestet ob er den switch nimmt (alles ok).
    Jedoch glaube ich (weis nicht genau) in der ajax.php kommt der target nicht an oder wird nicht verarbeitet ...
    kann es aber nicht genau sagen. Auf jedenfall gibt er mir nix in die Box aus.

    Quellcode

    1. $data = array();
    2. $res = mysql_query("SELECT id, name AS text FROM `{$_REQUEST['target']}`");
    3. while($row = mysql_fetch_object($res))
    4. {
    5. $data[] = $row;
    6. }
    7. echo json_encode($data);

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von sintains ()

  • Lass dir mal bitte den Inhalt von target und sonstiger Variablen mittels

    Quellcode

    1. var_dump($_POST)

    oder

    Quellcode

    1. var_dump($_REQUEST)

    ausgeben und poste die Ausgabe hier ins Forum.

    Und wie sieht denn deine Tabellenstruktur aus? Wenn ich das richtig sehe, dann weicht sie vom Wikibeispiel ab. Gibt es für jede neue Box eine eigene Tabelle?
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • bei zb.:

    var_dump($_REQUEST['target']) so wie POST gibt er "NULL" aus.
    An DB sollte es nicht liegen wenn ich zb.:
    land direkt nach From angebe geht es ja, aber so:
    $res = mysql_query("SELECT id, name AS text FROM `{$_REQUEST['target']}`");
    Will er nicht.

    DB ist folgendermassen aufgebaut:
    Tabelle "land":
    id
    name

    Tabelle "bundesland":
    id
    land_id
    name

    Tabelle "stadt":
    id
    bundesland_id
    name

    Aber wie gesagt wenn ich nach From es direkt angebe geht es...
  • ...ich bekomms trotzdem nicht hin... Jetzt hab ich endlich nach ewiger Recherche eine scheinbar deppensichere Anleitung gefunden, und ich schaffs immer noch nicht. Dabei ist euer Projekt genau das, was ich gerne auf meiner Seite einbinden möchte. Auch drei select-Felder, auch aus einer DB, nur keine Städte und Länder sondern Werkstoffe usw.
    Hab mir schon die DB zusammengebastelt die sintains benutzt damit alles passt. Die DB-Abfrage hab ich noch hinbekommen, aber dann nur noch... na ja, nix mehr :)
    Natürlich weiß ich auch, woran es liegt, meine Kenntnisse sind für sowas nicht, na sagen wir mal "gereift". Die Änderungen und Korrekturen, die ihr besprochen habt, wusste ich teilweise nicht einmal, wo sie hingehören (besonders in der script.js)... Ist zum verzweifeln...
    Ich weiß, es ist unverschämt, aber die letztgültigen funktionierenden Skripte würden mein Weihnachtsfest versüßen! Wenn ich könnte, würde ich mich ja gerne revangieren, aber meine bisherigen "Programmierkünste" fallen derweil noch unter "ferner liefen...".

    Wünsche euch ein schönes Weihnachtsfest (mir auch :) )
  • noch eine kurze Frage...

    Hab mit eurer Hilfe die verketteten selects in meine Umgebung einbetten können, Danke!
    Beim Herumexperimentieren stellt sich mir jetzt eine Frage. Ich hab aus optischen Gründen die select-box size auf "1" gesetzt. Nun lässt sich der oberste Wert nicht anwählen. Nur nach vorherigem Anwählen eines anderen Wertes.
    Ein ("bitte wählen" oder so ähnlich) für "value" als ersten Wert im Form einzusetzen hat erwartungsgemäß nichts gebracht. Hat jemand eine Idee wo ich da am besten ansetzen kann?