Lỗi phân tích cú pháp: Lỗi cú pháp, kết thúc tệp không mong muốn trong mã PHP của tôi


173

Tôi đã gặp một lỗi:

Parse error: syntax error, unexpected end of file in the line

Với mã này:

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

Có vấn đề gì vậy?


2
Tôi sẽ tưởng tượng bạn có lỗi với một số mã PHP của bạn ... mà bạn chưa đăng.
Yacoby

5
Có vẻ như bạn bị thiếu '}', ';' hoặc ngoặc nhưng sẽ hữu ích nếu bạn đăng cho bạn toàn bộ mã php
ryanc1256

14
Một năm rưỡi sau đó, thật buồn cười khi câu hỏi này đã bị đóng vì quá cục bộ nhưng nó đã có gần 50 nghìn lượt xem.
pratnala

3
Tôi đồng ý ... điều này hoàn toàn khắc phục vấn đề của tôi. Không được bản địa hóa ở tất cả các câu hỏi và giải pháp.
Rocco The Taco

5
Cũng cần kiểm tra short_tagstrong php.ini của bạn dưới CẢ apachecliconfigs
AO_

Câu trả lời:


317

Bạn nên tránh điều này (ở cuối mã của bạn):

{?>

và điều này:

<?php}

Bạn không nên đặt dấu ngoặc trực tiếp gần với thẻ mở / đóng php, nhưng tách nó bằng dấu cách:

{ ?>
<?php {

cũng tránh <?và sử dụng<?php


47
Trong trường hợp nó giúp được bất cứ ai: Tôi đã gặp một lỗi tương tự, nhưng gây ra bởi <? } ?>thay vì <?php } ?>.
Adam Libuša

70
Tôi đã có ptoblem tương tự nhưng trường hợp của tôi là tôi đã có short_open_tag = Tắt trong php.ini của tôi. Khi tôi bật nó thành Bật, mã của tôi đã hoạt động.
bksi

4
Lưu ý trong khi Apache chấp nhận điều này Nginx không (hoặc đúng hơn là fcgi không) vì vậy nếu bạn bị bối rối vì lý do này hoạt động trên một máy chủ web và không phải là một máy chủ khác bạn biết tại sao
Sammaye

Bạn có thể thêm để tránh điều này <? Php // echo $ pagetitle; ?> những dấu gạch chéo bình luận đang giết chết sự kết thúc?>
AndreaBogazzi

96

Tôi đã có cùng một lỗi, nhưng tôi đã sửa nó bằng cách sửa đổi php.initập tin.

Tìm tệp php.ini của bạn, xem Dude, php.ini của tôi đâu?

sau đó mở nó với trình soạn thảo yêu thích của bạn.

Tìm kiếm một short_open_tagtài sản và áp dụng thay đổi sau:

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

8
Câu trả lời này đặc biệt quan trọng khi xử lý mã kế thừa. Tôi đã thừa hưởng mã được viết bởi người khác và codebase có đầy đủ <? ?>(lưu ý, phần còn thiếu php). Tôi được giao nhiệm vụ thêm hoặc thay đổi các tính năng và thông thường không nên thay đổi mọi thứ chỉ vì một hoặc hai tính năng. Câu trả lời của bạn thực sự có ích.
Sal

Tại chỗ, điều này đặc biệt đáng chú ý nếu bạn đã nâng cấp lên phần mềm lưu trữ Plesk mới hơn hoặc nâng cấp phiên bản PHP của bạn. Chúng tôi thấy các cài đặt php.ini đã bị hỏng và chúng tôi phải tiếp tục thiết lập lại chúng, cài đặt đặc biệt này được yêu cầu để tránh lỗi kết thúc không mong muốn của tệp
Tahir Khalid

1
Bạn đã cứu mạng tôi, ;-)
Miguel S. Mendoza

mastar cứu mạng!
Kamil Dąbrowski

36

Tôi đã có cùng một lỗi, nhưng tôi đã sửa nó bằng cách sửa đổi php.ini và / hoặc chỉnh sửa tệp PHP!

Có hai phương pháp khác nhau để khắc phục cú pháp lỗi phân tích cú pháp.

Phương pháp 1 (Tệp PHP của bạn)

Tránh trong tệp PHP của bạn này:

<? } ?>

Hãy chắc chắn rằng bạn đặt nó như thế này

<?php ?>

Mã của bạn chứa <? ?>

LƯU Ý: Mất tích phpsau <?!

Phương pháp 2 (tệp php.ini)

Cũng có một cách đơn giản để giải quyết vấn đề của bạn. Tìm kiếm short_open_taggiá trị thuộc tính (Sử dụng trong trình soạn thảo văn bản của bạn với Ctrl + F!) Và áp dụng thay đổi sau:

; short_open_tag = Off

đến

short_open_tag = On

Theo mô tả của các lệnh php.ini lõi , short_open_tagcho phép bạn sử dụng thẻ mở ngắn ( <?) mặc dù điều này có thể gây ra sự cố khi sử dụng với xml ( <?xmlsẽ không hoạt động khi bật tính năng này)!

LƯU Ý: Tải lại Máy chủ của bạn (ví dụ như: Apache) và tải lại trang web PHP của bạn trong trình duyệt của bạn.


11

Chỉ cần truy cập php.ini sau đó tìm short_open_tag= Offthiết lập thànhshort_open_tag= On


6

Tìm kiếm bất kỳ vòng lặp hoặc tuyên bố là không được tiết lộ.

Tôi đã gặp rắc rối này khi tôi để lại một thẻ foreach php: không được tiết lộ.

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

Đóng nó bằng cách sử dụng sau đây đã giải quyết lỗi cú pháp: unexpected end of file

