• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

JSON mit Ajax und PHP in eine Datei auf dem Server schreiben.

MeMe

New member
Hallo zusammen,

wie der Titel schon sagt, versuche ich ein JSON Objekt mittels PHP auf dem Server abzulegen.
Ich habe schon so einiges versucht, aber nichts davon hat bis her funktioniert.

Mein aktueller Code sieht so aus:

Javscript

Code:
function writeData() {

var person = {
	name: name,
	geschlecht: gender
	};
	var file = "JSON.php";
	var daten = JSON.stringify(person);
	
	request.open("POST", file, true);
	request.setRequestHeader("Content-type","application/json");
	request.send(daten);
}

PHP sieht bei mir so aus:

PHP:
if(isset($_POST['daten'])) {

$data = $_POST['daten'];

$fname = "Person.txt";
//file_put_contents($fname, $data); schon ausprobiert!

$file = fopen($fname, 'w');
fwrite($file, $data);
fclose($file);
}

PHP läuft und die Schreibrechte sind für die Datei dementsprechend gesetzt.

Kann mir jemand nen kleinen Tipp geben? Vielen Dank...
 
PHP läuft und die Schreibrechte sind für die Datei dementsprechend gesetzt.
Das heißt, die Datei JSON.php existiert bereits?
Was sich hinter request verbirgt kann man nicht erkennen.
Werden die Daten denn zu dem Server geschickt?
Hast du mal kontrolliert, was bei dem Serverscript ankommt? Ich kann aus deinem Code nicht erkennen, das ein POST-Parameter names daten an das Serverscript geschickt wird.
 
Achso,

ja hier noch mal:

Code:
var request = new XMLHttpRequest();

function writeData() {

var person = {
	name: name,
	geschlecht: gender
	};
	var file = "JSON.php";
	var daten = JSON.stringify(person);
	
	request.open("POST", file, true);
	request.setRequestHeader("Content-type","application/json");
	request.send(daten);
}
Und steht in JSON.php
PHP:
if(isset($_POST['daten'])) {

$data = $_POST['daten'];

$fname = "Person.txt";

$file = fopen($fname, 'w');
fwrite($file, $data);
fclose($file);
}

