Errore di analisi: errore di sintassi, fine imprevista del file nel mio codice PHP


173

Ho ricevuto un errore:

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

Con questo codice:

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

Qual è il problema?


2
Immagino tu abbia un errore con alcuni dei tuoi codici PHP ... che non hai pubblicato.
Yacoby,

5
Sembra che manchi "}", ";" o parentesi ma sarebbe utile se hai pubblicato l'intero codice php
ryanc1256

14
Un anno e mezzo quindi, è divertente che questa domanda sia stata chiusa perché troppo localizzata ma ha quasi 50.000 visualizzazioni.
pratnala,

3
Sono d'accordo ... questo ha risolto totalmente il mio problema. Non localizzato per quanto riguarda la domanda e la soluzione.
Rocco The Taco,

5
Inoltre controllare per vedere short_tagsnel tuo php.ini sotto le due apachee cliconfigurazioni
AO_

Risposte:


317

Dovresti evitare questo (alla fine del tuo codice):

{?>

e questo:

<?php}

Non dovresti mettere le parentesi direttamente vicino al phptag open / close , ma separalo con uno spazio:

{ ?>
<?php {

anche evitare <?e usare<?php


47
Nel caso in cui aiuti qualcuno: ho avuto un errore simile, ma causato da <? } ?>invece di <?php } ?>.
Adam Libuša,

70
Avevo un ptoblema simile ma il mio caso era che avevo short_open_tag = Off nel mio php.ini. Quando l'ho attivato, il mio codice ha funzionato.
bksi,

4
Nota mentre Apache accetta questo Nginx non lo fa (o meglio fcgi no), quindi se sei sconcertato dal motivo per cui funziona su un server Web e non su un altro, sai perché
Sammaye,

Puoi aggiungere per evitare anche questo <? Php // echo $ pagetitle; ?> I commenti
tagliano

96

Ho avuto lo stesso errore, ma l'ho risolto modificando il php.inifile.

Trova il tuo file php.ini vedi Amico, dov'è il mio php.ini?

quindi aprilo con il tuo editor preferito.

Cerca una short_open_tagproprietà e applica la seguente modifica:

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

8
Questa risposta è particolarmente importante quando si tratta di codice legacy. Ho ereditato il codice scritto da qualcun altro e la base di codice era piena di <? ?>(nota, i mancanti php). Ho il compito di aggiungere o modificare funzionalità, e in genere non è una buona idea andare in giro a cambiare tutto solo per una o due funzionalità. La tua risposta mi ha davvero aiutato.
Sal

Appunto, questo è particolarmente degno di nota se, ad esempio, hai aggiornato il software di hosting Plesk più recente o hai aggiornato la tua versione di PHP. Abbiamo scoperto che le impostazioni di php.ini sono state cancellate e abbiamo dovuto ripeterle impostandole di nuovo, questo particolare era necessario per evitare la fine imprevista dell'errore del file
Tahir Khalid,

1
Mi hai salvato la vita ;-)
Miguel S. Mendoza,

mastar salva la vita!
Kamil Dąbrowski

36

Ho avuto lo stesso errore, ma l'ho risolto modificando php.ini e / o modificando il file PHP!

Esistono due metodi diversi per aggirare la sintassi dell'errore di analisi.

Metodo 1 (il tuo file PHP)

Evita nel tuo file PHP questo:

<? } ?>

Assicurati di metterlo in questo modo

<?php ?>

Il tuo codice contiene <? ?>

NOTA: il phpdopo mancante <?!

Metodo 2 (file php.ini)

C'è anche un modo semplice per risolvere il tuo problema. Cerca il short_open_tagvalore della proprietà (Usa nel tuo editor di testo con Ctrl + F!) E applica la seguente modifica:

; short_open_tag = Off

per

short_open_tag = On

Secondo la descrizione delle direttive principali di php.ini , short_open_tagti consente di usare il tag aperto breve ( <?) sebbene ciò possa causare problemi quando usato con xml ( <?xmlnon funzionerà quando è abilitato)!

NOTA: ricaricare il server (come ad esempio Apache) e ricaricare la pagina Web PHP nel browser.



6

Cerca eventuali loop o istruzioni che non siano stati chiusi.

Mi ero imbattuto in questo problema quando ho lasciato un php foreach: tag non chiuso.

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

