PHP kullanan "Uyarı: Tanımsız değişken", "Uyarı: Tanımsız dizin" ve "Uyarı: Tanımsız ofset"

Nov 24 2010

Bir PHP betiği çalıştırıyorum ve aşağıdaki gibi hatalar almaya devam ediyorum:

Uyarı: Tanımsız değişken: 10. satırdaki C: \ wamp \ www \ mypath \ index.php içindeki my_variable_name

Uyarı: Tanımsız dizin: 11 satırdaki my_index C: \ wamp \ www \ mypath \ index.php

10. ve 11. satırlar şuna benzer:

echo "My variable value is: " . $my_variable_name; echo "My index value is: " . $my_array["my_index"];

Bu hata mesajlarının anlamı nedir?

Neden birdenbire ortaya çıkıyorlar? Bu senaryoyu yıllarca kullandım ve hiç sorun yaşamadım.

Onları nasıl düzeltirim?


Bu, sorunu tekrar tekrar açıklamak zorunda kalmadan, kişilerin yinelenen olarak bağlantı kurabilecekleri bir Genel Referans sorusudur . Bunun gerekli olduğunu düşünüyorum çünkü bu konudaki gerçek dünyadaki cevapların çoğu çok özel.

İlgili Meta tartışması:

  • Tekrarlayan sorular hakkında ne yapılabilir?
  • "Referans soruları" mantıklı mı?

Yanıtlar

1113 Rizier123 Nov 24 2010 at 04:36

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

PHP Kılavuzunun engin bilgeliğinden :

Aynı değişken adını kullanan bir dosyanın diğerine dahil edilmesi durumunda, başlatılmamış bir değişkenin varsayılan değerine güvenmek sorunludur. Aynı zamanda bir uzmanı güvenlik riski ile register_globals döndü. İlklendirilmemiş değişkenlerle çalışma durumunda E_NOTICE seviyesinde hata verilir, ancak ilklendirilmemiş diziye eleman eklenmesi durumunda değil. isset () dil yapısı, bir değişkenin önceden başlatılmış olup olmadığını saptamak için kullanılabilir. Ek olarak ve daha ideal olanı , değişken başlatılmazsa bir uyarı veya hata mesajı oluşturmayacağı için empty () ' nin çözümüdür .

Gönderen PHP belgelerine :

Değişken yoksa hiçbir uyarı üretilmez. Bu, empty () ' nin özünde ! İsset ($var) || $var == false .

Yalnızca kullanabileceği Bu araçlar empty()değişken ayarlanmış olup olmadığını belirlemek için, ve buna ek olarak karşısına şunlar değişkeni denetler 0, 0.0, "", "0", null, falseveya [].

Misal:

$o = []; @$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "\n";
});

Yukarıdaki parçacığı 3v4l.org çevrimiçi PHP düzenleyicisinde test edin

PHP bir değişken bildirimi gerektirmese de, daha sonra komut dosyasında kullanılacak bir değişkene değer vermeyi unutan bazı güvenlik açıklarından veya hatalardan kaçınmak için bunu tavsiye eder. PHP'nin bildirilmemiş değişkenler durumunda yaptığı şey, çok düşük düzeyde bir hata yayınlamaktır E_NOTICE, bu, varsayılan olarak bile rapor edilmeyen bir hata , ancak geliştirme sırasında izin vermeyi tavsiye eder .

Sorunla başa çıkmanın yolları:

  1. Önerilen: Değişkenlerinizi bildirin, örneğin tanımsız bir değişkene bir dize eklemeye çalıştığınızda. Veya aşağıdaki gibi, referans vermeden önce beyan edilip edilmediklerini kontrol etmek için isset()/ !empty()kullanın:

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : ''; //empty() $value = !empty($_POST['value']) ? $_POST['value'] : '';
    

    Bu, PHP 7.0'dan itibaren çok daha temiz hale geldi, şimdi null coalesce operatörünü kullanabilirsiniz :

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. E_NOTICE için özel bir hata işleyici ayarlayın ve mesajları standart çıktıdan uzağa yönlendirin (belki bir günlük dosyasına):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  3. E_NOTICE’in raporlamasını devre dışı bırakın Yalnızca hariç tutmanın hızlı bir yolu E_NOTICEşudur:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  4. Hatayı @ operatörüyle bastırın .

Not: Sadece 1. noktayı uygulamanız şiddetle tavsiye edilir.

Uyarı: Tanımsız dizin / Tanımsız ofset

