Error de análisis: error de sintaxis, final inesperado del archivo en mi código PHP


173

Recibí un error:

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

Con este código:

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

¿Cuál es el problema?


2
Me imagino que tiene un error con algunos de sus códigos PHP ... que no ha publicado.
Yacoby

55
Parece que le faltan '}', ';' o el soporte pero ayudaría si usted fijó todo el código php
ryanc1256

14
Dentro de un año y medio, es curioso que esta pregunta se haya cerrado porque está demasiado localizada pero tiene casi 50 mil visitas.
pratnala

3
Estoy de acuerdo ... esto solucionó totalmente mi problema. No está localizado en absoluto en lo que respecta a la pregunta y la solución.
Rocco The Taco

55
También verifique short_tagsen su php.ini en AMBOS apachey cliconfiguraciones
AO_

Respuestas:


317

Debe evitar esto (al final de su código):

{?>

y esto:

<?php}

No debe colocar corchetes directamente cerca de la phpetiqueta abrir / cerrar , sino separarla con un espacio:

{ ?>
<?php {

también evitar <?y usar<?php


47
En caso de que ayude a alguien: recibí un error similar, pero causado en <? } ?>lugar de <?php } ?>.
Adam Libuša

70
Tuve un problema similar pero mi caso fue que tenía short_open_tag = Off en mi php.ini. Cuando lo encendí, mi código funcionó.
bksi

44
Tenga en cuenta que mientras Apache acepta esto, Nginx no lo hace (o más bien fcgi no lo hace), por lo que si no sabe por qué funciona en un servidor web y no en otro, ya sabe por qué
Sammaye

¿Puedes agregar para evitar también este <? Php // echo $ pagetitle; ?> las barras de comentarios están matando el cierre?>
AndreaBogazzi

96

Tuve el mismo error, pero lo solucioné modificando el php.iniarchivo.

Encuentra tu archivo php.ini, mira Amigo, ¿dónde está mi php.ini?

luego ábralo con su editor favorito.

Busque una short_open_tagpropiedad y aplique el siguiente cambio:

; short_open_tag = Off ; previous value
short_open_tag = On ; new value

8
Esta respuesta es especialmente importante cuando se trata de código heredado. Heredé el código escrito por otra persona, y la base de código estaba llena de <? ?>(nota, la falta php). Tengo la tarea de agregar o cambiar funciones, y generalmente no es una buena idea simplemente cambiar todo solo por una o dos funciones. Tu respuesta realmente ayudó.
Sal

En el acto, esto es especialmente notable si ha actualizado al nuevo software de alojamiento Plesk, por ejemplo, o ha actualizado su versión de PHP. Descubrimos que la configuración de php.ini se volcó y tuvimos que revisarla nuevamente, esta en particular fue necesaria para evitar el error inesperado de final de archivo
Tahir Khalid

1
Me has salvado la vida ;-)
Miguel S. Mendoza

mastar salva la vida!
Kamil Dąbrowski

36

Tuve el mismo error, pero lo solucioné modificando el php.ini y / o editando el archivo PHP.

Hay dos métodos diferentes para evitar la sintaxis de error de análisis.

Método 1 (su archivo PHP)

Evite en su archivo PHP esto:

<? } ?>

Asegúrate de ponerlo así

<?php ?>

Su código contiene <? ?>

NOTA: ¡ Lo que falta phpdespués <?!

Método 2 (archivo php.ini)

También hay una manera simple de resolver su problema. Busque el short_open_tagvalor de la propiedad (¡Use en su editor de texto con Ctrl + F!) Y aplique el siguiente cambio:

; short_open_tag = Off

a

short_open_tag = On

De acuerdo con la descripción de las directivas centrales de php.ini , le short_open_tagpermite usar la etiqueta abierta corta ( <?), aunque esto puede causar problemas cuando se usa con xml (¡ <?xmlno funcionará cuando esté habilitado)!

NOTA: Vuelva a cargar su servidor (como por ejemplo: Apache) y vuelva a cargar su página web PHP en su navegador.


11

Simplemente vaya a php.ini y luego encuentre short_open_tag= Offset toshort_open_tag= On