Chiudendolo usando il seguente risolto l'errore di sintassi: unexpected end of file

<?php endforeach; ?>

Spero che aiuti qualcuno


5

Verifica di aver chiuso la lezione.

Ad esempio, se si dispone di una classe controller con metodi e per errore si elimina la parentesi finale, che chiude l'intera classe, verrà visualizzato questo errore.

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

4

cerca anche un commento // che rompe la parentesi graffa di chiusura

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

il parentesi graffa di chiusura non chiuderà correttamente la sezione condizionale e php non elaborerà correttamente il resto del codice.


3

Evita anche questo <? } ?>assicurati di mettere<?php } ?>


2

Ho visto alcuni errori, che ho corretto di seguito.

Questo è ciò che ho ottenuto come errato:

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

Ecco come l'avrei fatto:

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

Bene, la cosa è dentro se (login ()), ho molto codice da scrivere, questo è solo un esempio. Comunque la prima risposta qui l'ha risolta. Non sapevo che fosse necessario mettere uno spazio. Grazie per l'aiuto!
pratnala,

1
solo aiutandoti comunque, l'ho capito, ma mi piace farlo in quel modo. E sicuramente
ryanc1256,

1

Nel mio caso il colpevole era il <?phptag di apertura solitario nell'ultima riga del file. Apparentemente funziona su alcune configurazioni senza problemi ma causa problemi ad altri.


1

Inoltre, fai attenzione agli identificatori di chiusura ereditari.

Esempio non valido:

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

Ciò genererà un'eccezione simile al seguente:

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

dove il numero 5 potrebbe essere l'ultimo numero di riga del file.

Secondo il manuale di php :

Avviso È molto importante notare che la riga con l'identificatore di chiusura non deve contenere altri caratteri, tranne un punto e virgola (;). Ciò significa in particolare che l'identificatore non può essere rientrato e non possono esserci spazi o tabulazioni prima o dopo il punto e virgola. È anche importante rendersi conto che il primo carattere prima dell'identificatore di chiusura deve essere una nuova riga come definito dal sistema operativo locale. Questo è \ n sui sistemi UNIX, incluso macOS. Anche il delimitatore di chiusura deve essere seguito da una nuova riga.

TLDR : gli identificativi di chiusura NON devonoessere rientrati.

Esempio valido:

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

0

Inoltre, un altro caso in cui è difficile individuare è quando hai un file con solo una funzione, so che non è un caso d'uso comune ma è fastidioso e ha dovuto individuare l'errore.

<?php
function () {

}

Il file sopra restituisce l'erro, Parse error: syntax error, unexpected end of file inmentre il sotto no.

<?php
function () {

};

0

Per me, la causa più frequente è un carattere omesso}, in modo che una funzione o se il blocco di istruzioni non sia terminato. Risolvo questo problema inserendo un carattere} dopo le mie recenti modifiche e spostandolo da lì. Uso un editor in grado di individuare parentesi di apertura corrispondenti a una parentesi di chiusura, quindi anche questa funzione aiuta (individua la funzione che non è stata terminata correttamente).

Possiamo sperare che un giorno interpreti e compilatori di lingue lavorino per generare messaggi di errore migliori, poiché è così facile omettere una parentesi di chiusura.

Se questo aiuta qualcuno, vota la risposta.


0

Non è possibile dividere le istruzioni IF / ELSE in due blocchi separati. Se è necessario stampare il codice HTML, utilizzare 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

Per integrare altre risposte, potrebbe anche essere dovuto all'auto-minificazione dello script php se si utilizza un client ftp come FileZilla. Assicurarsi che il tipo di trasferimento sia impostato su Binario e non su ASCII o automatico. Il tipo di trasferimento automatico o ASCII può minimizzare il tuo codice php portando a questo errore.


-1

Se stai usando parse_ini_file ($ file) o una routine sta eseguendo il rooting di un file .ini, controlla se i tuoi dati sono citati nel file ini. I dati non quotati causeranno questo errore. Ex; data1 = test provocherà l'errore, data1 = "test" no.


-2

Nel mio caso ho copiato il contenuto in un altro file, quindi ho eliminato il file php e ne ho creato uno nuovo, ho copiato nuovamente il contenuto nello stesso file e ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.