Bu uyarı, siz (veya PHP) bir dizinin tanımlanmamış bir dizinine erişmeye çalıştığınızda görünür.

Sorunla başa çıkmanın yolları:

  1. Erişmeden önce dizinin var olup olmadığını kontrol edin. Bunun için isset()veya kullanabilirsiniz array_key_exists():

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : ''; //array_key_exists() $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
  2. Dil yapısı list(), var olmayan bir dizi dizinine erişmeye çalıştığında bunu oluşturabilir:

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    

İki dizi öğesine erişmek için iki değişken kullanılır, ancak yalnızca bir dizi öğesi vardır, dizin 0, dolayısıyla bu:

Uyarı: Tanımsız ofset: 1

$_POST/ $_GET/ $_SESSIONdeğişken

Bildirimler yukarıda çalışırken sık görünür $_POST, $_GETya da $_SESSION. İçin $_POSTve $_GETkullanmadan önce dizinin var olup olmadığını kontrol etmelisiniz. Çünkü $_SESSIONoturumu başlattığınızdan session_start()ve dizinin de var olduğundan emin olmalısınız .

Ayrıca 3 değişkenin de süper küresel ve büyük harf olduğuna dikkat edin .

İlişkili:

  • Uyarı: Tanımsız değişken
  • Uyarı: Tanımsız Dizin
149 Ish Nov 24 2010 at 04:31

Bunları dene

S1: Bu uyarı, $ varname kodunun mevcut kapsamında tanımlı olmadığı anlamına gelir.

S2: Herhangi bir şüpheli değişkeni kullanmadan önce isset (), boş () koşullarının kullanılması iyi çalışıyor.

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? ''; // pre-7 PHP versions $user_name = '';
if (!empty($_SESSION['user_name'])) { $user_name = $_SESSION['user_name'];
}

Veya hızlı ve kirli bir çözüm olarak:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

Oturumlar hakkında not:

  • Oturumlar kullanılırken, oturumlar kullanılarak session_start();tüm dosyaların içine yerleştirilmesi gerekir.

  • http://php.net/manual/en/features.sessions.php

66 mario Nov 24 2010 at 04:40

Hata görüntüleme @operatörü

İstenmeyen ve gereksiz bildirimler için, tanımlanmamış değişken / dizin mesajlarını » gizlemek « için ayrılmış @operatör kullanılabilir .

$var = @($_GET["optional_param"]);
  • Bu genellikle tavsiye edilmez. Yeni gelenler onu aşırı kullanma eğilimindedir.
  • Uygulama mantığının derinliklerindeki kodlar için (yapmamanız gereken yerlerde bildirilmemiş değişkenleri göz ardı ederek), örneğin işlev parametreleri veya döngülerde çok uygun değildir.
  • Üzerinde ters bir tane var isset?:ya ??ancak süper supression. Bildirimler yine de kaydedilebilir. Ve biri diriltilebilir - @gizli bildirimler:set_error_handler("var_dump");
    • Ek if (isset($_POST["shubmit"]))olarak, ilk kodunuzda alışkanlıkla kullanmamalı / önermemelisiniz .
    • Yeni gelenler bu tür yazım hatalarını fark etmez. Sadece bu gibi durumlar için sizi PHP Bildirimlerinden mahrum eder. @Veya issetyalnızca işlevselliği doğruladıktan sonra ekleyin .
    • Önce nedeni düzeltin. Bildirimler değil.

  • @özellikle $_GET/ $_POSTinput parametreleri için kabul edilebilir , özellikle de isteğe bağlı iseler .

Ve bu, bu tür soruların çoğunu kapsadığından, en yaygın nedenleri inceleyelim:

$_GET/ $_POST/ $_REQUESTtanımsız girdi

  • Tanımlanmamış bir dizin / uzaklıkla karşılaştığınızda ilk yapmanız gereken, yazım hatalarını kontrol etmektir:
    $count = $_GET["whatnow?"];

    • Bu beklenen bir anahtar adı mı ve her sayfa isteğinde mevcut mu?
    • Değişken isimleri ve dizi göstergeleri PHP'de büyük / küçük harfe duyarlıdır.
  • İkinci olarak, bildirimin bariz bir nedeni var_dumpyoksa print_r, tüm giriş dizilerini mevcut içerikleri için kullanın veya doğrulayın :

    var_dump($_GET); var_dump($_POST);
    //print_r($_REQUEST);
    

    Her ikisi de betiğinizin doğru veya herhangi bir parametre ile çağrılıp çağrılmadığını gösterir.

  • Alternatif olarak veya ek olarak tarayıcınızın geliştiricilerini ( F12) kullanın ve istekler ve parametreler için ağ sekmesini inceleyin:

    POST parametreleri ve GET girişi ayrı ayrı gösterilecektir.

  • $_GETParametreler için içeriğe de göz atabilirsiniz QUERY_STRING.

    print_r($_SERVER);
    

    PHP'nin standart olmayan parametre isimlerini süper küreseller halinde birleştirmek için bazı kuralları vardır . Apache de bazı yeniden yazma işlemleri yapabilir. Bu şekilde sağlanan ham $_COOKIESve diğer HTTP istek başlıklarına da bakabilirsiniz .

  • Daha açık bir şekilde GET parametreleri için tarayıcınızın adres çubuğuna bakın :

    http://example.org/script.php?id=5&sort=desc

    name=valueSonra çiftleri ?soru işareti sorgu (GET) parametrelerdir. Bu nedenle, bu URL yalnızca muhtemelen $_GET["id"]ve sonucunu verebilir $_GET["sort"].

  • Son olarak , bir parametre bekliyor ancak hiçbirini almıyorsanız, beyanlarınızı <form>ve<input> beyanlarınızı kontrol edin .

    • Her gerekli girişin bir <input name=FOO>
    • id=Veya title=nitelik yetmiyor.
    • Bir method=POSTform doldurulmalı $_POST.
    • Oysa bir method=GET(veya onu dışarıda bırakmak) $_GETdeğişkenler verecektir .
    • Bir formun action=script.php?get=param$ _GET yoluyla ve kalan method=POSTalanları da $ _POST ile birlikte sağlaması da mümkündür .
    • Modern PHP yapılandırmalarıyla (≥ 5.6) , GET ve POST parametrelerini karıştıran tekrar kullanmak uygun (moda değil) hale geldi $_REQUEST['vars'].
  • Mod_rewrite kullanıyorsanız, o zaman her ikisini de kontrol etmeli ve eksik parametreleri bulmayı access.logetkinleştirmelisiniz RewriteLog.

$_FILES

  • Aynı mantık kontrolleri dosya yüklemeleri ve $_FILES["formname"].
  • Ayrıca kontrol edin enctype=multipart/form-data
  • Yanı sıra method=POSTsizin de <form>bildiriminde.
  • Ayrıca bkz: PHP Tanımsız dizin hatası $ _FILES?

$_COOKIE

  • $_COOKIEDizi hemen sonra doldurulan asla setcookie()ama sadece herhangi takip HTTP isteği üzerine,.
  • Ek olarak geçerlilikleri zaman aşımına uğrar, alt alan adları veya tek tek yollar için kısıtlama olabilirler ve kullanıcı ve tarayıcı bunları reddedebilir veya silebilir.
49 Erik Nov 24 2010 at 04:31

Genellikle "kötü programlama" nedeniyle ve şimdi veya daha sonra hata olasılığı nedeniyle.

  1. Eğer bir hata ise, önce değişkene uygun bir atama yapın: $ varname = 0;
  2. Gerçekten sadece bazen tanımlanıyorsa, test edin:, if (isset($varname))kullanmadan önce
  3. Eğer yanlış yazdığın içinse, sadece düzelt
  4. Hatta PHP ayarlarınızdaki uyarıları bile çevirebilirsiniz
43 DGM Nov 24 2010 at 04:35

Henüz hiçbir şey atamadığınız bir değişkeni test ettiğiniz, değerlendirdiğiniz veya yazdırdığınız anlamına gelir. Bu, ya bir yazım hatanız olduğu ya da değişkenin ilk önce bir şeye başlatıldığını kontrol etmeniz gerektiği anlamına gelir. Mantık yollarınızı kontrol edin, bir yolda ayarlanmış olabilir ancak başka bir yolda olmayabilir.

36 FerenciZoltánLászló Dec 30 2011 at 21:14

Yararlı olduğu için bildirimi devre dışı bırakmak istemedim, ancak çok fazla yazmaktan kaçınmak istedim.

Benim çözümüm şu işlevdi:

function ifexists($varname) { return(isset($$varname)?$varname:null);
}

Dolayısıyla, eğer varsa $ name ve echo'ya başvurmak istersem, basitçe şunu yazarım:

<?=ifexists('name')?>

Dizi öğeleri için:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

$ _REQUEST ['isim'] 'e başvurmak istersem sayfada:

<?=ifexistsidx($_REQUEST,'name')?>
28 mpyw Aug 27 2014 at 05:15

Girdi dizesini almanın en iyi yolu şudur:

$value = filter_input(INPUT_POST, 'value');

Bu tek astar, aşağıdakilere neredeyse eşdeğerdir:

if (!isset($_POST['value'])) {
    $value = null; } elseif (is_array($_POST['value'])) {
    $value = false; } else { $value = $_POST['value'];
}

Kesinlikle dize değeri istiyorsanız , aşağıdaki gibi:

$value = (string)filter_input(INPUT_POST, 'value');
26 Roger Dec 29 2012 at 18:46

Çünkü değişken '$user_location' is not getting defined. If you are using any if loop inside which you are declaring the '$user_location 'değişkeni bu durumda başka bir döngüye sahip olmanız ve aynısını tanımlamanız gerekir. Örneğin:

$a=10; if($a==5) { $user_location='Paris';} else { } echo $user_location;

Yukarıdaki kod, if döngüsü tatmin olmadığından ve else döngüsünde '$ user_location' tanımlanmadığından hata oluşturacaktır. Yine de PHP'den değişkeni yankılaması istendi. Bu nedenle, kodu değiştirmek için aşağıdakileri yapmanız gerekir:

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; } echo $user_location;
26 Robbie Nov 23 2016 at 08:44

Yanıt olarak "" Neden birdenbire ortaya çıkıyorlar? Bu senaryoyu yıllardır kullanıyordum ve hiç sorun yaşamadım. "

Çoğu sitenin, "Tüm hataları göster" ancak "bildirimler" ve "kullanımdan kaldırıldı" değil "varsayılan" hata raporlaması altında çalışması çok yaygındır. Bu php.ini içinde ayarlanacak ve sunucudaki tüm siteler için geçerli olacaktır. Bu, örneklerde kullanılan "uyarıların" bastırılacağı (gizleneceği) ve daha kritik kabul edilen diğer hataların gösterileceği / kaydedileceği anlamına gelir.

Diğer kritik ayar, hataların gizlenebilmesidir (yani display_errors"kapalı" veya "syslog" olarak ayarlanabilir).

Bu durumda olacak olan şey, ya error_reportingbildirimleri de gösterecek şekilde değiştirilmiş (örneklere göre) ve / veya ayarların display_errorsekranda olarak değiştirilmiş olmasıdır (onları bastırmak / günlüğe kaydetmek yerine).

Neden değiştiler?

Açık / en basit cevap, birisinin bu ayarlardan birini php.ini'de ayarlaması veya PHP'nin yükseltilmiş bir sürümünün şimdi daha önce farklı bir php.ini kullanıyor olmasıdır. Bakılacak ilk yer orası.

