Başvuru - Bu hata PHP'de ne anlama geliyor?


1137

Bu nedir?

Bu, PHP programlanırken karşılaşabileceğiniz uyarılar, hatalar ve bildirimlerle ilgili bir dizi yanıttır ve bunları nasıl düzeltebileceğinize dair hiçbir fikriniz yoktur. Bu aynı zamanda bir Topluluk Wiki'sidir, bu nedenle herkes bu listeye ekleme ve bu listeyi korumaya davet edilir.

Bu neden?

Yığın Taşması'nda "Başlıklar zaten gönderildi" veya "Nesne dışı bir üyeyi arama " 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 bunları tekrarlar ve OP'ye kendi özel durumlarında hangi satırı değiştireceğini gösterir. Bu yanıtlar siteye herhangi bir değer katmaz, çünkü yalnızca OP'nin özel kodu için geçerlidir. Aynı hatayı alan diğer kullanıcılar, çok yerelleştirilmiş oldukları için çözümü kolayca okuyamazlar. Bu üzücü çünkü kök nedeni anladıktan sonra, hatayı düzeltmek önemsizdir. Bu nedenle, bu liste çözümü genel bir şekilde açıklamaya çalışır.

Burada ne yapmalıyım?

Sorunuz bunun kopyası olarak işaretlenmişse, lütfen aşağıdaki hata mesajınızı bulun ve düzeltmeyi kodunuza uygulayın. Cevaplar genellikle sadece genel cevaptan net olmaması gerektiğinde 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ı veya bildiriminizi, yanıt başına bir tane, ne anlama geldiğini kısa bir açıklama (yalnızca manuel sayfalarındaki terimleri vurgulasa bile), olası bir çözümü veya hata ayıklama yaklaşımını ve mevcut olan Soru ve Cevapların bir listesi. Ayrıca, mevcut yanıtları geliştirmekten çekinmeyin.

Liste

Ayrıca bakınız:


7
Ayrıca, tartışmayı yorumların dışına çıkarmak için lütfen bu meta soruya gidin
Earlz



Yanıtlar:


275

Uyarı: Başlık bilgileri değiştirilemiyor - başlıklar zaten gönderildi

Betiğiniz istemciye bir HTTP üstbilgisi göndermeye çalıştığında, ancak daha önce çıktı alındığında gerçekleşir, bu da üstbilgilerin zaten istemciye gönderilmesine neden olur.

Bu bir E_WARNINGve betiği durdurmayacak.

Tipik bir örnek şöyle 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 yazdığında zaten başlıklar gönderdi . En session_start()üste gitmelisin.

Bu kodu Uyarı kodunu tetiklemeden önce satırlardan geçerek ve nerede çıktı verdiğini kontrol ederek çözebilirsiniz . Herhangi bir başlık gönderme kodunu bu koddan önce taşıyın.

Sıklıkla gözden kaçan bir çıktı PHP'nin kapanmasından sonraki yeni satırlardır ?>. ?>Dosyadaki son şey olduğunda atlamak standart bir uygulama olarak kabul edilir . Benzer şekilde, bu uyarının diğer bir yaygın nedeni, açılıştan <?phpönce boş bir alan, çizgi veya görünmez karakter olması ve web sunucusunun üstbilgileri ve boşluk / satırsonu göndermesine neden olmasıdır, böylece PHP ayrıştırma 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ş bir kodunuz varsa birden fazla bloğunuz olabilir)

Ayrıca, kodunuzun kodlaması BOM ile UTF-8 olduğunda, kodunuzda Bayt Sırası İşaretleri olmadığından emin olun.

İlgili sorular:


2
WordPress kullanıyorsanız, tema dosyalarını kontrol edin. Bir siteyi WordPress'in yeni bir sürümüne yükselttiğimde, temayı birkaç yıl içinde güncellenmediğinden güncelleyemedim. Bu sorun ortaya çıktı. Function.php dosyasının birden fazla <? ?> arasında boşluk olan blok.
Roy Leban

2
@RoyLeban "Dosyanızda birden fazla blok varsa ..." Bunun ne anlama geldiğinden emin değilim. "Blok" nedir? Bir blok oluşur <?php ?>ve böylece "birden fazla blok" olur <?php ?> <?php ?>mu?
Andrew Fox

2
Lütfen mümkünse PHP.ini yapılandırma dosyasında 'çıktı arabelleğe alma' özelliğini açın. üstbilgiler farklı bir konumda yayınlanırsa eski üstbilginin yerine yeni üstbilgi konur.
Nidhin David

191

Önemli hata: Nesne dışı bir üye işlevini çağırma ...

Bir nesnenin olmadığı bir xyz->method()yere benzer kodla olur xyzve bu nedenle methodçağrılamaz.

Bu, komut dosyasını durduracak ölümcül bir hatadır (ileri uyumluluk bildirimi: PHP 7 ile başlayan bir hata olabilir).

Çoğu zaman bu, kodun hata durumlarını denetlemediğinin bir işaretidir. Yöntemlerini çağırmadan önce bir nesnenin aslında bir nesne olduğunu doğrulayın.

