Erro de análise: erro de sintaxe, final inesperado de arquivo no meu código PHP


173

Eu recebi um erro:

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

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

Qual é o problema?


2
Eu imagino que você tenha um erro com parte do seu código PHP ... que você não postou.
Yacoby

5
Parece que falta um '}', ';' ou suporte, mas seria bom se você postou você código php todo
ryanc1256

14
Daqui a um ano e meio, é engraçado que essa pergunta tenha sido encerrada porque é muito localizada, mas tem quase 50 mil visualizações.
Pratnala #

3
Eu concordo ... isso resolveu totalmente o meu problema. Não localizado em relação à pergunta e à solução.
Rocco The Taco

5
Verifique também short_tagsem seu php.ini em AMBOS apachee cliconfigurações
AO_

Respostas:


317

Você deve evitar isso (no final do seu código):

{?>

e isto:

<?php}

Você não deve colocar colchetes diretamente perto da phptag abrir / fechar , mas separá-lo com um espaço:

{ ?>
<?php {

Também evite <?e use<?php


47
Caso isso ajude alguém: recebi um erro semelhante, mas causado por em <? } ?>vez de <?php } ?>.
11133 Adam Libuša

70
Eu tinha ptoblem semelhante, mas o meu caso foi que eu tinha short_open_tag = Off no meu php.ini. Quando o ativei, meu código funcionou.
22414 bksi

4
Nota ao Apache aceita esta Nginx não (ou melhor fcgi não) por isso, se o seu perplexo por que isso está trabalhando em um servidor web e não outro, você sabe por que
Sammaye

Você pode adicionar para evitar também este <? Php // echo $ pagetitle; ?> as barras de comentários estão matando o fechamento?> #
AndreaBogazzi

96

Eu tive o mesmo erro, mas o corrigi modificando o php.ini arquivo.

Encontre o seu arquivo php.ini em Cara, cadê meu php.ini?

depois abra-o com seu editor favorito.

Procure uma short_open_tagpropriedade e aplique a seguinte alteração:

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

8
Esta resposta é especialmente importante ao lidar com código legado. Eu herdei o código escrito por outra pessoa e a base de código estava cheia de <? ?>(nota, a falta php). Tenho a tarefa de adicionar ou alterar recursos, e normalmente não é uma boa ideia simplesmente mudar tudo apenas para um ou dois recursos. Sua resposta realmente ajudou.
Sal

No entanto, isso é especialmente digno de nota se você atualizou para o mais recente software de hospedagem Plesk, por exemplo, ou atualizou sua versão do PHP. Encontramos as configurações do php.ini obtive Trashed e tivemos que passar por set-los novamente, um presente especial foi necessário para evitar o fim inesperado de erro de arquivo
Tahir Khalid

1
Você salvou minha vida ;-)
Miguel S. Mendoza

mastar salvar vida!
Kamil Dąbrowski

36

Eu tive o mesmo erro, mas o corrigi modificando o php.ini e / ou editando o arquivo PHP!

Existem dois métodos diferentes para contornar a sintaxe do erro de análise.

Método 1 (seu arquivo PHP)

Evite no seu arquivo PHP o seguinte:

<? } ?>

Certifique-se de colocá-lo assim

<?php ?>

Seu código contém <? ?>

NOTA: O desaparecido phpdepois <?!

Método 2 (arquivo php.ini)

Também existe uma maneira simples de resolver seu problema. Procure o short_open_tagvalor da propriedade (Use no seu editor de texto com Ctrl + F!) E aplique a seguinte alteração:

; short_open_tag = Off

para

short_open_tag = On

De acordo com a descrição das diretivas principais do php.ini , short_open_tagpermite que você use a tag curta ( <?), embora isso possa causar problemas quando usado com xml ( <?xmlnão funcionará quando isso estiver ativado)!

NOTA: Recarregue seu servidor (como por exemplo: Apache) e recarregue sua página da Web PHP no seu navegador.


11

Basta ir ao php.ini e encontrar short_open_tag= Offsetshort_open_tag= On


6

Procure por quaisquer loops ou declarações que não foram fechados.

