解析错误:语法错误,我的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代码有错误...您尚未发布。
Yacoby

5
听起来您缺少'}',';' 或方括号,但如果您发布完整的php代码会有所帮助
ryanc1256

14
因此,一年半的时间,这个问题被关闭是很有趣的,因为它太本地化了,但是已经获得了近5万次浏览。
Pratnala

3
我同意...这完全解决了我的问题。关于问题和解决方案根本没有本地化。
Rocco The Taco

5
还要short_tags在php.ini中同时检查apachecli配置
AO_16年

Answers:


317

您应该避免这种情况发生(在代码末尾):

{?>

还有这个:

<?php}

您不应该将方括号直接放在open / close php标签附近,而应使用空格分隔:

{ ?>
<?php {

也避免<?和使用<?php


47
万一它对任何人都有帮助:我遇到了类似的错误,但是是由<? } ?>而不是引起的<?php } ?>
亚当·里布沙(AdamLibuša)2013年

70
我有类似的问题,但是我的情况是我的php.ini文件中的short_open_tag = Off。当我将其打开时,我的代码起作用了。
bksi 2014年

4
请注意,虽然Apache接受此Nginx不会(或者说fcgi不会),所以如果您对为什么它在一个Web服务器而不是另一个Web服务器上工作的原因
感到困惑,

您是否可以添加以避免这个<?php // echo $ pagetitle; ?>斜线杀死了结局?>
AndreaBogazzi

96

我有同样的错误,但是我通过修改php.ini文件将其修复。

找到您的php.ini文件,请参见Dude,我的php.ini在哪里?

然后使用您喜欢的编辑器将其打开。

查找short_open_tag属性,然后进行以下更改:

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

8
在处理遗留代码时,此答案尤其重要。我继承了其他人编写的代码,并且代码库充满了<? ?>(请注意,缺少php)。我的任务是添加或更改功能,只为一个或两个功能更改所有内容通常不是一个好主意。您的回答确实有帮助。
2016年

当场,如果您已升级到较新的Plesk托管软件或升级了PHP版本,则尤其值得注意。我们发现php.ini设置被破坏了,我们不得不再次对其进行设置,必须使用这一特定设置以避免文件错误的意外结束
Tahir Khalid

1
您救了我的命,;-)
Miguel S. Mendoza

mastar拯救生命!
卡米尔·丹布拉夫斯基

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:标签时,我遇到了这个麻烦。

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

好吧,如果(登录())里面有东西,我有很多代码要写,这只是一个示例。无论如何,这里的第一个答案已经解决了。我不知道必须放置一个空格。谢谢您的帮助!
pratnala 2012年

1
无论如何,我只是帮助了我,但我确实喜欢那样做。和你确定
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手册

警告请 务必注意,带有结束标识符的行除分号(;)之外,不得包含其他任何字符。特别是这意味着标识符可能不会缩进,并且在分号之前或之后可能没有空格或制表符。同样重要的是要认识到,结束标识符之前的第一个字符必须是本地操作系统定义的换行符。在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
}

0

另外,很难发现的另一种情况是当您只有一个带有功能的文件时,我知道这不是一个常见的用例,但它很烦人并且不得不发现错误。

<?php
function () {

}

上述返回文件的埃罗Parse error: syntax error, unexpected end of file in,而下面却没有。

<?php
function () {

};

0

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

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

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


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>

0

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


-1

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


-2

在我的情况下,我将内容复制到另一个文件,然后删除了php文件并创建了一个新文件,然后将内容再次复制到了同一文件,并且可以正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.