Bunun tipik bir örneği

// ... 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ğırmayı denerseniz , ölümcül hataya neden olur, falseçünkü değer bir boole'dir.

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 ele alındığına bağlı olacaktır.

Hatta ->preparebaşarısız olursa, $pdoveritabanı tanıtıcı nesnesi geçerli kapsama geçmedi . Nerede tanımlandığını bulun. Ardından 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 daha sonra bu koşullu bloğun dışında bir yöntem çağırmaya çalışmak olabilir. Örneğin

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

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

İlgili sorular:


115

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

Ölümün Beyaz Sayfası veya Ölümün Beyaz Ekranı olarak da bilinir . Bu, hata raporlaması kapatıldığında ve önemli bir hata (genellikle sözdizimi hatası) oluştuğunda meydana gelir.

Hata günlüğü etkinleştirilmişse, hata günlüğünüzde somut hata mesajını bulacaksınız. Bu genellikle "php_errors.log" adlı bir dosyada, merkezi bir konumda (örneğin /var/log/apache2birçok Linux ortamında) veya komut dosyasının kendisinde (bazen paylaşılan bir barındırma ortamında kullanılır) olur.

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

Bu, betiğin ü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çar ve raporlamayı en üst düzeye ayarlar.

Ç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 ayarlamanız gerekir true. Bunu çalışma zamanından önce yapılandırmayı etkileyenphp.ini ya da bir yöntemle .htaccessya da başka bir yöntemle yapın .

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

Günlüğe bakarak veya ekranı kullanarak, komut dosyanızın durduğu çok daha iyi bir hata mesajı ve kod satırı alırsınız.

İlgili sorular:

İlgili hatalar:


3
error_reporting(~0);neden olmasın -1? Yani ne ~0kadar değerlendirir ve çok az şifreli olduğunu.
Fabrício Matté

3
Bence her ikisi de benzer şekilde şifreli. ~0daha açık IMO: boş bit kümesini ortadan kaldırın, yani tüm bayrakları etkinleştirin . -1, C'deki strpos () gibi «bulunamadı» anlamına gelmez, ancak tüm bayraklar ayarlanmış bir 1111'1111'1111'1111bit kümesi olarak ifade edilir, çünkü -1 ikiliktir (32 bit için).
nalply

2
Üzgünüz, 1111'1111'1111'1111gerçekten 16 bit, ama umarım ne demek istediğimi anlarsın.
nalply

3
@IvanSolntsev, üzgünüm hayır, 5.4 öncesi sürümler için E_STRICTdahil değildir E_ALL. php.net/manual/tr/errorfunc.constants.php ve aşağı kaydırın E_STRICT.
nalply

102

Uyarı: Tanımsız Dizin

Bir diziye dizide bulunmayan bir anahtarla erişmeye çalıştığınızda olur.

Bildirimin tipik bir örneği Undefined Index( demo )

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

Her ikisi de spinachve 1dizide mevcut değil, bir E_NOTICEtetiklenmesine neden olur .

Çözüm, bu dizine erişmeden önce dizin veya ofsetin var olduğundan emin olmaktır. Bu, beklediğinizde bu dizinlerin var olduğundan emin olmak için programınızdaki bir hatayı düzeltmeniz gerektiği anlamına gelebilir. Ya da dizinlerin var olup olmadığını sınamanız gerektiği anlamına gelebilir array_key_existsveya isset:

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

Şunun gibi bir kodunuz varsa:

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

Sonra $_POST['message']bu sayfa ilk yüklendiğinde ayarlanmaz ve yukarıdaki hatayı alırsınız. Yalnızca form gönderildiğinde ve bu kod ikinci kez çalıştırıldığında dizi dizini bulunur. Bunu genellikle şunlarla kontrol edersiniz:

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

İlgili sorular:


