Ayrıştırma hatası: Sözdizimi hatası, PHP kodumda beklenmeyen dosya sonu


173

Bir hata aldım:

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

Bu kodla:

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

Sorun ne?


2
PHP kodunuzla ilgili bir hata yaptığınızı hayal ediyorum ...
Yacoby

5
Görünüşe göre eksik bir '}', ';' veya parantez ancak size tüm php kodunu
gönderirseniz

14
Bu yüzden bir buçuk yıl, bu sorunun çok lokalize olduğu için neredeyse 50 bin görüşe sahip olması komik.
pratnala

3
Kabul ediyorum ... bu tamamen sorunumu çözdü. Soru ve çözüm açısından hiç yerelleştirilmemiştir.
Rocco The Taco

5
Ayrıca short_tagsİKİ apacheve cliyapılandırmalar altında php.ini kontrol edin
AO_

Yanıtlar:


317

Bundan kaçınmalısınız (kodunuzun sonunda):

{?>

ve bu:

<?php}

Köşeli parantezleri doğrudan açma / kapama phpetiketine yakın yerleştirmemeli , boşlukla ayırmalısınız:

{ ?>
<?php {

ayrıca kaçının <?ve kullanın<?php


47
Kimseye yardım etmesi durumunda: Benzer bir hatayla karşılaştım, <? } ?>bunun yerine <?php } ?>.
Adam Libuša

70
Ben benzer ptoblem vardı ama benim durumum benim php.ini short_open_tag = Off vardı. Açık olarak ayarladığımda, kodum çalıştı.
bksi

4
Apache bu Nginx kabul etmez (veya daha ziyade fcgi değil) kabul edersiniz, bu yüzden bunun neden bir web sunucusunda çalıştığını ve bir başkası üzerinde çalıştığını bilmiyorsanız, neden olduğunu biliyorsunuz
Sammaye

Ayrıca bu <? Php // echo $ pagetitle; ?> yorum eğik çizgiler kapanış öldürüyor?>
AndreaBogazzi

96

Aynı hatayla karşılaştım, ancak php.inidosyayı değiştirerek düzelttim .

Php.ini dosyanızı bulun Dude, benim php.ini nerede?

ardından favori düzenleyicinizle açın.

Bir short_open_tagmülk arayın ve aşağıdaki değişikliği uygulayın:

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

8
Bu cevap özellikle eski kodlarla uğraşırken önemlidir. Başka biri tarafından yazılmış kod devralındı ​​ve kod temeli dolu <? ?>(Not, eksik php). Özellik eklemek veya değiştirmekle görevlendirildim ve genellikle sadece bir veya iki özellik için her şeyi değiştirmeyi denemek iyi bir fikir değil . Cevabınız gerçekten yardımcı oldu.
Sal

Örneğin, yeni Plesk barındırma yazılımına yükseltme yaptıysanız veya PHP sürümünüzü yükselttiyseniz, bu özellikle dikkat çekicidir. Php.ini ayarlarının çöpe atıldığını gördük ve onları tekrar ayarlamak zorunda kaldık, bu belirli bir dosya hatasının beklenmedik sonunu önlemek için gerekliydi
Tahir Khalid

1
Hayatımı kurtardın ;-)
Miguel S. Mendoza

mastar hayat kurtar!
Kamil Dąbrowski

36

Aynı hatayla karşılaştım, ancak php.ini dosyasını değiştirerek ve / veya PHP dosyasını düzenleyerek düzelttim!

Ayrıştırma hatası sözdizimini aşmanın iki farklı yöntemi vardır.

Yöntem 1 (PHP dosyanız)

PHP dosyanızda aşağıdakilerden kaçının:

<? } ?>

Böyle koyduğunuzdan emin olun

<?php ?>

Kodunuz şunları içerir <? ?>

NOT: Sonra eksik !php<?

Yöntem 2 (php.ini dosyası)

Sorununuzu çözmenin basit bir yolu da vardır. short_open_tagÖzellik değerini arayın (ile metin düzenleyicinizde Ctrl + F! İle kullanın ) ve aşağıdaki değişikliği uygulayın:

; short_open_tag = Off

için

short_open_tag = On

Temel php.ini yönergelerinin açıklamasına göre short_open_tag, kısa açık etiketi ( <?) kullanmanıza izin verir , ancak bu xml ile kullanıldığında sorunlara neden olabilir ( <?xmlbu etkinleştirildiğinde çalışmayacaktır)!

NOT: Sunucunuzu yeniden yükleyin (örneğin: Apache) ve PHP web sayfanızı tarayıcınıza yeniden yükleyin.



6

Döngüler veya ifadeler açıklanmadan bırakılır.

Ben php foreach: etiket kapatılmadığında bu sorunla karşılaşmıştı.

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

Aşağıdakileri kullanarak kapatmak, sözdizimi hatasını çözdü: unexpected end of file

<?php endforeach; ?>

