解析错误:语法错误,PHP代码中意外的文件结束

时间:2012-07-14 09:20:27

标签: php html parse-error

我收到了一个错误:

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>

有什么问题?

19 个答案:

答案 0 :(得分:282)

你应该避免这种情况(代码末尾):

{?>

和此:

<?php}

您不应该将括号直接放在开/关php标记附近,但它与空格分开:

{ ?>
<?php {

还要避免使用<?并使用<?php

答案 1 :(得分:74)

我遇到了同样的错误,但我通过修改php.ini文件修复了它。

找到您的php.ini文件,请参阅Dude, where's my php.ini?

然后用你最喜欢的编辑器打开它。

查找short_open_tag属性,并应用以下更改:

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

答案 2 :(得分:27)

  

我有同样的错误,但我通过修改php.ini和/或编辑PHP文件来修复它!

有两种不同的方法来解决解析错误语法。

方法1(您的PHP文件)

避免在你的PHP文件中:

<? } ?>

确保你把它放在这个

<?php ?>
  

您的代码包含<? ?>

     

注意: php后遗失的<?

方法2(php.ini文件)

还有一种简单的方法可以解决您的问题。 搜索short_open_tag属性值(在文本编辑器中使用Ctrl + F!),并应用以下更改:

; short_open_tag = Off

short_open_tag = On

根据description of core php.ini directivesshort_open_tag允许您使用短开标记(<?),但这可能会在与xml一起使用时出现问题(<?xml启用此功能后无效!)

  

注意: 重新加载您的服务器(例如:Apache)并在浏览器中重新加载您的PHP网页。

答案 3 :(得分:10)

转到php.ini,然后找到short_open_tag= Off设置为short_open_tag= On

答案 4 :(得分:5)

检查你是否关闭了课程。

例如,如果您有带方法的控制器类,并且意外删除了关闭整个类的最后一个括号,您将收到此错误。

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

答案 5 :(得分:4)

另外,找一条评论//打破结束大括号

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

结束花括号将无法正确关闭条件部分,php将无法正确处理剩余的代码。

答案 6 :(得分:4)

此外,请注意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 manual

警告 非常重要的一点是,带有结束标识符的行除分号(;)外,不得包含其他任何字符。特别是这意味着标识符可能不会缩进,并且在分号之前或之后可能没有空格或制表符。同样重要的是要认识到,结束标识符之前的第一个字符必须是本地操作系统定义的换行符。在UNIX系统(包括macOS)上,这是\ n。结束定界符也必须跟换行符。

TLDR :结束标识符应缩进。

有效示例:

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

答案 7 :(得分:3)

查找任何循环或语句未公开。

当我离开php foreach时,我遇到了这个麻烦:标签未关闭。

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

使用以下方法关闭它解决了语法错误:unexpected end of file

<?php endforeach; ?>

希望它有助于某人

答案 8 :(得分:2)

同样避免这种情况<? } ?>请确保放置<?php } ?>

答案 9 :(得分: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>

答案 10 :(得分:1)

在我的情况下,罪魁祸首是文件最后一行中唯一的<?php标签。显然,它适用于某些配置,没有问题,但会导致其他配置出现问题。

答案 11 :(得分:0)

就我而言,它是一个未关闭的函数。 我不得不一一删除和恢复功能,以检查哪个影响了代码。

希望有人受益

答案 12 :(得分:0)

这不是对您的代码的回答,而是对同一错误消息的回答。这可能对某人有帮助。 就我而言,我在第 665 行的 PHP 代码中遇到错误“解析错误:语法错误,文件意外结束” 我的问题出在第 45 行

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

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

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

答案 13 :(得分:0)

作为其他答案的补充,如果您使用的是FTP客户端(例如FileZilla),则还可能是由于您的php脚本的自动最小化。确保将传输类型设置为二进制,而不是ASCII或自动。 ASCII或自动传输类型可以最小化导致此错误的php代码。

答案 14 :(得分: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>

答案 15 :(得分:0)

对我来说,最常见的原因是省略的}字符,因此函数或if语句块不会终止。我通过在最近的编辑后插入}字符并从那里移动来解决此问题。我使用的编辑器可以找到对应于右括号的左括号,因此该功能也有帮助(它可以找到未正确终止的函数)。

我们希望有一天语言解释器和编译器会做一些工作来生成更好的错误消息,因为省略括号很容易。

如果这可以帮助任何人,请对答案进行投票。

答案 16 :(得分:0)

如果您使用parse_ini_file($ file)或例程正在调用.ini文件,请检查您是否在ini文件中引用了数据。不带引号的数据将导致此错误。防爆; data1 = test将导致错误,data1 =“test”将不会。

答案 17 :(得分:0)

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

Parse error: syntax error, unexpected end of file in

上面的文件会返回错误<?php function () { }; ,而下面则没有。

int a = 12345;
VeryImportantFunction<int>(a);

答案 18 :(得分:-1)

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