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

我得到一个错误:

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>

有什么问题吗?

955076 次浏览

我看到了一些错误,我在下面进行了修复。

以下是我得出的错误结论:

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}

你不应该把括号直接放在打开/关闭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,然后找到short_open_tag= Off设置为short_open_tag= On

检查你是否下课了。

例如,如果你有一个带有方法的控制器类,并且不小心删除了结束整个类的最后一个括号,你就会得到这个错误。

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

<? } ?>确保你输入了<?php } ?>

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

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

方法1(您的PHP文件)

避免在你的PHP文件:

<? } ?>

确保你这样写

<?php ?>

你的代码包含<? ?>

< em >注意:< / em > 在__ABC1之后缺少php !

方法二(php.ini文件)

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

; short_open_tag = Off

short_open_tag = On

根据php.ini核心指令的描述short_open_tag允许你使用短的打开标记(<?),尽管当与xml一起使用时,这可能会导致问题(当启用此功能时,<?xml将不起作用)!

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

另外,寻找一个注释//,它打断了右大括号

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

右花括号不能正确地关闭条件部分,PHP也不能正确地处理剩余的代码。

查看是否有未关闭的循环或语句。

当我没有关闭php foreach:标记时,我就遇到了这个麻烦。

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

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

<?php endforeach; ?>

希望它能帮助到别人

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

<?php
function () {


}

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

<?php
function () {


};

如果你使用parse_ini_file($file)或一个例程读取一个.ini文件,检查你的数据是否在ini文件中被引用。未引用的数据将导致此错误。交货;Data1 =test会导致错误,Data1 ="test"不会。

在我的例子中,罪魁祸首是文件最后一行中唯一的<?php开始标记。显然,它在某些配置上没有问题,但在其他配置上却会引起问题。

对我来说,最常见的原因是省略了}字符,这样函数或if语句块就不会终止。我通过在最近的编辑之后插入一个}字符并从那里移动它来解决这个问题。我使用了一个编辑器,它可以定位对应于结束方括号的开始方括号,所以这个功能也有帮助(它定位了没有正确结束的函数)。

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

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

另外,要注意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 manual:

< >强警告 非常重要的一点是,带有结束标识符的行不能包含任何其他字符,除了分号(;)。这尤其意味着标识符不能缩进,分号前后不能有任何空格或制表符。同样重要的是,要认识到结束标识符前的第一个字符必须是由本地操作系统定义的换行符。这在UNIX系统上是\n,包括macOS。结束分隔符后面也必须跟一个换行符

< >强TLDR < / >强:关闭标识符应该缩进。

有效的例子:

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


// ...
}

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

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

这不是对您的代码的回答,而是对相同错误消息的回答。它可能对某人有帮助。 在我的情况下,我有一个错误'解析错误:语法错误,在我的PHP代码第665行文件意外结束' 在我的情况下,问题是在一行关闭'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

set short_open_tag = Off to short_open_tag = On 并在apache2的情况下重新启动服务 sudo systemctl restart apache2.service < / p >