views:

100

answers:

2

When I try to run this page (video.php), I get the following error:

Parse error: syntax error, unexpected $end in /base/path/masked/inc/functions.php on line 37

The strange thing is "functions.php" has more than 37 lines... why is it detecting an end of file there? I don't think I'm missing any parens or brackets since each function is only one statement (a print statement) long.

I've done several things to try and fix the problem. If I remove the statements in the function definition for both print_head() and print_foot(), the error goes away (the rest of the page works fine). If I remove statements in either one of the functions, I get the same error, just on a different line. If I move the function definitions around on the page, I get the same error. I've even tried removing parts of the print statement, but I still get the same error.

EDIT:
'videos/transfer/playlist' is an example file that get_vids() loads. It's a flat txt file with an even number of lines; odd lines are the name of a video file, and even lines are the title that go with the preceding file. I've tested to make sure get_vids() works as expected.

EDIT:
Here's what I get when I try to run everything from the command line:

$ 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

Here's my code:

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 (where I think the problem is):

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

videos/transfer/playlist

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

I've fixed the code for you:

    <?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();
}
?>

You can just open and close the php tags around the html that you want to display - as you will see above :)

Hope that helps

Tim
'those strange "print <<<ENDHTML" bits' are called Heredoc blocks, by the way. :)
pinkgothic
Ah right, never ever seen those before!?
Tim
There HEREDOCs are not causing the problem; I think pinkgothic is on the right track.
JYelton
"Heredoc is a robust way to create string in PHP with more lines but without using quotations. Heredoc is rarely used as the day by day usage is more complicated as creating strings with quotes or double quotes. Besides this the not properly used heredoc can lead to problems in your code."...That'll be why I haven't come across it, then :D
Tim
That may work sometimes, but it doesn't always work. For instance, I want php to evaluate the values of $title and $extra in "print_head" instead of actually printing out "$title" and "$extra". Heredocs allow me to just type in those variables without adding extra php tags and print statements.
Tim F.
+3  A: 

It's not detecting an end-of-file, per se, but a logical end of the executable lines of code.

Make sure your HEREDOC end tokens (ENDHEAD; and ENDFOOT;) have no spaces before them - 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, so your HEREDOC eats up more of the codeblock.

That's the only thing that comes to mind - php -l <your functions.php> netted me no errors (but adding a space before ENDHEAD; gave me the error you described).

pinkgothic
Close, but no cigar. I forgot to mention I tried splitting the heredoc block into individual print statements and got the same error.
Tim F.
Well, the stuff you pasted checks out fine, though. As in, pasting it into a local file and doing `php -l` yields `No syntax errors detected [...]` (on both files). Try pasting what you put here back into a local file and see if that fixes it? Maybe there's a hidden broken character (e.g. half a UTF-8 character) somewhere that's triggering it.
pinkgothic
php -l inc/functions.php gives me the syntax error. I edited the post to reflect that.
Tim F.
And it still happens even if you paste the code you put here back into a blank file and replace `inc/functions.php` with it? o.O
pinkgothic
problem solved. I copied functions.php from this page onto my actual copy of functions.php (and replaced occurances of " " with tabs) and it worked just fine. Maybe my editor put in a weird character somewhere. I feel like an ID-10T. Thanks for your help.
Tim F.
Don't feel like an idiot, broken characters are the worst kind of error! And it's the last thing one looks for, usually. Glad to help.
pinkgothic