Ajax Inhalte mit Select nachladen und wieder zurücksetzen

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

  • Ajax Inhalte mit Select nachladen und wieder zurücksetzen

    Hallo!

    Vor ein paar Tagen hab ich zu meiner grossen Erleichterung den Code "Ajax Inhalte mit PHP & Select nachladen" im Coder Wiki gefunden. Also erst mal herzlichen Dank dafür.

    Klappt auch alles wunderbar, nur habe ich eine Frage zum Zurücksetzen.

    Hier erst mal mein Anwendungsbeispiel (Suchmaske für meine Bilderdatenbank): ich hab ein Select-Feld mit dem Aufnahmeort 1 (aus der Tabelle aufnahmeort1). Abhängig von der Auswahl dieser Liste wird ein neu eingeblendetes zweites Select-Feld mit den detaillierten Aufnahmeorten 2 geladen (z.B. Aufnahmeort 1 = Deutschland --> Aufnahmeorte 2 = Berlin, Dortmund, Köln...).

    Da es sich bei diesem Formular um die Suchmaske handelt, hab ich jetzt bei beiden Select-Feldern manuell noch eine Option "alle Aufnahmeorte" mit eingebunden.

    Nach diesem Roman komme ich nun endlich zu meinem Problem: Ich krieg's mit meinen mangelhaften Javascript-Kenntnissen leider nicht hin, dass das zweite Select-Feld wieder ausgeblendet wird, wenn im ersten Feld "alle Aufnahmeorte" gewählt wurde. Kann mir jemand bitte einen Tipp geben, wie ich das anstellen könnte? Das wäre sehr nett. :)

    Hier noch mein Code:

    Quellcode

    1. <html><head>
    2. <script type="text/Javascript">
    3. <!--
    4. function sendRequest() {
    5. try {
    6. req = window.XMLHttpRequest?new XMLHttpRequest():
    7. new ActiveXObject("Microsoft.XMLHTTP");
    8. } catch (e) {
    9. //Kein AJAX Support
    10. }
    11. req.onreadystatechange = handleResponse;
    12. id = document.getElementById('dropdown').value;
    13. req.open('get', 'func.php?s='+ id);
    14. req.send(null);
    15. }
    16. function handleResponse() {
    17. if ((req.readyState == 4) && (req.status == 200)) {
    18. document.getElementById('inhalt').innerHTML = req.responseText;
    19. }
    20. }
    21. //-->
    22. </script>
    23. </head>
    24. <body>
    25. <select id="dropdown" onChange="sendRequest()">
    26. <?
    27. include 'functions.inc'; // (DB-Verbindung)
    28. $result = mysql_query("SELECT aufnahmeort1ID,aufnahmeort1 FROM `aufnahmeort1`; ");
    29. while($row = mysql_fetch_object($result))
    30. {
    31. echo '<option value="'.$row->aufnahmeort1ID.'">'.$row->aufnahmeort1.'</option>';
    32. }
    33. ?>
    34. </select>
    35. <div id="inhalt"></div>
    36. </body>
    37. </html>
    Alles anzeigen


    und die func.php:

    Quellcode

    1. <?
    2. //Inhalte laden
    3. $result = mysql_query("SELECT aufnahmeort2ID, aufnahmeort2 FROM `aufnahmeort2` WHERE `aufnahmeort1F` = $_GET[s]; ");
    4. ?>
    5. <p>
    6. Aufnahmeort 2:
    7. <select name="aufnahmeort2" class="select240">
    8. <option value="0" selected>alle Aufnahmeorte</option>
    9. <?
    10. while($row = mysql_fetch_object($result))
    11. {
    12. echo '<option value="'.$row->aufnahmeort2ID.'">'.$row->aufnahmeort2.'</option>';
    13. }
    14. ?>
    15. </select>
    Alles anzeigen



    Herzlichen Dank!
    lg, michele[/quote]
  • hallo michele,

    die Option "alle Aufnahmeorte" müsste doch statt der func.php ins erste Select, oder?
    Je nachdem musst du dann den EventHandler onChange eine zusätzliche toggle Funktion einbinden

    Quellcode

    1. <select id="dropdown" onChange="sendRequest(); toggle('aufnahmeort2')">
    2. <option value="0" selected>alle Aufnahmeorte</option>
    3. <?
    4. include 'functions.inc'; // (DB-Verbindung)
    5. $result = mysql_query("SELECT aufnahmeort1ID,aufnahmeort1 FROM `aufnahmeort1`; ");
    6. while($row = mysql_fetch_object($result))
    7. {
    8. echo '<option value="'.$row->aufnahmeort1ID.'">'.$row->aufnahmeort1.'</option>';
    9. }
    10. ?>
    11. </select>
    12. <!-- AJAX Start //-->
    13. <select name="aufnahmeort2" class="select240" id="aufnahmeort2">
    14. ...
    15. </select>
    16. <!-- AJAX Ende //-->
    Alles anzeigen


    Die Toogle Funktion sähe so aus

    Quellcode

    1. function toggle(id) {
    2. if(document.getElementById('dropdown').value == 0)
    3. document.getElementById(id).style.display = 'none';
    4. else
    5. document.getElementById(id).style.display = 'block';
    6. }
  • hallo d0nUt

    vielen Dank für deine so prompte Antwort!

    Du hast natürlich Recht, die Option "alle Aufnahmeorte" gehört AUCH ins erste Select (beim zweiten brauch ich's aber auch). Ich hab im Eifer des Gefechts anscheinend nicht meine aktuellste Code-Version genommen.

    Deinen Tipp mit der Toggle-Funktion habe ich versucht einzubauen, leider bisher ohne Erfolg. Weder im Firefox noch im IE. Die ganze Sache hat sich dadurch sogar eher verschlechtert, weil es nun immer einen Moment dauert, bis das zweite Select-Feld eingeblendet und gefüllt wird.

    Was mache ich falsch?

    Hier nochmals der ganz richtige und aktuelle Code:

    box.php:

    Quellcode

    1. <html>
    2. <head>
    3. <title></title>
    4. <script language="javascript">
    5. <!--
    6. function sendRequest() {
    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('aufnahmeort').value;
    15. req.open('get', 'func.php?s='+ id);
    16. req.send(null);
    17. }
    18. function handleResponse() {
    19. if ((req.readyState == 4) && (req.status == 200)) {
    20. document.getElementById('inhalt').innerHTML = req.responseText;
    21. }
    22. }
    23. function toggle(id) {
    24. if(document.getElementById('dropdown').value == 0)
    25. document.getElementById(id).style.display = 'none';
    26. else
    27. document.getElementById(id).style.display = 'block';
    28. }
    29. //-->
    30. </script>
    31. </head>
    32. <body>
    33. <?
    34. include 'functions.inc';
    35. ?>
    36. Aufnahmeort 1:
    37. <select id="aufnahmeort" name="aufnahmeort1" class="select240" onChange="sendRequest(); toggle('aufnahmeort2')">
    38. <option value="0" selected>alle Aufnahmeorte</option>
    39. <?
    40. $result = mysql_query("SELECT aufnahmeort1ID,aufnahmeort1 FROM `aufnahmeort1`; ");
    41. while($row = mysql_fetch_object($result))
    42. {
    43. echo '<option value="'.$row->aufnahmeort1ID.'">'.$row->aufnahmeort1.'</option>';
    44. }
    45. ?>
    46. </select>
    47. <div id="inhalt"></div>
    Alles anzeigen


    func.php:

    Quellcode

    1. <?
    2. //Inhalte laden
    3. $result = mysql_query("SELECT aufnahmeort2ID, aufnahmeort2 FROM `aufnahmeort2` WHERE `aufnahmeort1F` = $_GET[s]; ");
    4. ?>
    5. <p>
    6. Aufnahmeort 2:
    7. <select name="aufnahmeort2" class="select240">
    8. <option value="0" selected>alle Aufnahmeorte</option>
    9. <?
    10. while($row = mysql_fetch_object($result))
    11. {
    12. echo '<option value="'.$row->aufnahmeort2ID.'">'.$row->aufnahmeort2.'</option>';
    13. }
    14. ?>
    15. </select>
    Alles anzeigen


    Wäre unheimlich froh um einen weiteren Tipp!

    Und noch eine kleine Frage am Rande: In deiner Antwort hast du das zweite Select zw. Ajax Start und Ajax Ende eingetragen. Bedeutet das, dass der Code für das zweite Select-Feld in der gleichen Datei stehen kann und nicht im includeten func.php stehen muss?

    Vielen Dank und lg
    Michele
  • nein, php ajax im html bereich geht nicht.
    ich hab in meiner antwort nur vergessen zu erwähnen, dass du das "id" im select ergänzen solltest.. hab dir hier nochmal die änderungen zusammengefasst (und die toggle auch wieder geändert)

    Quellcode

    1. <html>
    2. <head>
    3. <title></title>
    4. <script language="javascript">
    5. <!--
    6. function sendRequest() {
    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('aufnahmeort').value;
    15. if(id == 0) {
    16. document.getElementById('aufnahmeort2').style.display = 'none';
    17. } else {
    18. document.getElementById('aufnahmeort2').style.display = 'block';
    19. req.open('get', 'func.php?s='+ id);
    20. req.send(null);
    21. }
    22. }
    23. function handleResponse() {
    24. if ((req.readyState == 4) && (req.status == 200)) {
    25. document.getElementById('inhalt').innerHTML = req.responseText;
    26. }
    27. }
    28. //-->
    29. </script>
    30. </head>
    31. <body>
    Alles anzeigen



    Quellcode

    1. <?
    2. //Inhalte laden
    3. $result = mysql_query("SELECT aufnahmeort2ID, aufnahmeort2 FROM `aufnahmeort2` WHERE `aufnahmeort1F` = $_GET[s]; ");
    4. ?>
    5. <p>
    6. Aufnahmeort 2:
    7. <select name="aufnahmeort2" class="select240" id="aufnahmeort2">
    8. <option value="0" selected>alle Aufnahmeorte</option>
    9. <?
    10. while($row = mysql_fetch_object($result))
    11. {
    12. echo '<option value="'.$row->aufnahmeort2ID.'">'.$row->aufnahmeort2.'</option>';
    13. }
    14. ?>
    15. </select>
    Alles anzeigen
  • guten Morgäähn...

    Ich bin inzwischen alles nochmals durchgegangen und (ausnahmsweise) versteh ich sogar deinen Javascript-Code und bin der Laien-Meinung, dass das eigentlich funktionieren müsste. Nur tut es das leider nicht.
    Wenn ich deinen ersten Vorschlag umsetze, dann erscheint das zweite Select korrekt, aber es wird nicht ausgeblendet, wenn ich im ersten Select "alle Aufnahmeorte" wähle. Wenn ich deinen zweiten Vorschlag umsetze, erscheint das zweite Select gar nicht mehr. Gilt für FF und IE.

    Ich nerv wirklich nur ungern, aber vielleicht hast du noch den ultimativen dritten Vorschlag? *hoff*

    Daaaanke und lg
    michele
  • Ich hab's! :D War ja gar nicht so schwer, wenn man weiss, wie...

    Ist wahrscheinlich lausig programmiert, aber Hauptsache ist, dass es nun 1A klappt.

    Also nochmals danke, d0nUt für die Tipps.

    Hier noch mein aktueller Code:

    Quellcode

    1. <html>
    2. <head>
    3. <title></title>
    4. <script language="javascript">
    5. function setVisibility() {
    6. var ort = document.myForm.aufnahmeort1.selectedIndex;
    7. if (ort == 0) {
    8. inhalt.style.display = 'none';
    9. } else {
    10. inhalt.style.display = 'block';
    11. }
    12. }
    13. function sendRequest() {
    14. try {
    15. req = window.XMLHttpRequest?new XMLHttpRequest():
    16. new ActiveXObject("Microsoft.XMLHTTP");
    17. } catch (e) {
    18. //Kein AJAX Support
    19. }
    20. req.onreadystatechange = handleResponse;
    21. id = document.getElementById('aufnahmeort1').value;
    22. req.open('get', 'func.php?s='+ id);
    23. req.send(null);
    24. }
    25. function handleResponse() {
    26. if ((req.readyState == 4) && (req.status == 200)) {
    27. document.getElementById('inhalt').innerHTML = req.responseText;
    28. }
    29. }
    30. </script>
    31. </head>
    32. <body>
    33. <?
    34. include 'functions.inc';
    35. ?>
    36. <form name="myForm">
    37. Aufnahmeort 1:
    38. <select id="aufnahmeort1" name="aufnahmeort1" class="select240" onChange="setVisibility(); sendRequest()">
    39. <option value="0" selected>alle Aufnahmeorte</option>
    40. <?
    41. $result = mysql_query("SELECT aufnahmeort1ID,aufnahmeort1 FROM `aufnahmeort1`; ");
    42. while($row = mysql_fetch_object($result))
    43. {
    44. echo '<option value="'.$row->aufnahmeort1ID.'">'.$row->aufnahmeort1.'</option>';
    45. }
    46. ?>
    47. </select>
    48. <div id="inhalt"></div>
    49. </form>
    50. </body>
    51. </html>
    Alles anzeigen


    am func.php hat sich nix geändert.

    lg, michele
  • variable übergeben

    hallo :)

    lange ist's her, seit ich dieses posting geschrieben habe. meine bilderdatenbank lag während des sommers brach, aber jetzt bin ich wieder voll daran ... und musste feststellen, dass ich mit diesem ajax-select-formular immer noch auf kriegsfuss stehe *grummel*. mein problem ist, dass der wert, der vom benutzer in der zweiten selectbox gewählt wird, im firefox nicht als variable übergeben wird. im ie gehts, wie ich zu meiner grossen verwirrung gerade festgestellt habe. :?: aber der firefox tut bei der auswertung der formulareingaben so, als ob in der zweiten dropdown-liste nichts ausgewählt worden wäre.

    mit den folgenden zeilen checke ich, ob die variable übergeben wurde:

    Quellcode

    1. if (!empty($_POST["search_aufnahmeort2"]))
    2. { $aufnahmeort2F = $_POST["search_aufnahmeort2"]; }
    3. else { $aufnahmeort2F = 0; }


    hab's nach dem lesen der ajax tipps auch mit $_REQUEST statt $_POST versucht, klappt aber auch nicht. meine variable $aufnahmeort2F hat immer den wert 0 (im firefox)...

    hat vielleicht jemand einen tipp, woran es liegen könnte, dass mein script (code siehe weiter oben) im ie klappt, im ff aber nicht?

    menno, ich bekomm noch graue haare, bis das alles läuft... ;)

    vielen vielen dank für alle tipps!
    lg, michele
  • hallo d0nUt

    vielen dank für deine antwort und die beiden tipps. ich hab's geändert, hat aber nicht geholfen. da mein problem anscheinend irgend eine spitzfindigkeit im html, js oder php code ist (besonders bei js blick ich überhaupt nicht durch...), poste ich nun mal alles genau so, wie ich's bei mir habe:

    formular:

    Quellcode

    1. <?
    2. include "includes/functions.inc"; // enthält u.a. Verbindung zur Datenbank!
    3. $query_ort = "select aufnahmeort1ID, aufnahmeort1 from aufnahmeort1 order by aufnahmeort1";
    4. $result_ort = safe_query($query_ort);
    5. ?>
    6. <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
    7. <html>
    8. <head>
    9. <title>Bilder-Datenbank</title>
    10. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    11. <link rel="stylesheet" href="includes/stil.css" type="text/css" />
    12. <script type="text/javascript" src="includes/script.js"> </script>
    13. </head>
    14. <body>
    15. <table>
    16. <tr>
    17. <td>
    18. <form name="fsearch" method="post" action="index.php">
    19. <tr>
    20. <td>
    21. <table>
    22. <tr>
    23. <td>
    24. <table>
    25. <tr>
    26. <td>
    27. <select id="search_aufnahmeort1" name="search_aufnahmeort1" class="select210" onChange="setVisibility(); sendRequest_ort()">
    28. <option value="0" selected>alle Aufnahmeorte</option>
    29. <?
    30. while($row = mysql_fetch_object($result_ort))
    31. {
    32. echo '<option value="'.$row->aufnahmeort1ID.'">'.$row->aufnahmeort1.'</option>';
    33. }
    34. ?>
    35. </select>
    36. &nbsp;
    37. <div id="inhalt_ort"></div>
    38. </td>
    39. </tr>
    40. </table>
    41. </td>
    42. </tr>
    43. </table>
    44. </td>
    45. </tr>
    46. <tr>
    47. <td>
    48. <table>
    49. <tr>
    50. <td><input type="submit" name="search_go" class="button" value="Suchen ..."></td>
    51. <td><input type="reset" name="search_reset" class="button" value="Zur&uuml;cksetzen"></td>
    52. </tr>
    53. </table>
    54. </td>
    55. </tr>
    56. </form>
    57. </td>
    58. </tr>
    59. </table>
    60. </body>
    61. </html>
    Alles anzeigen


    (bitte nicht wundern wegen den vielen tabellen-tags... das formular ist ziemlich komplex und ich hab hier alles gelöscht, was nix mit meinem problem zu tun hat...)

    script.js:

    Quellcode

    1. <!--
    2. function setVisibility() {
    3. var date = document.fsearch.search_datumart.selectedIndex;
    4. if (date == 0) {
    5. layer1.style.display = 'none';
    6. layer2.style.display = 'none';
    7. } else if (date == 1) {
    8. layer1.style.display = 'inline';
    9. layer2.style.display = 'none';
    10. } else if (date == 2) {
    11. layer1.style.display = 'inline';
    12. layer2.style.display = 'none';
    13. } else if (date == 3) {
    14. layer1.style.display = 'inline';
    15. layer2.style.display = 'none';
    16. } else if (date == 4) {
    17. layer1.style.display = 'inline';
    18. layer2.style.display = 'inline';
    19. } else {
    20. layer1.style.display = 'none';
    21. layer2.style.display = 'none';
    22. }
    23. var ort = document.fsearch.search_aufnahmeort1.selectedIndex;
    24. var inhalt_ort = document.getElementById('inhalt_ort');
    25. if (ort == 0) {
    26. inhalt_ort.style.display = 'none';
    27. } else {
    28. inhalt_ort.style.display = 'inline';
    29. }
    30. }
    31. function sendRequest_ort() {
    32. try {
    33. req = window.XMLHttpRequest?new XMLHttpRequest():
    34. new ActiveXObject("Microsoft.XMLHTTP");
    35. } catch (e) {
    36. //Kein AJAX Support
    37. }
    38. req.onreadystatechange = handleResponse_ort;
    39. id = document.getElementById('search_aufnahmeort1').value;
    40. req.open('get', 'includes/search_ajax_ort.php?s='+ id);
    41. req.send(null);
    42. }
    43. function handleResponse_ort() {
    44. if ((req.readyState == 4) && (req.status == 200)) {
    45. document.getElementById('inhalt_ort').innerHTML = req.responseText;
    46. }
    47. }
    48. // End --->
    Alles anzeigen


    und dann noch search_ajax_ort.php:

    Quellcode

    1. <?
    2. $dbuser = '...';
    3. $dbpass = '...';
    4. $dbname = '...';
    5. $dbhost = 'localhost';
    6. mysql_connect($dbhost,$dbuser,$dbpass);
    7. mysql_select_db($dbname);
    8. //Inhalte laden
    9. $query_ort2 = "select aufnahmeort2ID, aufnahmeort2 from aufnahmeort2 where aufnahmeort1F = $_GET[s] order by aufnahmeort2";
    10. $result_ort2 = mysql_query($query_ort2);
    11. ?>
    12. <select name="search_aufnahmeort2" class="select210">
    13. <option value="0" selected>alle Aufnahmeorte</option>
    14. <?
    15. while($row = mysql_fetch_object($result_ort2))
    16. {
    17. $ort2 = str_replace("ä", "&auml;", $row->aufnahmeort2);
    18. $ort2 = str_replace("ö", "&ouml;", $ort2);
    19. $ort2 = str_replace("ü", "&uuml;", $ort2);
    20. echo '<option value="'.$row->aufnahmeort2ID.'">'.$ort2.'</option>';
    21. }
    22. ?>
    23. </select>
    Alles anzeigen


    im internet explorer funktioniert's nach den änderungen immer noch einwandfrei, im firefox bleibt die variable $_POST["search_aufnahmeort2"] leer...

    falls du dir das nochmals anschauen könntest, wär das genial!
    lg, michèle
  • vorweg

    search_ajax_ort.php -> #10 ($query_ort2)
    bitte änder das mal in

    Quellcode

    1. $query_ort2 = "select aufnahmeort2ID, aufnahmeort2 from aufnahmeort2 where aufnahmeort1F = ".mysql_escape_string($_GET[s])." order by aufnahmeort2";


    Ist das wirklich alles an code?
    Ich verstehe nicht, wo du die variablennamen layer1, layer2 her hast.
    Öffne doch mal mit extras > Fehler Konsole (oder auch Debugger) den Fehlerlog und teile uns die genaue Fehlermeldung mit - die sind meistens recht aussagekräftig.

    Wo hast du überhaupt die $_POST["search_aufnahmeort2"] ? die search_ajax_ort.php wird mit GET beliefert. Und wenn du das Formular submittest, dann schickt es ja nur an index.php - hat also gar nichts mit AJAX zu tun...2
  • hi d0nUt

    ich hab's! :D nachdem ich nun stundenlang das original-script mit meinem code verglichen und ausprobiert hab, hab ich bemerkt, dass es ein einfaches html-problem war... ich hatte den form-tag innerhalb eines table-tags. :oops: menno... das hatten wir hier im forum doch schon mal. genau das selbe problem. ich hab's gelesen und bei mir eigentlich gecheckt, aber ich hatte diesen table-tag übersehen, weil der in nem include drin ist. naja. eben :oops:

    noch kurz zu deinen fragen:
    nein, war natürlich nicht alles an code. das ist ein riesen formular, das konnte ich ja nicht gut als ganzes hier posten. die variablen layer1, layer2, etc. werden in einem anderen formular-bereich verwendet, den ich hier nicht gepostet hatte.

    und im formular hab ich ein hidden feld namens status. wenn das formular abgeschickt wird, erhält die variable status den wert 3 und wird im index.php per if-schleife und include an meine form-check-datei weitergeleitet.

    das mit dem mysql_escape_string hab ich übrigens eingefügt. dann krieg ich in meinem formular aber die folgende warnung:
    Notice: Use of undefined constant s - assumed 's' in D:\Web\web\Bilderdatenbank\includes\search_ajax_ort.php on line 11

    ohne funktioniert jetzt aber alles wunderbar.

    also nochmals danke!
    lg, michele