Analysefehler: Syntaxfehler, unerwartetes Dateiende in meinem PHP-Code

173

Ich habe eine Fehlermeldung erhalten:

Parse error: syntax error, unexpected end of file in the line

Mit diesem Code:

<html>
    <?php
        function login()
        {
            // Login function code
        }
        if (login())
    {?>

    <h2>Welcome Administrator</h2>
    <a href=\"upload.php\">Upload Files</a>
    <br />
    <a href=\"points.php\">Edit Points Tally</a>

    <?php}
        else
        {
            echo "Incorrect login details. Please login";
        }
    ?>
    Some more HTML code
</html>

Was ist das Problem?

Pratnala
quelle
2
Ich würde mir vorstellen, dass Sie einen Fehler mit einem Teil Ihres PHP-Codes haben ... den Sie nicht gepostet haben.
Yacoby
5
Es hört sich so an, als hätten Sie ein fehlendes '}', ';' oder Klammer, aber es würde helfen, wenn Sie
Ihren
14
In anderthalb Jahren ist es lustig, dass diese Frage geschlossen wurde, weil sie zu lokalisiert ist, aber fast 50.000 Aufrufe hat.
Pratnala
3
Ich stimme zu ... das hat mein Problem total behoben. In Bezug auf die Frage und die Lösung überhaupt nicht lokalisiert.
Rocco The Taco
5
Überprüfen Sie auch short_tagsin Ihrer php.ini unter BEIDE apacheund cliKonfigurationen
AO_

Antworten:

317

Sie sollten dies vermeiden (am Ende Ihres Codes):

{?>

und das:

<?php}

Sie sollten Klammern nicht direkt in die Nähe des Open / Close- phpTags setzen, sondern durch ein Leerzeichen trennen:

{ ?>
<?php {

auch vermeiden <?und verwenden<?php

j0k
quelle
47
Für den Fall, dass es jemandem hilft: Ich habe einen ähnlichen Fehler, aber verursacht durch <? } ?>statt <?php } ?>.
Adam Libuša
70
Ich hatte ein ähnliches Problem, aber mein Fall war, dass ich short_open_tag = Off in meiner php.ini hatte. Als ich es auf Ein stellte, funktionierte mein Code.
Bksi
4
Beachten Sie, während Apache dies akzeptiert, Nginx nicht (oder besser gesagt, fcgi nicht). Wenn Sie also nicht wissen, warum dies auf einem Webserver funktioniert und nicht auf einem anderen, wissen Sie warum
Sammaye
Können Sie hinzufügen, um auch dieses <? Php // echo $ pagetitle; ?> Die Schrägstriche töten den Abschluss?>
AndreaBogazzi
96

Ich hatte den gleichen Fehler, aber ich hatte ihn durch Ändern der php.iniDatei behoben .

Finde deine php.ini Datei siehe Dude, wo ist meine php.ini?

Öffnen Sie es dann mit Ihrem Lieblingseditor.

Suchen Sie nach einer short_open_tagEigenschaft und übernehmen Sie die folgende Änderung:

; short_open_tag = Off ; previous value
short_open_tag = On ; new value
Archana Balachandran
quelle
8
Diese Antwort ist besonders wichtig, wenn es um Legacy-Code geht. Ich habe Code geerbt, der von jemand anderem geschrieben wurde, und die Codebasis war voll von <? ?>(beachten Sie, der fehlende php). Ich habe die Aufgabe, Funktionen hinzuzufügen oder zu ändern, und es ist normalerweise keine gute Idee, alles nur für ein oder zwei Funktionen zu ändern . Ihre Antwort hat wirklich geholfen.
Sal
Genau richtig, dies ist besonders bemerkenswert, wenn Sie beispielsweise auf die neuere Plesk-Hosting-Software aktualisiert oder Ihre PHP-Version aktualisiert haben. Wir fanden, dass die php.ini-Einstellungen verworfen wurden und wir mussten sie erneut einstellen. Diese spezielle Einstellung war erforderlich, um den unerwarteten Fehler am Ende der Datei zu vermeiden
Tahir Khalid,
1
Du hast mein Leben gerettet ;-)
Miguel S. Mendoza
Mastar rette das Leben!
Kamil Dąbrowski
36

Ich hatte den gleichen Fehler, aber ich hatte ihn behoben, indem ich die php.ini geändert und / oder die PHP-Datei bearbeitet habe!

Es gibt zwei verschiedene Methoden, um die Analysefehlersyntax zu umgehen.

Methode 1 (Ihre PHP-Datei)

Vermeiden Sie in Ihrer PHP-Datei Folgendes:

<? } ?>

Stellen Sie sicher, dass Sie es so ausdrücken

<?php ?>

Ihr Code enthält <? ?>

HINWEIS: Das fehlt phpnach <?!

