Ошибка разбора: синтаксическая ошибка, неожиданный конец файла в моем коде PHP

Я получил ошибку:

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

С этим кодом:

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

В чем проблема?

22 ответа

Решение

Вам следует избегать этого (в конце вашего кода):

{?>

и это:

<?php}

Вы не должны ставить скобки прямо рядом с открытием / закрытием php тег, но он разделяется пробелом:

{ ?>
<?php {

также избегать <? и использовать <?php

У меня была та же ошибка, но я исправил ее, изменив php.ini файл.

Найдите свой файл php.ini, см. Чувак, где мой php.ini?

затем откройте его с вашим любимым редактором.

Искать short_open_tag и примените следующее изменение:

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

У меня была та же ошибка, но я исправил ее, изменив php.ini и / или изменив файл PHP!

Есть два разных способа обойти синтаксический анализ ошибки.

Способ 1 (ваш файл PHP)

Избегайте в вашем файле PHP этого:

<? } ?>

Убедитесь, что вы поставили это так

<?php ?>

Ваш код содержит <? ?>

ПРИМЕЧАНИЕ: пропавший php после <? !

Способ 2 (файл php.ini)

Существует также простой способ решить вашу проблему. Поиск для short_open_tag Значение свойства (используйте в текстовом редакторе с Ctrl + F !) и примените следующее изменение:

; short_open_tag = Off

в

short_open_tag = On

Согласно описанию основных директив php.ini, short_open_tag позволяет использовать короткий открытый тег (<?) хотя это может вызвать проблемы при использовании с xml ( <?xml не будет работать, когда это включено)!

ПРИМЕЧАНИЕ. Перезагрузите свой сервер (например, Apache) и перезагрузите веб-страницу PHP в своем браузере.

Просто зайдите на php.ini и найдите short_open_tag= Off установлен в short_open_tag= On

Также обратите внимание на закрывающие идентификаторы heredoc.

Неверный пример:

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

Это вызовет исключение, подобное следующему:

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

где цифра 5 может быть номером последней строки вашего файла.

Согласно руководству по php:

Предупреждение. Очень важно отметить, что строка с закрывающим идентификатором не должна содержать никаких других символов, кроме точки с запятой (;). Это, в частности, означает, что идентификатор не может иметь отступа, а также не должно быть никаких пробелов или табуляции до или после точки с запятой. Также важно понимать, что первый символ перед закрывающим идентификатором должен быть новой строкой, как это определено локальной операционной системой. Это \n в системах UNIX, включая macOS. За закрывающим разделителем также должна стоять новая строка.

TL; DR: закрывающие идентификаторы НЕ должныиметь отступ.

Действительный пример:

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

Ищите любые циклы или операторы, оставленные незамеченными.

Я столкнулся с этой проблемой, когда оставил php foreach: тег закрытым.

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

Закрытие с помощью следующего решило синтаксическую ошибку: unexpected end of file

<?php endforeach; ?>

Надеюсь, это поможет кому-то

Проверьте, что вы закрыли свой класс.

Например, если у вас есть класс контроллера с методами, и случайно вы удаляете заключительную скобку, которая закрывает весь класс, вы получите эту ошибку.

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

Также ищите комментарий //, который ломает закрывающую фигурную скобку

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

закрывающая фигурная скобка не будет корректно закрывать условный раздел, а php не будет правильно обрабатывать оставшуюся часть кода.

Также избегайте этого <? } ?> убедитесь, что вы положили <?php } ?>

если вы пользователь Linux и используете свой устаревший веб-сайт php на apache2server , затем найдите этот файл /etc/php/<php version>/apache2/php.inи если вы выполняете php-скрипт, используя php cliкак php example.phpтогда /etc/php/<php version>/cli/php.ini

установлен short_open_tag = Offк short_open_tag = Onи перезапустите службу в случае apache2 sudo systemctl restart apache2.service

Я видел некоторые ошибки, которые я исправил ниже.

Вот что я получил как ошибочный:

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

Вот как бы я это сделал:

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

В моем случае виновником было одинокое открытие <?php тег в последней строке файла. Очевидно, он работает на некоторых конфигурациях без проблем, но вызывает проблемы на других.

Это не ответ на ваш код, а ответ на то же сообщение об ошибке. Это может быть кому-то полезно. В моем случае у меня была ошибка «Ошибка анализа: синтаксическая ошибка, неожиданный конец файла в моем PHP-коде в строке 665». В моем случае проблема была в строке 45.

          $html = <<<html
....
            html

В версии 7.2 закрывающий тег должен быть БЕЗ пробелов перед

          $html = <<<html
....
html

Кроме того, еще один случай, когда трудно определить, когда у вас есть файл с просто функцией, я знаю, что это не обычный случай, но он раздражает и должен был обнаружить ошибку.

<?php
function () {

}

Файл выше возвращает ошибку Parse error: syntax error, unexpected end of file in в то время как ниже нет.

<?php
function () {

};

В моем случае это была незакрытая функция. Мне пришлось удалять и восстанавливать функции одну за другой, чтобы проверить, какая из них влияет на код.

Надеюсь, кому-то будет выгодно

Для меня наиболее частой причиной является пропущенный символ}, так что функция или блок операторов не завершены. Я исправляю это, вставляя символ} после моих последних правок и перемещая его оттуда. Я использую редактор, который может найти открывающие скобки, соответствующие закрывающей скобке, так что эта функция также помогает (она находит функцию, которая не была завершена правильно).

Мы можем надеяться, что когда-нибудь интерпретаторы языка и компиляторы сделают некоторую работу, чтобы генерировать лучшие сообщения об ошибках, так как закрывающую скобку так легко опустить.

Если это кому-нибудь поможет, пожалуйста, проголосуйте за ответ.

Чтобы дополнить другие ответы, это также может быть связано с автоматической минимизацией вашего php-скрипта, если вы используете ftp-клиент, такой как FileZilla. Убедитесь, что тип передачи установлен на Двоичный, а не на ASCII или авто. Тип передачи ASCII или автоматический может уменьшить ваш PHP-код, что приведет к этой ошибке.

Я не видел упоминания об этом, но если вы получаете это после создания нового файла, это может быть проблемой с кодировкой файла . Убедитесь, что для него установлено значениеUTF-8или что-то еще, что ожидает ваша система.

Вы не можете разделить инструкции IF/ELSE на два отдельных блока. Если вам нужен HTML-код для печати, используйте 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>

Если вы используете parse_ini_file($file) или подпрограмму для проверки файла.ini, проверьте, цитируются ли ваши данные в ini-файле. Данные без кавычек вызовут эту ошибку. Ex; data1= тест вызовет ошибку, data1="тест" не будет.

Я разработал плагин и установил его на сайте Wordpress, работающем на Nginx, и все прошло нормально. У меня была эта ошибка только тогда, когда я переключился на Apache, оказалось, что веб-сервер не принимает, поэтому я просто заменил <? теги к <?php тогда это сработало.

В моем случае я скопировал содержимое в другой файл, а затем удалил файл php и создал новый, снова скопировал содержимое в тот же файл, и это сработало.

Другие вопросы по тегам