Erreur d'analyse: erreur de syntaxe, fin de fichier inattendue dans mon code PHP

173

J'ai une erreur:

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

Avec ce 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>

Quel est le problème?

Pratnala
la source
2
J'imagine que vous avez une erreur avec une partie de votre code PHP ... que vous n'avez pas publié.
Yacoby le
5
Il semble que vous ayez un '}', ';' manquant. ou support, mais cela vous aiderait si vous
publiez votre
14
Dans un an et demi, il est drôle que cette question soit close car trop localisée mais elle a obtenu près de 50k vues.
pratnala
3
Je suis d'accord ... cela a totalement résolu mon problème. Pas du tout localisé en ce qui concerne la question et la solution.
Rocco The Taco le
5
Vérifiez également short_tagsdans votre php.ini sous les deux apacheet cliconfigs
AO_

Réponses:

317

Vous devez éviter cela (à la fin de votre code):

{?>

et ça:

<?php}

Vous ne devez pas mettre de crochets directement à proximité de la phpbalise open / close , mais séparez-la par un espace:

{ ?>
<?php {

aussi éviter <?et utiliser<?php

j0k
la source
47
Au cas où cela aiderait quelqu'un: j'ai eu une erreur similaire, mais causée par <? } ?>au lieu de <?php } ?>.
Adam Libuša
70
J'avais un ptoblem similaire mais mon cas était que j'avais short_open_tag = Off dans mon php.ini. Quand je l'ai activé, mon code fonctionnait.
bksi
4
Notez que bien qu'Apache accepte ce Nginx ne le fait pas (ou plutôt le fcgi ne le fait pas), donc si vous ne savez pas pourquoi cela fonctionne sur un serveur Web et pas sur un autre, vous savez pourquoi
Sammaye
Pouvez-vous ajouter pour éviter également ceci <? Php // echo $ pagetitle; ?> les slashs de commentaires tuent la clôture?>
AndreaBogazzi
96

J'ai eu la même erreur, mais je l'ai corrigée en modifiant le php.inifichier.

Trouvez votre fichier php.ini voir Mec, où est mon php.ini?

puis ouvrez-le avec votre éditeur préféré.

Recherchez une short_open_tagpropriété et appliquez la modification suivante:

; short_open_tag = Off ; previous value
short_open_tag = On ; new value
Archana Balachandran
la source
8
Cette réponse est particulièrement importante lorsqu'il s'agit de code hérité. J'ai hérité du code écrit par quelqu'un d'autre, et la base de code était pleine de <? ?>(note, les manquants php). Je suis chargé d'ajouter ou de modifier des fonctionnalités, et ce n'est généralement pas une bonne idée de simplement tout changer pour une ou deux fonctionnalités. Votre réponse a vraiment aidé.
Sal le
Spot on, cela est particulièrement remarquable si vous avez mis à niveau vers le nouveau logiciel d'hébergement Plesk par exemple ou mis à niveau votre version PHP. Nous avons trouvé que les paramètres de php.ini avaient été supprimés et nous avons dû les définir à nouveau, celui-ci était nécessaire pour éviter l'erreur de fin de fichier inattendue
Tahir Khalid
1
Vous avez sauvé ma vie, ;-)
Miguel S. Mendoza
mastar sauve la vie!
Kamil Dąbrowski
36

J'ai eu la même erreur, mais je l'ai fait réparer en modifiant le php.ini et / ou en éditant le fichier PHP!

Il existe deux méthodes différentes pour contourner la syntaxe d'erreur d'analyse.

Méthode 1 (votre fichier PHP)

Évitez dans votre fichier PHP ceci:

<? } ?>

Assurez-vous de le mettre comme ça

<?php ?>

Votre code contient <? ?>

REMARQUE: les disparus phpaprès <?!

Méthode 2 (fichier php.ini)

Il existe également un moyen simple de résoudre votre problème. Recherchez la short_open_tagvaleur de la propriété (à utiliser dans votre éditeur de texte avec Ctrl + F!) Et appliquez la modification suivante:

; short_open_tag = Off

à

short_open_tag = On

Selon la description des directives principales de php.ini , short_open_tagvous permet d'utiliser la courte balise open ( <?) bien que cela puisse causer des problèmes lorsqu'il est utilisé avec xml ( <?xmlne fonctionnera pas lorsque cela est activé)!

REMARQUE: rechargez votre serveur (comme par exemple: Apache) et rechargez votre page Web PHP dans votre navigateur.

Suriyaa
la source
11

Allez simplement sur php.ini, puis trouvez short_open_tag= Offset toshort_open_tag= On

Hamzah Akram
la source
6

Recherchez les boucles ou les déclarations non fermées.

J'avais rencontré ce problème lorsque j'ai laissé un php foreach: tag non fermé.

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