Methode 2 (php.ini-Datei)

Es gibt auch eine einfache Möglichkeit, Ihr Problem zu lösen. Suchen Sie nach dem short_open_tagEigenschaftswert (Verwenden Sie ihn in Ihrem Texteditor mit Ctrl + F!) Und übernehmen Sie die folgende Änderung:

; short_open_tag = Off

zu

short_open_tag = On

Gemäß der Beschreibung der core php.ini Einstellungen , short_open_tagkönnen Ihnen den kurzen offenen Tag (verwenden <?) , obwohl dies könnte Probleme verursachen , wenn sie mit xml (verwendet <?xmlwird nicht funktionieren , wenn dieser aktiviert ist)!

HINWEIS: Laden Sie Ihren Server neu (wie zum Beispiel: Apache) und laden Sie Ihre PHP-Webseite in Ihrem Browser neu.

Suriyaa
quelle
11

Gehen Sie einfach zu php.ini und finden Sie short_open_tag= Offset toshort_open_tag= On

Hamzah Akram
quelle
6

Suchen Sie nach Schleifen oder Anweisungen, die nicht geschlossen sind.

Ich war auf dieses Problem gestoßen, als ich ein PHP foreach: tag nicht geschlossen hatte.

<?php foreach($many as $one): ?>

Durch Schließen mit den folgenden Methoden wurde der Syntaxfehler behoben: unexpected end of file

<?php endforeach; ?>

Hoffe es hilft jemandem

Imtiaz
quelle
5

Überprüfen Sie, ob Sie Ihre Klasse geschlossen haben.

Wenn Sie beispielsweise eine Controller-Klasse mit Methoden haben und versehentlich die letzte Klammer löschen, die die gesamte Klasse schließt, wird dieser Fehler angezeigt.

class someControler{
private $varr;
public $varu;
..
public function method {
..
} 
..
}// if you forget to close the controller, you will get the error
olga
quelle
4

Suchen Sie auch nach einem Kommentar //, der die schließende geschweifte Klammer bricht

if (1==1) { //echo "it is true"; }

Die schließende geschweifte Klammer schließt den bedingten Abschnitt nicht richtig und PHP verarbeitet den Rest des Codes nicht richtig.

Steve Wasiura
quelle
3

Vermeiden Sie dies auch <? } ?>stellen Sie sicher, dass Sie setzen<?php } ?>

Gpak
quelle
2

Ich habe einige Fehler gesehen, die ich unten behoben habe.

Das habe ich als falsch empfunden:

if (login())
{?>
<h2>Welcome Administrator</h2>
<a href=\"upload.php\">Upload Files</a>
<br />
<a href=\"points.php\">Edit Points Tally</a>
<?php}
else
{
echo "Incorrect login details. Please login";
}

So hätte ich es gemacht:

<html>
    some code
