Serverseitiges Error-Management für Ajax

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Serverseitiges Error-Management für Ajax

    Guten morgen zusammen.

    Nach längerer Zeit brauche ich mal wieder ein paar Tips von euch, nachdem ewige Recherchen im Internet mehr bzw. weniger erfolgreich waren. Es geht um die Frage, ob und wie man mit Serverseitigen Fehlern umgehen kann, wenn man mit AJAX arbeitet.

    Beispiel:
    Bisher haben meine Scripte die häufigsten Fehlerfälle aufgefangen und entsprechende Meldungen für den Benutzer ausgegeben:

    PHP-Code:
    $dbCon db_connect();
    if(
    $dbCon) {
      
    $id intval($_GET['id']);
      
    $dbRes db_execute('SELECT * FROM tabelle WHERE id='.$id);

      if(
    $dbRes && mysql_num_rows($dbRes) != 0) {
        
    $myObject = Array();
        
    $myObject = [...] usw. [...]
      } else {
        
    $errorMsg "Kein Datensatz gefunden!";
      }
    } else {
      
    $errorMsg "Datenbankverbindung nicht hergestellt!";

    Fazit:
    ENTWEDER gibt das Script das Ergebnis der Abfrage zurück, ODER eine Fehlermeldung.

    Und genau dieses "ODER" im vorherigen Satz macht mir jetzt Probleme. Ich baue mir das Script mal so um, das es mir die Daten JavaScript lesbar aufbereitet (ich nehme hier mal JSON, um das Format geht es hier ja nicht!).

    PHP-Code:
    $dbCon db_connect();
    if(
    $dbCon) {
      
    $id intval($_GET['id']);
      
    $dbRes db_execute('SELECT * FROM tabelle WHERE id='.$id);

      if(
    $dbRes && mysql_num_rows($dbRes) != 0) {
        
    $myObject = Array();
        
    $myObject = [...] usw. [...]
      } else {
        
    $errorMsg "Kein Datensatz gefunden!";
      }
    } else {
      
    $errorMsg "Datenbankverbindung nicht hergestellt!";
    }

    if(
    $errorMsg != '') {
      echo 
    $myJson->encode($errorMsg);
    } else {
      echo 
    $myJson->encode($myObject);

    Problem:
    Das Problem ist nun, dass die JavaScript Funktion, die die AJAX Anfrage stellt, nicht weiß, ob ein Fehler oder ein Ergebnis zurück geliefert wird!

    PHP-Code:
    new Ajax.Request(test.php, {
      
    method:'get',
      
    onSuccess:  function(req) {
        var 
    dat req.responseText.evalJSON();
        [...] 
    verarbeiten der daten ODER anzeigen des fehlers [...]
      }
    }); 
    Denn entweder enthält die JavaScript Variable "dat" ein komplexes Objekt mit Daten aus der Datenbank ODER einen einfachen String mit der Fehlermeldung. Ich habe es in tausend verschiedenen Versuchen nicht geschafft, zu prüfen, wann was zurück kommt um im JavaScript entsprechend darauf zu reagieren!

    Fragen:
    1. Ist der Ansatz den ich hier umsetzen möchte überhaupt sinnvoll?
    2. Gibt es andere Möglichkeiten, soetwas vielleicht viel eleganter zu lösen?
    3. Eigentlich hatte ich vor, nach dem einfachen Error-Management noch einen Schritt weiter zu gehen und JEDEM Ergebnis, welches vom Server-Script zurück kommt, einen Status zu verpassen (OK oder Fehler). Nach dem Prinzip:
      {"errorState":true,"errorMessage":"Kein Datensatz gefunden!"}null
      ODER
      {"errorState":false,"errorMessage":null} [...] hier das Objekt mit Daten [...]


    Schon mal vielen Dank für eure Antworten.
    GLORIA PERPETUA

  • #2
    Warum setzt du 3 nicht einfach um? Dann ist das Problem doch gelöst...


    Ansonsten suche er nach typeof, damit geht z.B. sowas
    Code:
    if( typeof this.img == 'undefined' ) return;

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Original geschrieben von ghostgambler
      Warum setzt du 3 nicht einfach um? Dann ist das Problem doch gelöst...
      Habe ich ja auch gemacht, aber irgendwie hat es nicht geklappt. Und zwar aus folgendem Grund: angenommen die Datenbank-Abfrage liefert ein gültiges Ergebnis zurück und ich bekomme von JSON ein 2-dimensionales Array:

      PHP-Code:
      while($row mysql_fetch_object($result)) {
        
      $myObject[$i]['id'] = $row->id;
        
      $myObject[$i]['class'] = $row->classcode;
        
      $myObject[$i]['name'] = $row->name;
        
      $i++;
      }
      echo 
      $myJson->encode($myObject); 
      Der Javascript wertet das Array nun aus:
      PHP-Code:
      var thisData thisRequest.responseText.evalJSON();
      for(
      i=0thisData.lengthi++) {
        $(
      'classes').options[i] = new Option(thisData[i]['class']+' - '+thisData[i]['name'], thisData[i]['id']);

      Soweit funktioniert das noch alles, denn NOCH haben wir die Status-Meldungen nicht dabei. Geben wir die nun zusätzlich aus:
      PHP-Code:
      echo $myJson->encode(array('errorState' => $errorStt);
      echo 
      $myJson->encode(array('errorMessage' => $errorMsg);
      echo 
      $myJson->encode($myObject); 
      Das funktioniert nun nicht mehr, da die Schleife den ganzen JSON String nicht mehr als sauberes Array erkennt. Ich habe schon versucht mit Substr o.ä. irgendwie den Anfang vom JSON String zu entfernen und gesondert auszuwerten, aber genau das hat alles nicht geklappt...
      Ich kann mir vorstellen, das ich irgendwo nur einen blöden Denkfehler drin habe, aber ich komme nicht drauf.
      GLORIA PERPETUA

      Kommentar


      • #4
        Wieso packst du auch mehrere Objekte in eine Rückgabe?
        Mach ein Objekt "Response" und die Fehler-Klassen sind nur Attribute davon, dann alles zusammen encoden, ab zum Browser und im Browser das komplette EINE Objekt wieder aufrufen.
        Wenn dann
        Code:
        response.errors.length != 0
        dann gab es einen Fehler, den man dann mit
        Code:
        response.errors.each(function (s) {document.write(s.value);});
        ausgeben kann (sofern man script.aculo.us verwendet~)

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Au wie dämlich, das wars! O_o
          Die response Daten sind bei mir schon teilweise große Objekte, bin irgendwie nicht drauf gekommen, die nochmal zusätzlich in ein weiteres Objekt zu packen mit den Fehlereigenschaften wie du es sagtest...
          Manchmal ist man so eingefahren in irgendwelche Tutorials, echt unglaublich. Klappt jetzt wunderbar, vielen tausend Dank
          GLORIA PERPETUA

          Kommentar

          Lädt...
          X