Le fermer à l'aide de ce qui suit a résolu l'erreur de syntaxe: unexpected end of file

<?php endforeach; ?>

J'espère que ça aide quelqu'un

Imtiaz
la source
5

Vérifiez que vous avez fermé votre classe.

Par exemple, si vous avez une classe de contrôleur avec des méthodes, et par accident vous supprimez le crochet final, qui ferme toute la classe, vous obtiendrez cette erreur.

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

aussi, recherchez un commentaire // qui brise l'accolade fermante

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

l'accolade fermante ne fermera pas correctement la section conditionnelle et php ne traitera pas correctement le reste du code.

Steve Wasiura
la source
3

Évitez cela et <? } ?>assurez-vous de mettre<?php } ?>

Gpak
la source
2

J'ai vu quelques erreurs, que j'ai corrigées ci-dessous.

Voici ce que j'ai eu comme étant erroné:

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";
}

Voici comment je l'aurais fait:

<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
la source
Eh bien, le truc est à l'intérieur si (login ()), j'ai beaucoup de code à écrire, ce n'est qu'un exemple. Quoi qu'il en soit, la première réponse ici l'a résolu. Je ne savais pas qu'il fallait mettre un espace. Merci pour l'aide!
pratnala le
1
vous aidez juste de toute façon vous avez obtenu cela mais j'aime juste le faire de cette façon. And yer sure
ryanc1256
1

Dans mon cas, le coupable était la seule <?phpbalise d' ouverture dans la dernière ligne du fichier. Apparemment, cela fonctionne sur certaines configurations sans problème mais pose des problèmes sur d'autres.

J. Faux
la source
1

Faites également attention aux identifiants de fermeture heredoc.

Exemple non valide:

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

Cela lèvera une exception qui ressemble à ce qui suit:

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

où le numéro 5 peut être le dernier numéro de ligne de votre fichier.

Selon le manuel php :

Attention Il est très important de noter que la ligne avec l'identifiant de fermeture ne doit contenir aucun autre caractère, sauf un point-virgule (;). Cela signifie notamment que l'identifiant peut ne pas être indenté et qu'il ne peut y avoir d'espaces ou de tabulations avant ou après le point-virgule. Il est également important de réaliser que le premier caractère avant l'identifiant de fermeture doit être une nouvelle ligne telle que définie par le système d'exploitation local. Ceci est \ n sur les systèmes UNIX, y compris macOS. Le délimiteur de fermeture doit également être suivi d'une nouvelle ligne.

TLDR : Les identificateurs de fermeture ne doivent PAS être indentés.

Exemple valide:

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

De plus, un autre cas où il est difficile de le repérer est celui où vous avez un fichier avec juste une fonction, je sais que ce n'est pas un cas d'utilisation courant, mais c'est ennuyeux et il fallait repérer l'erreur.

<?php
function () {

}

Le fichier ci-dessus renvoie l'erro Parse error: syntax error, unexpected end of file inalors que le fichier ci -dessous ne le fait pas.

<?php
function () {

};
neisantos
la source
0

Pour moi, la cause la plus fréquente est un caractère} omis, de sorte qu'une fonction ou un bloc d'instructions if ne se termine pas. Je corrige cela en insérant un caractère} après mes récentes modifications et en le déplaçant à partir de là. J'utilise un éditeur qui peut localiser les crochets ouvrants correspondant à un crochet fermant, de sorte que cette fonctionnalité aide également (elle localise la fonction qui ne s'est pas terminée correctement).

Nous pouvons espérer qu'un jour les interprètes et les compilateurs de langage feront du travail pour générer de meilleurs messages d'erreur, car il est si facile d'omettre une parenthèse fermante.

Si cela aide quelqu'un, veuillez voter pour la réponse.

David Spector
la source
0

Vous ne pouvez pas diviser les instructions IF / ELSE en deux blocs distincts. Si vous avez besoin d'imprimer du code HTML, utilisez 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
la source
0

Pour compléter d'autres réponses, cela pourrait également être dû à la minification automatique de votre script php si vous utilisez un client ftp comme FileZilla. Assurez-vous que le type de transfert est défini sur Binaire et non ASCII ou auto. Le type de transfert ASCII ou automatique peut minimiser votre code php conduisant à cette erreur.

user3585550
la source
-1

Si vous utilisez parse_ini_file ($ file) ou une routine radie un fichier .ini, vérifiez si vos données sont citées dans le fichier ini. Les données sans guillemets provoqueront cette erreur. Ex; data1 = test provoquera l'erreur, data1 = "test" ne le fera pas.

Wynn
la source
-2

Dans mon cas, j'ai copié le contenu dans un autre fichier, puis j'ai supprimé le fichier php et en ai créé un nouveau, copié à nouveau le contenu dans le même fichier, et cela a fonctionné.

Reejesh PK
la source