Błąd analizy: błąd składni, nieoczekiwany koniec pliku w moim kodzie PHP


173

Wystąpił błąd:

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

Za pomocą tego kodu:

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

Jaki jest problem?


2
Wyobrażam sobie, że masz błąd w części kodu PHP ... którego nie opublikowałeś.
Yacoby,

5
Wygląda na to, że brakuje ci '}', ';' lub nawias, ale pomogłoby, gdybyś wysłał cały kod php
ryanc1256

14
Za półtora roku to zabawne, że to pytanie zostało zamknięte, bo jest zbyt zlokalizowane, ale ma prawie 50 tys. Wyświetleń.
pratnala

3
Zgadzam się ... to całkowicie rozwiązało mój problem. W ogóle nie zlokalizowane w odniesieniu do pytania i rozwiązania.
Rocco The Taco

5
Sprawdź również short_tagsw swoim php.ini w OBU apachei clikonfiguracjach
AO_

Odpowiedzi:


317

Powinieneś tego unikać (na końcu swojego kodu):

{?>

i to:

<?php}

Nie powinieneś umieszczać nawiasów bezpośrednio blisko phptagu otwórz / zamknij , ale oddziel go spacją:

{ ?>
<?php {

także unikaj <?i używaj<?php


47
Na wypadek, gdyby to komuś pomogło: Mam podobny błąd, ale spowodowany przez <? } ?>zamiast <?php } ?>.
Adam Libuša

70
Miałem podobny problem, ale moim przypadkiem było to, że miałem short_open_tag = Off w moim php.ini. Kiedy włączyłem go, mój kod działał.
bksi,

4
Uwaga, podczas gdy Apache akceptuje tę Nginx nie jest (lub raczej fcgi nie), więc jeśli jesteś zakłopotany przez dlaczego to działa na jednym serwerze WWW, a nie inny wiesz dlaczego
Sammaye

Czy możesz dodać, aby uniknąć również tego <? Php // echo $ pagetitle; ?> ukośniki w komentarzach zabijają zamknięcie?>
AndreaBogazzi

96

Miałem ten sam błąd, ale naprawiłem go, modyfikując php.iniplik.

Znajdź swój plik php.ini, zobacz Koleś, gdzie jest moje php.ini?

następnie otwórz go w swoim ulubionym edytorze.

Poszukaj short_open_tagwłaściwości i zastosuj następującą zmianę:

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

8
Ta odpowiedź jest szczególnie ważna w przypadku starszego kodu. Odziedziczyłem kod napisany przez kogoś innego, a baza kodu była pełna <? ?>(uwaga, brak php). Mam za zadanie dodawać lub zmieniać funkcje i zazwyczaj nie jest dobrym pomysłem po prostu zmieniać wszystko tylko dla jednej lub dwóch funkcji. Twoja odpowiedź naprawdę pomogła.
Sal

Jest to szczególnie godne uwagi, jeśli na przykład zaktualizowałeś do nowszego oprogramowania hostingowego Plesk lub zaktualizowałeś wersję PHP. Okazało się, że ustawienia php.ini zostały zniszczone i musieliśmy je ponownie ustawić, ten konkretny był wymagany, aby uniknąć nieoczekiwanego błędu końca pliku
Tahir Khalid

1
Uratowałeś mi życie ;-)
Miguel S. Mendoza

mastar ratuj życie!
Kamil Dąbrowski

36

Miałem ten sam błąd, ale naprawiłem go, modyfikując php.ini i / lub edytując plik PHP!

Istnieją dwie różne metody obejścia składni błędu analizy.

Metoda 1 (Twój plik PHP)

Unikaj w swoim pliku PHP tego:

<? } ?>

Upewnij się, że umieściłeś to w ten sposób

<?php ?>

Twój kod zawiera <? ?>

UWAGA: brakujące phppo <?!

Metoda 2 (plik php.ini)

Istnieje również prosty sposób rozwiązania problemu. Wyszukaj short_open_tagwartość właściwości (użyj w edytorze tekstu z Ctrl + F!) I zastosuj następującą zmianę:

; short_open_tag = Off

do

short_open_tag = On

Zgodnie z opisem podstawowych dyrektyw php.ini , short_open_tagpozwala na użycie krótkiego otwartego znacznika ( <?), chociaż może to powodować problemy, gdy jest używane z xml ( <?xmlnie będzie działać, gdy jest włączone)!

UWAGA: Załaduj ponownie swój serwer (jak na przykład: Apache) i ponownie załaduj stronę PHP w przeglądarce.


11

Po prostu przejdź do php.ini, a następnie znajdź short_open_tag= Offustawienieshort_open_tag= On


6

Poszukaj wszelkich pętli lub instrukcji, które nie są zamknięte.

Wpadłem w ten problem, kiedy zostawiłem plik php foreach: tag niezamknięty.

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