<?php endforeach; ?>

Hy vọng nó sẽ giúp được ai đó


5

Kiểm tra xem bạn đã đóng lớp của bạn.

Ví dụ: nếu bạn có lớp trình điều khiển với các phương thức và do vô tình bạn xóa dấu ngoặc cuối, đóng toàn bộ lớp, bạn sẽ gặp lỗi này.

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

4

Ngoài ra, hãy tìm một bình luận // phá vỡ dấu ngoặc nhọn

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

dấu ngoặc nhọn đóng sẽ không đóng đúng phần có điều kiện và php sẽ không xử lý đúng phần còn lại của mã.


3

Tránh điều này cũng như <? } ?>đảm bảo bạn đặt<?php } ?>


2

Tôi đã thấy một số lỗi, mà tôi đã sửa chữa dưới đây.

Đây là những gì tôi nhận được là sai lầm:

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

Đây là cách tôi sẽ làm điều đó:

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

Vâng, điều nằm bên trong nếu (login ()), tôi có rất nhiều mã để viết, đây chỉ là một mẫu. Dù sao câu trả lời đầu tiên ở đây đã giải quyết nó. Tôi không biết rằng một không gian phải được đặt. Cảm ơn đã giúp đỡ!
pratnala

1
yer chỉ giúp dù sao tôi đã nhận được điều đó nhưng tôi chỉ muốn làm theo cách đó. Và chắc chắn
ryanc1256

1

Trong trường hợp của tôi, thủ phạm là <?phpthẻ mở đơn độc ở dòng cuối cùng của tệp. Rõ ràng nó hoạt động trên một số cấu hình không có vấn đề nhưng gây ra vấn đề trên những người khác.


1

Ngoài ra, xem ra cho định danh đóng cửa heredoc.

Ví dụ không hợp lệ:

function findAll() {
    $query=<<<SQL
        SELECT * FROM `table_1`;
    SQL;
    // ... omitted
}

Điều này sẽ đưa ra một ngoại lệ tương tự như sau:

<br />
<b>Parse error</b>:  syntax error, unexpected end of file in <b>[...][...]</b> on line <b>5</b><br />

trong đó số 5 có thể là số dòng cuối cùng của tệp của bạn.

Theo hướng dẫn sử dụng php :

Cảnh báo Điều rất quan trọng cần lưu ý là dòng có mã định danh đóng phải không chứa các ký tự khác, ngoại trừ dấu chấm phẩy (;). Điều đó có nghĩa là đặc biệt là mã định danh có thể không được thụt lề và có thể không có bất kỳ khoảng trắng hoặc tab nào trước hoặc sau dấu chấm phẩy. Điều quan trọng nữa là phải nhận ra rằng ký tự đầu tiên trước mã định danh đóng phải là một dòng mới theo định nghĩa của hệ điều hành cục bộ. Đây là \ n trên các hệ thống UNIX, bao gồm cả macOS. Dấu phân cách đóng cũng phải được theo sau bởi một dòng mới.

TLDR : định danh Bế nên KHÔNG nên thụt lề định danh.

Ví dụ hợp lệ:

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

0

Ngoài ra, một trường hợp khác rất khó phát hiện là khi bạn có một tệp chỉ có chức năng, tôi biết đó không phải là trường hợp sử dụng thông thường nhưng nó gây khó chịu và phải phát hiện ra lỗi.

<?php
function () {

}

Các tập tin ở trên trả về erro Parse error: syntax error, unexpected end of file introng khi bên dưới thì không.

<?php
function () {

};

0

Đối với tôi, nguyên nhân thường gặp nhất là một ký tự bị bỏ qua}, do đó, một hàm hoặc nếu khối lệnh không bị chấm dứt. Tôi khắc phục điều này bằng cách chèn một ký tự} sau các chỉnh sửa gần đây của tôi và di chuyển nó từ đó. Tôi sử dụng một trình soạn thảo có thể xác định vị trí mở ngoặc tương ứng với dấu ngoặc đóng, vì vậy tính năng đó cũng giúp (nó định vị chức năng không được kết thúc chính xác).

Chúng tôi có thể hy vọng rằng một ngày nào đó trình thông dịch và trình biên dịch ngôn ngữ sẽ thực hiện một số công việc để tạo thông báo lỗi tốt hơn, vì rất dễ bỏ qua dấu ngoặc đóng.

Nếu điều này giúp bất cứ ai, xin vui lòng bỏ phiếu trả lời lên.


0

Bạn không thể chia hướng dẫn IF / ELSE thành hai khối riêng biệt. Nếu bạn cần mã HTML được in, hãy sử dụng 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

Để bổ sung các câu trả lời khác, đó cũng có thể là do tự động thu nhỏ tập lệnh php của bạn nếu bạn đang sử dụng ứng dụng khách ftp như FileZilla. Đảm bảo rằng loại chuyển được đặt thành Nhị phân và không phải ASCII hoặc tự động. ASCII hoặc loại chuyển tự động có thể giảm thiểu mã php của bạn dẫn đến lỗi này.


-1

Nếu bạn sử dụng parse_ini_file (tệp $) hoặc một thói quen đang phát ra tệp .ini, hãy kiểm tra xem dữ liệu của bạn có được trích dẫn trong tệp ini không. Dữ liệu không được trích dẫn sẽ gây ra lỗi này. Ví dụ; data1 = test sẽ gây ra lỗi, data1 = "test" sẽ không xảy ra.


-2

Trong trường hợp của tôi, tôi đã sao chép nội dung sang một tệp khác và sau đó xóa tệp php và tạo một tệp mới, sao chép lại nội dung đó vào cùng một tệp và nó đã hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.