Eu tive esse problema quando deixei um php foreach: tag não fechado.

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

Fechá-lo usando o seguinte resolveu o erro de sintaxe: unexpected end of file

<?php endforeach; ?>

Espero que ajude alguém


5

Verifique se você encerrou sua aula.

Por exemplo, se você tem classe de controlador com métodos e, por acidente, exclui o colchete final, que fecha toda a classe, você receberá esse erro.

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

4

Além disso, procure um comentário // que quebre a chave de fechamento

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

a chave de fechamento não fecha adequadamente a seção condicional e o php não processa adequadamente o restante do código.


3

Evite isso também, <? } ?>certifique-se de colocar<?php } ?>


2

Vi alguns erros, que corrigi abaixo.

Isto é o que eu entendi como errado:

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

É assim que eu teria feito:

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

Bem, a coisa está dentro se (login ()), eu tenho muito código para escrever, isso é apenas uma amostra. De qualquer forma, a primeira resposta aqui a resolveu. Não sabia que era preciso colocar um espaço. Obrigado pela ajuda!
Pratnala

1
você está apenas ajudando de qualquer maneira, eu consegui isso, mas eu só gosto de fazer dessa maneira. E você tem certeza #
ryanc1256

1

No meu caso, o culpado foi a <?phptag de abertura solitária na última linha do arquivo. Aparentemente, ele funciona em algumas configurações sem problemas, mas causa problemas em outras.


1

Além disso, esteja atento aos identificadores de fechamento do heredoc.

Exemplo inválido:

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

Isso lançará uma exceção semelhante à seguinte:

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

onde o número 5 pode ser o último número da linha do seu arquivo.

De acordo com o manual do php :

Aviso É muito importante observar que a linha com o identificador de fechamento não deve conter outros caracteres, exceto um ponto e vírgula (;). Isso significa especialmente que o identificador não pode ser recuado e não pode haver espaços ou tabulações antes ou depois do ponto e vírgula. Também é importante perceber que o primeiro caractere antes do identificador de fechamento deve ser uma nova linha, conforme definido pelo sistema operacional local. Isso é \ n nos sistemas UNIX, incluindo o macOS. O delimitador de fechamento também deve ser seguido por uma nova linha.

TLDR : Os identificadores de fechamento NÃO devemser recuados.

Exemplo válido:

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

0

Além disso, outro caso em que é difícil identificar é quando você tem um arquivo com apenas uma função, sei que não é um caso de uso comum, mas é irritante e teve que detectar o erro.

<?php
function () {

}

O arquivo acima retorna o erro, Parse error: syntax error, unexpected end of file inenquanto o abaixo não.

<?php
function () {

};

0

Para mim, a causa mais frequente é um caractere omitido, para que uma função ou se o bloco de instruções não seja finalizado. Corrijo isso inserindo um caractere} após minhas edições recentes e movendo-o a partir daí. Eu uso um editor que pode localizar colchetes de abertura correspondentes a um colchete de fechamento, para que esse recurso também ajude (ele localiza a função que não foi finalizada corretamente).

Podemos esperar que algum dia os intérpretes e compiladores de idiomas façam algum trabalho para gerar melhores mensagens de erro, pois é tão fácil omitir um colchete.

Se isso ajudar alguém, vote na resposta.


0

Você não pode dividir as instruções IF / ELSE em dois blocos separados. Se você precisar que o código HTML seja impresso, 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 outras respostas, também pode ser devido à minificação automática do seu script php se você estiver usando um cliente ftp como o FileZilla. Verifique se o tipo de transferência está definido como Binário e não ASCII ou automático. O tipo de transferência automática ASCII ou pode reduzir o seu código php levando a esse erro.


-1

Se você estiver usando parse_ini_file ($ file) ou uma rotina estiver exibindo um arquivo .ini, verifique se os dados estão citados no arquivo ini. Dados não citados causarão esse erro. Ex; data1 = teste causará o erro, dados1 = "teste" não causará.


-2

No meu caso, copiei o conteúdo para outro arquivo, excluí o arquivo php e criei um novo, copiei o conteúdo novamente para o mesmo arquivo e funcionou.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.