当我尝试运行此页面(video.php)时,出现以下错误:
解析错误:语法错误,第37行/base/path/masked/inc/functions.php中的意外$ end
奇怪的是“functions.php”有超过37行...为什么它检测到文件的结尾?我不认为我缺少任何parens或括号,因为每个函数只有一个语句(一个打印语句)。
我已经做了几件事来尝试解决问题。如果我删除print_head()和print_foot()的函数定义中的语句,则错误消失(页面的其余部分工作正常)。如果我删除其中一个函数中的语句,我会得到相同的错误,只是在另一行上。如果我在页面上移动函数定义,我会得到相同的错误。我甚至尝试删除部分print语句,但我仍然遇到同样的错误。
编辑:
'videos / transfer / playlist'是get_vids()加载的示例文件。它是一个平坦的txt文件,具有偶数行;奇数行是视频文件的名称,偶数行是与前一个文件一起使用的标题。我已经测试过以确保get_vids()按预期工作。
编辑:
这是我尝试从命令行运行所有内容时得到的结果:
$ php -l video.php
No syntax errors detected in video.php
$ php video.php
Parse error: syntax error, unexpected $end in /home/nova20/http-dir/orientation/inc/functions.php on line 37
$ php -l inc/functions.php
Parse error: syntax error, unexpected $end in inc/functions.php on line 37
Errors parsing inc/functions.php
这是我的代码:
video.php:
<?php
include('inc/functions.php');
$type=$_GET['type'];
if($type == '') {
$type = 'transfer';
}
$vidno = $_GET['vid'];
if($vidno == '') {
$vidno = 1;
}
$vidindex = $vidno - 1;
$videos = get_vids($type);
$filename = $videos[$vidindex]['file'];
$title = $videos[$vidindex]['title'];
$basedir = "videos/$type";
$vidfile = "$basedir/$filename";
if($vidfile != '') {
$extra = '<script src="/flowplayer/flowplayer-3.1.4.min.js"></script>';
print_head($title, $extra);
print <<<ENDHTML
<p>
<a
href='$vidfile'
style="display:block;width:640px;height:498px;"
id="player"
></a>
</p>
<p id="contlink" style="display:none">
<a href="done.php?type=$type&vid=$vidno">Click Here to continue</a>
</p>
<script language="JavaScript">
flowplayer(
"player",
"/flowplayer/flowplayer-3.1.5.swf",
{
clip: {
onFinish: function(){
//window.location = "done.php";
//alert('done!');
document.getElementById('contlink').style.display = "block";
}
},
plugins: {
controls: {
play:true,
volume:true,
mute:true,
time:true,
stop:true,
fullscreen:true,
scrubber:false
}
}
}
);
</script>
ENDHTML;
print_foot();
} else {
print_head('OOPS!');
print <<<ENDERROR
<h1>OOPS!</h1>
<p>
It looks like there's no video here. <a onclick="history.go(-1);return false;" href="#">Go back</a> and try again.
</p>
ENDERROR;
print_foot();
}
?>
inc / functions.php(我认为问题所在):
<?php
function get_vids($type) {
$base = "videos/$type";
$playlist = "$base/playlist";
$vidinfo = file($playlist);
$videos = array();
for($i = 0; $i < count($vidinfo); $i += 2) {
$filename = trim($vidinfo[$i]);
$title = trim($vidinfo[$i+1]);
if($filename != '') {
$index = $i / 2;
$video['file'] = $filename;
$video['title'] = $title;
$videos[$index] = $video;
}
}
return($videos);
}
function print_head($title, $extra = '') {
print <<<ENDHEAD
<html>
<head>
<title>$title</title>
$extra
</head>
<body>
ENDHEAD;
}
function print_foot() {
print <<<ENDFOOT
</body>
</html>
ENDFOOT;
}
?>
视频/转移/播放列表
1.flv
Introduction
2.flv
Why am I doing this?
3.flv
What can I access with RAIN?
4.flv
How do I access my RAIN Account?
5.flv
How do I Check my registration status?
6.flv
Evaluating transfer credit
7.flv
Transferable degrees
8.flv
Physical Education and History
9.flv
Regents exemptions
10.flv
Academic status
11.flv
How to find my academic advisor?
12.flv
Is Financial Aid available?
13.flv
How do I check my financial aid status?
14.flv
How do I transfer my hope scholarship?
15.flv
Payment information
16.flv
Student Services (Part 1)
17.flv
Student Services (Part 2)
18.flv
Student Services (Part 3)
19.flv
Campus Bookstore
20.flv
Where can I eat on Campus?
21.flv
Where can I live on Campus?
22.flv
How do I register for Parking?
23.flv
Still Have questions?
答案 0 :(得分:4)
它本身并不是检测文件结尾,而是检测可执行代码行的逻辑结尾。
确保你的HEREDOC结束标记(ENDHEAD;和ENDFOOT;)之前没有空格 - the moment they're not the first token on the line, they don't register as HEREDOC end tokens but as an arbitrary string within,所以你的HEREDOC会占用更多的代码块。
这是唯一让我想到的事情 - php -l <your functions.php>
让我没有错误(但在ENDHEAD之前添加了一个空格;给了我描述的错误)。
答案 1 :(得分:0)
我为你修好了代码:
<?php
include('inc/functions.php');
$type=$_GET['type'];
if($type == '') {
$type = 'transfer';
}
$vidno = $_GET['vid'];
if($vidno == '') {
$vidno = 1;
}
$vidindex = $vidno - 1;
$videos = get_vids($type);
$filename = $videos[$vidindex]['file'];
$title = $videos[$vidindex]['title'];
$basedir = "videos/$type";
$vidfile = "$basedir/$filename";
if($vidfile != '') {
$extra = '<script src="/flowplayer/flowplayer-3.1.4.min.js"></script>';
print_head($title, $extra);
?>
<p>
<a
href='<?=$vidfile;?>'
style="display:block;width:640px;height:498px;"
id="player"
></a>
</p>
<p id="contlink" style="display:none">
<a href="done.php?type=<?=$type;?>&vid=<?=$vidno;?>">Click Here to continue</a>
</p>
<script language="JavaScript">
flowplayer(
"player",
"/flowplayer/flowplayer-3.1.5.swf",
{
clip: {
onFinish: function(){
//window.location = "done.php";
//alert('done!');
document.getElementById('contlink').style.display = "block";
}
},
plugins: {
controls: {
play:true,
volume:true,
mute:true,
time:true,
stop:true,
fullscreen:true,
scrubber:false
}
}
}
);
</script>
<?php
print_foot();
} else {
print_head('OOPS!');
?>
<h1>OOPS!</h1>
<p>
It looks like there's no video here. <a onclick="history.go(-1);return false;" href="#">Go back</a> and try again.
</p>
<?php
print_foot();
}
?>
你可以打开和关闭你想要显示的html周围的php标签 - 正如你将在上面看到的那样:)
希望有所帮助