Bununla birlikte, bu ayarların geçersiz kılınması da mümkündür.

  • .htconf (vhost'lar ve alt yapılandırmalar dahil web sunucusu yapılandırması) *
  • .htaccess
  • php kodunun kendisinde

ve bunlardan herhangi biri de değiştirilebilirdi.

Ayrıca, web sunucusu yapılandırmasının .htaccess yönergelerini etkinleştirebilmesi / devre dışı bırakabilmesi gibi ek bir zorluk da vardır, bu nedenle .htaccess'te aniden çalışmayı başlatan / durduran yönergeleriniz varsa, bunu kontrol etmeniz gerekir.

(.htconf / .htaccess, apache olarak çalıştığınızı varsayar. Komut satırı çalıştırıyorsanız bu geçerli olmaz; IIS veya başka bir web sunucusu çalıştırıyorsanız, bu yapılandırmaları uygun şekilde kontrol etmeniz gerekir)

Özet

  • Php.ini'deki kontrol error_reportingve display_errorsphp yönergeleri değişmedi veya daha önce farklı bir php.ini kullanmadığınızı.
  • Htconf (veya vhosts vb.) İçindeki kontrol error_reportingve display_errorsphp yönergeleri değişmedi
  • .Htaccess içindeki kontrol error_reportingve display_errorsphp yönergeleri değişmedi
  • .Htaccess dosyasında yönergeniz varsa, bunlara hala .htconf dosyasında izin verilip verilmediğini kontrol edin.
  • Son olarak kodunuzu kontrol edin; muhtemelen ilgisiz bir kütüphane; olmadığını görmek için error_reportingve display_errorsphp direktifler orada belirlenmiştir.
21 ShahinMammadzada May 13 2014 at 02:02

hızlı düzeltme, değişkeninizi kodunuzun üst kısmına null olarak atamaktır

$user_location = null;
17 rybo111 Jul 29 2015 at 02:12

Eskiden bu hatayı lanetliyordum, ancak kullanıcı girdisinden kaçmanızı hatırlatmak faydalı olabilir.

Örneğin, bunun akıllıca olduğunu düşündüyseniz, kısa kod:

// Echo whatever the hell this is
<?=$_POST['something']?>

...Tekrar düşün! Daha iyi bir çözüm:

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

( html()Karakterlerden kaçmak için özel bir işlev kullanıyorum , kilometreniz değişebilir)

16 user2253362 Apr 09 2013 at 20:43

Değişkenleri otomatik olarak bildiren her zaman kendi yararlı işlevi olan exst () kullanıyorum .

Kodunuz -

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location); /** * Function exst() - Checks if the variable has been set * (copy/paste it in any place of your code) * * If the variable is set and not empty returns the variable (no transformation) * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var * @param mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = ""; if ( !isset($var)  || !$var ) { if (isset($default) && $default != "") $t = $default; } else { $t = $var; } if (is_string($t)) $t = trim($t);
    return $t;
}
16 elpiel Dec 13 2016 at 20:34

PHP 7.0'da artık Null birleştirme operatörünü kullanmak mümkündür:

echo "My index value is: " . ($my_array["my_index"] ?? '');

Eşittir:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

PHP kılavuzu PHP 7.0

15 RishabhSeth Dec 18 2015 at 18:06

Çok Basit Bir Dilde .
Hata, $user_locationdaha önce sizin tarafınızdan tanımlanmamış ve herhangi bir değeri olmayan bir değişken kullanıyor olmanızdır. Bu nedenle, bu değişkeni kullanmadan önce bildirmenizi tavsiye ederim.Örneğin :


$user_location = '';
Veya
$user_location = 'Los Angles';
Bu karşılaşabileceğiniz çok yaygın bir hatadır, bu yüzden endişelenmeyin, sadece değişkeni bildirin ve Kodlamanın Keyfini Çıkarın .

15 smcjones Nov 29 2016 at 06:01

BU NEDEN OLUYOR?

Zamanla, PHP daha güvenlik odaklı bir dil haline geldi. Varsayılan olarak kapalı olan ayarlar artık varsayılan olarak açıktır. Bunun mükemmel bir örneği E_STRICT, PHP 5.4.0'dan itibaren varsayılan olarak açılmış olan şeydir .

Ayrıca, PHP belgelerine göre, varsayılan E_NOTICEolarak php.ini'de devre dışı bırakılmıştır. PHP dokümanları , hata ayıklama amacıyla onu açmanızı önerir . Ancak, PHP'yi Ubuntu deposundan ve BitNami'nin Windows yığınından indirdiğimde başka bir şey görüyorum.

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

error_reportingVarsayılan olarak "varsayılan" değere değil, varsayılan olarak üretim değerine ayarlandığına dikkat edin . Bu biraz kafa karıştırıcı ve ben var, bu yüzden php.ini dışında belgelenmiş değildir değil diğer dağıtımlarında bu valide.

Ancak sorunuzu cevaplamak için, bu hata şimdi daha önce açılmadığında ortaya çıkıyor, çünkü:

  1. PHP'yi yüklediniz ve yeni varsayılan ayarlar bir şekilde yetersiz belgelenmiştir, ancak hariç tutmayın E_NOTICE.

  2. E_NOTICETanımlanmamış değişkenler ve tanımlanmamış dizinler gibi uyarılar aslında kodunuzu daha temiz ve daha güvenli hale getirmeye yardımcı olur. Yıllar önce, E_NOTICEetkinleştirmenin beni değişkenlerimi bildirmeye zorladığını söyleyebilirim. C'yi öğrenmeyi çok daha kolay hale getirdi, değişkenleri bildirmemek bir sıkıntıdan çok daha büyüktü.

BU KONUDA NE YAPABİLİRİM?

  1. E_NOTICE"Varsayılan değeri" kopyalayıp E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED, eşittir oturum açtıktan sonra şu anda yorumlanmamış olanla değiştirerek kapatın error_reporting =. Apache'yi veya CGI veya FPM kullanıyorsanız PHP'yi yeniden başlatın. "Doğru" php.ini dosyasını düzenlediğinizden emin olun. PHP'yi Apache, fpm veya php-fpm ile çalıştırıyorsanız, doğru olan Apache olacaktır; PHP-FPM çalıştırıyorsanız fpm veya php-fpm, PHP-CGI çalıştırıyorsanız cgi, vb. Bu önerilen yöntem değildir, ancak eski kodunuz varsa düzenlemek son derece zor olursa, o zaman en iyi seçeneğiniz bu olabilir.

  2. E_NOTICEDosya veya klasör düzeyinde kapatın . Eski kodunuz varsa, ancak işleri "doğru" şekilde yapmak istiyorsanız bu tercih edilebilir. Bunu yapmak için, Apache2, Nginx veya sunucu seçiminiz ne olursa olsun danışmalısınız. Apache'de, php_valueiçinde kullanırsınız <Directory>.

  3. Daha temiz olması için kodunuzu yeniden yazın. Eğer bir üretim ortamına taşırken yapmanız gerekir ya, senin hatalarını görmek için birini istiyorum emin hatalardan herhangi görüntüsünü devre dışı kalırlar ve sadece yapmazsanız giriş (bkz hatalarınızı display_errorsve log_errorsphp.ini içinde ve sunucu ayarlarınızı) .

3. seçeneği genişletmek için: İdeal olan budur. Bu rotaya gidebiliyorsan gitmelisin. Başlangıçta bu rotaya gitmeyecekseniz, kodunuzu bir geliştirme ortamında test ederek sonunda bu rotayı taşımayı düşünün. Bunu yaparken, kurtulun ~E_STRICTve ~E_DEPRECATEDgelecekte neyin yanlış gidebileceğini görün. Pek çok tanıdık olmayan hata göreceksiniz, ancak bu, gelecekte PHP'yi yükseltmeniz gerektiğinde herhangi bir tatsız problem yaşamanızı önleyecektir.

HATALAR NE ANLAMA GELİYOR?

Undefined variable: my_variable_name- Bu, kullanımdan önce bir değişken tanımlanmadığında ortaya çıkar. PHP betiği çalıştırıldığında, dahili olarak sadece boş bir değer alır. Ancak, hangi senaryoda bir değişkeni tanımlanmadan önce kontrol etmeniz gerekir? Sonuçta, bu "özensiz kod" için bir argümandır. Bir geliştirici olarak, değişkenlerin tanımlanabildikleri ölçüde kapsamlarında en üstte tanımlandığı açık kaynaklı bir proje gördüğümde bunu sevdiğimi söyleyebilirim. Gelecekte hangi değişkenlerin ortaya çıkacağını söylemeyi kolaylaştırır ve kodu okumayı / öğrenmeyi kolaylaştırır.

function foo()
{
    $my_variable_name = ''; //.... if ($my_variable_name) {
        // perform some logic
    }
}

Undefined index: my_index- Bu, bir dizideki bir değere erişmeye çalıştığınızda ve mevcut olmadığında oluşur. Bu hatayı önlemek için koşullu bir kontrol yapın.

// verbose way - generally better
if (isset($my_array['my_index'])) { echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)'; echo "My index value is: " . $my_index_val;   

Diğer bir seçenek de fonksiyonunuzun tepesinde boş bir dizi bildirmektir. Bu her zaman mümkün değil.

$my_array = array( 'my_index' => '' ); //... $my_array['my_index'] = 'new string';

(ek ipucu)

  • Bu ve diğer sorunlarla karşılaştığımda, NetBeans IDE'yi (ücretsiz) kullandım ve bana bir dizi uyarı ve bildirim verdi. Bazıları çok faydalı ipuçları sunuyor. Bu bir gereklilik değil ve artık büyük projeler dışında IDE kullanmıyorum. vimBugünlerde daha çok insanım :).
9 gts Jun 07 2013 at 03:37

neden işleri basit tutmuyorsunuz?

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']); // returns null without any notice echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>
7 SintayehuAbaynhe Jan 27 2017 at 15:00

tanımsız dizin, örneğin, kullanılamayan dizi dizini için talep ettiğiniz dizide anlamına gelir

<?php 

$newArray[] = {1,2,3,4,5}; print_r($newArray[5]);

?>

tanımlanmamış değişken, tamamen mevcut olmayan veya bu isimle tanımlanmamış veya başlatılmamış değişken kullandığınız anlamına gelir.

<?php print_r($myvar); ?>

tanımsız uzaklık, dizide mevcut olmayan anahtarı istediğiniz anlamına gelir. Ve bunun çözümü, kullanmadan önce kontrol etmektir.

php> echo array_key_exists(1, $myarray);
5 WouterdeWinter Nov 29 2016 at 02:31

Sorunun bu kısmıyla ilgili olarak:

Neden birdenbire ortaya çıkıyorlar? Bu senaryoyu yıllarca kullandım ve hiç sorun yaşamadım.

Kesin bir yanıt yok, ancak ayarların neden 'birdenbire' değişebileceğine dair bazı olası açıklamalar şunlardır:

  1. PHP'yi error_reporting, display_errors veya diğer ilgili ayarlar için başka varsayılanlara sahip olabilen daha yeni bir sürüme yükselttiniz.

  2. ini_set()Veya error_reporting()(bunları kodda arayın) kullanarak çalışma zamanında ilgili ayarları ayarlayan bazı kodları (muhtemelen bir bağımlılık içinde) kaldırdınız veya tanıttınız.

  3. Web sunucusu yapılandırmasını değiştirdiniz (burada apache varsayarak): .htaccessdosyalar ve vhost yapılandırmaları da php ayarlarını değiştirebilir.

  4. Genellikle bildirimler görüntülenmez / bildirilmez ( PHP kılavuzuna bakın ), bu nedenle sunucuyu kurarken php.ini dosyasının herhangi bir nedenle yüklenememesi (dosya izinleri ??) ve varsayılan ayarlarda olmanız mümkündür. . Daha sonra, 'hata' (kazara) çözüldü ve şimdi, bildirimleri göstermek için error_reporting setiyle doğru php.ini dosyasını yükleyebilir.

4 James Jul 07 2018 at 01:56

Üçlü sayı kullanmak basit, okunabilir ve temizdir:

Pre PHP 7
Eğer ayarlanmışsa başka bir değişkenin değerine bir değişken atayın, aksi takdirde atayınnull(veyaihtiyacınız olan varsayılan değeri):

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

PHP 7+ Null Coalescing Operator kullanımı
dışında aynıdır . Bu yerleşik olduğu için artık çağırmaya gerek yoktur ve kontrol edilen değişkenin değerini döndürdüğü varsayıldığından dönmesi için değişkeni sağlamaya gerek yoktur:isset()

$newVariable = $thePotentialData ?? null;

Her ikisi de OP sorusundaki Bildirimleri durdurur ve her ikisi de şunun tam karşılığıdır:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

 
Yeni bir değişken ayarlamanız gerekmiyorsa echo, işlev argümanları, vb. Gibi üçlü öğenin döndürülen değerini doğrudan kullanabilirsiniz :

Eko:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

İşlev:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId) { if ($userId === null) {
        // Etc
    }
}

Yukarıdakiler, oturumlar vb. Dahil olmak üzere dizilerle aynı şekilde çalışacak ve kontrol edilen değişkeni örneğin:
$_SESSION['checkMe']
veya ihtiyacınız olan derinlikteki birçok seviye ile değiştirecektir , örneğin:
$clients['personal']['address']['postcode']


 

Bastırma:

PHP Bildirimlerini @hata raporlama düzeyinizle bastırmak veya azaltmak mümkündür , ancak sorunu çözmez, hata günlüğünde raporlanmasını durdurur. Bu, kodunuzun hala ayarlanmayan bir değişkeni kullanmaya çalıştığı anlamına gelir; bu, bir şeyin amaçlandığı gibi çalışmadığı anlamına gelebilir veya olmayabilir - eksik değerin ne kadar önemli olduğuna bağlı olarak.

Bu sorunu gerçekten kontrol etmeli ve uygun şekilde ele almalısınız, ya farklı bir mesaj sunmalı ya da tam durumu belirlemek için diğer her şey için boş bir değer döndürmelisiniz.

Bildirimin hata günlüğünde olmamasını önemsiyorsanız, bir seçenek olarak hata günlüğünü göz ardı edebilirsiniz.

3 JohnConde May 19 2017 at 00:15

Sınıflarla çalışıyorsanız, aşağıdakileri kullanarak üye değişkenlere başvurduğunuzdan emin olmanız gerekir $this:

class Person
{
    protected $firstName;
    protected $lastName; public function setFullName($first, $last) { // Correct $this->firstName = $first; // Incorrect $lastName = $last; // Incorrect $this->$lastName = $last;
    }
}
2 Fred-ii- Jul 24 2017 at 23:11

Tanımlanmamış bir dizin bildiriminin atılmasının bir başka nedeni de, bir sütunun bir veritabanı sorgusundan çıkarılmış olmasıdır.

Yani:

$query = "SELECT col1 FROM table WHERE col_x = ?";

Sonra bir döngü içinde daha fazla sütun / satıra erişmeye çalışın.

Yani:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

veya bir whiledöngüde:

while( $row = fetching_function($query) ) { echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown echo "<br>"; echo $row['col3']; // undefined index thrown

}

Dikkat edilmesi gereken başka bir şey de, * NIX OS ve Mac OS X'te, şeylerin büyük / küçük harfe duyarlı olmasıdır.

Yığınla ilgili aşağıdaki Soru ve Cevaplara başvurun:

  • MySQL'deki tablo adları büyük / küçük harfe duyarlı mıdır?

  • mysql sorgulardaki büyük / küçük harfe duyarlı tablo adları

  • MySql - Farklı sunucudaki tabloların Büyük / Küçük Harfe Duyarlı sorunu

1 Pupil Apr 23 2019 at 18:30

Bu hatalar, ayarlanmamış bir değişken kullandığımızda ortaya çıkar.

Bunlarla baş etmenin en iyi yolu, geliştirme sırasında hata raporlamasını ayarlamaktır.

Hata raporlamayı ayarlamak için:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

Üretim sunucularında hata raporlama kapalıdır, bu nedenle bu hataları almıyoruz.

Ancak geliştirme sunucusunda hata raporlamayı açık hale getirebiliriz.

Bu hatadan kurtulmak için aşağıdaki örneği görüyoruz:

if ($my == 9) { $test = 'yes';  // Will produce error as $my is not 9. } echo $test;

NULLDeğerlerini atamadan veya kullanmadan önce değişkenleri başlatabiliriz .

Yani kodu şu şekilde değiştirebiliriz:

$test = NULL; if ($my == 9) {
 $test = 'yes'; // Will produce error as $my is not 9.
}
echo $test;

Bu, herhangi bir program mantığını bozmaz ve değeri olmasa bile Uyarı üretmez $test.

Bu nedenle, temelde, geliştirme için hata raporlamayı AÇIK konuma getirmek her zaman daha iyidir.

Ve tüm hataları düzeltin.

Üretim sırasında hata raporlama kapatılmalıdır.

1 JohnConde Jul 06 2018 at 03:46

Bir HTML formu gönderildikten sonra var olmayan bir değişkenin yaygın nedenlerinden biri, form öğesinin bir <form>etiket içinde yer almamasıdır :

Örnek: İçinde bulunmayan öğe <form>

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

Örnek: Öğe artık <form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>
phvish Aug 30 2017 at 16:08

Muhtemelen eski PHP sürümünü kullanıyordunuz ve şimdiye kadar PHP'yi yükseltmiştiniz, yıllardır hatasız çalışmasının nedeni buydu. PHP4'e kadar değişkeni tanımlamadan kullanıyorsanız hata olmadı, ancak PHP5'ten itibaren söz konusu kodlar için hatalar atıyor.

JaimeMontoya Sep 02 2018 at 01:31

Bununla ilgili bir soru sordum ve bu yazıya şu mesajla yönlendirildim:

Bu sorunun zaten burada bir cevabı var:

PHP kullanan "Uyarı: Tanımsız değişken", "Uyarı: Tanımsız dizin" ve "Uyarı: Tanımsız ofset"

Sorum ve çözümümü burada paylaşıyorum:

Bu hata:

154. satır sorun. 154. satırda sahip olduğum şey bu:

153    foreach($cities as $key => $city){ 154 if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

Sanırım sorun, $cityanahtar değil, değer olan değişken için şartlar yazıyorum $key => $city. İlk olarak, uyarının sebebinin bu olup olmadığını teyit edebilir misiniz? İkincisi, sorun buysa, neden değere dayalı bir koşul yazamıyorum? Durumu yazmam için gereken anahtarla birlikte olmak zorunda mı?

GÜNCELLEME 1: Sorun şu ki, çalıştırılırken $citiesCounterArray[$key]bazen dizide $keyolmayan bir anahtara karşılık gelir $citiesCounterArray, ancak bu her zaman döngümün verilerine bağlı olarak durum böyle değildir. İhtiyacım olan şey $key, dizide varsa, kodu çalıştırmak, aksi takdirde atlamak için bir koşul belirlemektir .

GÜNCELLEME 2: Bunu kullanarak şu şekilde düzelttim array_key_exists():

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){