if(!empty($_POST['message'])){ //do stuff }
Kullanma

85

Uyarı: mysql_fetch_array (), parametre 1'in boolean verilen kaynak olmasını bekliyor

İlk ve en önemli:

Lütfen mysql_*yeni kodda işlevleri kullanmayın . Artık bakımları yapılmıyor ve resmi olarak kullanımdan kaldırılıyor . Bkz kırmızı kutuyu ? Bunun yerine hazırlanmış ifadeler hakkında bilgi edininve PDO veya MySQLi kullanın - bu makale hangisine karar vermenize yardımcı olacaktır. PDO'yu seçerseniz, burada iyi bir öğretici var .


Sonuçtan veri almaya çalıştığınızda, mysql_queryancak sorgu başarısız olduğunda bu olur .

Bu bir uyarıdır ve komut dosyasını 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:

İlgili Hatalar:

mysql*Bir parametre olarak MySQL sonuç kaynağını bekleyen diğer işlevler aynı nedenden dolayı aynı hatayı oluşturur.


5
Sadece bir not. Eğer mysql_queryekleyerek, kötü yetmez or dieo yaralanma hakaret ekliyor üstüne.
Madara'nın Hayaleti

$res = mysql_query($query)Sorgu başarılı olursa karşılaştığım sorun 1 döndürür, bu yüzden doğru kabul edilir. Bu nedenle sonucunu geçerken mysql_query için mysql_fetch_array() uyarı gösterir.
mboy

mboy SELECT, SHOW, DESCRIBE, EXPLAIN ve sonuç kümesi döndüren diğer ifadeler için, mysql_query () başarılı olduğunda bir kaynak veya hata durumunda FALSE döndürür. Diğer SQL deyimleri için INSERT, UPDATE, DELETE, DROP vb. Mysql_query (), başarı durumunda TRUE, hata durumunda FALSE döndürür.
xdazz

@xdazz Karşılaştığım sorun bu, Güncelleme Ekle TRUE döndürüyor, bu yüzden bu hatadan kurtulamıyorum mysql_fetch_array() expects parameter 1 to be resource, boolean given in select lütfen - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 Bu hatadan kurtulmak için herhangi bir öneriniz var mı?
mboy

2
mboy mysql_fetch_array(), seçme sorgusu içindir, ekleme ve güncelleme için, sonuç kümesini getirmenize gerek yoktur (ve getirmenize izin veren hiçbir sonuç kümesi yoktur).
xdazz

79

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

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

Bu hata oluşabilir:

  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 kodunun normal fonksiyonuna ya da sadece küresel kapsam kopyalanmaz edilmişse ve tutmak $thisözel değişkeni.
    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: PHP Önemli hata: Nesne bağlamında değilken $ this kullanma
  2. Kod üzerinden kopyalama: Önemli hata: Nesne bağlamında değilken $ this kullanma
  3. Tüm "Nesne bağlamında değilken $ this kullanma" Stackoverflow ile ilgili sorular

2
Bunun w / kapanışlarla nasıl çalıştığını (statik olmayan yöntemlerde bile) ve 5.4'te nasıl "sabitlendiğini" belirtmek isteyebilirsiniz.
Kendall Hopkins

2
@hakre Kapanış içindeki statik bir çağrıdan bahsediyordum. Gibi $closure = function() { self::method(); }.
Kendall Hopkins

2
@KendallHopkins: Bu farklı bir hata: "Ölümcül hata: hiçbir sınıf kapsamı etkin değilken self :: erişilemiyor" Ancak, $thissizinle birlikte söz konusu tetikleyebilir "Önemli hata: Nesne bağlamında değilken $ this kullanma" :$closure = function() { $this->method(); };
hakre

75

Önemli hata: XXX tanımsız işlevine çağrı

Henüz tanımlanmamış bir işlevi çağırmaya çalıştığınızda olur. Yaygın nedenler arasında eksik uzantılar ve içerme, koşullu işlev bildirimi, işlev bildirimindeki 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 bir kez ilan edilecektircreateFn() çağrıldığında . Sonraki çağrılar, createFn()Varolan bir işlevin Yeniden Bildirimi hakkında bir hata tetikleyeceğini unutmayın .

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

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

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

Eksik eklemeler durumunda, işlevi çağırmadan önce işlevi bildiren dosyayı eklediğinizden emin olun.

Yazım hataları durumunda yazım hatalarını giderin.

İlgili sorular:


73

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

Jetonun olduğunda olurT_XXX beklenmedik bir yerde, dengesiz (gereksiz) parantez, php.ini içindeki etkinleştirmeden kısa etiketinin kullanımı, ve daha bir çok yer.

İlgili sorular:

Daha fazla yardım için bkz:


70

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

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

Misal:

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

Çünkü emptybir işlev değil, bir dil yapısı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ın empty()bir değişken olması gerekir , ancak PHP 5.5 ve sonraki sürümlerinde rasgele bir ifadeye (örneğin bir işlevin dönüş değeri gibi) izin verilir.

empty, ismine rağmen, bir değişkenin "boş" olup olmadığını kontrol etmez. Bunun yerine, bir değişkenin olup olmadığını kontrol eder veya == false. İfadeler ( is_null(null)örnekteki gibi ) her zaman var sayılır, bu yüzden burada emptysadece yanlış olana eşit olup olmadığı kontrol edilir. empty()Burada yerine !örn. if (!is_null(null)), Veya açıkça false ile karşılaştırabilirsiniz, örn if (is_null(null) == false).

İlgili sorular:


64

MySQL: SQL sözdiziminizde bir hata var; satırda ... yakınında kullanılacak 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 iletilen verilerden uygun şekilde kaçmayı unuttuğunuzdan kaynaklanır.

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, http://example.com/edit.php?id=10 (yayını n ° 10 düzenlemek için) gibi bir URL ile gönderilecek formu olan bir sayfaya eklenebilir

Gönderilen metin tek tırnak içeriyorsa ne olur? $queryile sona erecek:

$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 edecektir, çünkü ortada fazladan bir tek tırnak var.

Bu tür hataları önlemek için, sorguda kullanmadan önce her zaman verilerden kaçmanız GEREKİR .

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

Belgeler:


3
Ayrıca, sitenizi otomatik olarak botlar tarafından otomatik olarak saldırıya
uğrayacaksınız

2
@gladoscc "Düzenle" yi tıklayın ve cevabı değiştirin. Geliştirilebileceğinin farkındayım.
Jocelyn

2
Veya hazırlanmış bir sql sorgusu kullanın.
Matej

53

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

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

Yapılacak ilk şey, betiğinizin ihtiyaç duyduğu bellek miktarını en aza indirmektir. Örneğin, büyük bir dosyayı bir değişkene okuyorsanız veya bir veritabanından çok sayıda kayıt alıyorsanız ve bunların tümünü bir dizide saklıyorsanız, bu çok fazla bellek kullanabilir. Kodunuzu, dosyayı satır satır okumak için değiştirin veya veritabanı kayıtlarını tümünü belleğe kaydetmeden tek tek alın. Bu, perde arkasında neler olup bittiğine ve verilerin bellekte başka bir yerde ne zaman depolandığına dair kavramsal bir farkındalık gerektiriyor.

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

İlgili sorular:


53

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

Bu hata çoğunlukla , karmaşık değişken yapının tamamı içine alınmadığında çift tırnaklı bir dize içinde enterpolasyon için tırnak içine alınmış bir anahtarla bir dizi değerine başvurmaya çalışırken karşılaşılır {}.

Hata durumu:

Bunun sonucu 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 dizede PHP, dizi anahtar dizelerinin tırnaksız olarak kullanılmasına izin verir ve bir E_NOTICE. Yani yukarıdakiler şöyle 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 belgeleri , 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']}";

Elbette , yukarıdakilerden herhangi birine alternatif , dizi değişkenini enterpolasyon yapmak yerine 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


45

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

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öreceli
  • içerme yolu 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, mevcut olmayan dosyalar, PHP'nin kendisi tarafından erişimi önleyen dosya sisteminin hakları veya açık tabanlı kısıtlamalar ile de ilgili olabilir.

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

İlgili sorular:

İlgili Hatalar:


44

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

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

Bu hata genellikle ::kodunuzu yanlışlıkla girerseniz oluşur .

İlgili sorular:

Belgeler:


Bu hatayı tetiklemenin en kolay yolu a()::b;veya $a=::;.
Ismael Miguel

43

Uyarı: Tanımlanmamış sabit XXX kullanımı - 'XXX' olduğu varsayıldı

veya PHP 7.2 veya üzeri ile:

Uyarı: 'XXX' olduğu varsayılan tanımsız sabit XXX kullanımı (bu, PHP'nin gelecekteki bir sürümüne Hata gönderir)

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

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

Örneğin:

// Wrong
echo $array[key];

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

Bir diğer yaygın neden, $değişken adının önünde eksik (dolar) bir işarettir:

// Wrong
echo varName;

// Right
echo $varName;

Ya da belki başka bir sabit veya anahtar kelimeyi yanlış yazdınız:

// Wrong
$foo = fasle;

// Right
$foo = false;

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

İlgili sorular:


2
En yaygın neden $ dizileri değil, bir değişken önünde unutmak olduğunu söyleyebilirim.
Overv

42

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

Ö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ı oluşturur. 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.


3
Otomatik yükleme kullanarak bahsetmeye değer mi ve PSR-4 veya şimdi kullanımdan kaldırılmış PSR-0 gibi standartlar , kendinizi ihtiyaç / dahil etme gereksiniminden kurtararak (bundan birkaç tuhaf kenar vakası bar) kurtulabilirsiniz.
DanielM

39

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

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

Bunun tipik bir örneği

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

Daha $counterönce tanımlamadıysanız , yukarıdaki kod bildirimi tetikler.

Doğru yol, sadece boş bir dize olsa bile, kullanmadan önce ayarlamaktır

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

Uyarı: Tanımsız mülkiyet

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

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

İlgili sorular:


35

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

Olası senaryo

Kodumun nerede yanlış gittiğini bulamıyorum. İşte benim 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özdiziminde, bir ifadenin sonundan noktalı virgül bırakılması veya yukarıdaki durum gibi .operatörü kaçırması gibi bir sorun . 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 ayrıştırılmasını ve dolayısıyla çalışmasını durduran bir şey vardır.

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

Bu hata iletisi, dosyanın x satırında PHP yorumlayıcısının açık bir parantez görmeyi beklediği, ancak bunun yerine çağrılan bir şeyle karşılaştığı anlamına gelir T_VARIABLE. Bu T_VARIABLEşeye a denir token. PHP tercümanının programların farklı temel bölümlerini ifade etme şeklidir. Tercüman bir programda okuduğunda, yazdıklarınızı bir jeton listesine çevirir. Programınıza bir değişken yerleştirdiğiniz her yerde T_VARIABLE, tercüman listesinde bir jeton vardır .

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

Yani emin azından etkinleştirmek yapmak E_PARSEGözlerinde farklı php.ini. Üretim komut dosyalarında ayrıştırma hataları olmamalıdır.

Kodlama sırasında her zaman aşağıdaki ifadeyi eklemenizi öneririm:

error_reporting(E_ALL);

PHP hata bildirimi

Ayrıca, yazarken ayrıştırma hatalarını bildiren bir IDE kullanmak için iyi bir fikir. Kullanabilirsiniz:

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

İlgili sorular:


34

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

Adından da anlaşılacağı gibi, büyük olasılıkla yinelenmeye veya var olmayan bir anahtarı olan bir diziden bir değer bulmaya çalıştığınızda bu tür bir hata oluşur.

Siz düşünün, her mektubu $string

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

Yukarıdaki örnek ( çevrimiçi demo ) üretir :

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

Ve, komut dosyası yankıyı bitirir bitirmez Dhatayı alırsınız, çünkü for()döngü içinde PHP'ye size 'ABCD'hangi, var olan ilkden beşinci dize karakterini göstermesini söylediniz , ancak döngü saymaya 0ve yankılara başladığından beri Dulaştığında 4bir ofset hatası atar.

Benzer Hatalar:


32

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

Nesne yokken bir nesnenin özelliğine erişmeye çalıştığınızda olur.

Nesne dışı bir bildirim için tipik bir örnek olarak

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

Bu durumda, $usersbir dizidir (bu nedenle 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ımsız Dizin ).

Bu örnek çok basitleştirilmiştir. Çoğu zaman böyle bir bildirim, örneğin NULLbir nesne yoksa bir kütüphane döndüğünde veya yalnızca beklenmeyen bir nesne dışı değer olduğunda (örneğin, bir Xpath sonucunda, beklenmeyen biçime sahip JSON yapıları, beklenmedik biçime sahip XML vb.) İşaretlenmemiş bir dönüş değeri sinyali verir . ancak kod böyle bir durumu kontrol etmez.

Bu nesne olmayanlar genellikle daha fazla işlendiğinden, genellikle nesne olmayan bir nesne üzerinde bir nesne yöntemi çağrıldıktan sonra ölümcül bir hata oluşur (bkz: Ölümcül hata: Nesne dışı bir üye işlevine çağrı ... ) senaryo.

Hata durumları kontrol edilerek ve / veya bir değişkenin bir beklentiyle eşleştiği kolayca önlenebilir. DOMXPath örneğiyle böyle bir bildirim :

$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ığını kontrol etmediği halde, 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 getirmeye yarar:

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

İlgili hatalar:


1
json_decodeŞimdi bir örneğini döndürür stdclassörnek kod böylece, varsayılan olarak ederim gerçekten işe.
Hugo Zink

@HugoZink: Aslında bu örnek için bir dizi döndürüyor (ve her zaman yaptı): 3v4l.org/SUDe0 - Ayrıca yazınız için " json_decodeşimdi stdclassvarsayılan olarak bir örneğini döndüren " için referans verebilir misiniz ? Bunu changelog'da bulamıyorum.
hakre

PHP kılavuzunun json_decode üzerindeki sayfasına göre, varsayılan olarak assocparametre false olarak ayarlanır. Bu parametre işlevin stdclassilişkilendirilebilir bir dizi yerine döndürüp döndürmeyeceğine karar verir .
Hugo Zink

json_decode('[{"name": "hakre"}]', true)bir dizi döndürür, aksi takdirde bir stdclassnesne
zanderwar

29

Uyarı: open_basedir geçerli kısıtlaması

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

Göründüğünde, bazı dosyalara erişim yasaklanmıştır.

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

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

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

İlgili sorular:


1
Bu genellikle paylaşılan bir ana bilgisayarda gerçekleşir, insanlar genellikle kendilerini dizinlerden kilitlemez :-)
uınbɐɥs

28

Ayrıştırma hatası: beklenmedik bir hata oluştu '['

Bu hata iki varyantta gelir:

Varyasyon 1

$arr = [1, 2, 3];

Bu dizi başlatıcı sözdizimi yalnızca PHP 5.4'te tanıtıldı; bundan önceki sürümlerde ayrıştırıcı hatası ortaya çıkar. Mümkünse kurulumunuzu yükseltin veya eski sözdizimini kullanın:

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

Kılavuzdaki bu örneğe de bakın .

Varyasyon 2

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

Dizi kayıt silme işlevi sonuçları PHP 5.4'te de tanıtıldı. Yükseltme mümkün değilse (geçici) bir değişken kullanmanız gerekir:

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

Kılavuzdaki bu örneğe de bakın .


23

Uyarı: [function], parametre 1'in boolean verilen kaynak olmasını bekliyor

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

Kaynaklar PHP'deki bir türdür (dizeler, tamsayılar veya nesneler gibi). Bir kaynak, kendiliğinden anlamlı değeri olmayan opak bir lekedir. Bir kaynak, belirli bir PHP işlevi veya uzantısı kümesine özgüdür ve tanımlanır. Örneğin, Mysql uzantısı iki kaynak türünü tanımlar :

MySQL modülünde kullanılan iki kaynak türü vardır. Birincisi bir veritabanı bağlantısı için bağlantı tanımlayıcı, ikincisi bir sorgunun sonucunu tutan kaynaktır.

CURL uzantısı başka iki kaynak türü tanımlar :

... bir cURL sapı ve bir cURL çoklu sapı.

Ne zaman var_dumped, değerler aşağıdaki gibi görünür:

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

resource(1) of type (curl)

Çoğu kaynak budur, (1)belirli bir türdeki sayısal bir tanımlayıcıdır ( (curl)).

Bu kaynakları yanınızda taşır ve böyle bir kaynağın bir şey ifade ettiği farklı işlevlere geçirirsiniz. Genellikle bu işlevler belirli verileri arka planda tahsis eder ve kaynak, bu verileri dahili olarak takip etmek için kullandıkları bir referanstır.


" ... parametre 1'in kaynak, boolean verildiğini " hatası, genellikle bir kaynak oluşturması beklenen ancak falsebunun yerine döndürülen denetlenmeyen bir işlemin sonucudur . Örneğin, fopenişlev şu açıklamaya sahiptir:

Dönüş Değerleri

Başarılı veya FALSEhatalı bir dosya tanıtıcısı kaynağı döndürür .

Yani bu kodda $fpya bir resource(x) of type (stream)ya da olacak false:

$fp = fopen(...);

fopenİşlemin başarılı veya başarısız olup olmadığını ve dolayısıyla $fpgeçerli bir kaynak olup olmadığını veya bir kaynak bekleyen başka bir işleve falsegeçip geçmediğini kontrol etmezseniz $fp, yukarıdaki hatayı alabilirsiniz:

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

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

Her zaman bir kaynak ayırmaya çalışan ve başarısız olabilecek işlevlerin dönüş değerini denetlemeniz gerekir :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

İlgili Hatalar:


22

Uyarı: Geçersiz dize uzaklığı 'XXX'

Bu, köşeli ayraç sözdizimi ile bir dizi öğesine erişmeye çalıştığınızda gerçekleşir, ancak bunu bir dizide değil, bir dizede yapıyorsunuz, bu nedenle işlem açıkça mantıklı değil .

Misal:

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

Değişkenin bir dizi olması gerektiğini düşünüyorsanız, nereden geldiğini görün ve sorunu orada düzeltin.


20

Kod çalışmıyor / PHP kodumun bazı bölümleri çıktı gibi görünüyor

PHP kodunuzdan hiçbir sonuç görmüyorsanız ve / veya web sayfasında gerçek PHP kaynak kodu çıktısının bir kısmını görüyorsanız, PHP'nizin gerçekten yürütülmediğinden emin olabilirsiniz. Tarayıcınızda Kaynağı Görüntüle'yi kullanırsanız, muhtemelen tüm PHP kaynak kodu dosyasını olduğu gibi görürsünüz. PHP kodu <?php ?>etiketlere gömülü olduğundan, tarayıcı bunları HTML etiketleri olarak yorumlamaya çalışır ve sonuç biraz karışık görünebilir.

PHP betiklerinizi gerçekten çalıştırmak için şunlara ihtiyacınız vardır:

  • betiğinizi çalıştıran bir web sunucusu
  • dosya uzantısını .php olarak ayarlamak için, aksi takdirde web sunucusu dosyayı böyle yorumlamaz *
  • sunucusu üzerinden .php dosyanıza erişmek için

* Yeniden yapılandırmadıkça, her şey yapılandırılabilir.

Bu sonuncusu özellikle önemlidir. Dosyayı çift tıklamak, muhtemelen aşağıdaki gibi bir adres kullanarak tarayıcınızda açılır:

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

Bu, çalıştırdığınız herhangi bir web sunucusunu tamamen atlıyor ve dosya yorumlanmıyor. Muhtemelen aşağıdaki gibi bir şey olan web sunucunuzdaki dosyanın URL'sini ziyaret etmeniz gerekir:

http://localhost/my/file.php

Bunun <?yerine kısa açık etiketler kullanıp kullanmadığınızı <?phpve PHP yapılandırmanızın kısa açık etiketleri kapatıp kapatmadığını da kontrol etmek isteyebilirsiniz .

Ayrıca bkz. PHP kodu yürütülmüyor, bunun yerine kod sayfada görünüyor


18

Uyarı: mysql_connect (): '@' host 'kullanıcı adı için erişim reddedildi

Bu uyarı, geçersiz veya eksik kimlik bilgilerine (kullanıcı adı / şifre) sahip bir MySQL / MariaDB sunucusuna bağlandığınızda görünür. Bu genellikle bir kod sorunu değil , bir sunucu yapılandırma sorunudur.

  • mysql_connect("localhost", "user", "pw")Örnekler için kılavuz sayfasına bakınız .

  • Gerçekten bir $usernameve kullandığınızdan emin olun $password.

    • Parola kullanmadan erişim elde etmeniz nadirdir - Uyarı: söylendiğinde olan budur (using password: NO).
    • Yalnızca yerel test sunucusu genellikle kullanıcı adı root, parola ve testveritabanı adıyla bağlantı kurulmasına izin verir .

    • Komut satırı istemcisini kullanarak gerçekten doğru olup olmadıklarını test edebilirsiniz :
      mysql --user="username" --password="password" testdb

    • Kullanıcı adı ve şifre olan harf duyarlı ve boşluk olduğu değil görmezden geldi. Parolanız gibi meta karakterler içeriyorsa $, bu karakterlerden kaçın veya parolayı tek tırnak içine alın .

    • Çoğu paylaşılan barındırma sağlayıcıları, unix kullanıcı hesabıyla ilişkili olarak mysql hesaplarını önceden bildirir (bazen sadece önekler veya fazladan sayısal sonekler). Bir desen veya dokümantasyon için dokümanlara ve bir şifre ayarlamak için CPanel'e veya herhangi bir arayüze bakın.

    • Komut satırını kullanarak kullanıcı hesapları ekleme ile ilgili MySQL kılavuzuna bakın . Yönetici kullanıcı olarak bağlandığında aşağıdaki gibi bir sorgu düzenleyebilirsiniz:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Veya kullanmak Adminer veya Workbench , çek veya doğru hesap bilgilerini oluşturmak için veya başka herhangi bir grafik aracı.

    • Kimlik bilgilerinizi düzeltemiyorsanız, internetten "lütfen yardım et" istemesinin hiçbir etkisi olmayacaktır. Yalnızca siz ve barındırma sağlayıcınız, şeyleri tanılamak ve düzeltmek için izinlere ve yeterli erişime sahip olursunuz.

  • Sağlayıcınız tarafından verilen ana bilgisayar adını kullanarak veritabanı sunucusuna ulaşabildiğinizi doğrulayın :
    ping dbserver.hoster.example.net

    • Bunu doğrudan web sunucunuzdaki bir SSH konsolundan kontrol edin. Yerel geliştirme istemcinizden paylaşılan barındırma sunucunuza test yapmak nadiren anlamlıdır.

    • Genellikle sunucu adının olmasını istersiniz "localhost", bu normalde kullanılabilir olduğunda yerel olarak adlandırılmış bir soket kullanır. Diğer zamanlarda "127.0.0.1"yedek olarak deneyebilirsiniz .

    • MySQL / MariaDB sunucunuz farklı bir bağlantı noktasını dinlerse kullanın "servername:3306".

    • Bu başarısız olursa, belki de bir güvenlik duvarı sorunu vardır. (Konu dışı, programlama sorusu değil. Uzaktan tahmin etme imkanı yok.)

  • Örneğin veya gibi sabitleri kullanırken bunların gerçekten tanımlandığını kontrol edin .DB_USERDB_PASSWORD

    • Eğer bir "Warning: Access defined for 'DB_USER'@'host'"ve bir alırsanız "Notice: use of undefined constant 'DB_PASS'", bu sizin probleminizdir.

    • xy/db-config.phpÖrneğinizin gerçekten dahil edildiğini ve whatelse olduğunu doğrulayın .

  • Doğru ayarlanmış GRANTizinleri kontrol edin .

    • Bir username+ passwordçiftine sahip olmak yeterli değildir .

    • Her MySQL / MariaDB hesabının ekli bir izin kümesi olabilir.

    • Bunlar, hangi veritabanlarına bağlanmanıza izin verildiğini, hangi istemci / sunucudan kaynaklanabileceğini ve hangi sorgulara izin verileceğini kısıtlayabilir.

    • "Erişim reddedildi" uyarısı mysql_query, SELECTbelirli bir tablodan veya INSERT/ veya UPDATEdaha yaygın olarak DELETEherhangi bir şeyden izniniz yoksa aramalar için de görünebilir .

    • Aşağıdaki gibi bir sorgu ile yönetici hesabını kullanarak komut satırı istemcisi başına bağlandığında hesap izinlerini uyarlayabilirsiniz :
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • Uyarı önce ile gösterilirse Warning: mysql_query(): Access denied for user ''@'localhost', php.ini tarafından önceden yapılandırılmış bir hesap / parola çiftiniz olabilir .

    • Bunu kontrol edin mysql.default_user=ve mysql.default_password=anlamlı değerlere sahip olun.

    • Çoğu zaman bu bir sağlayıcı yapılandırmasıdır. Bu yüzden uyumsuzluklar için desteklerine başvurun.

  • Paylaşılan barındırma sağlayıcınızın belgelerini bulun:

  • Kullanılabilir bağlantı havuzunu da bitirmiş olabileceğinizi unutmayın . Çok fazla eşzamanlı bağlantı için erişim reddedildi uyarıları alacaksınız. (Kurulumu araştırmalısınız. Bu bir programlama sorusu değil, konu dışı bir sunucu yapılandırma sorunu.)

  • Libmysql istemci sürümünüz veritabanı sunucusuyla uyumlu olmayabilir . Normalde MySQL ve MariaDB sunucularına sürücüde derlenen PHP'lerle erişilebilir. Özel bir kurulum veya eski bir PHP sürümünüz ve çok daha yeni bir veritabanı sunucunuz veya önemli ölçüde eski bir sunucunuz varsa, sürüm uyuşmazlığı bağlantıları önleyebilir. (Hayır, kendinizi araştırmanız gerekiyor. Kimse kurulumunuzu tahmin edemez).

Diğer referanslar:

Btw, muhtemelen mysql_*işlevleri artık kullanmak istemiyorsunuz . Yeni gelenler genellikle mysqli'ye göç ederler , ancak bu da sıkıcıdır. Bunun yerine PDO ve hazırlanan ifadeleri okuyun .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
mysql, php-ini ayarları aracılığıyla otomatik bağlanmaya izin verir, ardından aynı hata mesajı öneklenmiş farklı komutla verilir, örn. "Uyarı: mysql_query (): '' @ 'localhost' kullanıcısı için erişim reddedildi (şifre: NO kullanarak). .. " - dikkat çekiyor.
hakre

Ha, tamamen unutmuşum! (Muhtemelen en son PHP3 ya da öylesine kullanılmış ..)
mario

18

Uyarı: Dizeden dizeye dönüştürme

Bu, bir diziyi dize olarak ele almaya çalıştığınızda gerçekleşir:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Dizi, olamaz echosonuç iyi tanımlanmamış nedeniyle, d veya bir dizi ile birleştirilmiş'. PHP, dizinin yerine "Dizi" dizesini kullanır ve muhtemelen bunun amaçlanmadığını ve kodunuzu burada kontrol etmeniz gerektiğini belirtmek için uyarıyı tetikler. Muhtemelen bunun gibi bir şey istersiniz:

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

Veya diziyi döngüye sokun:

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

Bu uyarı beklemediğiniz bir yerde görünüyorsa, bir dizenin aslında bir dizi olduğunu düşündüğünüz bir değişken anlamına gelir. Bu, kodunuzda bu değişkeni beklediğiniz dize yerine bir dizi yapan bir hataya sahip olduğunuz anlamına gelir.


12

Uyarı: Division by zero

'Sıfıra bölme' uyarı mesajı, yeni PHP geliştiricileri arasında en sık sorulan sorulardan biridir. Bu hata bir istisnaya neden olmaz, bu nedenle bazı geliştiriciler zaman zaman ifadeden önce hata bastırma operatörü @ ekleyerek uyarıyı bastırır. Örneğin:

$value = @(2 / 0);

Ancak, herhangi bir uyarıda olduğu gibi, en iyi yaklaşım uyarının nedenini bulmak ve çözmek olacaktır. Uyarının nedeni, 0'a bölmeye çalıştığınız herhangi bir örnekten, 0'a eşit bir değişkenden veya sonuç 'tanımsız' olacağından atanmamış bir değişkenden (çünkü NULL == 0) gelecektir.

Bu uyarıyı düzeltmek için, değerin 0 olmadığından emin olmak için ifadenizi yeniden yazmalısınız, eğer öyleyse başka bir şey yapın. Değer sıfırsa bölmemelisiniz, ya da değeri 1 olarak değiştirmeli ve sonra bölmelisiniz, böylece bölme yalnızca ek değişkene bölünme eşdeğeri ile sonuçlanır.

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
}

