2012-04-10 9 views
4

Ich habe seltsame Fehler und nicht sicher, wie man es angehen, ohne zu viel Zeit zu verschwenden. Ich habe eine Methode in meinem Controller, die unter Verwendung von XML zurückgeben sollte:php: leere Zeile aus dem Nichts

header("Content-type: text/xml"); 
    header("Content-Disposition: attachment; filename=output.xml"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 

die Sache ist, dass die Ausgabe wegen der leeren Zeile nicht gültig xml ist, und ich habe keine Ahnung, woher es kommt, haben Sie eine Idee, wie um das zu beheben? Vielleicht diese leere Zeile oder etwas ignorieren? Ich möchte nicht das gesamte Framework debuggen ... Ich habe versucht, var_dump(debug_backtrace()) zu verwenden, aber ich bekomme ein großes Durcheinander wahrscheinlich wegen der Doktrin.

Antwort

13

Fast immer wird eine Leerzeile vor oder nach Ihren <?php ?> Tags angezeigt. Wenn nicht in Ihrer Hauptdatei, schauen Sie sich Ihre Includes an.

Auch ein kleiner Tipp ... Wenn Ihre Datei reines PHP ist, starten Sie es einfach mit <?php und schließen Sie niemals das PHP-Tag. Schließen ist nicht notwendig, und dann vermeiden Sie Leerzeilen am Ende, die Ihnen Probleme bereiten.

+3

eine Spitze unerwünschte Newline hatte das Ende eines sortieren ist nicht PHP-Tags, wenn Sie wirklich müssen –

+0

@ShaunHare, ich glaube, Sie fügte hinzu, dass Kommentar, so wie ich schließen hat es meiner Antwort hinzugefügt? Oder bin ich verwirrt? Was meinen Sie? – Brad

+0

Nein muss zusammengestoßen sein!Das gleiche bedeuten –

0

Sie haben fast sicher eine leere Zeile irgendwo vor oder nach Ihren PHP-Tags. Eine Möglichkeit, das Problem zu beheben, ist nach der Ausgabe der XML-Datei immer oder die(). Dadurch werden zusätzliche Zeilen am Ende des Codes abgeschnitten. Es liegt an Ihnen, sicherzustellen, dass es am Anfang der Datei keine gibt.

4

Außerdem werden alle Fehlermeldungen vor den Kopfzeilen in das Dokument gedruckt. aber manchmal ist es schwer, den Täter zu finden, wenn kein Fehler vorliegt. Versuchen Sie folgendes:

ob_start() 

Setzen Sie das erste, was in Ihrem Skript, das sonst, dass nichts sicher, ausgegeben ist, bis Sie

ob_flush() 

aufrufen, die nicht für Sie (die ob_flush) notwendig sein kann.

Außerdem hatte ich dieses Problem vor einer Weile, wo ein Skript, das in der Mitte eines anderen Skripts enthalten war, ein einzelnes Zeichen nach dem Schließen von PHP-Tag hatte, die dieses einzelne Zeichen die Header ausgelöst und die Antwort ungültig machen .

Also würde ich dem Vorschlag von Brad folgen, dass Sie nicht schließen PHP-Tags verwenden, wenn Sie müssen.

0

Nach Plesk Update hatte ich eine leere Datei /tmp/.tmp.err die mit auto_prepend_file in PHP-Konfiguration autoprependiert wurde.

Also alle PHP-Skripte wurden mit einer leeren Zeichenfolge vorangestellt. Irgendeine einzigartige Situation, aber könnte wahrscheinlich jemandem helfen.

0

Ich laufe von Zeit zu Zeit auf dieses Problem. Und es kann sehr frustrierend sein. :-) Wie auch immer - ich finde das hilfreich. Dies zeigt Dateien mit einer leeren Zeile, gefolgt von einem PHP-Start-Tag. Es wird False Positives anzeigen, hilft aber die Suche einzugrenzen.

pcregrep -Mron '\n\<\?php' . 
2

Verwenden ob_clean() die Puffer löscht die

+1

Sie haben meinen Tag gerettet, es ist die einzige Lösung, die in meinem Fall funktioniert (Wordpress-Plugin). –