Umarım birine yardımcı olur


5

Sınıfınızı kapattığınızdan emin olun.

Örneğin, yöntemlerle denetleyici sınıfınız varsa ve yanlışlıkla tüm sınıfı kapatan son köşeli parantezleri silerseniz, bu hatayı alırsınız.

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

4

ayrıca, kapanan süslü ayracı kıran bir yorum // bulun

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

kapanış küme ayracı koşullu bölümü düzgün bir şekilde kapatmayacak ve php kodun geri kalanını düzgün bir şekilde işlemeyecektir.


3

Bundan kaçının ve <? } ?>koyduğunuzdan emin olun.<?php } ?>


2

Aşağıda düzelttiğim bazı hatalar gördüm.

Hatalı olarak aldığım şey bu:

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

Ben böyle yapardı:

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

Şey (login ()), içinde yazmak için kod çok şey varsa, bu sadece bir örnek. Her neyse, buradaki ilk cevap çözüldü. Bir boşluk bırakılması gerektiğini bilmiyordum. Yardım için teşekkürler!
pratnala

1
sadece yardım ettim ama ben bunu aldım ama bunu böyle yapmaktan hoşlanıyorum. Ve yer emin
ryanc1256 14:12

1

Benim durumumda suçlu, <?phpdosyanın son satırındaki yalnız açılış etiketiydi. Görünüşe göre bazı yapılandırmalarda sorunsuz çalışıyor ancak diğerlerinde sorunlara neden oluyor.


1

Ayrıca, heredoc kapanış tanımlayıcılarına dikkat edin.

Geçersiz Örnek:

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

Bu, aşağıdakine benzer bir istisna atar:

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

burada 5 sayısı dosyanızın son satır numarası olabilir.

Php kılavuzuna göre :

Uyarı Kapatma tanımlayıcısına sahip satırın noktalı virgül (;) dışında başka karakter içermemesi gerektiğine dikkat etmek çok önemlidir. Bu, özellikle tanımlayıcının girintilemeyebileceği ve noktalı virgülden önce veya sonra boşluk veya sekme bulunmayabileceği anlamına gelir. Kapatma tanımlayıcısından önceki ilk karakterin yerel işletim sistemi tarafından tanımlanan yeni bir satır olması gerektiğini de bilmek önemlidir. MacOS dahil UNIX sistemlerinde bu \ n'dir. Kapanış sınırlayıcıyı da bir satırsonu izlemelidir.

TLDR : Kapanış tanımlayıcılar gerekir DEĞİL girintili.

Geçerli Örnek:

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

0

Ayrıca, tespit etmek zor başka bir durumda, sadece bir işlevi olan bir dosya olduğunda, ortak bir kullanım durumu olmadığını biliyorum ama sinir bozucu ve hatayı tespit etmek zorunda kaldı.

<?php
function () {

}

Yukarıdaki dosya erro döndürür, Parse error: syntax error, unexpected end of file inancak aşağıdaki dosya döndürmez .

<?php
function () {

};

0

Benim için en sık karşılaşılan neden atlanmış bir} karakteridir, böylece bir işlev ya da deyim bloğu sonlandırılmaz. Bunu, son düzenlemelerimden sonra bir} karakteri ekleyip oradan hareket ettirerek düzeltirim. Kapatma dirseğine karşılık gelen açılış köşeli ayraçları bulabilen bir düzenleyici kullanıyorum, böylece özellik de yardımcı oluyor (doğru sonlandırılmamış işlevi bulur).

Bir gün dil tercümanlarının ve derleyicilerinin daha iyi hata mesajları üretmek için bazı işler yapmasını umabiliriz, çünkü bir kapanış parantezini atlamak çok kolaydır.

Bu herkese yardımcı olursa, lütfen cevabı oylayın.


0

IF / ELSE talimatlarını iki ayrı bloğa bölemezsiniz. Yazdırılacak HTML koduna ihtiyacınız varsa echo kullanın .

<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

Diğer cevapları desteklemek için, FileZilla gibi bir ftp istemcisi kullanıyorsanız, php komut dosyanızın otomatik olarak küçültülmesinden de kaynaklanabilir. Aktarım türünün ASCII veya otomatik olarak İkili olarak ayarlandığından emin olun. ASCII veya otomatik aktarım türü, bu hataya neden olan php kodunuzu küçültebilir.


-1

Parse_ini_file ($ file) veya bir rutini bir .ini dosyasıyla gölgelendiriyorsanız, verilerinizin ini dosyasında alıntılanıp alıntılanmadığını kontrol edin. Alıntılanmamış veriler bu hataya neden olur. Örn; data1 = test hataya neden olur, data1 = "test" olmaz.


-2

Benim durumumda içeriği başka bir dosyaya kopyaladım ve sonra php dosyasını sildim ve yeni bir dosya oluşturdum, içerikleri tekrar aynı dosyaya kopyaladım ve çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.