解析错误:语法错误,我的 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

方法 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= On short_open_tag= Off<</p>

div class="answers">

另外,请注意 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 系统(包括 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标签。显然,它适用于某些配置,没有问题,但在其他配置上会导致问题。

如果您是 Linux 用户并在apache2服务器上运行旧版 PHP 网站,请找到此文件/etc/php/<php version>/apache2/php.in,如果您使用php example.php之类的php cli执行 PHP 脚本,则/etc/php/<php version>/cli/php.ini

short_open_tag = Off设置为 short_open_tag = On并在 Apache 的情况下重新启动您的服务2 sudo systemctl restart apache2.service

此外,另一种难以发现的情况是,当您有一个只有一个函数的文件时,我知道这不是一个常见的用例,但它很烦人,必须发现错误。

<?php
function () {
}

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

<?php
function () {
};

这不是对代码的回答,而是对同一错误消息的回答。它可能对某人有所帮助。就我而言,我有一个错误"解析错误:语法错误,我的 PHP 代码中第 665 行的文件意外结尾"在我的情况下,问题在于关闭"html">

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

在版本 7.2 中,结束标记之前应该没有空格

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

为了补充其他答案,如果您使用的是像FileZilla这样的ftp客户端,这也可能是由于php脚本的自动缩小。确保传输类型设置为二进制,而不是 ASCII 或自动。ASCII 或自动传输类型可能会缩小您的 php 代码,从而导致此错误。

就我而言,这是一个未关闭的功能。我不得不逐个删除和恢复功能,以检查哪个功能正在影响代码。

我希望有人受益

对我来说,最常见的原因是省略了"}"字符,因此函数或控制语句块不会终止。

以下是查找此类问题的一种方法:

第 1 步:

创建源文件的备份。

第 2 步:

从文件前面开始,向前移动(或从文件后面向后移动(,删除以函数或控制语句块开头的任意 PHP 代码部分。

第 3 步::

以您通常的方式或使用在线 PHP 代码检查器测试您的代码。如果错误消息消失,则 PHP 代码的最后删除部分包含未终止的函数或控制语句块。添加"}"终止。如果错误消息仍然存在,请转到步骤 2 并继续执行同一方向。

如果您使用 parse_ini_file($file( 或例程正在处理 .ini 文件,请检查您的数据是否在 ini 文件中被引用。未引用的数据将导致此错误。前任;data1=test 会导致错误,data1="test" 不会。

我开发了一个插件并将其安装在运行在Nginx上的Wordpress网站上,这很好。当我切换到 Apache 时,我只遇到了这个错误,结果是 Web 服务器不接受<?,所以我只是将 <? 标签替换为 <?php 然后它就可以工作了。