Zamknięcie go za pomocą następującego rozwiązania rozwiązało błąd składniowy: unexpected end of file

<?php endforeach; ?>

Mam nadzieję, że to komuś pomoże


5

Sprawdź, czy zamknąłeś swoje zajęcia.

Na przykład, jeśli masz klasę kontrolera z metodami i przypadkowo usuniesz ostatni nawias zamykający całą klasę, otrzymasz ten błąd.

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

4

poszukaj również komentarza, // który łamie zamykający nawias klamrowy

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

zamykający nawias klamrowy nie zamknie poprawnie sekcji warunkowej, a php nie przetworzy poprawnie pozostałej części kodu.


3

Unikaj tego również <? } ?>upewnij się, że umieściłeś<?php } ?>


2

Widziałem błędy, które poprawiłem poniżej.

Oto, co otrzymałem jako błędne:

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

Oto jak bym to zrobił:

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

Cóż, rzecz jest w środku, jeśli (login ()), mam dużo kodu do napisania, to tylko przykład. W każdym razie pierwsza odpowiedź tutaj rozwiązała problem. Nie wiedziałem, że trzeba wstawić miejsce. Dzięki za pomoc!
pratnala

1
i tak po prostu pomagasz. Dostałem to, ale po prostu lubię to robić w ten sposób. I na pewno
ryanc1256

1

W moim przypadku winowajcą był samotny otwierający <?phptag w ostatniej linii pliku. Najwyraźniej działa w niektórych konfiguracjach bez żadnych problemów, ale powoduje problemy w innych.


1

Uważaj też na identyfikatory zamykające heredoc.

Nieprawidłowy przykład:

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

Spowoduje to zgłoszenie wyjątku podobnego do następującego:

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

gdzie numer 5 może być numerem ostatniej linii twojego pliku.

Zgodnie z instrukcją php :

Ostrzeżenie Bardzo ważne jest, aby pamiętać, że wiersz z identyfikatorem zamykającym nie może zawierać żadnych innych znaków, z wyjątkiem średnika (;). Oznacza to w szczególności, że identyfikator nie może być wcięty, a przed lub po średniku nie może być żadnych spacji ani tabulatorów. Ważne jest również, aby zdać sobie sprawę, że pierwszy znak przed identyfikatorem zamykającym musi być znakiem nowej linii, zgodnie z definicją w lokalnym systemie operacyjnym. Dotyczy to \ n systemów UNIX, w tym macOS. Po ograniczniku zamykającym należy również umieścić nowy wiersz.

TLDR : identyfikatory zamknięcia NIE powinny być wcięte.

Prawidłowy przykład:

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

0

Innym przypadkiem, w którym trudno go zauważyć, jest plik zawierający tylko funkcję, wiem, że nie jest to typowy przypadek użycia, ale jest denerwujący i musiał wykryć błąd.

<?php
function () {

}

Plik powyżej zwraca błąd, Parse error: syntax error, unexpected end of file inpodczas gdy poniższy nie.

<?php
function () {

};

0

Dla mnie najczęstszą przyczyną jest pominięty znak}, dzięki czemu funkcja lub blok instrukcji nie są przerywane. Naprawiam to, wstawiając znak} po moich ostatnich edycjach i przenosząc go stamtąd. Używam edytora, który może zlokalizować nawiasy otwierające odpowiadające nawiasom zamykającym, więc ta funkcja również pomaga (lokalizuje funkcję, która nie została poprawnie zakończona).

Możemy mieć nadzieję, że pewnego dnia interpretery i kompilatory języków wykonają jakąś pracę, aby wygenerować lepsze komunikaty o błędach, ponieważ tak łatwo jest pominąć nawias zamykający.

Jeśli to komuś pomoże, zagłosuj na odpowiedź.


0

Nie możesz podzielić instrukcji IF / ELSE na dwa oddzielne bloki. Jeśli potrzebujesz wydrukować kod HTML, użyj 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

Aby uzupełnić inne odpowiedzi, może to być również spowodowane automatyczną minifikacją skryptu php, jeśli używasz klienta ftp, takiego jak FileZilla. Upewnij się, że typ transferu jest ustawiony na Binary, a nie ASCII lub auto. Typ ASCII lub transfer automatyczny może zminimalizować kod php, prowadząc do tego błędu.


-1

Jeśli używasz parse_ini_file ($ file) lub procedura raduje plik .ini, sprawdź, czy dane są cytowane w pliku ini. Brak cytowania danych spowoduje ten błąd. Dawny; data1 = test spowoduje błąd, data1 = "test" nie.


-2

W moim przypadku skopiowałem zawartość do innego pliku, a następnie usunąłem plik php i utworzyłem nowy, skopiowałem zawartość ponownie do tego samego pliku i zadziałało.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.