1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

XMLHttpRequest

Dieses Thema im Forum "Javascript & Ajax" wurde erstellt von Umbriell, 27. Dezember 2016.

  1. Umbriell

    Umbriell Mitglied

    Hi,


    ich versuche leider vergebens per javascript Daten über PHP aus einer Datenbank zu holen.

    Im JS steht folgendes:

    Code (Javascript):
    1. function getmess(id) {
    2.     var message = 'Nichts gefunden';    
    3.     var request = new XMLHttpRequest();
    4.     request.open('post', 'mess.php', true);
    5.     request.setRequestHeader('Content-Type', 'application/x-www-formurlencoded');
    6.     request.send('id='+id);
    7.     request.onreadystatechange = function() {
    8.          message=request.responseText;
    9.     }
    10.     return message;
    11. }
    Den Inhalt wollte ich mir an anderer Stelle so ausgeben lassen:
    Code (Javascript):
    1. document.getElementById('messagein').value= getmess(id);
    Die id kann ich mir ausgeben lassen und die Ausgabe stimmt auch mit dem Erwarteten überein.

    In der PHP Datei steht folgender Code:
    Code (PHP):
    1. <?php
    2. include 'connect.php';
    3. if(isset($_POST['id'])){
    4.    $id = $_POST['id'];
    5.    $return = 'Keine Nachricht gefunden';
    6.    
    7.    $query = "SELECT * FROM messages WHERE id = $id";
    8.         $result = mysqli_query($con, $query);
    9.         if($row = mysqli_fetch_assoc($result)){
    10.             $return = $row['message'];
    11.         }
    12. }
    13.    echo $return;
    14. ?>
    Ich habe leider keine Ahnung wieso es keine Ausgabe gibt. Schreibe ich im JS statt 'return message' 'return 'Hallo Welt' wird der Wert ausgegeben. Es passt also irgendwas mit der Abfrage nicht. Kann jemand den/die Fehler entdecken?

    Besten Dank im Voraus!

    VG
    Umbriell
     
  2. SpiceLab

    SpiceLab ZENmechanic Premium-User

    Ein Versuch ist es wert...

    Wie verhält es sich anstelle von
    Code (Javascript):
    1. document.getElementById('messagein').value = getmess(id);
    mit
    Code (Javascript):
    1. document.getElementById('messagein').innerHTML = getmess(id);
     
  3. Umbriell

    Umbriell Mitglied

    Hi,

    besten Dank für die Antwort. Leider ändert sich am Ergebnis nichts.
    Ich habe das Problem oben nicht richtig beschrieben, wie mir gerade auffällt. Die Ausgabe lautet "Nichts gefunden", wie bei der Deklarierung der Variabel vorgegeben. Die Frage muss also sein, wieso der Wert der Variabel nicht verändert wird. Die ID ist korrekt und auch in der DB vorhanden. Sorry für die unkonkreten Angaben.

    VG
    Umbriell
     
  4. SpiceLab

    SpiceLab ZENmechanic Premium-User

  5. Sempervivum

    Sempervivum Erfahrenes Mitglied

    Ajax arbeitet asynchron, d. h. der Request wird an den Server gesendet und später trifft die Antwort ein und der Handler für onreadystatechange wird aufgerufen. D. h. in deiner Funktion getmess() ist message noch nicht verfügbar. Du musst alle Aktivitäten, die die Antwort vom Server brauchen, im Handler für onreadystatechange durchführen:
    Code (Text):
    1. function getmess(id) {
    2.     var message = 'Nichts gefunden';  
    3.     var request = new XMLHttpRequest();
    4.     request.open('post', 'mess.php', true);
    5.     request.setRequestHeader('Content-Type', 'application/x-www-formurlencoded');
    6.     request.send('id='+id);
    7.     request.onreadystatechange = function() {
    8.          message=request.responseText;
    9.          document.getElementById('messagein').value= message;
    10.     }
    11.     return message;
    12. }
     
  6. Umbriell

    Umbriell Mitglied

    Hi,

    besten Dank für die Antworten.
    Das die Antwort abgewartet werden muss, bevor sie ausgegeben kann habe ich eingesehen. Danke für den Tipp. Es klappt jetzt soweit, dass sich die Variabel durch den PHP-Teil ändert.
    Scheinbar stimmt aber mit dem "POST" noch was nicht. Im PHP-Teil wird die IF-Abfrage "if(isset($_POST['id']))" als false behandelt. Bei einem Test ist er in den else-Teil gesprungen.

    Hat noch jemand einen Tip was da noch falsch ist?

    Besten Dank im Voraus!

    VG
    Umbriell
     
    Zuletzt bearbeitet: 27. Dezember 2016
  7. Sempervivum

    Sempervivum Erfahrenes Mitglied

    Habe mal dies ergooglet:
    http://stackoverflow.com/questions/9713058/send-post-data-using-xmlhttprequest
    und das setRequestHeader entspr. geändert:
    Code (Text):
    1.  
    2.            var message = 'Nichts gefunden';
    3.            var request = new XMLHttpRequest();
    4.            request.open('post', 'testpost.php', true);
    5.            var params = "name=xxx";
    6.            request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    7.            request.onreadystatechange = function () {
    8.                if(request.readyState == 4 && request.status == 200) {
    9.                    message = request.responseText;
    10.                    console.log(message);
    11.                }
    12.            }
    13.            request.send(params);
    Damit erkennt er offenbar die POST-Parameter. Ich würde dir empfehlen, lieber jQuery für Ajax zu verwenden, damit ist das Handling viel einfacher und übersichtlicher.
     
    Zuletzt bearbeitet: 27. Dezember 2016
  8. Umbriell

    Umbriell Mitglied

    Hi,

    besten Dank. Ich habe Deinen code übernommen und angepasst:

    Code (Javascript):
    1.             var message = 'Nichts gefunden';
    2.             var request = new XMLHttpRequest();
    3.             request.open('post', 'mess.php', true);
    4.             var params = "id="+id;
    5.             request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    6.             request.onreadystatechange = function () {
    7.                 message = request.responseText;
    8.                 document.getElementById('messagein').value= message;
    9.             }
    10.             request.send(params);
    So läuft es jetzt ohne Warn- oder Fehlermeldungen.

    Mit jQuery habe ich mich bisher kaum beschäftigt. Das muss ich dann nachholen, wenn die Grundlagen bei mir vorhanden sind und ich ein gewisses Maß an Verständnis für das ganze entwickelt habe.

    Jetzt muss ich erstmal schauen, warum es jetzt geht und mit dem "alten" Code nicht.
    Nochmals vielen Dank für Deine Hilfe.

    VG
    Umbriell
     
  9. Sempervivum

    Sempervivum Erfahrenes Mitglied

    Der entscheidende Fehler war, dass ein "-" in dem Parameter für setRequestHeader fehlte:
    Vorher: "application/x-www-formurlencoded"
    Nachher: "application/x-www-form-urlencoded"
     
  10. Sempervivum

    Sempervivum Erfahrenes Mitglied

    Ich empfehle, dieses:
    Code (Text):
    1. if(request.readyState == 4 && request.status == 200)
    beizubehalten, weil der Callback ein paar Mal triggert, wenn noch keine Antwort vorhanden ist.
     
  11. Umbriell

    Umbriell Mitglied

    Hi Sempervivum,

    nun ist es klar. Besten Dank!
    Die Abfrage nach dem Status habe ich wieder eingebaut. Danke für den Tip!!

    VG
    Umbriell
     
  12. Umbriell

    Umbriell Mitglied

    Hi,

    leider ist jetzt noch ein Problem aufgetreten. Ich erstelle in der PHP-Datei jetzt ein XML-Object mit verschiedenen Angaben. Das klappt auch soweit.
    Nur wenn das Object per
    Code (PHP):
    1.  echo $dom
    ausgegeben werden soll, kommt die Fehlermeldung "<b>Catchable fatal error</b>: Object of class DOMDocument could not be converted to string in <b>D:\xxamp\htdocs\fpww\mess.php</b> on line <b>32</b", was inhaltlich ja auch nachvollziehbar ist. DIe Frage ist jetzt, wie man das XML-Object an den XMLHttpRequest übergibt.

    Vielen Dank im Voraus!

    VG
    Umbriell[/code]
     
  13. Sempervivum

    Sempervivum Erfahrenes Mitglied

  14. Umbriell

    Umbriell Mitglied

    Hallo,

    danke für den Tip. Ich habe auch schon überlegt die Werte in einen string zu packen mit einem \ getrennt und dann anschließend in Javascript wieder zu splitten.
    Das sollte zwar funktionieren, es gibt aber doch die Möglichkeit, statt 'responseText' 'responseXML' zu nehmen. Daraus sollte man schließen können, dass die Verarbeitung von XML-Objecten vorgesehen ist. Leider bekomme ich das so nicht ans Laufen, was immer etwas an mir frißt.
    Aber ich denke, ich werde es mit dem string erstmal versuchen, bis mir die Erleuchtung kommt.

    Vielen Dank für Deine Hilfe!

    VG
    Umbriell
     
  15. Sempervivum

    Sempervivum Erfahrenes Mitglied

    Wenn es dir nur darum geht, verschiedene Werte zu übertragen, würde ich sie in ein assozitatives Array packen, dieses mit JSON kodieren und auf dem Client wieder auszupacken.
     
  16. Umbriell

    Umbriell Mitglied

    Hi,

    werde ich mal testen. Das Problem ist aber, dass ich mit JSON noch gar nichts gemacht habe. Da muss ich mich dann auch erstmal wieder einlesen.

    VG
    Umbriell
     
  17. Sempervivum

    Sempervivum Erfahrenes Mitglied

    Das Kodieren und Dekodieren von und nach JSON ist aber jeweils nur eine einzige, einfache Zeile:
    PHP:
    1.     $arr = [];
    2.     $arr["name1"] = 1;
    3.     $arr["name2"] = 2;
    4.     $arr["name3"] = 3;
    5.     echo json_encode($arr);
    Code (Javascript):
    1.             request.onreadystatechange = function () {
    2.                 if (request.readyState == 4 && request.status == 200) {
    3.                     message = request.responseText;
    4.                     values = JSON.parse(message);
    5.                     v1 = values.name1;
    6.                     console.log(v1);
    7.                 }
    8.             }
     
    Umbriell gefällt das.
  18. Umbriell

    Umbriell Mitglied

    Hi,

    jo, das sieht ja mal einfach aus.
    Besten Dank für die Hilfe!

    VG
    Umbriell
     
Die Seite wird geladen...