PHP "Invalid argument supplied for foreach()" hatası, foreach döngüsüne dizi ya da üzerinde dolaşılabilen bir değer yerine null, hiç atanmamış bir değişken, metin veya beklenmeyen başka bir tür ulaştığında ortaya çıkar. Çözüm, uyarıyı bastırmak değil, döngüye verilen değişkenin hangi kaynaktan geldiğini bulup türünü kontrol etmektir.
Önce veri kaynağı ile foreach arasındaki atamayı görünür hâle getir, ardından yalnızca beklenen yapıda veri varsa döngüyü çalıştır. Böylece sorun formdan, veritabanından veya değişken adından kaynaklanıyorsa doğru satıra geri dönebilirsin.
PHP "Invalid argument supplied for foreach()" Hatası Ne Anlama Gelir?

foreach, bir veri kümesinin elemanlarını sırayla okumak için kullanılır. Kaynak genellikle bir dizi veya dolaşılabilir bir nesnedir. PHP'nin foreach belgeleri, döngünün verilen ifade üzerinden ilerlediğini açıklar. Bu nedenle hata satırında incelenecek ilk şey döngünün sözdizimi değil, $veri değişkeninin o anda taşıdığı değerdir.
$veri değişkeni null veya hiç atanmamışsa, değişken adında yazım hatası varsa ya da kaynak tek bir metin döndürmüşse döngünün beklediği yapı bozulur. Hata mesajını bastırmak yerine foreach satırından geriye giderek değerin nerede üretildiğini ve döngüye nasıl aktarıldığını izle.
Hata Nereden Gelir: Null, Form Verisi ve Veritabanı Çıktısı
Hatanın kaynağını bulmak için foreach satırından hemen önceki atamayı incele. En sık karşılaşılan durumlar şunlardır:
nullveya atanmamış değer: Sorgu, fonksiyon ya da koşul beklenen veriyi üretmemiş olabilir.- Değişken adı hatası: Değer
$verilerdeğişkenine atanmışken döngüde yanlışlıkla$verikullanılabilir. - Form alanı: Alan hiç gönderilmemiş olabilir veya beklenen dizi yerine tek bir metin gelebilir.
$_POST, form verilerini alan adlarıyla taşıyan bir dizidir; belirli bir alanın yapısı ayrıca kontrol edilmelidir. - Veritabanı sonucu: Sorgu başarısız olduğunda, başarılı sorguda kullanılan sonuç yapısından farklı bir değer dönebilir.
Örneğin PDO::query() başarılı olduğunda PDOStatement, başarısız olduğunda false döndürebilir. Kullanılan hata ayarına göre istisna da oluşabilir. Bu nedenle sorgu sonucunu doğrudan döngüye vermeden önce kontrol etmek gerekir. PDO::query() belgeleri bu dönüş değerlerini açıklar.
Hatalı ve düzeltilmiş yaklaşım
Hatalı yaklaşımda veri kaynağının türü kontrol edilmeden döngü başlatılır:
foreach ($veri as $kayit) {
echo $kayit;
}
Form alanını döngüden önce kontrol eden yaklaşım ise şöyledir:
<?php
$veri = $_POST['etiketler'] ?? null;
if (is_array($veri)) {
foreach ($veri as $kayit) {
echo htmlspecialchars((string) $kayit, ENT_QUOTES, 'UTF-8') . PHP_EOL;
}
}
etiketler[] alanı PHP ve SQL değerleriyle dizi olarak geldiğinde beklenen çıktı şöyledir:
PHP
SQL
Alan hiç gelmezse veya tek bir metin olarak gelirse koşul sağlanmaz ve döngü çalışmaz. Böylece beklenmeyen veri doğrudan döngüye taşınmaz.
Veri kaynağından çıktıya kontrol listesi
- Verinin kaynağını belirle: form alanı, veritabanı sorgusu veya fonksiyon dönüşü.
- Atamayı görünür yaz ve döngüde kullanılan değişken adını karşılaştır.
- Geliştirme sırasında
var_dump($veri)ile gerçek değeri ve türü incele. - Beklenen tür ile gelen türü karşılaştır: dizi mi, tek değer mi, yoksa hata sonucu mu?
- Tür uygun değilse kontrollü bir hata yolu veya boş veri yaklaşımı seç, ardından
foreachdöngüsünü çalıştır.
is_array() ile Güvenli Varsayılan Değer Kullanımı