İlgili sorular:


0 ise 1 olarak ayarlanması hatayı durduracaktır, ancak bu gerçekten kullanılmaması gerektiğini söylediğiniz baskılamadan daha mı iyi (buna katılıyorum)? Çoğu zaman başka bir mesajın veya değerin döndürülmesini öneririm.
James

Eğer bu Örneğin, $var1ardından == 0 yapar sadece ayarlayabilirsiniz $var3için $var2. Bunu yapmasa bile, ödev her iki durumda da aynı olduğu için başka bir şeye ihtiyaç duyulmaz, bu yüzden başka bir şey if
James

8

Katı Standartlar: Statik olmayan yöntem [<class> :: <method>] statik olarak çağrılmamalıdır

Sınıfta statik olmadığı için statik olmayan bir yöntemi çağırmaya çalıştığınızda oluşur ve ayarlarınızda da E_STRICTbayrak bulunur error_reporting().

Misal :

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() veya $html::br()

Aslında değil ekleyerek bu hatayı önleyebilirsiniz E_STRICTiçin error_reporting(), örneğin

error_reporting(E_ALL & ~E_STRICT);

çünkü PHP 5.4.0 ve üstü için, [ ref ] E_STRICTiçine dahil edilmiştir . Ancak bu tavsiye edilemez. Çözüm, amaçladığınız statik işlevi gerçek olarak tanımlamaktır :E_ALLstatic

public static function br() {
  echo '<br>';
}

veya işlevi geleneksel olarak çağırın:

$html = new HTML();
$html->br();

İlgili sorular :


7

Kullanımdan kaldırıldı: Kıvrık parantez içeren dizi ve dizgi kaydırma erişimi sözdizimi kullanımdan kaldırıldı

{}PHP 7.4.0'dan önce string ofsetleri ve dizi elemanlarına kıvırcık parantezlerle erişilebilir :

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

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

PHP 7.4.0'dan bu yana kullanımdan kaldırılmıştır ve bir uyarı oluşturur:

Kullanımdan kaldırıldı: Kıvrık parantez içeren dizi ve dizgi kaydırma erişimi sözdizimi kullanımdan kaldırıldı

[]Dizi ofsetlerine ve dizi öğelerine erişmek için köşeli parantez kullanmalısınız :

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

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

Bu değişiklik için RFC bir PHP bağlantılar komut girişimleri mekanik Bunu düzeltmek için.

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.