So scheint nichts beim Skript anzukommen. Eigentlich nimmt doch
Code:
if(isset($_POST['daten'])
Code:
request.send(daten)
entgegen. Das ist sicherlich hier die entscheidende Frage. Es klappt aber auch nicht, wenn ich die if - Abfrage komplett weglasse und nur $_POST['daten'] speichere.
 
var request = new XMLHttpRequest(); ist zwar sehr tudimentär, aber das ist ein anderes Thema.

Würdest du deine if-Abfrage entsprechend erweiter, würdest du erkennen, das die POST-Variable daten nicht gesetzt ist:
PHP:
if(isset($_POST['daten'])) {

$data = $_POST['daten'];

$fname = "Person.txt";

$file = fopen($fname, 'w');
fwrite($file, $data);
fclose($file);
} else {
echo "Die Variable 'daten' ist nicht gesetzt !!!"
}

Du solltest dir eigentlich mal ansehen was überhaupt in deinem Serverscript ankommt, bzw. mal im Webbrowser mal anschauen, was dieser an das Serverscript sendet.
 
var request = new XMLHttpRequest(); ist zwar sehr tudimentär, aber das ist ein anderes Thema.

Wie geht es denn besser?

Würdest du deine if-Abfrage entsprechend erweiter, würdest du erkennen, das die POST-Variable daten nicht gesetzt ist:
Ja, genau das ist ja mein Problem. Das Skript macht ja nicht, was es soll. Nur weiß ich halt nicht, warum die POST Anfrage nicht zu funktionieren scheint oder was denn falsch an meinem Code ist.

Ich hatte auch mit unterschiedlichen
Code:
request.setRequestHeader("Content-type", ...);
experimentiert.
 
@MeMe: eine globale Variable ist schon mal prinzipiell eine schlechte Idee. Ein globales XHR ist aber noch doppelt schlecht, da du dir damit gerne mal selbst Netzwerktechnisch in den Fuß schießt.

@miniA4kuser: was aus JSON.stringify() rauskommt sollte man noch durch encodeURIComponent() jagen, da da ja durchaus noch ein "&" oder andere störende Zeichen drin seien können.

PS: @MeMe: dein Code ist echt grausam formatiert...

- - - Aktualisiert - - -

Nachtrag: also Request-Content-Type muss auf jeden Fall "application/x-www-form-urlencoded" eingetragen sein. Denn das ist es, was du versendest und was das PHP erwartet.
 
Hallo @all,

habe den Code verändert, so dass das Request Objekt in einer separaten Funktion erstellt wird. Dann hätte ich noch eine Funktion, die bei readyState == 4 true liefert (wenn ich es denn brauche).
Jedenfalls lag der Fehler anscheinend nicht im Code selbst. Wenn ich die Anwendung mit Firefox starte, dann werden die Formulardaten auch als JSON String in der Datei abgelegt. Es funktioniert mit Safari und Opera jedoch nicht.

...ich kann mir nicht erklären warum.

VG
 
...habe den Code verändert, ... Es funktioniert mit Safari und Opera jedoch nicht.

...ich kann mir nicht erklären warum.
Schön das du deinen Code geändert hast. Ohne jedoch zu wissen wie dein Code jetzt aussieht, wird dir hier wohl keiner eine Antwort geben können.

Wenn das Request Objekt korrekt erstellt wird, dann kann es nicht sein, das es in einem Browser funktioniert und in einem anderen nicht. Hast du dir den Link aus meinem Beitrag #6 mal angeschaut?

PS: Für soetwas eignet sich auch eine Testlink (Testseite)
 
Hallo zusammen,

wenn ich das Dokument über Dreamweaver aufrufe, dann klappt alles... aber nur mit Firefox. Wenn ich es aber direkt vom Server starte, dann klappt es gar nicht. Nicht einmal mit Firefox. Die Fehlerkonsole zeigt nichts an. Sie zeigt auch an, dass die POST Anfrage bzw. "writeData()" anscheinend gar nicht gestartet wird.

Hier mal der Javascript-Code:
Code:
    function requestObjektGet(method, file) {
              var request = new XMLHttpRequest();
              request.open(method, file, true);
              return request;
              } 


              function isReady(ajax) {
                  if(ajax.readyState == 4) {
                    return true;
                  }
              }


             function requestObjektPost(method, file) {

             var request = new XMLHttpRequest();
             request.open(method, file, true);
             request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
             return request;

             } 

            function writeData() {

            var gesch = getGender();
            var vname = getName();
            var user = {
                             name: vname,
                             geschlecht: gesch
            };
            var file = "JSON.php";
            var daten = "daten=" + JSON.stringify(user);
            var request = requestObjektPost("POST", file);
            request.send(daten);
            }





            function showUserData() {
            var file = "User.txt";
            var request = requestObjektGet("GET", file);
            request.onreadystatechange = function() {

                if(isReady(request)) {
                  var objekt =JSON.parse(request.responseText);
                  createBlink(objekt);
                }
            }
            request.send(null);

            }

Der PHP-Code steht ja oben...
LG
Me
 
Du beschreibst aber erneut nicht, wie wann wo womit oder wodurch die Funktion writeData() aufgerufen wird.
Wenn ich es aber direkt vom Server starte, dann klappt es gar nicht.
Und warum ist es dann wirklich sooo schwer uns eben diesen Testlink zu geben? Dann könnten wir uns das mal live anschauen.
 
Die Fehlerkonsole zeigt nichts an.
Der FF hat manchmal die Unart, dass er Fehler, die in Callback von XHRs ausgelöst werden, nicht in der Fehlerkonsole erscheinen.

Aber du kannst im Debugger doch Breakpoints setzen und dann sehen, was alles ausgeführt wird.

Wenn wir dir genauer helfen sollen, musst du schon uns den kompletten Code zeigen. Oder, noch besser, ein lauffähiges Minimalbeispiel.

PS: dein Funktionsaufbau ist etwas seltsam. Bist du dir sicher, dass du nicht doch ein Framework verwenden willst?
 
Zurück
Oben