<?php
function login()
{
    if (empty ($_POST['username']))
    {
        return false;
    }
    if (empty ($_POST['password']))
    {
        return false;
    }
    $username = trim ($_POST['username']);
    $password = trim ($_POST['password']);
    $scrambled = md5 ($password . 'foo');
    $link = mysqli_connect('localhost', 'root', 'password');
    if (!$link)
    {
        $error = "Unable to connect to the database server";
        include 'error.html.php';
        exit ();
    }
    if (!mysqli_set_charset ($link, 'utf8'))
    {
        $error = "Unable to set database connection encoding";
        include 'error.html.php';
        exit ();
    }
    if (!mysqli_select_db ($link, 'foo'))
    {
        $error = "Unable to locate the foo database";
        include 'error.html.php';
        exit ();
    }
    $sql = "SELECT COUNT(*) FROM admin WHERE username = '$username' AND password = '$scrambled'";
    $result = mysqli_query ($link, $sql);
    if (!$result)
    {
        return false;
        exit ();
    }
    $row = mysqli_fetch_array ($result);
    if ($row[0] > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
if (login())
{
echo '<h2>Welcome Administrator</h2>
<a href=\"upload.php\">Upload Files</a>
<br />
<a href=\"points.php\">Edit Points Tally</a>';
}
else
{
    echo "Incorrect login details. Please login";
}
?>
some more html code
</html>
ryanc1256
quelle
Nun, die Sache ist drin, wenn (login ()) ich viel Code zu schreiben habe, dies ist nur ein Beispiel. Wie auch immer, die erste Antwort hier hat es gelöst. Ich wusste nicht, dass ein Leerzeichen gesetzt werden muss. Danke für die Hilfe!
Pratnala
1
Du hilfst trotzdem, wenn ich das bekommen habe, aber ich mache es einfach gerne so. Und Sie sind sicher
Ryanc1256
1

In meinem Fall war der Schuldige das einzige öffnende <?phpTag in der letzten Zeile der Datei. Anscheinend funktioniert es bei einigen Konfigurationen ohne Probleme, verursacht aber bei anderen Probleme.

J. Falsch
quelle
1

Achten Sie auch auf Heredoc-Abschlusskennungen.

Ungültiges Beispiel:

function findAll() {
    $query=<<<SQL
        SELECT * FROM `table_1`;
    SQL;
    // ... omitted
}

Dies löst eine Ausnahme aus, die der folgenden ähnelt:

<br />
<b>Parse error</b>:  syntax error, unexpected end of file in <b>[...][...]</b> on line <b>5</b><br />

Dabei ist Nummer 5 möglicherweise die letzte Zeilennummer Ihrer Datei.

Laut PHP-Handbuch :

Warnung Es ist sehr wichtig zu beachten, dass die Zeile mit dem schließenden Bezeichner keine anderen Zeichen als ein Semikolon (;) enthalten darf. Dies bedeutet insbesondere, dass der Bezeichner möglicherweise nicht eingerückt ist und vor oder nach dem Semikolon keine Leerzeichen oder Tabulatoren vorhanden sein dürfen. Es ist auch wichtig zu wissen, dass das erste Zeichen vor der schließenden Kennung eine neue Zeile sein muss, wie sie vom lokalen Betriebssystem definiert wurde. Dies ist \ n auf UNIX-Systemen, einschließlich macOS. Dem schließenden Trennzeichen muss auch eine neue Zeile folgen.

TLDR : Schließende Bezeichner sollten NICHT eingerückt werden.

Gültiges Beispiel:

function findAll() {
    $query=<<<SQL
        SELECT * FROM `table_1`;
SQL;
    // closing identifier should not be indented, although it might look ugly
    // ... omitted
}
tapferer Meister
quelle
0

Ein weiterer Fall, in dem es schwer zu erkennen ist, ist, wenn Sie eine Datei mit nur einer Funktion haben. Ich weiß, dass dies kein häufiger Anwendungsfall ist, aber es ist ärgerlich und musste den Fehler erkennen.

<?php
function () {

}

Die obige Datei gibt den Fehler zurück, die folgende Parse error: syntax error, unexpected end of file innicht.

<?php
function () {

};
Neisantos
quelle
0

Für mich ist die häufigste Ursache ein weggelassenes} Zeichen, so dass eine Funktion oder ein if-Anweisungsblock nicht beendet wird. Ich behebe dies, indem ich nach meinen letzten Änderungen ein} -Zeichen einfüge und es von dort aus verschiebe. Ich verwende einen Editor, der öffnende Klammern finden kann, die einer schließenden Klammer entsprechen, sodass diese Funktion ebenfalls hilfreich ist (er findet die Funktion, die nicht korrekt beendet wurde).

Wir können hoffen, dass eines Tages Sprachinterpreten und Compiler einige Arbeit leisten werden, um bessere Fehlermeldungen zu generieren, da es so einfach ist, eine schließende Klammer wegzulassen.

Wenn dies jemandem hilft, stimmen Sie bitte die Antwort ab.

David Spector
quelle
0

Sie können IF / ELSE-Anweisungen nicht in zwei separate Blöcke unterteilen. Wenn Sie HTML-Code zum Drucken benötigen, verwenden Sie echo .

<html>
    <?php
        function login()
        {
            // Login function code
        }
        if (login())
        {
            echo "<h2>Welcome Administrator</h2>
            <a href=\"upload.php\">Upload Files</a>
            <br />
            <a href=\"points.php\">Edit Points Tally</a>";
        }
        else
        {
            echo "Incorrect login details. Please login";
        }
    ?>
    Some more HTML code
</html>
TK-421
quelle
0

Als Ergänzung zu anderen Antworten kann es auch an der automatischen Minimierung Ihres PHP-Skripts liegen, wenn Sie einen FTP-Client wie FileZilla verwenden. Stellen Sie sicher, dass der Übertragungstyp auf Binär und nicht auf ASCII oder Auto eingestellt ist. Der ASCII- oder Auto-Transfer-Typ kann Ihren PHP-Code minimieren, was zu diesem Fehler führt.

user3585550
quelle
-1

Wenn Sie mit parse_ini_file ($ file) oder einer Routine eine INI-Datei ausstrahlen, überprüfen Sie, ob Ihre Daten in der INI-Datei angegeben sind. Nicht zitierte Daten verursachen diesen Fehler. Ex; data1 = test verursacht den Fehler, data1 = "test" nicht.

Wynn
quelle
-2

In meinem Fall habe ich den Inhalt in eine andere Datei kopiert und dann die PHP-Datei gelöscht und eine neue erstellt, den Inhalt erneut in dieselbe Datei kopiert und es hat funktioniert.

Reejesh PK
quelle