Arif

WFN Üye
Konular
646
Mesajlar
646
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Bilecik
Web Sitesi
Var
Alanı
SEO Uzmanı
1/1
Konu sahibi
“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 $_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öntemAnahtar yoksaAnahtar null iseNe zaman kullanılır?
$dizi['anahtar'] ?? $varsayilanVarsayılan değeri kullanırVarsayılan değeri kullanırEksik veya null değer için güvenli varsayılan gerektiğinde
isset($dizi['anahtar'])false döndürürfalse döndürürAnahtar okunabilir ve null değilse işlem yapılacağında
array_key_exists('anahtar', $dizi)false döndürürtrue döndürürAnahtarın varlığı, değer null olsa bile önemli olduğunda
Örneğin 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:
  1. Uyarının gösterdiği dosya ve satır numarasını açın; doğrudan hangi dizi anahtarının okunduğunu belirleyin.
  2. Anahtarın her durumda bulunmasının garanti edilip edilmediğini kontrol edin. Garanti edilmiyorsa ??, isset() veya array_key_exists() ile beklenen iş kuralını uygulayın.
  3. 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.
  4. Eksik, boş, null, false ve geçersiz tür durumları için ayrı davranış belirleyin.
  5. Düzeltmeden sonra anahtarın bulunduğu, bulunmadığı ve null olduğu durumları ayrı ayrı çalıştırarak beklenen çıktıyı kontrol edin.
Örneğin bir veritabanı sonucu için varsayılan değer kullanmak yerine sorgunun neden satır döndürmediğini bilmeniz gerekiyorsa, ?? 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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic