ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์จุดสิ้นสุดของไฟล์ที่ไม่คาดคิดในรหัส 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
หนึ่งปีครึ่งดังนั้นจึงเป็นเรื่องตลกที่คำถามนี้ถูกปิดเพราะมีการแปลเกินไป แต่มันมีมุมมองเกือบ 50k
pratnala

3
ฉันเห็นด้วย ... นี่เป็นการแก้ไขปัญหาของฉันโดยสิ้นเชิง ไม่ได้แปลเป็นภาษาท้องถิ่นในส่วนที่เกี่ยวกับคำถามและการแก้ปัญหา
Rocco The Taco

5
นอกจากนี้ยังตรวจสอบshort_tagsใน php.ini ของคุณภายใต้ทั้งสองapacheและcliconfigs
AO_

คำตอบ:


317

คุณควรหลีกเลี่ยงสิ่งนี้ (ในตอนท้ายของรหัสของคุณ):

{?>

และนี่:

<?php}

คุณไม่ควรวางวงเล็บไว้ใกล้กับphpแท็กเปิด / ปิดโดยตรง แต่แยกด้วยช่องว่าง:

{ ?>
<?php {

ยังหลีกเลี่ยง<?และใช้<?php


47
ในกรณีที่จะช่วยให้ทุกคน: ผมได้รับข้อผิดพลาดที่คล้ายกัน แต่เกิดจากการแทน<? } ?> <?php } ?>
อดัมLibuša

70
ฉันมี ptoblem ที่คล้ายกัน แต่กรณีของฉันคือฉันมี short_open_tag = Off ใน php.ini ของฉัน เมื่อฉันเปิดใช้งานเป็นเปิดรหัสของฉันก็ใช้งานได้
bksi

4
หมายเหตุในขณะที่ Apache ยอมรับ Nginx นี้ไม่ได้ (หรือมากกว่า fcgi ไม่) ดังนั้นหากคุณนิ่งงันเพราะเหตุใดจึงทำงานบนเว็บเซิร์ฟเวอร์เดียวและไม่ใช่อีกเว็บหนึ่งที่คุณรู้ว่าทำไม
Sammaye

คุณสามารถเพิ่มเพื่อหลีกเลี่ยง <<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
คำตอบนี้มีความสำคัญอย่างยิ่งเมื่อจัดการกับรหัสดั้งเดิม ฉันได้รับรหัสที่เขียนโดยบุคคลอื่นและ codebase นั้นเต็มไปด้วย<? ?>(โน้ตที่หายไปphp) ฉันได้รับมอบหมายให้เพิ่มหรือเปลี่ยนคุณสมบัติและโดยทั่วไปแล้วไม่ใช่ความคิดที่ดีที่จะเปลี่ยนทุกอย่างเพียงแค่คุณสมบัติหนึ่งหรือสองอย่าง คำตอบของคุณช่วยได้จริงๆ
Sal

โดยเฉพาะอย่างยิ่งสิ่งนี้เป็นสิ่งสำคัญหากคุณอัปเกรดเป็นซอฟต์แวร์โฮสติ้ง Plesk รุ่นใหม่เช่นหรืออัพเกรด PHP เวอร์ชันของคุณ เราพบว่าการตั้งค่า php.ini ถูกทิ้งในถังขยะและเราต้องผ่านการตั้งค่าอีกครั้งโดยเฉพาะสิ่งนี้ถูกต้องเพื่อหลีกเลี่ยงข้อผิดพลาดในตอนท้ายของไฟล์ที่ไม่คาดคิด
Tahir Khalid

1
คุณช่วยชีวิตฉันไว้, ;-)
มิเกลเอสเมนโดซา

mastar ช่วยชีวิต!
Kamil Dąbrowski

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

มองหาลูปหรือข้อความใด ๆ ที่ไม่ได้รับการเปิดเผย

ฉันพบปัญหานี้เมื่อฉันออกจาก phe foreach: tag unclosed

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

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

โดยที่ number 5 อาจเป็นหมายเลขบรรทัดสุดท้ายของไฟล์ของคุณ

ตามคู่มือ php :

คำเตือน มันสำคัญมากที่จะต้องทราบว่าบรรทัดที่มีตัวระบุการปิดจะต้องไม่มีตัวอักษรอื่นยกเว้นเซมิโคลอน (;) ซึ่งหมายความว่าโดยเฉพาะอย่างยิ่งที่ตัวระบุอาจไม่เยื้องและอาจไม่มีช่องว่างหรือแท็บใด ๆ ก่อนหรือหลังเครื่องหมายอัฒภาค สิ่งสำคัญคือต้องตระหนักว่าอักขระตัวแรกก่อนตัวระบุปิดจะต้องขึ้นบรรทัดใหม่ตามที่กำหนดโดยระบบปฏิบัติการท้องถิ่น นี่คือ \ n บนระบบ UNIX รวมถึง macOS ตัวคั่นการปิดจะต้องตามด้วยการขึ้นบรรทัดใหม่

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

สำหรับฉันสาเหตุที่พบบ่อยที่สุดคือตัวอักษรที่ละเว้น} ดังนั้นฟังก์ชันหรือถ้าบล็อกคำสั่งไม่ถูกยกเลิก ฉันแก้ไขได้โดยใส่อักขระ} หลังจากการแก้ไขล่าสุดของฉันและย้ายจากที่นั่น ฉันใช้ตัวแก้ไขที่สามารถค้นหาวงเล็บเปิดที่สอดคล้องกับวงเล็บปิดดังนั้นคุณลักษณะดังกล่าวก็ช่วยได้เช่นกัน

เราหวังว่าสักวันหนึ่งล่ามและนักแปลภาษาจะทำงานเพื่อสร้างข้อความแสดงข้อผิดพลาดที่ดีกว่าเนื่องจากง่ายต่อการละเว้นวงเล็บปิด

หากสิ่งนี้ช่วยใครได้โปรดโหวตให้คำตอบ


0

คุณไม่สามารถแบ่งคำแนะนำ IF / ELSE ออกเป็นสองช่วงตึกได้ หากคุณจำเป็นต้องใช้รหัส HTML เพื่อจะพิมพ์ใช้เสียงสะท้อน

<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

เพื่อเสริมคำตอบอื่น ๆ อาจเป็นเพราะการลดขนาดสคริปต์ PHP ของคุณโดยอัตโนมัติหากคุณใช้ไคลเอนต์ ftp เช่น FileZilla ตรวจสอบว่าชนิดการถ่ายโอนถูกตั้งค่าเป็น Binary ไม่ใช่ ASCII หรืออัตโนมัติ ประเภท ASCII หรือการถ่ายโอนอัตโนมัติสามารถลดรหัส php ของคุณซึ่งนำไปสู่ข้อผิดพลาดนี้


-1

หากการใช้ parse_ini_file ($ file) ของคุณหรือรูทีนกำลัง rading ไฟล์. ini ให้ตรวจสอบว่าข้อมูลของคุณถูกยกมาในไฟล์ ini หรือไม่ ข้อมูลที่ไม่ได้อ้างอิงจะทำให้เกิดข้อผิดพลาดนี้ Ex; data1 = test จะทำให้เกิดข้อผิดพลาด data1 = "test" จะไม่เกิดขึ้น


-2

ในกรณีของฉันฉันคัดลอกเนื้อหาไปยังไฟล์อื่นแล้วลบไฟล์ phpและสร้างขึ้นใหม่คัดลอกเนื้อหาไปยังไฟล์เดียวกันอีกครั้งและใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.