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

173

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

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>

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

pratnala
источник
2
Я полагаю, у вас есть ошибка с некоторым вашим PHP-кодом ... который вы не опубликовали.
Якоби
5
Похоже, у вас пропущен '}', ';' или скобки, но было бы
полезно,
14
Полтора года спустя, забавно, что этот вопрос был закрыт, потому что он слишком локализован, но имеет почти 50 000 просмотров.
пратнала
3
Я согласен ... это полностью устранило мою проблему. Совсем не локализовано в отношении вопроса и решения.
Рокко Тако
5
Также проверьте short_tagsв вашем php.ini под ОБА apacheи cliконфиги
AO_

Ответы:

317

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

{?>

и это:

<?php}

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

{ ?>
<?php {

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

j0k
источник
47
На случай, если это кому-нибудь поможет: я получил похожую ошибку, но вызванную <? } ?>вместо <?php } ?>.
Адам Либуша
70
У меня была похожая проблема, но в моем случае у меня был short_open_tag = Off в моем php.ini. Когда я включил его, мой код работал.
bksi
4
Обратите внимание, что в то время как Apache принимает это Nginx не (или, скорее, fcgi не делает), поэтому, если вы озадачены тем, почему это работает на одном веб-сервере, а не на другом, вы знаете, почему
Sammaye
Вы можете добавить, чтобы избежать также это <? Php // echo $ pagetitle; ?> косые черты от комментариев убивают закрытие?>
AndreaBogazzi
96

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

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

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

Найдите short_open_tagсвойство и примените следующее изменение:

; short_open_tag = Off ; previous value
short_open_tag = On ; new value
Арчана Балахандран
источник
8
Этот ответ особенно важен при работе с устаревшим кодом. Я унаследовал код, написанный кем-то другим, и кодовая база была полна <? ?>(заметьте, отсутствующий php). Мне поручено добавлять или изменять функции, и, как правило, не стоит просто менять все только для одной или двух функций. Ваш ответ действительно помог.
Сэл
Обратите внимание: это особенно примечательно, если вы обновились, например, до нового хостинга Plesk или обновили версию PHP. Мы обнаружили, что настройки php.ini были сброшены, и нам пришлось снова выполнить их настройку, именно эта была необходима, чтобы избежать непредвиденной ошибки конца файла
Тахир Халид
1
Ты спас мне жизнь ;-)
Мигель С. Мендоса,
Мастар спаси жизнь!
Камиль Домбровски
36

У меня была та же ошибка, но я исправил ее, изменив 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 в своем браузере.

Suriyaa
источник
11

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

Хамза Акрам
источник
6

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

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

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

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

<?php endforeach; ?>

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

Имтиаз
источник
5

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

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

class someControler{
private $varr;
public $varu;
..
public function method {
..
} 
..
}// if you forget to close the controller, you will get the error
ольга
источник
4

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

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

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

Стив Васиура
источник
3

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

GPAK
источник
2

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

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

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>
ryanc1256
источник
Ну, дело в том, что если (login ()) мне нужно написать много кода, это всего лишь пример. В любом случае первый ответ здесь решил это. Я не знал, что нужно поставить место. Спасибо за помощь!
Пратнала
1
ты все равно помогаешь, ты получил это, но мне просто нравится делать это таким образом. И
ты
1

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

Дж. Неправильно
источник
1

Также обратите внимание на закрывающие идентификаторы 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. После закрывающего разделителя также должен стоять символ новой строки.

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

Допустимый пример:

function findAll() {
    $query=<<<SQL
        SELECT * FROM `table_1`;
SQL;
    // closing identifier should not be indented, although it might look ugly
    // ... omitted
}
bravemaster
источник
0

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

<?php
function () {

}

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

<?php
function () {

};
neisantos
источник
0

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

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

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

Дэвид Спектор
источник
0

Вы не можете разделить инструкции 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>
ТК-421
источник
0

В дополнение к другим ответам, это также может быть связано с автоматической минимизацией вашего php-скрипта, если вы используете FTP-клиент, такой как FileZilla. Убедитесь, что для типа передачи установлено значение Binary, а не ASCII или auto. ASCII или автоматический тип передачи могут минимизировать ваш php-код, приводящий к этой ошибке.

user3585550
источник
-1

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

Wynn
источник
-2

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

Reejesh PK
источник