der henry: mein erstes PHP cgi-Script

Hallo,

ich habe jetzt versucht ein erstes "Probescript" mit JS-fetch und PHP zu testen. Damit die gesendeten Daten nicht sichtbar in der Adresszeile stehen, sende ich mit post.

JS fetch sendet ein json an das php-cgi-script und diese sendet das gleiche wieder an JS zurück.

Fehler im catch: There was an error SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

const data = await response.json();
async function refreshData()
{
let meinObjekt = {
  "name": "Max Mustermann",
  "alter": 30,
  "istAktiv": true,
  "hobbies": ["Lesen", "Programmieren", "Wandern"]
};
	
	try
	{
		const response = await fetch("loadvalue.php",
		{
			method: 'POST',
			header: 'Content-Type: application/json; charset=UTF-8',
			body: JSON.stringify(meinObjekt),
		});
      
		if (response.ok) {
		const data = await response.json();
		
		console.log(data.name);
		}
	}
	catch (error)
	{
		// TypeError: Failed to fetch
		console.log('There was an error', error);
	} 
} 

PHP: loadvalue.php

#!/usr/bin/php-cgi
<?php
$json_string = file_get_contents('php://input');
$data = json_decode($json_string, true);

	
	// caching verhindern
	header('Cache-Control: no-cache');
	header("Expires: 0");
	header('Pragma: no-cache'); 

    
//header("ETag: \"" . (new DateTimeImmutable())->format('c') . "\"");
	header('Content-Type: application/json; charset=UTF-8');
	echo json_encode($data);

Hier komme ich leider nicht weiter, bzw. sehe das Problem nicht 🤔

