簡體   English   中英

解析錯誤:語法錯誤,我的 PHP 代碼中的文件意外結束

[英]Parse error: Syntax error, unexpected end of file in my PHP code

我收到一個錯誤:

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>

有什么問題?

您應該避免這種情況(在代碼末尾):

{?>

還有這個:

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

方法二(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 關閉標識符。

無效示例:

// it's not working!!!

function findAll() {
    $query=<<<SQL
        SELECT * FROM `table_1`;
    SQL; // <-------- THIS IS BAD

    // ...
}

這將引發類似於以下內容的異常:

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

其中數字 5 可能是文件的最后一行。

根據php手冊

警告請務必注意,帶有結束標識符的行不能包含其他字符,分號 (;) 除外。 這尤其意味着標識符可能不會縮進,並且分號之前或之后可能沒有任何空格或制表符。 同樣重要的是要認識到結束標識符之前的第一個字符必須是本地操作系統定義的換行符。 這是在 UNIX 系統上的 \\n,包括 macOS。 結束分隔符后還必須跟一個換行符。

TLDR :結束標識符不應縮進。

有效示例:

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

    // ...
}

查找任何未關閉的循環或語句。

當我離開 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 } ?>

我看到了一些錯誤,我在下面修復了這些錯誤。

這就是我得到的錯誤:

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
function () {

}

上面的文件返回Parse error: syntax error, unexpected end of file in而下面沒有。

<?php
function () {

};

在我的情況下,罪魁禍首是文件最后一行中唯一的打開<?php標記。 顯然,它適用於某些配置而沒有問題,但會導致其他配置出現問題。

對我來說,最常見的原因是省略了 } 字符,因此函數或 if 語句塊沒有終止。 我通過在我最近的編輯后插入一個 } 字符並從那里移動它來解決這個問題。 我使用的編輯器可以定位與右括號相對應的左括號,因此該功能也有幫助(它可以定位未正確終止的函數)。

我們可以希望有一天語言解釋器和編譯器會做一些工作來生成更好的錯誤消息,因為省略右括號很容易。

如果這對任何人有幫助,請投票給答案。

為了補充其他答案,如果您使用像 FileZilla 這樣的 ftp 客戶端,也可能是由於您的 php 腳本的自動縮小。 確保傳輸類型設置為二進制而不是 ASCII 或自動。 ASCII 或自動傳輸類型可以縮小導致此錯誤的 php 代碼。

這不是對您的代碼的回答,而是對同一錯誤消息的回答。 它可能對某人有幫助。 在我的情況下,我有一個錯誤“解析錯誤:語法錯誤,第 665 行我的 PHP 代碼中的文件意外結束”在我的情況下,問題在於關閉“html”

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

在 7.2 版本中,結束標記之前應該沒有空格

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

就我而言,這是一個未封閉的功能。 我不得不一一刪除和恢復函數,以檢查哪個函數影響了代碼。

我希望有人受益

如果您是 linux 用戶並在apache2服務器上運行您的舊 php 網站,則找到此文件/etc/php/<php version>/apache2/php.in ,以防您使用php cli執行 php 腳本,例如php example.php然后/etc/php/<php version>/cli/php.ini

short_open_tag = Off設置為short_open_tag = On並在 apache2 的情況下重新啟動您的服務sudo systemctl restart apache2.service

如果您使用 parse_ini_file($file) 或例程正在處理 .ini 文件,請檢查您的數據是否在 ini 文件中被引用。 未引用的數據將導致此錯誤。 前任; data1=test 會導致錯誤,data1="test" 不會。

我開發了一個插件並將它安裝在一個運行在 Nginx 上的 Wordpress 站點上,它很好。 當我切換到 Apache 時,我只有這個錯誤,結果 Web 服務器不接受<? ,所以我只是替換了<? 標簽到<?php然后它工作。

您不能將 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM