Referans - Bu hata PHP'de ne anlama geliyor?

Oct 08 2012

Bu nedir?

Bu, PHP'yi programlarken karşılaşabileceğiniz uyarılar, hatalar ve bildirimler hakkında bir dizi yanıttır ve bunları nasıl düzelteceğiniz konusunda hiçbir fikriniz yoktur. Bu aynı zamanda bir Topluluk Wiki'sidir, bu nedenle herkes bu listeye eklenmeye ve bu listeyi sürdürmeye davet edilir.

Bu neden?

Stack Overflow'da "Başlıklar zaten gönderildi" veya "Nesne olmayan bir üyeyi çağırma " gibi sorular sıklıkla açılır. Bu soruların temel nedeni her zaman aynıdır. Dolayısıyla, bu soruların cevapları genellikle onları tekrar eder ve ardından OP'ye kendi özel durumlarında hangi satırın değiştirileceğini gösterir. Bu cevaplar siteye herhangi bir değer katmaz çünkü sadece OP'nin özel kodu için geçerlidir. Aynı hataya sahip diğer kullanıcılar, çok yerelleştirilmiş oldukları için çözümü bundan kolayca okuyamazlar. Bu üzücü çünkü asıl nedeni anladıktan sonra hatayı düzeltmek önemsizdir. Bu nedenle, bu liste çözümü genel bir uygulama şeklinde açıklamaya çalışmaktadır.

Burada ne yapmalıyım?

Sorunuz bunun bir kopyası olarak işaretlendiyse, lütfen aşağıda hata mesajınızı bulun ve düzeltmeyi kodunuza uygulayın. Cevaplar genellikle tek başına genel cevaptan anlaşılmaması durumunda araştırmak için başka bağlantılar içerir.

Katkıda bulunmak istiyorsanız, lütfen "favori" hata mesajınızı, uyarınızı veya bildirimi, her yanıt için bir tane, ne anlama geldiğini kısa bir açıklama (yalnızca kılavuz sayfalarında terimleri vurguluyor olsa bile), olası bir çözüm veya hata ayıklama yaklaşımını ekleyin ve değerli olan mevcut Soru ve Cevapların bir listesi. Ayrıca, mevcut yanıtları iyileştirmekten çekinmeyin.

Liste

  • Hiçbir şey görünmüyor. Sayfa boş ve beyaz. ( Beyaz Sayfa / Ölüm Ekranı olarak da bilinir )
  • Kod çalışmıyor / PHP kodumun bazı bölümleri çıktı gibi görünüyor
  • Uyarı: Başlık bilgileri değiştirilemez - başlıklar zaten gönderilmiştir
  • Uyarı: mysql_fetch_array () kaynak, boole verilen olduğu 1 parametre tahmin aka
    mysql_fetch_array (): Uyarı verilen argümanı geçerli MySQL sonuç değildir aka
    Uyarı: mysqli_num_rows () mysqli_result olduğu 1 parametre bekler, Boole verilen (benzer çeşitleri veya)
  • Uyarı: [işlev], parametre 1'in kaynak olmasını bekler, verilen boole
  • Uyarı: [işlev] : akış açılamadı: [neden]
  • Uyarı: open_basedir kısıtlaması yürürlükte
  • Uyarı: Sıfıra bölme
  • Uyarı: Geçersiz dize uzaklığı 'XXX'
  • Uyarı: count (): Parametre, Countable'ı uygulayan bir dizi veya nesne olmalıdır
  • Ayrıştırma hatası: beklenmedik bir hata oluştu '['
  • Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_XXX
  • Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_ENCAPSED_AND_WHITESPACE
  • Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_PAAMAYIM_NEKUDOTAYIM
  • Ayrıştırma hatası: sözdizimi hatası, beklenmeyen 'require_once' (T_REQUIRE_ONCE), beklenen işlev (T_FUNCTION)
  • Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_VARIABLE
  • Önemli hata: İzin verilen XXX bayt bellek boyutu tükendi (XXX bayt ayırmaya çalışıldı)
  • Önemli hata: Nesne olmayan veya boş bir üye işleve çağrı ...
  • Önemli Hata: Tanımlanmamış XXX işlevine Çağrı
  • Önemli Hata: XXX yeniden bildirilemez
  • Önemli hata: Yazma bağlamında işlev dönüş değeri kullanılamaz
  • Önemli hata: AAA :: BBB () beyanı CCC :: BBB () ile uyumlu olmalıdır '
  • Önemli hata: Nesne bağlamında değilken $ this kullanılması
  • Önemli hata: Kapanış sınıfının nesnesi dizeye dönüştürülemedi
  • Önemli hata: Tanımsız sınıf sabiti
  • Uyarı: Diziden dizeye dönüştürme
  • Uyarı: Nesne dışı hatanın özelliğini almaya çalışılıyor
  • Uyarı: Tanımsız değişken veya özellik
  • Uyarı: Tanımsız Dizin
  • Uyarı: Tanımsız ofset XXX [Referans]
  • Uyarı: Başlatılmamış dize uzaklığı: XXX
  • Uyarı: Tanımlanmamış sabit XXX kullanımı - "XXX" olduğu varsayılır
  • MySQL: SQL sözdiziminizde bir hata var; Yakın ... satırda ... kullanmak üzere doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuza bakın.
  • Katı Standartlar: Statik olmayan yöntem [ :: ] statik olarak çağrılmamalıdır
  • Uyarı: işlev, X parametresinin boole / string / tamsayı olmasını bekler
  • HTTP Hatası 500 - Dahili sunucu hatası
  • Kullanımdan kaldırıldı: Küme parantezli diziler ve dizeler ofset erişim sözdizimi kullanımdan kaldırıldı

Ayrıca bkz:

  • Referans - Bu sembol PHP'de ne anlama geliyor?

Yanıtlar

281 Gordon Oct 07 2012 at 22:21

Uyarı: Başlık bilgileri değiştirilemez - başlıklar zaten gönderilmiştir

Komut dosyanız istemciye bir HTTP üstbilgisi göndermeye çalıştığında, ancak daha önce zaten çıktı vardı, bu da üstbilgilerin istemciye zaten gönderilmesine neden oldu.

Bu bir E_WARNINGve betiği durdurmayacak.

Tipik bir örnek, şuna benzer bir şablon dosyası olabilir:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

session_start()Fonksiyon müşteriye oturum çerez ile başlıklarını göndermeyi dener. Ancak PHP, <html>öğeyi çıktı akışına yazarken zaten başlıklar gönderiyordu. En session_start()üste taşımak zorundasın .

Sen hatları üzerinden giderek bu çözebilir önce Uyarı tetikleme kodu ve çıkışları nerede kontrol edin. Herhangi bir başlık gönderme kodunu kodun önüne taşıyın.

Genellikle gözden kaçan bir çıktı, PHP'nin kapanmasından sonraki yeni satırlardır ?>. ?>Dosyadaki son şey olduğunda göz ardı edilmesi standart bir uygulama olarak kabul edilir . Benzer şekilde, bu uyarının diğer bir yaygın nedeni, açılışın önünde <?phpboş bir boşluk, satır veya görünmez bir karakter bulunmasıdır; bu, web sunucusunun üstbilgileri ve beyaz boşlukları / yeni satırı göndermesine neden olur, bu nedenle PHP ayrıştırmaya başladığında gönderemez. herhangi bir başlık.

Dosyanızda birden fazla <?php ... ?>kod bloğu varsa, aralarında boşluk olmamalıdır. (Not: Otomatik olarak oluşturulmuş kodunuz varsa birden fazla bloğunuz olabilir)

Ayrıca kodunuzda Bayt Sırası İşaretlerinin bulunmadığından emin olun, örneğin komut dosyasının kodlaması BOM ile UTF-8 olduğunda.

İlgili sorular:

  • PHP tarafından zaten gönderilmiş üstbilgiler
  • Stackoverflow'daki tüm PHP "Başlıkları zaten gönderildi" Soruları
  • Bayt Sırası İşareti
  • Hangi PHP İşlevleri Çıktı Oluşturur?
195 hakre Oct 07 2012 at 22:11

Önemli hata: Nesne olmayan bir üye işleve çağrı ...

Nesne olmadığı ve bu nedenle çağrılamayan xyz->method()yere benzer bir kodla gerçekleşir .xyzmethod

Bu, betiği durduracak ölümcül bir hatadır (ileriye dönük uyumluluk bildirimi: PHP 7'den başlayarak yakalanabilir bir hata haline gelecektir).

Çoğu zaman bu, kodda hata koşulları için eksik kontrollerin bulunduğunun bir işaretidir. Yöntemlerini çağırmadan önce bir nesnenin aslında bir nesne olduğunu doğrulayın.

Bir tipik örnek olacaktır

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

Yukarıdaki örnekte, sorgu hazırlıklı olamaz ve prepare()atayacaktır falseiçin $statement. execute()Yöntemi çağırmaya çalışmak false, değer bir boole olduğu için "nesne olmayan" olduğundan Ölümcül Hata ile sonuçlanacaktır .

Anlamaya neden senin işlevi bir boolean yerine bir nesne döndürdü. Örneğin, $pdomeydana gelen son hata için nesneyi kontrol edin . Bunun nasıl hata ayıklanacağına ilişkin ayrıntılar, söz konusu işlev / nesne / sınıf için hataların nasıl işlendiğine bağlı olacaktır.

->prepareBaşarısız olsa bile, $pdoveritabanı tutamaç nesneniz geçerli kapsama geçirilmemiştir . Nerede tanımlandığını bulun. Ardından bunu bir parametre olarak iletin, özellik olarak saklayın veya genel kapsam aracılığıyla paylaşın.

Başka bir sorun, koşullu olarak bir nesne oluşturmak ve ardından bu koşullu bloğun dışındaki bir yöntemi çağırmaya çalışmak olabilir. Örneğin

if ($someCondition) { $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Yöntemi koşullu bloğun dışında yürütmeye çalıştığınızda, nesneniz tanımlanamayabilir.

İlgili sorular:

  • Nesne olmayan bir üye işleve çağrı
  • Tüm PHP'yi listele "Önemli hata: Nesne olmayan bir üye işleve çağrı ..." Stackoverflow ile ilgili sorular
119 nalply Oct 08 2012 at 04:06

Hiçbir şey görünmüyor. Sayfa boş ve beyaz.

Ayrıca Beyaz Sayfa Ölümü veya Beyaz Ölüm Perdesi olarak da bilinir . Bu, hata raporlama kapatıldığında ve önemli bir hata (genellikle sözdizimi hatası) oluştuğunda gerçekleşir.

Hata günlüğünü etkinleştirdiyseniz, hata günlüğünüzde somut hata mesajını bulacaksınız. Bu genellikle "php_errors.log" adlı bir dosyada, ya merkezi bir konumda (örneğin /var/log/apache2birçok Linux ortamında) ya da betiğin kendi dizininde (bazen paylaşılan bir barındırma ortamında kullanılır) olacaktır.

Bazen hataların görüntülenmesini geçici olarak etkinleştirmek daha kolay olabilir. Beyaz sayfa daha sonra hata mesajını gösterecektir. Dikkatli olun çünkü bu hatalar web sitesini ziyaret eden herkes tarafından görülebilir.

Bu, komut dosyasının en üstüne aşağıdaki PHP kodunu ekleyerek kolayca yapılabilir:

ini_set('display_errors', 1); error_reporting(~0);

Kod, hataların görüntülenmesini açacak ve raporlamayı en yüksek seviyeye ayarlayacaktır.

Çalışma ini_set()zamanında yürütüldüğünden ayrıştırma / sözdizimi hataları üzerinde hiçbir etkisi yoktur. Bu hatalar günlükte görünecektir. Bunları çıktıda da görüntülemek istiyorsanız (örneğin bir tarayıcıda) display_startup_errorsyönergeyi olarak ayarlamanız gerekir true. Bunu , çalışma zamanından önce yapılandırmayı etkileyen başka bir yöntemdephp.ini veya içinde .htaccessveya başka bir yöntemle yapın .

Log_errors ve error_log yönergelerini kendi günlük dosyası konumunuzu seçmek için ayarlamak için aynı yöntemleri kullanabilirsiniz .

Günlüğe baktığınızda veya ekranı kullanarak, çok daha iyi bir hata mesajı ve betiğinizin durmaya başladığı kod satırını alacaksınız.

İlgili sorular:

  • PHP'nin beyaz ölüm ekranı
  • Beyaz ölüm perdesi!
  • PHP Hata Mesajlarını Görüntülemiyor
  • PHP hatalara 500 yayıyor - bu nerede belgeleniyor?
  • PHP'de faydalı hata mesajları nasıl alınır?
  • Stackoverflow'daki tüm PHP "Beyaz Sayfa" Soruları

İlgili hatalar:

  • Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_XXX
  • Önemli hata: Nesne olmayan bir üye işleve çağrı ...
  • Kod çalışmıyor / PHP kodumun bazı bölümleri çıktı gibi görünüyor
106 Gordon Oct 07 2012 at 23:53

Uyarı: Tanımsız Dizin

Dizide var olmayan bir anahtarla bir diziye erişmeye çalıştığınızda olur.

Bir Undefined Indexbildirimin tipik bir örneği ( demo )

$data = array('foo' => '42', 'bar'); echo $data['spinach'];
echo $data[1];

Hem spinachve 1bir neden dizide bulunmayan E_NOTICEtetiklenecek.

Çözüm, bu dizine erişmeden önce dizinin veya ofsetin var olduğundan emin olmaktır. Bu, programınızdaki bir hatayı, bu dizinlerin beklediğinizde var olmasını sağlamak için düzeltmeniz gerektiği anlamına gelebilir. Veya indekslerin var olup olmadığını array_key_existsveya issetaşağıdakileri kullanarak test etmeniz gerektiği anlamına gelebilir :

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) { echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

Aşağıdaki gibi kodunuz varsa:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

sonra $_POST['message']bu sayfa ilk yüklendiğinde ayarlanmayacak ve yukarıdaki hatayı alacaksınız. Yalnızca form gönderildiğinde ve bu kod ikinci kez çalıştırıldığında dizi dizini mevcut olacaktır. Bunu genellikle şu şekilde kontrol edersiniz:

if ($_POST) .. // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

İlgili sorular:

  • Referans: "Uyarı: Tanımsız değişken" ve "Uyarı: Tanımsız dizin"
  • Stackoverflow'daki tüm PHP "Bildirim: Tanımlanmamış Dizin" Soruları
  • http://php.net/arrays
88 xdazz Oct 07 2012 at 22:20

Uyarı: mysql_fetch_array () parametre 1'in kaynak olmasını bekler, verilen boole

İlk ve en önemli:

Lütfen mysql_*yeni kodda işlev kullanmayın . Artık korunmuyorlar ve resmi olarak kullanımdan kaldırılıyorlar . Bkz kırmızı kutuyu ? Bunun yerine hazırlanmış ifadeler hakkında bilgi edininve PDO veya MySQLi kullanın - bu makale hangisi olduğuna karar vermenize yardımcı olacaktır. PDO'yu seçerseniz, işte size iyi bir eğitim .


Bu, sonucundan veri almaya çalıştığınızda mysql_queryancak sorgu başarısız olduğunda gerçekleşir.

Bu bir uyarıdır ve betiği durdurmaz, ancak programınızı yanlış yapar.

Sen dönen sonucu kontrol etmeniz gerekir mysql_querytarafından

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

İlgili sorular:

  • mysql_fetch_array () parametre 1'in kaynak olmasını bekler, seçimde verilen boole
  • Tüm "mysql_fetch_array (), parametre 1'in kaynak, boole olarak verilen" Stackoverflow Soruları olmasını bekler

İlgili Hatalar:

  • Uyarı: [işlev], parametre 1'in kaynak olmasını bekler, verilen boole

mysql*Bir MySQL sonuç kaynağını parametre olarak bekleyen diğer işlevler de aynı nedenle aynı hatayı üretecektir.

81 xdazz Oct 07 2012 at 22:52

Önemli hata: Nesne bağlamında değilken $ this kullanılması

$thisPHP'de atanamayan özel bir değişkendir . Var olmadığı bir bağlamda erişilirse, bu ölümcül hata verilir.

Bu hata meydana gelebilir:

  1. Statik olmayan bir yöntem statik olarak çağrılırsa. Misal:

    class Foo {
       protected $var; public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    Nasıl düzeltilir? Kodunuzu tekrar gözden geçirin$this, yalnızca bir nesne bağlamında kullanılabilir ve asla statik bir yöntemde kullanılmamalıdır. Ayrıca, statik bir yöntem, statik olmayan özelliğe erişmemelidir. self::$static_propertyStatik özelliğe erişmek içinkullanın.

  2. Bir sınıf yönteminden kod normal bir işleve veya yalnızca genel kapsam ve$this özel değişkeni koruyarak kopyalanmışsa .
    Nasıl düzeltilir? Kodu inceleyin ve $thisfarklı bir ikame değişkeniyle değiştirin.

İlgili sorular:

  1. Statik olmayan yöntemi statik olarak çağırın: PHP Ölümcül hata: Nesne bağlamında değilken $ this kullanma
  2. Kodun üzerine kopyala: Önemli hata: Nesne bağlamında değilken $ this kullanma
  3. Stackoverflow'daki tüm "Nesne bağlamında değilken $ this kullanılıyor" Soruları
77 Gordon Oct 08 2012 at 21:43

Önemli hata: Tanımlanmamış XXX işlevine çağrı

Henüz tanımlanmamış bir işlevi çağırmaya çalıştığınızda gerçekleşir. Yaygın nedenler arasında eksik uzantılar ve eklemeler, koşullu işlev bildirimi, işlev bildiriminde işlev veya basit yazım hataları bulunur.

Örnek 1 - Koşullu İşlev Bildirimi

$someCondition = false; if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

Bu durumda fn()asla beyan edilmeyecektir çünkü $someConditiondoğru değildir.

Örnek 2 - İşlev Bildirimindeki İşlev

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

Bu durumda, fnsadece createFn()arandığında ilan edilecektir . Sonraki çağrıların createFn()Varolan bir işlevin Yeniden Bildirilmesi ile ilgili bir hatayı tetikleyeceğini unutmayın .

Bunu bir PHP yerleşik işlevi için de görebilirsiniz. Fonksiyonu resmi kılavuzda aramayı deneyin ve hangi "uzantıya" (PHP modülü) ait olduğunu ve hangi PHP sürümlerinin onu desteklediğini kontrol edin.

Eksik bir uzantı olması durumunda, bu uzantıyı kurun ve php.ini içinde etkinleştirin. İşlevinizin göründüğü uzantı için PHP Kılavuzundaki Kurulum Talimatlarına bakın. Uzantıyı paket yöneticinizi (örn apt. Debian veya Ubuntu'da, yumRed Hat veya CentOS'ta) veya bir kontrol panelini kullanarak da etkinleştirebilir veya yükleyebilirsiniz. paylaşılan bir barındırma ortamında.

İşlev, kullandığınız PHP'nin daha yeni bir sürümünde tanıtılmışsa, kılavuzda veya yorum bölümünde alternatif uygulamalara bağlantılar bulabilirsiniz. PHP'den kaldırıldıysa, artık gerekli olmayabileceğinden nedeniyle ilgili bilgilere bakın.

Eksik içerme durumunda, işlevi çağırmadan önce işlevi bildiren dosyayı dahil ettiğinizden emin olun.

Yazım hataları durumunda yazım hatasını düzeltin.

İlgili sorular:

  • https://stackoverflow.com/search?q=Fatal+error%3A+Call+to+undefined+function
73 LeleDumbo Oct 07 2012 at 22:22

Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_XXX

Eğer ne zaman olur T_XXXbelirteci beklenmedik bir yerde, dengesiz (gereksiz) parantez, php.ini içindeki etkinleştirmeden kısa etiketinin kullanımı, ve daha bir çok yer.

İlgili sorular:

  • Referans: PHP Ayrıştırma / Sözdizimi Hataları; ve nasıl çözülür?
  • Ayrıştırma hatası: beklenmedik bir hata oluştu '{'
  • Ayrıştırma hatası: Sözdizimi hatası, PHP kodumda beklenmeyen dosya sonu
  • Ayrıştırma hatası: sözdizimi hatası, beklenmeyen '<' in - Düzeltilsin mi?
  • Ayrıştırma hatası: beklenmedik bir hata oluştu '?'

Daha fazla yardım için bkz:

  • http://phpcodechecker.com/ - Bu, sözdizimi sorunlarınız hakkında daha yararlı açıklamalar sağlar.
71 xdazz Oct 07 2012 at 23:16

Önemli hata: Yazma bağlamında işlev dönüş değeri kullanılamaz

Bu genellikle bir işlevi doğrudan ile kullanıldığında olur empty.

Misal:

if (empty(is_null(null))) {
  echo 'empty';
}

Bunun nedeni empty, bir dil yapısı olması ve bir işlev olmamasıdır, 5.5'ten önceki PHP sürümlerinde argüman olarak bir ifade ile çağrılamaz. PHP 5.5'ten önce, argümanı empty()bir değişken olmalıdır , ancak PHP 5.5+ sürümünde rastgele bir ifadeye (bir işlevin dönüş değeri gibi) izin verilir.

emptyismine rağmen, aslında bir değişkenin "boş" olup olmadığını kontrol etmez. Bunun yerine, bir değişkenin var olup olmadığını kontrol eder veya == false. İfadeler ( is_null(null)örnekteki gibi ) her zaman var sayılacaktır, bu nedenle burada emptyyalnızca yanlışa eşit olup olmadığı kontrol edilmektedir. Sen yerini alabilir empty()buraya ile !örneğin if (!is_null(null))veya açıkça örneğin false olarak karşılaştırmak if (is_null(null) == false).

İlgili sorular:

  • Önemli hata: Dönüş değeri işlevi kullanılamaz
64 Jocelyn Oct 08 2012 at 00:45

MySQL: SQL sözdiziminizde bir hata var; Yakın ... satırda ... kullanmak üzere doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuza bakın.

Bu hata genellikle bir MySQL sorgusuna geçirilen verilerden doğru şekilde kaçmayı unuttuğunuz için ortaya çıkar.

Ne bir örneği değil ( "Kötü fikir") yapmak:

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}"; mysqli_query($db, $query);

Bu kod, aşağıdaki gibi bir URL ile gönderilecek bir form içeren bir sayfaya eklenebilir: http://example.com/edit.php?id=10 (gönderiyi n ° 10 düzenlemek için)

Gönderilen metin tek alıntılar içeriyorsa ne olacak? $queryşununla sonuçlanacak:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

Ve bu sorgu MySQL'e gönderildiğinde, sözdiziminin yanlış olduğundan şikayet edecek, çünkü ortada fazladan bir tek alıntı var.

Bu tür hataları önlemek için, MUTLAKA hep sorguda kullanmadan önce veri kaçmak.

Bir SQL sorgusunda kullanmadan önce veriden kaçmak da çok önemlidir çünkü yapmazsanız, komut dosyanız SQL enjeksiyonlarına açık olacaktır. Bir SQL enjeksiyonu, bir kaydın, tablonun veya tüm veritabanının değiştirilmesine, kaybına veya değiştirilmesine neden olabilir. Bu çok ciddi bir güvenlik sorunu!

Dokümantasyon:

  • PHP'de SQL enjeksiyonunu nasıl önleyebilirim?
  • mysql_real_escape_string()
  • mysqli_real_escape_string()
  • "Bobby Tables" XKCD çizgi romanından SQL enjeksiyonu nasıl çalışıyor?
  • Mysql_real_escape_string () etrafında dolaşan SQL enjeksiyonu
54 MichaelBerkowski Dec 18 2012 at 21:52

Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_ENCAPSED_AND_WHITESPACE

Bu hatayla en çok , karmaşık değişken yapısının tamamı dahil edilmediğinde, çift tırnaklı bir dize içindeki enterpolasyon için tırnaklı bir anahtarla bir dizi değerine başvurmaya çalışırken karşılaşılır {}.

Hata durumu:

Bu şunlarla sonuçlanır Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

Olası düzeltmeler:

Çift tırnaklı bir dizgede, PHP dizi anahtar dizelerinin tırnaksız olarak kullanılmasına izin verir ve bir E_NOTICE. Yani yukarıdakiler şu şekilde yazılabilir:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

Tüm karmaşık bir dizi değişken ve anahtar (lar) içinde olabilir, {}ki bu durumda, gereken bir önlemek için verilemeyecek E_NOTICE. PHP dokümantasyonu , karmaşık değişkenler için bu sözdizimini önerir.

echo "This is a double-quoted string with a quoted array key in {$array['key']}"; //--------------------------------------------------------------^^^^^^^^^^^^^^^ // Or a complex array property of an object: echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

Tabii ki, yukarıdakilerden herhangi birinin alternatifi , dizi değişkenini enterpolasyon yapmak yerine içinde birleştirmektir:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Başvuru için, ilgili bölüme bakın Değişken Ayrıştırmadaki içinde PHP dizeleri manuel sayfa

53 xdazz Oct 07 2012 at 22:36

Önemli hata: İzin verilen XXX bayt bellek boyutu tükendi (XXX bayt ayırmaya çalışıldı)

Komut dosyanızı çalıştırmak için yeterli bellek yok. PHP bellek sınırına ulaştı ve onu çalıştırmayı durdurdu. Bu hata ölümcüldür, komut dosyası durur. Bellek sınırının değeri , php.inidosyada veya ini_set('memory_limit', '128 M');komut dosyası kullanılarak yapılandırılabilir (bu, içinde tanımlanan değerin üzerine yazacaktır php.ini). Bellek sınırının amacı, tek bir PHP betiğinin tüm kullanılabilir belleği yutmasını ve tüm web sunucusunu çökertmesini önlemektir.

Yapmanız gereken ilk şey, betiğinizin ihtiyaç duyduğu bellek miktarını en aza indirmektir. Örneğin, bir değişkene büyük bir dosya okuyorsanız veya bir veritabanından çok sayıda kayıt alıyorsanız ve hepsini bir dizide depoluyorsanız, bu çok fazla bellek kullanabilir. Kodunuzu bunun yerine dosyayı satır satır okuyacak şekilde değiştirin veya veritabanı kayıtlarını hepsini belleğe kaydetmeden birer birer alın. Bu, perde arkasında neler olup bittiğine ve verilerin başka bir yerde mi yoksa bellekte ne zaman depolandığına dair biraz kavramsal farkındalık gerektirir.

Komut dosyanız bellek yoğun bir çalışma yapmadığında bu hata meydana gelirse, bellek sızıntısı olup olmadığını görmek için kodunuzu kontrol etmeniz gerekir. memory_get_usageFonksiyon senin arkadaşın.

İlgili sorular:

  • Stackoverflow'daki tüm "Önemli hata: İzin verilen XXX bayt bellek boyutu tükendi" Soruları
46 Mahdi Oct 10 2012 at 20:14

Uyarı: [işlev] : akış açılamadı: [neden]

Genellikle bir dosya aradığınızda bu olur include, requireya da fopenve PHP dosyası bulun veya dosyayı yüklemek için yeterli değildir iznine sahip olamazdı.

Bu, çeşitli nedenlerle olabilir:

  • dosya yolu yanlış
  • dosya yolu görecelidir
  • dahil yol yanlış
  • izinler çok kısıtlayıcı
  • SELinux yürürlükte
  • ve daha fazlası ...

Yaygın bir hata, mutlak bir yol kullanmamaktır. Bu kolayca tam yol ya kullanılarak çözülebilir sihirli sabitleri gibi __DIR__ya dirname(__FILE__):

include __DIR__ . '/inc/globals.inc.php';

veya:

require dirname(__FILE__) . '/inc/globals.inc.php';

Doğru yolun kullanıldığından emin olmak bu sorunların giderilmesinde bir adımdır, bu aynı zamanda var olmayan dosyalar, dosya sisteminin erişimi engelleyen hakları veya PHP'nin kendisi tarafından açık temel yönlendirme kısıtlamaları ile ilgili olabilir.

Bu sorunu hızlı bir şekilde çözmenin en iyi yolu, aşağıdaki sorun giderme kontrol listesini izlemektir.

İlgili sorular:

  • Sorun giderme kontrol listesi: Akış açılamadı

İlgili Hatalar:

  • Uyarı: open_basedir kısıtlaması yürürlükte
45 RichBradshaw Oct 07 2012 at 22:29

Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_PAAMAYIM_NEKUDOTAYIM

Kapsam çözümleme operatörü aynı zamanda İbranice פעמיים נקודתיים 'dan "Paamayim Nekudotayim" olarak da adlandırılır. bu "çift kolon" anlamına gelir.

Bu hata genellikle yanlışlıkla ::kodunuzu girmeniz durumunda ortaya çıkar .

İlgili sorular:

  • Referans: PHP Ayrıştırma / Sözdizimi Hataları; ve nasıl çözülür?
  • PHP'de iki sütun ne anlama geliyor?
  • PHP'de :: (çift kolon) ve -> (ok) arasındaki fark nedir?
  • Beklenmeyen T_PAAMAYIM_NEKUDOTAYIM, T_NS_Separator bekleniyor

Dokümantasyon:

  • Kapsam Çözünürlük İşleci (: :)
44 DaveRandom Oct 08 2012 at 05:06

Uyarı: Tanımlanmamış sabit XXX kullanımı - "XXX" olduğu varsayılır

veya PHP 7.2 veya sonrasında:

Uyarı: Tanımlanmamış sabit XXX kullanımı - varsayılan 'XXX' (bu, PHP'nin gelecekteki bir sürümünde bir Hata oluşturacaktır)

Bu uyarı, kodda bir belirteç kullanıldığında ve sabit gibi göründüğünde, ancak bu ada göre bir sabit tanımlanmadığında ortaya çıkar.

Bu bildirimin en yaygın nedenlerinden biri, ilişkilendirilebilir dizi anahtarı olarak kullanılan bir dizenin alıntılamamasıdır.

Örneğin:

// Wrong
echo $array[key]; // Right echo $array['key'];

Diğer bir yaygın neden, $değişken adının önündeki eksik (dolar) işaretidir:

// Wrong
echo varName;

// Right
echo $varName;

Veya belki başka bir sabiti veya anahtar kelimeyi yanlış yazmışsınızdır:

// Wrong
$foo = fasle; // Right $foo = false;

Bu kitaplık tarafından tanımlanan bir sabite erişmeye çalıştığınızda, gerekli bir PHP uzantısının veya kitaplığının eksik olduğunun bir işareti de olabilir.

İlgili sorular:

  • PHP hata mesajı "Uyarı: Tanımlanmamış sabit kullanımı" ne anlama geliyor?
43 DaveRandom Dec 14 2012 at 20:18

Önemli hata: [sınıf adı] sınıfı yeniden bildirilemez

Önemli hata: [işlev adı] yeniden bildirilemiyor

Ya iki kez aynı işlevi / sınıf adını kullanarak ve bunlardan birini yeniden adlandırmak için ihtiyaç veya kullanmış çünkü öyle vermenize Bu araç requireya includekullandığınız olması gereken yerde require_onceveya include_once.

PHP'de bir sınıf veya işlev bildirildiğinde, değişmezdir ve daha sonra yeni bir değerle bildirilemez.

Aşağıdaki kodu göz önünde bulundurun:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass; $obj->doSomething();
}

do_stuff();
do_stuff();

İkinci çağrı do_stuff()yukarıdaki hatayı üretecektir. Değiştirerek requireiçin require_once, biz tanımını içeren dosya emin olabiliriz MyClasssadece bir kez yüklenecektir ve hata kaçınılacaktır.

42 aleation Oct 08 2012 at 16:14

Uyarı: Tanımsız değişken

Daha önce tanımlanmamış bir değişkeni kullanmaya çalıştığınızda olur.

Tipik bir örnek olacaktır

foreach ($items as $item) {
    // do something with item
    $counter++;
}

Daha $counterönce tanımlamadıysanız , yukarıdaki kod uyarıyı tetikleyecektir.

Doğru yol, değişkeni kullanmadan önce ayarlamaktır, bu sadece gibi boş bir dize olsa bile

$counter = 0; foreach ($items as $item) { // do something with item $counter++;
}

Benzer şekilde, örneğin anonim işlevler kullanılırken bir değişkene kapsamı dışında erişilemez.

$prefix = "Blueberry"; $food = ["cake", "cheese", "pie"];
$prefixedFood = array_map(function ($food) {
  // Prefix is undefined
  return "${prefix} ${food}";
}, $food);

Bunun yerine kullanılarak geçilmelidir use

$prefix = "Blueberry";
$food = ["cake", "cheese", "pie"]; $prefixedFood = array_map(function ($food) use ($prefix) {
  return "${prefix} ${food}";
}, $food);

Uyarı: Tanımsız özellik

Bu hata hemen hemen aynı anlama gelir, ancak bir nesnenin bir özelliğine işaret eder. Yukarıdaki örnek yeniden kullanıldığında, bu kod, counterözellik ayarlanmadığı için hatayı tetikleyecektir .

$obj = new stdclass;
$obj->property = 2342; foreach ($items as $item) { // do something with item $obj->counter++;
}

İlgili sorular:

  • Stackoverflow'daki tüm PHP "Bildirimi: Tanımlanmamış Değişken" Soruları
  • PHP kullanan "Uyarı: Tanımsız değişken", "Uyarı: Tanımsız dizin" ve "Uyarı: Tanımsız ofset"
  • Referans: Değişken kapsamı nedir, hangi değişkenlere nereden erişilebilir ve "tanımsız değişken" hataları nelerdir?
36 NullPoiиteя Mar 21 2013 at 11:31

Ayrıştırma hatası: sözdizimi hatası, beklenmeyen T_VARIABLE

Olası senaryo

Kodumun nerede yanlış gittiğini bulamıyorum. İşte tam hatam:

Ayrıştırma hatası: sözdizimi hatası, x satırında beklenmeyen T_VARIABLE

Ne deniyorum

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

Cevap

Ayrıştırma hatası: Programınızın sözdizimiyle ilgili bir sorun, örneğin bir ifadenin sonundan noktalı virgül bırakmak veya yukarıdaki durumda olduğu gibi .işleci eksiktir . Yorumlayıcı, bir ayrıştırma hatasıyla karşılaştığında programınızı çalıştırmayı durdurur.

Basit bir deyişle, bu bir sözdizimi hatasıdır, yani kodunuzda doğru şekilde ayrıştırılmasını ve dolayısıyla çalışmasını engelleyen bir şey vardır.

Yapmanız gereken , basit hatalar için hatanın olduğu yerin etrafındaki satırları dikkatlice kontrol etmektir.

Bu hata mesajı, dosyanın x satırında, PHP yorumlayıcısının açık bir parantez görmeyi beklediği, bunun yerine adı verilen bir şeyle karşılaştığı anlamına gelir T_VARIABLE. Bu T_VARIABLEşeye a denir token. Bu, PHP yorumlayıcısının programların farklı temel parçalarını ifade etme şeklidir. Tercüman bir programda okuduğunda, yazdıklarınızı belirteçler listesine çevirir. Programınıza bir değişken koyduğunuz her yerde T_VARIABLE, yorumlayıcının listesinde bir belirteç vardır .

İyi okuma: Ayrıştırıcı Jetonlarının Listesi

Bu yüzden, en azından E_PARSEkendi php.ini. Üretim komut dosyalarında ayrıştırma hataları olmamalıdır.

Kod yazarken her zaman şu ifadeyi eklemeyi tavsiye ettim:

error_reporting(E_ALL);

PHP hata raporlama

Ayrıca, yazarken hataları ayrıştırmanızı sağlayacak bir IDE kullanmak iyi bir fikirdir. Kullanabilirsiniz:

  1. NetBeans (güzel bir güzellik, özgür yazılım) (bence en iyisi)
  2. PhpStorm (Gordon amca bunu çok seviyor: P, ücretli plan, özel mülk ve özgür yazılım içeriyor)
  3. Eclipse (güzellik ve canavar, özgür yazılım)

İlgili sorular:

  • Referans: PHP Ayrıştırma / Sözdizimi Hataları; ve nasıl çözülür?
35 samayo Jul 13 2013 at 21:00

Uyarı: Başlatılmamış dize uzaklığı: *

Adından da anlaşılacağı gibi, bu tür bir hata, büyük olasılıkla yineleme yapmaya veya var olmayan bir anahtarla bir diziden bir değer bulmaya çalıştığınızda ortaya çıkar.

Düşünsene, her mektubu göstermeye çalışıyorsun $string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

Yukarıdaki örnek ( çevrimiçi demo ) oluşturacaktır:

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

Ve komut dosyası yankılamayı bitirir bitirmez Dhatayı alırsınız, çünkü for()döngünün içinde, PHP'ye size 'ABCD'hangisinin varolduğundan birinci ile beşinci dize karakterini göstermesini söylediniz , ancak döngü saymaya başladığından 0ve yankılar Dulaştığında 4, bir ofset hatası atacaktır.

Benzer Hatalar:

  • Geçersiz dize uzaklığı 'seçenek 1'
34 hakre Oct 26 2014 at 18:20

Uyarı: Nesne dışı hatanın özelliğini almaya çalışılıyor

Bir nesne yokken bir nesnenin bir özelliğine erişmeye çalıştığınızda gerçekleşir.

Nesne olmayan bir bildirim için tipik bir örnek,

$users = json_decode('[{"name": "hakre"}]'); echo $users->name; # Notice: Trying to get property of non-object

Bu durumda, $usersbir dizidir (yani bir nesne değildir) ve herhangi bir özelliği yoktur.

Bu, var olmayan bir dizine veya bir dizinin anahtarına erişmeye benzer (bkz. Uyarı: Tanımlanmamış Dizin ).

Bu örnek çok basitleştirilmiştir. Çoğu zaman bu tür bir uyarı, kontrol edilmemiş bir dönüş değerini işaret eder, örneğin NULLbir nesne yoksa veya yalnızca beklenmedik bir nesne olmayan değerde (örneğin bir Xpath sonucunda, beklenmeyen formatta JSON yapılarında, beklenmeyen formatta XML vb.) ancak kod böyle bir durumu kontrol etmez.

Bu olmayan nesneler genellikle daha fazla işlendiğinden, nesne olmayan bir nesnede bir nesne yönteminin çağrılması sırasında genellikle ölümcül bir hata meydana gelir (bkz: Ölümcül hata: Bir nesne olmayan üzerinde bir üye işlevi çağırma ... ) senaryo.

Hata durumlarının ve / veya bir değişkenin bir beklentiye uyup uymadığı kontrol edilerek kolayca önlenebilir. İşte DOMXPath örneğiyle böyle bir uyarı :

$result  = $xpath->query("//*[@id='detail-sections']/div[1]"); $divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Sorun, koleksiyonda nodeValuevar olup olmadığı kontrol edilmeden ilk öğenin özelliğine (alanına) erişmektir $result. Bunun yerine, kodun üzerinde çalıştığı nesnelere değişkenler atayarak kodu daha açık hale getirmek için ödeme yapar:

$result = $xpath->query("//*[@id='detail-sections']/div[1]");
$div = $result->item(0);
$divText = "-/-"; if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

İlgili hatalar:

  • Uyarı: Tanımsız Dizin
  • Önemli hata: Nesne olmayan bir üye işleve çağrı ...
29 hakre Oct 08 2012 at 02:44

Uyarı: open_basedir kısıtlaması yürürlükte

Bu uyarı, dosya ve dizin erişimiyle ilgili çeşitli işlevlerde görünebilir. Bir yapılandırma sorunu hakkında uyarır.

Göründüğünde, bazı dosyalara erişimin yasak olduğu anlamına gelir.

Uyarının kendisi hiçbir şeyi bozmaz, ancak dosya erişimi engellendiğinde çoğu zaman bir komut dosyası düzgün çalışmaz.

Düzeltme normalde PHP yapılandırmasını değiştirmektir , ilgili ayar çağrılır open_basedir.

Bazen yanlış dosya veya dizin adları kullanılır, düzeltme o zaman doğru olanları kullanmaktır.

İlgili sorular:

  • open_basedir kısıtlaması yürürlükte. Dosya (/) izin verilen yollar içinde değil:
  • All PHP "Warning: open_basedir restriction in effect" Querstions on Stackoverflow
28 Ja͢ck Mar 11 2014 at 11:55

Parse error: syntax error, unexpected '['

This error comes in two variatians:

Variation 1

$arr = [1, 2, 3];

This array initializer syntax was only introduced in PHP 5.4; it will raise a parser error on versions before that. If possible, upgrade your installation or use the old syntax:

$arr = array(1, 2, 3);

See also this example from the manual.

Variation 2

$suffix = explode(',', 'foo,bar')[1];

Array dereferencing function results was also introduced in PHP 5.4. If it's not possible to upgrade you need to use a (temporary) variable:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

See also this example from the manual.

23 deceze Dec 28 2012 at 16:51

Warning: [function] expects parameter 1 to be resource, boolean given

(A more general variation of Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given)

Resources are a type in PHP (like strings, integers or objects). A resource is an opaque blob with no inherently meaningful value of its own. A resource is specific to and defined by a certain set of PHP functions or extension. For instance, the Mysql extension defines two resource types:

There are two resource types used in the MySQL module. The first one is the link identifier for a database connection, the second a resource which holds the result of a query.

The cURL extension defines another two resource types:

... a cURL handle and a cURL multi handle.

When var_dumped, the values look like this:

$resource = curl_init(); var_dump($resource);

resource(1) of type (curl)

That's all most resources are, a numeric identifier ((1)) of a certain type ((curl)).

You carry these resources around and pass them to different functions for which such a resource means something. Typically these functions allocate certain data in the background and a resource is just a reference which they use to keep track of this data internally.


The "... expects parameter 1 to be resource, boolean given" error is typically the result of an unchecked operation that was supposed to create a resource, but returned false instead. For instance, the fopen function has this description:

Return Values

Returns a file pointer resource on success, or FALSE on error.

So in this code, $fp will either be a resource(x) of type (stream) or false:

$fp = fopen(...);

If you do not check whether the fopen operation succeed or failed and hence whether $fp is a valid resource or false and pass $fp to another function which expects a resource, you may get the above error:

$fp = fopen(...); $data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

You always need to error check the return value of functions which are trying to allocate a resource and may fail:

$fp = fopen(...);

if (!$fp) { trigger_error('Failed to allocate resource'); exit; } $data = fread($fp, 1024);

Related Errors:

  • Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given
22 KarolyHorvath Dec 28 2014 at 23:40

Warning: Illegal string offset 'XXX'

This happens when you try to access an array element with the square bracket syntax, but you're doing this on a string, and not on an array, so the operation clearly doesn't make sense.

Example:

$var = "test"; echo $var["a_key"];

If you think the variable should be an array, see where it comes from and fix the problem there.

20 deceze Jun 26 2014 at 12:51

Code doesn't run/what looks like parts of my PHP code are output

If you see no result from your PHP code whatsoever and/or you are seeing parts of your literal PHP source code output in the webpage, you can be pretty sure that your PHP isn't actually getting executed. If you use View Source in your browser, you're probably seeing the whole PHP source code file as is. Since PHP code is embedded in <?php ?> tags, the browser will try to interpret those as HTML tags and the result may look somewhat confused.

To actually run your PHP scripts, you need:

  • a web server which executes your script
  • to set the file extension to .php, otherwise the web server won't interpret it as such*
  • to access your .php file via the web server

* Unless you reconfigure it, everything can be configured.

This last one is particularly important. Just double clicking the file will likely open it in your browser using an address such as:

file://C:/path/to/my/file.php

This is completely bypassing any web server you may have running and the file is not getting interpreted. You need to visit the URL of the file on your web server, likely something like:

http://localhost/my/file.php

You may also want to check whether you're using short open tags <? instead of <?php and your PHP configuration has turned short open tags off.

Also see PHP code is not being executed, instead code shows on the page

19 deceze Jul 01 2014 at 16:42

Notice: Array to string conversion

This simply happens if you try to treat an array as a string:

$arr = array('foo', 'bar'); echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

An array cannot simply be echo'd or concatenated with a string, because the result is not well defined. PHP will use the string "Array" in place of the array, and trigger the notice to point out that that's probably not what was intended and that you should be checking your code here. You probably want something like this instead:

echo $arr[0]; // displays foo $str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Or loop the array:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

If this notice appears somewhere you don't expect, it means a variable which you thought is a string is actually an array. That means you have a bug in your code which makes this variable an array instead of the string you expect.

18 mario Sep 20 2015 at 23:40

Warning: mysql_connect(): Access denied for user 'name'@'host'

This warning shows up when you connect to a MySQL/MariaDB server with invalid or missing credentials (username/password). So this is typically not a code problem, but a server configuration issue.

  • See the manual page on mysql_connect("localhost", "user", "pw") for examples.

  • Check that you actually used a $username and $password.

    • It's uncommon that you gain access using no password - which is what happened when the Warning: said (using password: NO).
    • Only the local test server usually allows to connect with username root, no password, and the test database name.

    • You can test if they're really correct using the command line client:
      mysql --user="username" --password="password" testdb

    • Username and password are case-sensitive and whitespace is not ignored. If your password contains meta characters like $, escape them, or put the password in single quotes.

    • Most shared hosting providers predeclare mysql accounts in relation to the unix user account (sometimes just prefixes or extra numeric suffixes). See the docs for a pattern or documentation, and CPanel or whatever interface for setting a password.

    • See the MySQL manual on Adding user accounts using the command line. When connected as admin user you can issue a query like:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Or use Adminer or WorkBench or any other graphical tool to create, check or correct account details.

    • If you can't fix your credentials, then asking the internet to "please help" will have no effect. Only you and your hosting provider have permissions and sufficient access to diagnose and fix things.

  • Verify that you could reach the database server, using the host name given by your provider:
    ping dbserver.hoster.example.net

    • Check this from a SSH console directly on your webserver. Testing from your local development client to your shared hosting server is rarely meaningful.

    • Often you just want the server name to be "localhost", which normally utilizes a local named socket when available. Othertimes you can try "127.0.0.1" as fallback.

    • Should your MySQL/MariaDB server listen on a different port, then use "servername:3306".

    • If that fails, then there's a perhaps a firewall issue. (Off-topic, not a programming question. No remote guess-helping possible.)

  • When using constants like e.g. DB_USER or DB_PASSWORD, check that they're actually defined.

    • If you get a "Warning: Access defined for 'DB_USER'@'host'" and a "Notice: use of undefined constant 'DB_PASS'", then that's your problem.

    • Verify that your e.g. xy/db-config.php was actually included and whatelse.

  • Check for correctly set GRANT permissions.

    • It's not sufficient to have a username+password pair.

    • Each MySQL/MariaDB account can have an attached set of permissions.

    • Those can restrict which databases you are allowed to connect to, from which client/server the connection may originate from, and which queries are permitted.

    • The "Access denied" warning thus may as well show up for mysql_query calls, if you don't have permissions to SELECT from a specific table, or INSERT/UPDATE, and more commonly DELETE anything.

    • You can adapt account permissions when connected per command line client using the admin account with a query like:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • If the warning shows up first with Warning: mysql_query(): Access denied for user ''@'localhost' then you may have a php.ini-preconfigured account/password pair.

    • Check that mysql.default_user= and mysql.default_password= have meaningful values.

    • Oftentimes this is a provider-configuration. So contact their support for mismatches.

  • Find the documentation of your shared hosting provider:

    • e.g. HostGator, GoDaddy, 1and1, DigitalOcean, BlueHost, DreamHost, MediaTemple, ixWebhosting, lunarhosting, or just google yours´.

    • Else consult your webhosting provider through their support channels.

  • Note that you may also have depleted the available connection pool. You'll get access denied warnings for too many concurrent connections. (You have to investigate the setup. That's an off-topic server configuration issue, not a programming question.)

  • Your libmysql client version may not be compatible with the database server. Normally MySQL and MariaDB servers can be reached with PHPs compiled in driver. If you have a custom setup, or an outdated PHP version, and a much newer database server, or significantly outdated one - then the version mismatch may prevent connections. (No, you have to investigate yourself. Nobody can guess your setup).

More references:

  • Serverfault: mysql access denied for 'root'@'name of the computer'
  • Warning: mysql_connect(): Access denied
  • Warning: mysql_select_db() Access denied for user ''@'localhost' (using password: NO)
  • Access denied for user 'root'@'localhost' with PHPMyAdmin

Btw, you probably don't want to use mysql_* functions anymore. Newcomers often migrate to mysqli, which however is just as tedious. Instead read up on PDO and prepared statements.
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");

13 davidcondrey Feb 02 2014 at 12:12

Warning: Division by zero

The warning message 'Division by zero' is one of the most commonly asked questions among new PHP developers. This error will not cause an exception, therefore, some developers will occasionally suppress the warning by adding the error suppression operator @ before the expression. For example:

$value = @(2 / 0);

But, like with any warning, the best approach would be to track down the cause of the warning and resolve it. The cause of the warning is going to come from any instance where you attempt to divide by 0, a variable equal to 0, or a variable which has not been assigned (because NULL == 0) because the result will be 'undefined'.

To correct this warning, you should rewrite your expression to check that the value is not 0, if it is, do something else. If the value is zero you either should not divide, or you should change the value to 1 and then divide so the division results in the equivalent of having divided only by the additional variable.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Related Questions:

  • warning: division by zero
  • Warning: Division By Zero Working on PHP and MySQL
  • Division by zero error in WordPress Theme
  • How to suppress the “Division by zero” error
  • How to catch a division by zero?
9 Dharman Jun 19 2019 at 06:03

Fatal error: Object of class Closure could not be converted to a string

It means that you are not executing your anonymous function (or a closure).

An error will be thrown for this example using arrow functions:

echo $fn = fn($x = 42) => $x;

Or for any anonymous function

echo function($x = 42) { return $x; };

To resolve this error you need to execute the closure.

echo $fn = (fn($x = 42) => $x)(30); // take notice of the 2 sets of brackets

echo (function($x = 42) { return $x; })(30);

This kind of syntax is called IIFE and it was added in PHP 7.

9 AbraCadaver Dec 03 2019 at 21:02

Deprecated: Array and string offset access syntax with curly braces is deprecated

String offsets and array elements could be accessed by curly braces {} prior to PHP 7.4.0:

$string = 'abc'; echo $string{0};  // a

$array = [1, 2, 3]; echo $array{0};  // 1

This has been deprecated since PHP 7.4.0 and generates a warning:

Deprecated: Array and string offset access syntax with curly braces is deprecated

You must use square brackets [] to access string offsets and array elements:

$string = 'abc'; echo $string[0];  // a

$array = [1, 2, 3]; echo $array[0];  // 1

The RFC for this change links to a PHP script which attempts to fix this mechanically.