- Konu sahibi
- #1
“Undefined array key” hatasını gidermek için diziden bir anahtarı okumadan önce anahtarın gerçekten var olduğunu kontrol edin veya eksik durumda kullanılacak varsayılan değeri tanımlayın. Örneğin
PHP, dizide bulunmayan bir anahtara doğrudan erişmeye çalıştığınızda bu uyarıyı üretir. Aşağıdaki örnekte
Burada sorun,
Uyarıyı gizlemek yerine eksik verinin nasıl ele alınacağını belirleyin.
Eksik anahtar için makul bir varsayılan değeriniz varsa null birleştirme operatörünü kullanın:
Bu ifade
Örneğin URL’de
Ancak
Eksik anahtarda farklı bir işlem yapmanız gerekiyorsa
Değerin boş olup olmadığını da iş kuralınıza göre kontrol etmeniz gerekebilir. Örneğin form alanı gönderilmiş olsa bile boş olabilir:
Bu örnekte iki farklı durum aynı doğrulamada ele alınır: alanın hiç gönderilmemesi ve gönderilmiş olsa da boş bırakılması.
Bu üç yaklaşım benzer görünür; fakat
Örneğin
Bu kod “Tema anahtarı mevcut.” çıktısını verir. Çünkü anahtar dizide vardır; değerinin
Hata birden fazla dizi seviyesinde de oluşabilir. Aşağıdaki kodda
Bu yaklaşımda önce
Bir form alanı zorunluysa önce alanı alın, sonra içeriğini doğrulayın:
Burada
Uyarı, yalnızca kodda kontrol eksikliği anlamına gelmeyebilir. Bir fonksiyonun beklediğiniz anahtarı döndürmemesi, veritabanı sorgusunun farklı sütun adları kullanması veya API yanıtının hata biçiminde gelmesi de aynı belirtiye yol açabilir.
Örneğin fonksiyondan
Üretim ortamında hassas verileri ekrana basmayın. Hatanın kaynağını bulduktan sonra geçici
Uyarıyı düzelttikten sonra uygulamanın eksik veride nasıl davranması gerektiğini doğrulayın. Sadece uyarının görünmemesi, uygulamanın doğru çalıştığını göstermez. Eksik anahtar için boş değer kullanılması; hatalı sorgu, eksik yetki veya bozuk istek gibi gerçek sorunu gizleyebilir.
Şu sırayla ilerleyin:
Neden
Hata bastırmak için
$_GET['sayfa'] yerine $_GET['sayfa'] ?? 1 kullanabilirsiniz. Ancak anahtarın mevcut olup olmadığını, değerinin null olup olmadığını ve boş değerlerin geçerli sayılıp sayılmayacağını ayırmanız gerekir; doğru çözüm bu duruma göre değişir.Hata neden oluşur?
PHP, dizide bulunmayan bir anahtara doğrudan erişmeye çalıştığınızda bu uyarıyı üretir. Aşağıdaki örnekte
email anahtarı dizide olmadığı için uyarı oluşabilir:
PHP:
<?php
$kullanici = [
'ad' => 'Ayşe'
];
echo $kullanici['email'];
Burada sorun,
echo komutunun kendisi değildir. Sorun, email anahtarının okunmadan önce kontrol edilmemesidir. Form verileri, URL parametreleri, oturum değişkenleri ve veritabanından gelen sonuçlarda bazı alanlar her istekte bulunmayabileceği için bu durum özellikle sık görülür.Uyarıyı gizlemek yerine eksik verinin nasıl ele alınacağını belirleyin.
@$_GET['sayfa'] gibi hata bastırma operatörleri uyarıyı görünmez yapar; fakat eksik veriyi düzeltmez ve hatanın kaynağını takip etmeyi zorlaştırır.En kısa çözüm: varsayılan değer kullanmak
Eksik anahtar için makul bir varsayılan değeriniz varsa null birleştirme operatörünü kullanın:
PHP:
<?php
$sayfa = $_GET['sayfa'] ?? 1;
echo $sayfa;
Bu ifade
$_GET['sayfa'] mevcut ve null değilse onun değerini $sayfa değişkenine aktarır. Anahtar yoksa veya değeri null ise 1 kullanılır.Örneğin URL’de
?sayfa=3 varsa $sayfa değeri 3 olur. sayfa parametresi hiç gönderilmezse değer 1 olur ve “Undefined array key” uyarısı oluşmaz. Bu kullanım, sayfalama gibi eksik parametrelerde başlangıç değeri belirlemenin pratik yoludur.Ancak
?? yalnızca eksik veya null değerleri ele alır. Değerin boş metin, 0 veya false olması ayrıca kontrol edilmez. Örneğin ?sayfa=0 gönderilirse $sayfa değeri 0 olarak kalır.Anahtarın varlığını kontrol etmek
Eksik anahtarda farklı bir işlem yapmanız gerekiyorsa
isset() kullanabilirsiniz:
PHP:
<?php
if (isset($_GET['arama'])) {
$arama = trim($_GET['arama']);
echo 'Arama yapılıyor: ' . $arama;
} else {
echo 'Arama metni gönderilmedi.';
}
isset($_GET['arama']) ifadesi, anahtar mevcutsa ve değeri null değilse true döndürür. Anahtar yoksa koşul çalışmaz ve kod else bloğuna geçer.Değerin boş olup olmadığını da iş kuralınıza göre kontrol etmeniz gerekebilir. Örneğin form alanı gönderilmiş olsa bile boş olabilir:
PHP:
<?php
if (!isset($_POST['kullanici_adi']) || trim($_POST['kullanici_adi']) === '') {
echo 'Kullanıcı adı zorunludur.';
} else {
$kullaniciAdi = trim($_POST['kullanici_adi']);
echo 'Girilen kullanıcı adı: ' . $kullaniciAdi;
}
Bu örnekte iki farklı durum aynı doğrulamada ele alınır: alanın hiç gönderilmemesi ve gönderilmiş olsa da boş bırakılması.
trim() kullanıldığı için yalnızca boşluklardan oluşan giriş de boş kabul edilir.isset(), array_key_exists() ve?? arasındaki fark
Bu üç yaklaşım benzer görünür; fakat
null değerinde farklı davranırlar.| Yöntem | Anahtar yoksa | Anahtar null ise | Ne zaman kullanılır? |
|---|---|---|---|
$dizi['anahtar'] ?? $varsayilan | Varsayılan değeri kullanır | Varsayılan değeri kullanır | Eksik veya null değer için güvenli varsayılan gerektiğinde |
isset($dizi['anahtar']) | false döndürür | false döndürür | Anahtar okunabilir ve null değilse işlem yapılacağında |
array_key_exists('anahtar', $dizi) | false döndürür | true döndürür | Anahtarın varlığı, değer null olsa bile önemli olduğunda |
null değeri bilinçli olarak kaydedilmiş bir durumu temsil ediyorsa isset() doğru seçim olmayabilir:
PHP:
<?php
$ayarlar = [
'tema' => null
];
if (array_key_exists('tema', $ayarlar)) {
echo 'Tema anahtarı mevcut.';
}
Bu kod “Tema anahtarı mevcut.” çıktısını verir. Çünkü anahtar dizide vardır; değerinin
null olması bunu değiştirmez. Aynı durumda isset($ayarlar['tema']) false döndürür. Yani isset() anahtarın varlığını tek başına değil, anahtarın var olup değerinin null olmamasını kontrol eder.İç içe dizilerde hatayı önlemek
Hata birden fazla dizi seviyesinde de oluşabilir. Aşağıdaki kodda
profil veya telefon anahtarı bulunmuyorsa uyarı alabilirsiniz:
PHP:
<?php
$kullanici = [];
$telefon = $kullanici['profil']['telefon'] ?? 'Telefon yok';
echo $telefon;
?? bu tür erişimlerde eksik ara anahtarların oluşturacağı uyarıyı önlemek için kullanılabilir. Daha karmaşık yapılarda veriyi önce ayrı bir değişkene almak okunabilirliği artırır:
PHP:
<?php
$profil = $kullanici['profil'] ?? [];
$telefon = $profil['telefon'] ?? 'Telefon yok';
echo $telefon;
Bu yaklaşımda önce
profil için boş dizi varsayılanı belirlenir, ardından telefon okunur. Böylece hangi seviyede eksik veri bulunduğunu anlamak ve daha sonra doğrulama eklemek kolaylaşır.Form ve URL verilerinde doğru kullanım
$_GET, $_POST ve benzeri süper küresel dizilerde istemciden gelen verinin her zaman bulunacağını varsaymayın. Alanın gönderilmesini HTML tarafında zorunlu yapmak, sunucu tarafındaki kontrolün yerini tutmaz; istek doğrudan da oluşturulabilir.Bir form alanı zorunluysa önce alanı alın, sonra içeriğini doğrulayın:
PHP:
<?php
$email = trim($_POST['email'] ?? '');
if ($email === '') {
echo 'E-posta adresi zorunludur.';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo 'Geçerli bir e-posta adresi girin.';
} else {
echo 'E-posta adresi kabul edildi.';
}
Burada
?? '' kullanımı eksik alanı boş metne dönüştürür. Ardından boşluk temizlenir ve doğrulama yapılır. Bu işlem uyarıyı kaldırmanın yanında, eksik ve biçimi geçersiz veriyi birbirinden ayırır.$_GET veya $_POST içinden gelen değerlerin türünü ve içeriğini ayrıca doğrulayın. ?? yalnızca anahtar erişimini güvenli hâle getirir; verinin sayı, e-posta, tarih veya izin verilen bir seçenek olup olmadığını kanıtlamaz.Dizinin beklediğiniz yapıda olup olmadığını kontrol edin
Uyarı, yalnızca kodda kontrol eksikliği anlamına gelmeyebilir. Bir fonksiyonun beklediğiniz anahtarı döndürmemesi, veritabanı sorgusunun farklı sütun adları kullanması veya API yanıtının hata biçiminde gelmesi de aynı belirtiye yol açabilir.
Örneğin fonksiyondan
ad anahtarını bekliyorsanız önce gerçek sonucu geçici olarak inceleyin:
PHP:
<?php
$sonuc = kullaniciGetir();
var_dump($sonuc);
$ad = $sonuc['ad'] ?? null;
var_dump() çıktısında dizinin gerçekten döndüğünü, anahtar adının doğru yazıldığını ve değer türünü kontrol edin. Anahtar name olarak dönüyorsa ad okumaya çalışmak hataya neden olur. Sonuç false, null veya beklenmeyen bir yapıysa yalnızca erişim satırını değiştirmek yerine veriyi üreten fonksiyonun hata durumunu da ele alın.Üretim ortamında hassas verileri ekrana basmayın. Hatanın kaynağını bulduktan sonra geçici
var_dump() veya print_r() satırlarını kaldırın; kalıcı kayıt için uygulamanızın hata günlüğünü kullanın.Hata devam ederse izlenecek sıra
Uyarıyı düzelttikten sonra uygulamanın eksik veride nasıl davranması gerektiğini doğrulayın. Sadece uyarının görünmemesi, uygulamanın doğru çalıştığını göstermez. Eksik anahtar için boş değer kullanılması; hatalı sorgu, eksik yetki veya bozuk istek gibi gerçek sorunu gizleyebilir.
Şu sırayla ilerleyin:
- Uyarının gösterdiği dosya ve satır numarasını açın; doğrudan hangi dizi anahtarının okunduğunu belirleyin.
- Anahtarın her durumda bulunmasının garanti edilip edilmediğini kontrol edin. Garanti edilmiyorsa
??,isset()veyaarray_key_exists()ile beklenen iş kuralını uygulayın. - Anahtar bulunmalıysa veriyi oluşturan kodu inceleyin: form alanı, URL parametresi, oturum, veritabanı sonucu veya API yanıtı gerçekten beklenen yapıyı döndürüyor mu kontrol edin.
- Eksik, boş,
null,falseve geçersiz tür durumları için ayrı davranış belirleyin. - Düzeltmeden sonra anahtarın bulunduğu, bulunmadığı ve
nullolduğu durumları ayrı ayrı çalıştırarak beklenen çıktıyı kontrol edin.
?? ile uyarıyı susturmak yeterli değildir. Bu durumda sorgu sonucunu kontrol edip “kayıt bulunamadı” durumunu uygulamanın akışında açıkça ele alın.Sık sorulan sorular
“Undefined array key” ile “Undefined index” arasındaki fark nedir?
İkisi de dizide bulunmayan bir anahtara erişim sorununu ifade eder. “Undefined index” daha eski PHP sürümlerinde yaygın olan ifadedir; güncel sürümlerde dizi anahtarları için “Undefined array key” ifadesini görmeniz normaldir. Çözüm değişmez: anahtarı okumadan önce uygun kontrolü veya varsayılan değeri kullanın.
Neden isset() yerine array_key_exists() kullanmalıyım?
Anahtar dizide mevcut olsa bile değeri
null olabiliyorsa array_key_exists() kullanın. isset() bu durumda false döndürür. null değerini “anahtar yok” ile aynı kabul ediyorsanız isset() veya ?? daha uygun olabilir.Hata bastırmak için @ kullanabilir miyim?
Kullanabilirsiniz; ancak bu önerilen çözüm değildir.
@ uyarıyı gizler, eksik verinin nedenini çözmez ve hata ayıklamayı zorlaştırır. Eksik anahtarda kullanılacak değeri belirleyip ??, isset() veya array_key_exists() ile açık bir kontrol yapın.Anahtar kesinlikle bulunmalıysa varsayılan değer vermek doğru mudur?
Her zaman doğru değildir. Anahtarın bulunmaması program akışında hata veya bozuk veri anlamına geliyorsa varsayılan değer kullanmak sorunu gizleyebilir. Böyle bir durumda veriyi üreten kodu kontrol edin ve gerekirse açık bir doğrulama hatası, kayıt bulunamadı durumu veya istisna üretin.