Помилка розбору: Помилка синтаксису, несподіваний кінець файлу в моєму 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>

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


2
Я б міг уявити, що у вас є помилка з деяким вашим PHP-кодом ... який ви ще не опублікували.
Якобі

5
Це здається, що у вас відсутні '}', ';' або дужка, але це допоможе, якщо ви опублікуєте весь php-код
ryanc1256

14
Через півтора року смішно, що це питання було закрито, оскільки воно занадто локалізоване, але воно отримало майже 50 тис. Переглядів.
pratnala

3
Я згоден ... це повністю виправило мою проблему. Зовнішньо не локалізовано щодо питання та рішення.
Rocco The Тако

5
Також перевірте short_tagsв вашому php.ini під ОБИДВА apacheі cliконфіги
AO_

Відповіді:


317

Вам слід уникати цього (наприкінці коду):

{?>

і це:

<?php}

Не слід ставити дужки безпосередньо поруч із phpтегом відкриття / закриття , а розділяти їх пробілом:

{ ?>
<?php {

також уникати <?та використовувати<?php


47
У випадку, якщо це комусь допомагає: я отримав подібну помилку, але викликану <? } ?>замість <?php } ?>.
Адам Лібуша

70
У мене була подібна птоблема, але у мене випадок, що у мене був php_ini. Short_open_tag = Off. Коли я ввімкнув його увімкнено, мій код працював.
bksi

4
Зверніть увагу, поки Apache приймає це Nginx не робить (а точніше, fcgi не робить), тож якщо ваш тупик, чому це працює на одному веб-сервері, а не інший, ви знаєте, чому
Sammaye

Чи можете ви додати, щоб уникнути цього <? Php // echo $ pagetitle; ?>
коса риса

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 у своєму браузері.



6

Шукайте, чи будь-які петлі чи заяви залишаються незакритими.

Я зіткнувся з цією проблемою, коли залишив php foreach: tag unclosed.

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


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>

Ну, справа всередині, якщо (login ()) у мене є багато коду для запису, це просто зразок. У будь-якому випадку перша відповідь тут вирішила його. Я не знав, що потрібно поставити пробіл. Дякую за допомогу!
pratnala

1
yer просто допомагаючи yer я отримав це, але я просто люблю робити це таким чином. І ви впевнені
ryanc1256

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
}

0

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

<?php
function () {

}

Файл, що знаходиться вище, повертає помилку, Parse error: syntax error, unexpected end of file inтоді як нижче -.

<?php
function () {

};

0

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

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

Якщо це допомагає комусь, будь ласка, проголосуйте відповідь.


0

Ви не можете розділити інструкції IF / ELSE на два окремі блоки. Якщо вам потрібен друк HTML-коду, використовуйте ехо .

<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

Щоб доповнити інші відповіді, це також може бути пов’язане з автоматичним мінімізацією сценарію php, якщо ви використовуєте ftp-клієнт, наприклад FileZilla. Переконайтесь, що для типу передачі встановлено значення Binary, а не ASCII або auto. ASCII або тип автоматичної передачі може мінімізувати ваш PHP-код, що призведе до цієї помилки.


-1

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


-2

У моєму випадку я скопіював вміст в інший файл, а потім видалив файл php і створив новий, скопіював вміст знову в той самий файл, і він спрацював.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.