Sven Mörs: JSON / Ajax

Habe ein sehr sehr komisches Problem was mich seit Tagen verrückt macht. Und zwar geht es um einen Kontakt-Formular. Übertragen wird es mit der Ajax-Technik:

			$.ajax({ 
				type: "POST",
		  		url: "ajax.php",
		  		mimeType: "multipart/form-data",
		        cache: false,
		        contentType: false,
		        processData: false,
		  		data: formData 
		  	}).done(function( msg ) 
			{
				alert(msg);
$arr = array();
			if (mail($empfaenger, $betreff, $mailtext, $headers))
			{
				$arr["message"] = mail_sent;
			} else $arr["error"] = mail_error;	

			echo json_encode($arr);

Quellcode sollte ausreichen! Das ganze teste ich mit Xampp. Rufe ich die Webseite mit der Lokalen IP auf: 127.0.0.1/webseite funktioniert es bekomme ein JSON zurück. Rufe ich die Webseite mit der LAN-IP auf: 192.168.192.10/webseite bekomme ich den Fehler: Unexpected end of JSON input. WTF?

Kontakt-Formular hat alles geklappt Online, bis die Webseite umgezogen ist auf eine andere Domain. Seit dem funktioniert es nicht mehr und man bekommt den Fehler Unexpected end of JSON input. Das ergibt doch keinen Sinn, hat jemand eine Lösung?

  1. da bist du hier falsch,

    klick da

    1. da bist du hier falsch,

      klick da

      Warum bin ich hier falsch? :). Gesucht habe ich schon genug (Über 2 Wochen) was der Fehler aussagt weiß ich auch. Komische ist ja wenn ich mit der Lokalen IP aufrufe geht es, mit der LAN IP nicht dann wird nur ein leerer String zurück gegeben - Und das ist es was ich nicht verstehe. Total unlogisch.

      1. da bist du hier falsch,

        klick da

        Warum bin ich hier falsch? :)

        Die Lösung musst Du selber finden. Darum: Ich hatte neulich ein ähnliches Problem und bekam hier eine Antwort der Art "Was an den 380 Tausend Such-Ergebnisseiten hast Du nicht verstanden?" und da ist mir das mal wieder klar geworden. MfG

        1. Tach!

          Die Lösung musst Du selber finden. Darum: Ich hatte neulich ein ähnliches Problem und bekam hier eine Antwort der Art "Was an den 380 Tausend Such-Ergebnisseiten hast Du nicht verstanden?" und da ist mir das mal wieder klar geworden.

          Man wird ja wohl von jemandem, der von sich selbst behauptet, jahrelange Programmiererfahrung zu haben, erwarten können, dass er weiß, wie generell Lösungsfindung geht. Deine Frage war, wie man ein Zertifikat erstellt. Das ist eine sehr allgemeine Frage zum Thema, das ausreichend oft beschrieben ist. Du hast nicht geschrieben, woran es denn bei dir scheitert. Ich sehe mich nicht als Internet-Kopierer, wenn dazu genügend Anleitungen zur generellen Vorgehensweise vorhanden sind. Ich habe dir auch keinen konkreten Link geben können, weil ich selbst keinen weiß, sondern ebenfalls suchen müsste. Zudem waren ja in meiner Antwort auch noch weitergehende Hinweise zu den Eigenarten der Browser bei der Zertifikatsverwaltung enthalten. Ich habe dich nicht generell weggeschickt.

          Du versuchst dich gerade ob dieser von dir so empfunden ungerechten Behandlung an diesem Forum zu rächen und hast dir dazu einen unbeteiligten Unschuldigen ausgesucht. Wenn ich solch ein Verhalten benennen müsste, fiele mir auch grad ein passendes Adjektiv ein.

          dedlfix.

  2. Tach!

    Kontakt-Formular hat alles geklappt Online, bis die Webseite umgezogen ist auf eine andere Domain. Seit dem funktioniert es nicht mehr und man bekommt den Fehler Unexpected end of JSON input. Das ergibt doch keinen Sinn, hat jemand eine Lösung?

    Vor der Lösungssuche kommt erstmal die Problemanalyse. Öffne die Entwicklertools in deinem Browser und geh zum Abschnitt Netzwerk. Dort schaust du dir den Ajax-Request an und was da für Daten hin und her übertragen werden. Danach kann man den nächsten Schritt planen.

    dedlfix.

    1. Tach! Vor der Lösungssuche kommt erstmal die Problemanalyse. Öffne die Entwicklertools in deinem Browser und geh zum Abschnitt Netzwerk. Dort schaust du dir den Ajax-Request an und was da für Daten hin und her übertragen werden. Danach kann man den nächsten Schritt planen.

      dedlfix.

      Er gibt mir ein leeren String zurück, deswegen kommt der Fehler das weiß ich schon! Aber die Frage ist ja, warum? Warum funktioniert es mit der anderen Domain. Genau so Lokal 127.0.0.1/webseite funktioniert alles bestens. Aber wenn ich mit 192.168.192.10/webseite aufrufe kommt der Fehler (Leerer String) oO.

      1. Tach!

        Er gibt mir ein leeren String zurück, deswegen kommt der Fehler das weiß ich schon! Aber die Frage ist ja, warum?

        Wer ist "er"? Schau doch mal bei "ihm" nach, ob alles so läuft wie geplant. Ich nehme an, bei "ihm" handelt es sich konkret um den Webserver und das darauf laufende PHP. Gib Kontrollausgaben von Inhalten strategisch wichtiger Variablen ins Error-Log von PHP aus oder auch als Anwort (ohne JSON-Behandlung) in Richtung Client. Schau in dem Fall auch mit den Entwicklertool, was konkret geantwortet wird.

        dedlfix.

        1. Tach! Wer ist "er"? Schau doch mal bei "ihm" nach, ob alles so läuft wie geplant. Ich nehme an, bei "ihm" handelt es sich konkret um den Webserver und das darauf laufende PHP. Gib Kontrollausgaben von Inhalten strategisch wichtiger Variablen ins Error-Log von PHP aus oder auch als Anwort (ohne JSON-Behandlung) in Richtung Client. Schau in dem Fall auch mit den Entwicklertool, was konkret geantwortet wird.

          dedlfix.

          Alles schon gemacht, aber es kommt einfach nichts (Nur leere Strings...) Kriege einfach nichts raus. Hier mal ein Link: http://www.eraiizegaming.com/contact gerne einfach mal was schreiben im Kontakt-Formular und abschicken. Vorher war die Domain: http://www.team-eraiize.com da ging alles. Die 2 Domain zeigt auf den gleichen Server nur im anderen Ordner. Man wird bei der alten Domain weitergeleitet zu der anderen. Quellcode wurde kein stück verändert. Kann auch ehrlich gesagt gar nicht mehr Denken... seit über 2 Wochen probiere ich das zu Lösen, komme aber irgendwie nicht vorwärts, bin fix und fertig mit den Nerven. Wäre echt Dankbar wenn Du dir das mal anschauen könntest.

          1. Tach!

            Alles schon gemacht, aber es kommt einfach nichts (Nur leere Strings...)

            Das kann so nicht stimmen. $_POST wird von PHP als Array bereitgestellt. "Alles" kann nicht "nur leere Strings" sein. Nimm var_dump() zur Inhaltsanalyse. Das error_reporting ist auch auf Maximum gestellt? In den Logfiles sind keine Auffälligkeiten?

            Wie läuft denn der Request durch das Script? Bau mal echos ein (oder auch die("irgendein_text")), die dir zeigen, an welcher Stelle die Abarbeitung vorbeikommt und wo nicht.

            Wäre echt Dankbar wenn Du dir das mal anschauen könntest.

            Das kann ich nur begrenzt, weil ich ja nicht die Serverseite sehe. Clientseitig sieht es gar nicht mal schlecht aus. Nur eins, warum nimmst du multipart/form-data, wenn der Standard application/x-www-form-urlencoded für normale Eingabefelder (sprich: kein Filetransfer) ausreichend ist?

            dedlfix.

            1. Das kann ich nur begrenzt, weil ich ja nicht die Serverseite sehe. Clientseitig sieht es gar nicht mal schlecht aus.

              Doch, genau da ist ein Problem: Der gesendete Content-Type und Content-Length wird nicht geprüft.

              Nur eins, warum nimmst du multipart/form-data, wenn der Standard application/x-www-form-urlencoded für normale Eingabefelder (sprich: kein Filetransfer) ausreichend ist?

              Was hackst Du denn auf dem Enctype rum? Der hat mit dem Problem überhaupt nichts zu tun.

              1. Tach!

                Das kann ich nur begrenzt, weil ich ja nicht die Serverseite sehe. Clientseitig sieht es gar nicht mal schlecht aus.

                Doch, genau da ist ein Problem: Der gesendete Content-Type und Content-Length wird nicht geprüft.

                Von wem gesendet? Im Reqeuest vom Client gesendet und auf dem Server nicht geprüft oder in der Response vom Server gesendet und auf dem Client nicht geprüft? Wenn du meinst, das muss auf dem Client geprüft werden ... was genau willst du da prüfen? Der Server sendet eine Response ohne Inhalt mit Content-Length 0. Und nun?

                Der Content-Type muss zum Inhalt passen und muss korrekt gesetzt werden, wenn man nicht auf eventuelle Fehlerkorrekturmechanismen der Browser hoffen möchte. Die Content-Length hingegen ist üblicherweise für den Programmierer von PHP und Ajax nicht von Belang. Darum kümmert sich PHP einerseits und der Browser andererseits selbst. Man muss da nicht eingreifen.

                Nur eins, warum nimmst du multipart/form-data, wenn der Standard application/x-www-form-urlencoded für normale Eingabefelder (sprich: kein Filetransfer) ausreichend ist?

                Was hackst Du denn auf dem Enctype rum? Der hat mit dem Problem überhaupt nichts zu tun.

                Der Request wird derzeit aufgrund seiner Zeile >mimeType: "multipart/form-data"< mit ebendiesem Wert als Content-Type gesendet, obwohl keine Notwendigkeit besteht, vom Standard application/x-www-form-urlencoded abzuweichen. Das wird keinen Einfluss auf das Problem haben, aber die Frage, warum er das tut, ist doch sicherlich gestattet.

                dedlfix.

                1. Der Request wird derzeit aufgrund seiner Zeile >mimeType: "multipart/form-data"< mit ebendiesem Wert als Content-Type gesendet, obwohl keine Notwendigkeit besteht, vom Standard application/x-www-form-urlencoded abzuweichen. Das wird keinen Einfluss auf das Problem haben, aber die Frage, warum er das tut, ist doch sicherlich gestattet.

                  dedlfix.

                  Liegt daran das ich mir ein Framework gemacht habe und über den Abschnitt kann beides kommen. Manchmal nur Content aber auch Dateien :)

          2. Alles schon gemacht, aber es kommt einfach nichts (Nur leere Strings...) Kriege einfach nichts raus. Hier mal ein Link: http://www.eraiizegaming.com/contact gerne einfach mal was schreiben im Kontakt-Formular und abschicken.

            Habch gemacht. Serverseitig wird Content-Length: 0 gesendet und folgerichtig kein message body. Das ist soweit korrekt.

            Dein Problem liegt im Verfahren. Einerseits brauchst Du kein JSON zum Senden von Erfolgreich oder nicht Erfolgreich, da reicht ein einfacher String für eine etwaige serverseitige Fehlermeldung. Ein Leerstring würde dann bedeuten, dass es keinen Fehler gab.

            Auf jeden Fall solltest Du Dein JS so verändern, dass alle möglichen Fälle einer Response geprüft werden. D.h., Du solltest auch prüfen, ob überhaupt ein Response Message Body gesendet wurde und wenn ja, prüfen ob es ein Content-Type: application/json ist.

            PS: In Deinem Fall wird ein Response-Header Content-Type: text/html gesendet und das passt schonmal nicht zu JSON.

            1. Tach!

              Auf jeden Fall solltest Du Dein JS so verändern, dass alle möglichen Fälle einer Response geprüft werden. D.h., Du solltest auch prüfen, ob überhaupt ein Response Message Body gesendet wurde und wenn ja, prüfen ob es ein Content-Type: application/json ist.

              Du solltest beachten, dass er jQuery verwendet. Das hat bereits einen Mechanismus eingebaut, der den Typ der Response zu analysieren versucht, siehe dataType.

              PS: In Deinem Fall wird ein Response-Header Content-Type: text/html gesendet und das passt schonmal nicht zu JSON.

              Das ist vermutlich der zweite von zwei Punkten, der in Bezug auf das Ajax geändert werden sollte. Der andere ist, den contentType auf application/x-www-form-urlencoded zu belassen anstatt multipart/form-data zu verwenden. Das ist vermutlich aber beides nur Kosmetik, denn das Problem scheint mir derzeit auf der Serverseite zu liegen, denn mit diesen beiden Fehlern funktioniert es ja bereits unter einer anderen URL.

              dedlfix.

              1. Dankeschön erstmal für die vielen Antworten. Nur mal als kleiner Hinweis: Online habe ich die Alert Meldung nicht eingebaut nur Lokal bei mir, die Meldung kommt, nur halt leer. Ich werde nochmal genauer schauen. Was mich etwas verwirrt, findet ihr das so nicht komisch das es funktioniert wenn ich die Webseite Lokal mit: 127.0.0.1/webseite öffne? Und mit der LAN-IP (Lokal) das der Fehler dann kommt?

                Ich tendiere eher dazu das es nicht am Quellcode liegt und irgendein anderes Problem vorliegt? Vielleicht ein JS oder PHP Bug. Aber mal schauen ob ich noch was rauskriege. Jetzt bin ich erstmal wieder fit und kann besser Denken ^^.

                1. Tach!

                  Nur mal als kleiner Hinweis: Online habe ich die Alert Meldung nicht eingebaut nur Lokal bei mir, die Meldung kommt, nur halt leer.

                  Nimm lieber console.log() statt alert(). Du musst dafür zwar die Entwicklertools des Browsers offenhaben, um die Meldung zu sehen, aber das hat man als Webentwickler doch sowieso ;)

                  Ich werde nochmal genauer schauen. Was mich etwas verwirrt, findet ihr das so nicht komisch das es funktioniert wenn ich die Webseite Lokal mit: 127.0.0.1/webseite öffne? Und mit der LAN-IP (Lokal) das der Fehler dann kommt?

                  Ob ich das komisch finde oder nicht, wird dein Problem nicht beeinflussen. Das bringt dich nicht weiter.

                  Ich tendiere eher dazu das es nicht am Quellcode liegt und irgendein anderes Problem vorliegt? Vielleicht ein JS oder PHP Bug.

                  Die Erfahrung hat gezeigt, dass das Problem immer auf der eigenen Seite zu finden ist, wenn nicht genau nachgewiesen werden kann, dass es an der verwendeten Software liegt. Ausnahmen bestätigen diese Regel. Doch sollte man sich mit einem Fehlerreport an die anderen Entwickler zurückhalten, wenn man keine Beweise dafür hat. Bloße Verdachtsmomente sind da nicht ausreichend.

                  Untersuch mal lieber das Script auf der Serverseite.

                  dedlfix.

                  1. Die Erfahrung hat gezeigt, dass das Problem immer auf der eigenen Seite zu finden ist, wenn nicht genau nachgewiesen werden kann, dass es an der verwendeten Software liegt. Ausnahmen bestätigen diese Regel. Doch sollte man sich mit einem Fehlerreport an die anderen Entwickler zurückhalten, wenn man keine Beweise dafür hat. Bloße Verdachtsmomente sind da nicht ausreichend.

                    Untersuch mal lieber das Script auf der Serverseite.

                    dedlfix.

                    Dankeschön. Problem gelöst, das gibt es doch nicht. Dann noch ein peinlicher Fehler, hätte gar nicht mit der anderen URL funktionieren dürfen, sonst hätte ich den Fehler schon schneller gefunden. Aber so ist das Programmieren... nochmal Danke auch für eure Geduld :).

                    Problem lag am Script - Serverseite. Abfrage war in einer anderen Abfrage drin und konnte deswegen nicht ausgeführt werden. Wie mir das auch immer passiert ist, vor allem warum funktioniert es mit der anderen URL... aber da mache ich mir jetzt kein Kopf mehr. Funktioniert ja jetzt.

                    Gruß Sven

                    1. Tach!

                      Problem lag am Script - Serverseite. Abfrage war in einer anderen Abfrage drin und konnte deswegen nicht ausgeführt werden. Wie mir das auch immer passiert ist, vor allem warum funktioniert es mit der anderen URL... aber da mache ich mir jetzt kein Kopf mehr. Funktioniert ja jetzt.

                      Deine Entscheidung. Mich würde das nicht ruhen lassen, bis ich die Ursache kenne. Denn das zeigt ja doch, dass da noch irgendwo ein Fehler enthalten sein muss.

                      dedlfix.

                      1. Hallo,

                        Deine Entscheidung. Mich würde das nicht ruhen lassen, bis ich die Ursache kenne. Denn das zeigt ja doch, dass da noch irgendwo ein Fehler enthalten sein muss.

                        ja, exakt. Wenn etwas nach längerer Fehlersuche auf einmal funktioniert, und ich weiß nicht warum, macht mich das auch relativ unruhig. Denn es bedeutet, wie du schon sagst, dass der Fehler im Prinzip noch da ist und nur durch etwas anderes kaschiert wird. Irgendwann springt er einen wieder von hinten an.

                        So long,
                         Martin

                        --
                        Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
                        - Douglas Adams, The Hitchhiker's Guide To The Galaxy