ebody: jQuery Ajax - PHP Script enthält mehrere echos, soll aber nur das letzte echo zurückgeben

Hallo,

ich möchte mit Ajax Werte aus einem PHP Script abrufen. Das PHP Script enthält zu Testzwecken mehrer echo... Angaben. Am Ende des PHP Scripts erstelle ich ein Array, welches die Variablen enthält und zurückliefern soll.

Da ich im jQuery Script dataType: 'json' angebe, kommt es zu einem Fehler und wenn ich mich nicht täusche, liegt das an den echos im PHP Script, da diese kein json Format haben.

Wie kann man nur das letzte echo als relevant festlegen?

jQuery:

$(document).ready(function() {

	var loadScript = function (url, callback) {
		$.ajax({
			type: "GET",
			url: url,
			dataType: 'json',
			success: callback		
		})
		  .done(function() {
			console.log( "success" );
		  })
		  .fail(function() {
			console.log( "error" );
		  })
		  .always(function() {
			console.log( "complete" );
		  });	
	}

	loadScript('ajax-nur-ein-echo.php', function(data){
		console.log( "loadScript", data);
	});				

});

PHP - ajax-nur-ein-echo.php:

echo "Das gehört nur zum PHP Script";
echo "Das auch";

$hallo = "hallo";
$welt = "welt";

$phpResponse = array(
	"hallo" => $hallo,
	"welt" => $welt
 );
 
echo json_encode($phpResponse);

akzeptierte Antworten

  1. Tach!

    Wie kann man nur das letzte echo als relevant festlegen?

    Sowas gibt es nicht. Ausgegeben ist ausgegeben. Wenn du etwas nicht in der Ausgabe haben möchtest, schreib es nicht dort hin. Debug-Informationen kann man in eine Log-Datei schreiben. Mit dem Outputbuffer kann man auch Ausgaben abfangen. Aber das ist dann auch nicht sonderlich sinnvoll, wenn man sie erst erzeugt und dann wegwirft.

    dedlfix.

  2. Wenn ich den Fall habe, dass ich mit dem selben Skript einmal die Webseite und einmal nur JSON-Daten ausliefern will, dann mach ich das in etwa so:

     	loadScript('ajax-nur-ein-echo.php?api=1', function(data){
      		console.log( "loadScript", data);
      });
    
    if ( ( ! isset( $_GET['api'] ) ) or $_GET['api'] != 1 ) {
        header( 'Content-Type: text/html; charset=utf-8' );
        echo "Das gehört nur zum HTML-Output";
        echo "Das auch";
    } else {
        header( 'Content-Type: application/json; charset=utf-8' );
    }
    
    
    $hallo = "hallo";
    $welt = "welt";
    
    $phpResponse = array(
    	"hallo" => $hallo,
    	"welt" => $welt
    );
    echo json_encode( $phpResponse );
    
    1. Reden wir hier etwa über Kontrollstrukturen? Da kannste auch die header mit einbeziehen, zur Unterscheidung ob für einen ajaxrequest nur Daten gesendet werden sollen oder für einen legacy Request eine ganze HTML Seite. Also der ajaxrequest setzt einen speziellen header.

      Und clientseitig bitte auch den Response Status mit ins Boot nehmen. Falls nämlich serverseitig eine Exception fliegt, kommt da auch kein JSON. MfG

  3. Warum mehrere echo Anweisungen, echo kann Listenkontext. MfG

  4. Hallo ebody,

    ich habe mir in solchen Fällen auch schon mal so beholfen (weil mir das serverseitige Log fehlte). Es ist aber ein BEHELF, ein Serverlog ist besser.

    class Log {
        public static $Zeilen = [];
        public static function Write($l) {
            self::$Zeilen[] = $l;
            // echo "$l<br>";
        }
    }
    
    Log.Write("Hello my dear loggi!");
    
    $phpResponse = array(
    	"hallo" => $hallo,
    	"welt" => $welt
     );
    
    $phpResponse["_DEBUG"] = Log::$Zeilen;
    
    echo json_encode($phpResponse);
    

    D.h. die Debug-Infos in einem Array sammeln und als Attribut ans Json-Objekt kleben. Das setzt natürlich voraus, dass die technische Übertragung soweit funktioniert. Wenn serverseitig irgendwas crasht, so dass gar kein JSON zurückkommt, kannst Du immer noch die Echo-Zeile in der Write-Methode entkommentieren und die URL im Browser aufrufen (bzw. im Netzwerktrace des Browsers gucken was zurückkommt, wenn Du einen POST Request brauchst).

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo,

      vielen Dank an alle. Die Helfer Funktionen werde ich mir merken.

      Gruß ebody