ebody: Daten von PHP simplexml_load_file() mit JQuery "empfangen"

Hallo,

ich habe bisher eine XML Datei mit JQuery eingelesen und die Daten weiterverarbeitet.

$.get("file.xml", function(data){...
$(data).find("books").each(function(index, value){
...
}
} 

Jetzt möchte ich die XML Datei in einem PHP Script auslesen und dann mit JQuery die Daten empfangen und weiterverarbeiten. Das bisher genutzte JQuery Script möchte ich, wenn möglich zum größten Teil weiter nutzen.

Daher geht es in erster Linie darum, wie ich die XML Daten / Datei "empfangen" kann und den Inhalt mit dem alten Script weiterverarbeiten kann.

// PHP Script
$xml=simplexml_load_file("file.xml") or die("Error: Cannot create object");
var_dump($xml);
// JQuery Script
		var myObj;
		
		$.ajax({
			url      : 'ajax.php',
			type     : 'post',
			async: false,
			//dataType: 'text',
			success  : function(Result){
					myObj = Result;
					console.dir(myObj);
				}
			}
		  );

$(myObj).find("books").each(function(index, value){
...
}

Mit diesem Script console.dir(myObj); zeigt mir die WebDev Console von Chrome den Inhalt der XML Datei an. Aber wenn ich jetzt mit JQuery auf myObj zugreifen möchte funktioniert das nicht, weil myObj ein String ist und kein Object (vermute ich zumindest).

dataType: 'xml' habe ich mal probiert, hat aber nicht funktioniert.

1. Kann ich in JQuery myObj in ein Object umwandeln oder ähnliches, so dass ich den Inhalt auslesen kann?

2. Oder müsste ich das PHP Script anpassen und die Daten in einer anderen Form ausgeben, z.B. $xml mit einer Schleife auslesen und ein Array erstellen?

Gruß ebody

  1. Für den wahlfreien Zugriff in JS brauchst Du ein Objekt. Du kriegst ein solches serverseitig mit PHP, das muß nur entsprechend serialisiert werden zur Übertragung per HTTP. Dafür gibt es verschiedene Möglichkeiten. XML und JSON sind 2 davon. MfG

  2. Hallo

    du musst dein Script dazu bringen, die Daten als XML auszuliefern.

    Nur, was willst du damit erreichen, wenn du die XML- Datei durch ein php-Script schickst? Geht es um die Downloadsperre?

    Gruß
    Jürgen

    1. Hi,

      der Hintergrund ist, dass ich vermeiden möchte die URL der XML Datei zu zeigen. Als ich es nur mit JQuery gemacht habe, musste ich im Script die URL angeben. Man konnte die Datei und deren Inhalt also ganz einfach finden und kopieren. Mit PHP kann ich das vermeiden oder zumindest schwieriger gestalten.

      Gruß ebody

      1. Hallo ebody,

        Was gewinnst du damit? Man kann die PHP URL doch genauso gut aufrufen.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo Rolf,

          ja stimmt, das habe ich irgendwie völlig übersehen 😟

          Mhh, wenn ich aber getallheaders(); im PHP Script verwende und das Script nur ausführe, wenn der Referer der URL der HTML Seite mit dem JQuery Script entspricht, welches die Daten vom PHP Script anfordert?! Oder könnte man das auch leicht "austricksen"?

          Funktioniert Ajax eigentlich nur, wenn man in PHP den Inhalt mit echo oder anderen Befehlen (print_r u.a.) ausgibt oder gibt es auch eine Möglichkeit, den Inhalt einfach in einer PHP Variable zu speichern und erhält im JQuery Script trotzdem den Inhalt?

          So ähnlich:

          // PHP Script
          $xml=simplexml_load_file("file.xml") or die("Error: Cannot create object");
          
          // JQuery Script
          		var myObj;
          		
          		$.ajax({
          			url      : 'ajax.php',
          			type     : 'post',
          			async: false,
          			//dataType: 'text',
          			success  : function(Result){
          					myObj = Result;
          					console.dir(myObj);
          				}
          			}
          		  );
          
          $(myObj).find("books").each(function(index, value){
          ...
          }
          

          Gruß ebody

          1. hi

            ja stimmt, das habe ich irgendwie völlig übersehen 😟

            Mhh, wenn ich aber getallheaders(); im PHP Script verwende und das Script nur ausführe, wenn der Referer der URL der HTML Seite mit dem JQuery Script entspricht, welches die Daten vom PHP Script anfordert?! Oder könnte man das auch leicht "austricksen"?

            Außer Referrer kannst Du beliebige Custom-Header senden und serverseitig prüfen:

            xhr.setRequestHeader('x-load','1'),
            daraus wird in der Serverumgebung:
            HTTP_X_LOAD
            

            Dann mach nicht ein GET auf den URL welcher die Datei ausliefert, sondern ein POST oder ein PUT, vielleicht sogar ein DELETE oder ein PATCH und mach den Request auf denselben URL wie Deine Anwendung.

            Und wenn Du mit FetchAPI arbeitest, kannst Du auch die Requestmethode frei benennen, z.B. APFEL oder ZITRONE.

            Dann ist der Gegner komplett verwirrt 😉

            Und ja, ich habe das getestet, es funktioniert tatsächlich.

            MfG

            PS: Am Einfachsten, Du schickst die Session-ID mit dem AJAX Request. Die kann man nicht so ohne Weiteres im Vorbeigehen faken.

            1. Moin,

              Mhh, wenn ich aber getallheaders(); im PHP Script verwende und das Script nur ausführe, wenn der Referer der URL der HTML Seite mit dem JQuery Script entspricht, welches die Daten vom PHP Script anfordert?! Oder könnte man das auch leicht "austricksen"?

              Du wirst diesen Transfer ebenfalls im Netzwerk-Tab der Entwickler-Tools sehen können.

              Dann mach nicht ein GET auf den URL welcher die Datei ausliefert, sondern ein POST oder ein PUT, vielleicht sogar ein DELETE oder ein PATCH und mach den Request auf denselben URL wie Deine Anwendung.

              Und wenn Du mit FetchAPI arbeitest, kannst Du auch die Requestmethode frei benennen, z.B. APFEL oder ZITRONE.

              Dann ist der Gegner komplett verwirrt 😉

              Du wirst diesen Transfer ebenfalls im Netzwerk-Tab der Entwickler-Tools sehen können.

              Viele Grüße
              Robert

      2. Hallo,

        so gewinnst du nichts. Dein PHP-Script wird genauso aufgerufen, wie die Originaldatei. Du schriebst ja, das du die Daten im Browser gesehen hast.

        Gruß
        Jürgen