解析エラー:構文エラー、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 2012

5
「}」、「;」が欠落しているようです またはブラケットですが、phpコード全体を投稿した場合に役立ちます
ryanc1256

14
それから1年半、この質問はローカライズされすぎているために閉じられたのはおかしいですが、ビューは5万回近くあります。
プラトナラ2013年

3
同意します...これで問題が完全に修正されました。質問と解決策に関してはローカライズされていません。
Rocco The Taco

5
またのチェックshort_tagsの両方で、あなたのphp.iniのapachecliコンフィグ
AO_

回答:


317

これは避けてください(コードの最後)。

{?>

この:

<?php}

ブラケットを開始/終了phpタグのすぐ近くに配置するのではなく、スペースで区切ります。

{ ?>
<?php {

また避け<?て使用する<?php


47
それが誰かを助ける場合:私は同様のエラーを受け取りましたが、<? } ?>代わりにが原因です<?php } ?>
アダムLibuša2013年

70
私は同様の問題を抱えていましたが、私のphp.iniにshort_open_tag = Offが含まれている場合がありました。オンにすると、コードが機能しました。
bksi 14

4
ApacheがこのNginxを受け入れない(またはfcgiが受け入れない)ので、なぜこれが1つのWebサーバーで機能し、別のWebサーバーで機能しないのかがわからない場合は、理由を知ってください
Sammaye

この<?php // echo $ pagetitle;も回避するために追加できますか??>コメントスラッシュが終了を殺している?>
AndreaBogazzi

96

同じエラーが発生しましたが、php.iniファイルを変更して修正しました。

php.iniファイルを見つけて、私のphp.iniはどこにありますか?

次に、お気に入りのエディターで開きます。

short_open_tagプロパティを探し、次の変更を適用します。

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

8
この答えは、レガシーコードを扱うときに特に重要です。私は他の誰かが書いたコードを継承しましたが、コードベースはいっぱいでした<? ?>(注:がありませんphp)。私は機能を追加または変更する必要があります。通常、1つまたは2つの機能についてのみすべてを変更することはお勧めできません。あなたの答えは本当に役に立ちました。
2016

注目してください。これは、たとえば新しいPleskホスティングソフトウェアにアップグレードした場合や、PHPバージョンをアップグレードした場合に特に注目に値します。php.iniの設定が壊れてしまったため、もう一度設定する必要がありました。この特定の設定は、予期しないファイルの終わりエラーを回避するために必要でした
Tahir Khalid

1
あなたは私の命を救った;-)
ミゲルS.メンドーサ

マスターは命を救う!
KamilDąbrowski

36

同じエラーが発生しましたが、php.iniを変更したり、PHPファイルを編集したりして修正しました。

構文解析エラー構文を回避するには、2つの異なる方法があります。

方法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 Webページをリロードします。



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>

(login())の場合、内部にコードがたくさんあるので、これは単なるサンプルです。とにかく、ここの最初の答えはそれを解決しました。スペースを入れる必要があることを知りませんでした。助けてくれてありがとう!
プラトナラ2012

1
とにかく私はそれを手に入れましたが、私はそのようにしたいのです。そして確かに
ryanc1256

1

私の場合、犯人は<?phpファイルの最後の行の唯一の開始タグでした。どうやら、それはいくつかの構成で問題なく動作しますが、他の構成で問題を引き起こします。


1

また、ヒアドキュメントの終了識別子にも注意してください。

無効な例:

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マニュアルによると:

警告 終了識別子のある行には、セミコロン(;)以外の文字を含めないでください。これは、特に識別子がインデントされていない可能性があり、セミコロンの前後にスペースやタブがない可能性があることを意味します。終了識別子の前の最初の文字は、ローカルオペレーティングシステムで定義されている改行でなければならないことを認識することも重要です。これは、macOSを含むUNIXシステムの\ nです。終了デリミタの後には改行も続く必要があります。

TLDR:終了識別子はインデントしないでください。

有効な例:

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

0

また、関数だけのファイルがある場合に見つけるのが難しいもう1つのケースは、それが一般的な使用例ではないことはわかっていますが、迷惑であり、エラーを見つける必要がありました。

<?php
function () {

}

上記のファイルはエラーParse error: syntax error, unexpected end of file inを返しますが、以下のファイルはそうではありません。

<?php
function () {

};

0

私にとって、最も頻繁な原因は省略された}文字であるため、関数またはifステートメントブロックが終了しません。これを修正するには、最近の編集の後に}文字を挿入し、そこから移動します。私は、右大かっこに対応する大かっこを見つけることができるエディタを使用しているため、この機能も役立ちます(正しく終了しなかった関数を見つけます)。

終わりのかっこを省略しやすいので、いつか言語インタープリターとコンパイラーがより適切なエラーメッセージを生成するための作業を行うことを期待できます。

これが誰かを助けるなら、答えを投票してください。


0

IF / ELSE命令を2つの別々のブロックに分割することはできません。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

他の回答を補足するために、FileZillaのようなftpクライアントを使用している場合は、phpスクリプトの自動縮小が原因である可能性もあります。転送タイプがASCIIやautoではなくBinaryに設定されていることを確認します。ASCIIまたは自動転送タイプは、このエラーにつながるphpコードを縮小できます。


-1

parse_ini_file($ file)またはルーチンを使用して.iniファイルを表示している場合は、iniファイルでデータが引用されているかどうかを確認してください。引用符で囲まれていないデータは、このエラーの原因になります。例; data1 = testはエラーを引き起こし、data1 = "test"はエラーを引き起こしません。


-2

私の場合、コンテンツを別のファイルにコピーしてから、phpファイル削除して新しいファイルを作成し、コンテンツを同じファイルに再度コピーしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.