6

Busque los bucles o declaraciones que no se hayan cerrado.

Me encontré con este problema cuando dejé un php foreach: etiqueta sin cerrar.

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

Cerrarlo usando lo siguiente resolvió el error de sintaxis: unexpected end of file

<?php endforeach; ?>

Espero que ayude a alguien


5

Comprueba que cerraste tu clase.

Por ejemplo, si tiene una clase de controlador con métodos, y por accidente elimina el corchete final, que cierra toda la clase, obtendrá este error.

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

4

también, busque un comentario // que rompa la llave de cierre

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

la llave de cierre no cerrará correctamente la sección condicional y php no procesará correctamente el resto del código.


3

Evita esto también <? } ?>asegúrate de poner<?php } ?>


2

Vi algunos errores, que he corregido a continuación.

Esto es lo que obtuve por ser erróneo:

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

Así es como lo habría hecho:

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

Bueno, la cosa está dentro si (login ()), tengo mucho código para escribir, esto es solo una muestra. De todos modos, la primera respuesta aquí lo ha resuelto. No sabía que había que poner un espacio. ¡Gracias por la ayuda!
pratnala

1
De todas formas, me estás ayudando. Lo conseguí, pero me gusta hacerlo de esa manera. Y
estás

1

En mi caso, el culpable fue la única <?phpetiqueta de apertura en la última línea del archivo. Aparentemente funciona en algunas configuraciones sin problemas pero causa problemas en otras.


1

Además, tenga cuidado con los identificadores de cierre heredoc.

Ejemplo inválido:

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

Esto generará una excepción similar a la siguiente:

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

donde el número 5 podría ser el último número de línea de su archivo.

Según el manual de php :

Advertencia Es muy importante tener en cuenta que la línea con el identificador de cierre no debe contener otros caracteres, excepto un punto y coma (;). Esto significa especialmente que el identificador puede no estar sangrado, y puede que no haya espacios o pestañas antes o después del punto y coma. También es importante darse cuenta de que el primer carácter antes del identificador de cierre debe ser una nueva línea según lo definido por el sistema operativo local. Esto es \ n en sistemas UNIX, incluido macOS. El delimitador de cierre también debe ir seguido de una nueva línea.

TLDR : los identificadores de cierre NO deberían estar sangrados.

Ejemplo válido

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

0

Además, otro caso en el que es difícil de detectar es cuando tiene un archivo con solo una función, sé que no es un caso de uso común, pero es molesto y tuvo que detectar el error.

<?php
function () {

}

El archivo anterior devuelve el error Parse error: syntax error, unexpected end of file inmientras que el siguiente no.

<?php
function () {

};

0

Para mí, la causa más frecuente es un carácter omitido}, por lo que una función o si el bloque de instrucciones no se termina. Arreglo esto insertando un carácter} después de mis ediciones recientes y moviéndolo desde allí. Utilizo un editor que puede ubicar los corchetes de apertura correspondientes a un corchete de cierre, por lo que esa característica también ayuda (localiza la función que no se terminó correctamente).

Podemos esperar que algún día los intérpretes y compiladores de idiomas hagan algún trabajo para generar mejores mensajes de error, ya que es muy fácil omitir un paréntesis de cierre.

Si esto ayuda a alguien, por favor vote la respuesta.


0

No puede dividir las instrucciones IF / ELSE en dos bloques separados. Si necesita imprimir un código HTML, use 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>

0

Para complementar otras respuestas, también podría deberse a la minimización automática de su script php si está utilizando un cliente ftp como FileZilla. Asegúrese de que el tipo de transferencia esté configurado en Binario y no en ASCII o automático. El tipo de transferencia automática o ASCII puede minimizar su código php y provocar este error.


-1

Si está usando parse_ini_file ($ file) o una rutina está emitiendo un archivo .ini, verifique si sus datos se citan en el archivo ini. Los datos sin comillas causarán este error. Ex; data1 = test causará el error, data1 = "test" no lo hará.


-2

En mi caso, copié el contenido en otro archivo y luego eliminé el archivo php y creé uno nuevo, volví a copiar el contenido en el mismo archivo y funcionó.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.