Vielen Dank !!

  1. Hallo,

    nur um sicher zu gehen: ich hoffe, Du hast bei php-Skript lediglich vergessen, hier das Ende zu schreiben - oder fehlt es wirklich?

    Ein PHP fängt an mit <?php und endet mit ?>. Letzteres sehe ich in Deinem Text nicht - und so etwas könnte ein Problem machen, da dann php einfach aussteigt und gar nichts zurück gibt - also Fehler in Zeile 1 Spalte 1 (eben nichts)

    Viel Erfolg,

    Hans

    1. Hallo Hans und vielen Dank für den Tipp,

      ja es ist nur ein Teil vom Script. Das Ende des SCriptes sieht nachfolgende aus.

      echo json_encode($data);
      
      exit;
      
      x.y
      
      ?>
      

      ... und es wird ja etwas an JS zurück geschickt, sonst würde der "Parsfehler" in Zeile const data = await response.json(); nicht kommen.

      Danke !!

      1. Lieber Henry,

        Hallo Hans und vielen Dank für den Tipp,

        das war leider kein Tipp, sondern ein Vorschlag zur Verschlimmbesserung. Haben aber andere längst angemerkt.

        Das Ende des SCriptes sieht nachfolgende aus.

        echo json_encode($data);
        
        exit;
        
        x.y
        
        ?>
        

        Damit sollte das x.y einen Parserfehler in PHP werfen, da es sich um einen Syntaxfehler handelt - kein Semikolon am Ende des Ausdrucks!

        Wenn ohnehin exit; die letzte Anweisung in Deinem PHP-Script ist, kannst Du diese ebenso weg lassen, wie den ganzen anderen Rest.

        ... und es wird ja etwas an JS zurück geschickt, sonst würde der "Parsfehler" in Zeile const data = await response.json(); nicht kommen.

        Damit ist klar, dass beim Browser keine JSON-Daten ankommen, zumindest kann er die Response nicht zu JSON parsen. Liegt das an Deiner Shebang-Zeile, die den JSON-Daten vorausgehen?

        Liebe Grüße

        Felix Riesterer

    2. Hallo

      nur um sicher zu gehen: ich hoffe, Du hast bei php-Skript lediglich vergessen, hier das Ende zu schreiben - oder fehlt es wirklich?

      Ein PHP fängt an mit <?php und endet mit ?>. Letzteres sehe ich in Deinem Text nicht - und so etwas könnte ein Problem machen, da dann php einfach aussteigt und gar nichts zurück gibt - also Fehler in Zeile 1 Spalte 1 (eben nichts)

      Nein, das ist eine falsche Information. Gerade, wenn wie im vorliegenden Fall eine generierte Ausgabe erfolgt, wird empfohlen, das schließende ?> wegzulassen, damirt nicht dahinter aus Versehen eine weitere Ausgabe (zum Beispiel ein Leerzeichen oder ein Zeilenumbruch) folgt, die die vom Skript generierte Ausgabe kaputt macht.

      Tschö, Auge

      --
      „Habe ich mir das nur eingebildet, oder kann der kleine Hund wirklich sprechen?“ fragte Schnapper. „Er behauptet, nicht dazu imstande zu sein“ erwiderte Victor. Schnapper zögerte (…) „Nun …“ sagte er schließlich, „ich schätze, er muss es am besten wissen.“ Terry Prattchett, Voll im Bilde
  2. Hallo

    ich habe jetzt versucht ein erstes "Probescript" mit JS-fetch und PHP zu testen. Damit die gesendeten Daten nicht sichtbar in der Adresszeile stehen, sende ich mit post.

    Du sendest die Anfrage aus einem Browser heraus?

    JS fetch sendet ein json an das php-cgi-script und diese sendet das gleiche wieder an JS zurück.

    Fehler im catch: There was an error SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

    PHP: loadvalue.php

    #!/usr/bin/php-cgi
    <?php
    /* … */
    

    Wenn deine Anfrage aus dem Browser erfolgt, wird sie per HTTP an den Webserver gesendet. Soweit ich weiß, ist deine Zeile #!/usr/bin/php-cgi aber nur für den Aufruf von PHP-Skripten über die Shell gedacht. Wenn ich nicht irre, muss die Zeile weg.

    <?php
    /* … */
    

    Tschö, Auge

    --
    „Habe ich mir das nur eingebildet, oder kann der kleine Hund wirklich sprechen?“ fragte Schnapper. „Er behauptet, nicht dazu imstande zu sein“ erwiderte Victor. Schnapper zögerte (…) „Nun …“ sagte er schließlich, „ich schätze, er muss es am besten wissen.“ Terry Prattchett, Voll im Bilde
    1. Hallo Auge,

      Du sendest die Anfrage aus einem Browser heraus?

      Sehr wahrscheinlich. Und das bedeutet, dass die Shebang-Zeile 1:1 in die Response geschrieben wird, noch bevor die Header gesetzt werden. Aber das hatte eigentlich schon jemand geschrieben, dass das in ein PHP Script für's Web nicht reingehört.

      Dass die Shebang-Zeile ausgegeben wird, löst einen Folgefehler aus: Das Script hat eine Ausgabe gemacht. Damit sendet PHP alle HTTP Header zum Browser und akzeptiert keine Aufrufe von header() mehr. D.h. im Output steht sicherlich auch noch die Meldung "Headers already sent" drin.

      Henry,

      in solchen Fällen ist es hilfreich, mit den Entwickler-Tools des Browsers zu schauen, was genau aus dem WebRequest zurückgekommen ist.

      Hatten wir die Frage, wie bei Dir PHP an den Webserver angeschlossen ist, eigentlich geklärt?

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hallo,

        die Shebang-Zeile wurde tatsächlich an den Browser übertragen, ich habe diese Zeile jetzt gelöscht, ein „Beispiel json“ übertragen und mittels Boardwerkzeug vom Firefox überprüft, soweit OK.

        Somit liegt es vermutlich noch an der Erstellung/Zusammenstellung des sql-Daten-Return in json. (siehe anderer tread im Forum)

        @Rolf:

        Hatten wir die Frage, wie bei Dir PHP an den Webserver angeschlossen ist, eigentlich geklärt?

        Was meinst du damit ???

        Danke !!!

        1. Hallo Henry,

          Was meinst du damit ???

          Das hier. Aber ich denke, das betraf letztlich dein Szenario nicht und ich habe da was verwechselt.

          Da war von PHP und CGI die Rede und da kam auch der Shebang vor.

          Ich kann mir Szenarien vorstellen, wo man ein PHP-Programm vom Apache wie ein Shell-Script startet und die Ausgabe zum Browser schicken lässt, so als ob man ein Bash-Script als CGI verwendet. Nicht, dass dieses Szenario auch nur ansatzweise erstrebenswert wäre. Aber da und nur da wäre ein Shebang in PHP denkbar. In $$(100 - 10^{-99})\% $$ der Fälle ist es Unsinn.

          Rolf

          --
          sumpsi - posui - obstruxi