foreach satırına veri kaynağını doğrudan vermek yerine önce ayrı bir değişkene alıp beklenen türü normalleştirmek daha güvenlidir. Yalnızca dizi beklenen bir akışta, gelen değer dizi değilse boş dizi kullanabilirsin:
Hatalı yaklaşım, foreach ($gelenVeri as $oge) biçiminde kaynağı doğrudan döngüye vermektir. Düzeltilmiş yaklaşımda ise döngü yalnızca türü kontrol edilmiş $liste değişkeni üzerinde çalışır.
<?php
$gelenVeri = ['Elma', 'Armut'];
$liste = is_array($gelenVeri) ? $gelenVeri : [];
foreach ($liste as $oge) {
echo $oge . PHP_EOL;
}
Beklenen çıktı:
Elma
Armut
$gelenVeri bir dizi değilse $liste boş dizi olur ve foreach herhangi bir çıktı üretmeden tamamlanır. Böylece döngüye uygun olmayan bir değer gönderilmez. Ancak boş diziye dönmek, veri kaynağındaki asıl hatayı düzeltmez. Form alanı gönderilmemiş, veritabanı işlemi başarısız olmuş veya fonksiyon beklenmeyen bir değer döndürmüş olabilir. Bu nedenle normalleştirme, kaynak kontrolünün yerine değil, onunla birlikte kullanılmalıdır.
Form verisinde önce alanın gönderilip gönderilmediğini kontrol edebilirsin:
$gelenVeri = isset($_POST['etiketler'])
? $_POST['etiketler']
: [];
$liste = is_array($gelenVeri) ? $gelenVeri : [];
Burada alan bulunmadığında güvenli bir varsayılan belirlenir. Alan bulunsa bile beklenen yapı dizi değilse yine boş liste kullanılır.
is_array() yalnızca dizileri kabul eder. Veri sözleşmesi diziyle sınırlıysa bu doğru kontroldür. Fakat akışın Traversable nesneleri gibi dizi dışındaki dolaşılabilir değerleri de kabul etmesi gerekiyorsa is_iterable() değerlendirilmelidir. PHP dokümantasyonunda iterable, dizi veya Traversable değerleri kapsayan bir tür olarak açıklanır.
foreach Öncesi Değişkenin Türünü Kontrol Et: Teşhis Kontrol Listesi
foreach öncesi değişkenin türünü kontrol et. Hata mesajından doğrudan döngüyü değiştirmeye geçmek yerine, verinin kaynaktan çıktıya kadar hangi noktada beklenmeyen biçime dönüştüğünü izle.
- foreach satırındaki değişkeni belirle. Örneğin döngü
$listeüzerinde çalışıyorsa incelemeye bu değişkenden başla. - Türü ve içeriği gözlemle. Döngüden hemen önce
var_dump($liste);veya uygun bir gözlem yöntemi kullan. Değerin dizi,null, metin ya da başka bir tür olup olmadığına bak. - Son atamaya geri git.
$listedeğişkeninin son değerini hangi form alanı, veritabanı sonucu veya fonksiyon dönüşü oluşturuyor, bunu incele. - Eksik ve hatalı durum için varsayılanı belirle. Alan gönderilmediğinde ya da kaynak beklenen sonucu üretmediğinde boş liste mi kullanılacak, işlem durdurulacak mı, yoksa hata ayrıca mı bildirilecek karar ver.
- Kaynağı normalize etmeden döngüye sokma. Dizi beklenen bir akışta
is_array()kontrolüyle, daha geniş bir dolaşılabilir tür kümesi kabul ediliyorsa uygun iterable kontrolüyle güvenli değişkeni oluştur. - Çıktıyı doğrula. Döngünün yalnızca hata vermemesi yeterli değildir. Beklenen kayıtların gerçekten üretildiğini kontrol et.
Boş dizi kullanmak uyarıyı önleyebilir, fakat kayıp veriyi geri getirmez. Döngü artık çalışıyor görünse bile çıktı boşsa form isteğini, veritabanı sonucunu veya fonksiyonun dönüş değerini ayrıca incelemek gerekir.
Sık Sorulan Sorular
foreach öncesi değişkenin türünü nasıl kontrol ederim?
Döngüden hemen önce var_dump($liste); kullanabilirsin. Çıktıda değişkenin türünü ve içeriğini birlikte görerek değerin gerçekten dizi olup olmadığını, boş gelip gelmediğini veya beklenmeyen bir değer taşıyıp taşımadığını inceleyebilirsin.
is_array() kullanmak foreach hatasını her durumda çözer mi?
Hayır. is_array() yalnızca dizi kontrolü yapar. Veri sözleşmesi Traversable değerleri de kabul ediyorsa is_iterable() daha uygun olabilir. Ayrıca boş dizi kullanmak kaynakta oluşan veri sorununu ortadan kaldırmaz.
Form verisi neden foreach içinde hata oluşturur?
Form alanı hiç gönderilmemiş olabilir veya gelen değer beklenen dizi yerine metin, sayı ya da null olabilir. Önce alanın varlığını kontrol et, ardından değer türünü doğrula ve yalnızca güvenli hâle getirilmiş değişkeni döngüye ver.
Veritabanından gelen veri dizi değilse ne yapmalıyım?
Önce sorgu sonucunun gerçek türünü ve içeriğini incele. Sonucun tek kayıt, sonuç nesnesi, null veya hata değeri olarak dönmesi mümkündür. Beklenen yapı dizi ise kaynağı bu sözleşmeye göre düzenle ya da uygun bir varsayılan belirlemeden önce kaynak hatasını ayrıca ele al.
En güvenli yaklaşım, verinin türünü görmek, kaynağı beklenen yapıya göre normalleştirmek ve ardından foreach çıktısını doğrulamaktır.