Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

PHP "Invalid argument supplied for foreach()" Hatası Nasıl Çözülür?

php-invalid-argument-supplied-for-foreach-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. PHP "Invalid argument supplied for foreach()" Hatası Ne Anlama Gelir?
  2. Hata Nereden Gelir: Null, Form Verisi ve Veritabanı Çıktısı
  3. is_array() ile Güvenli Varsayılan Değer Kullanımı
  4. foreach Öncesi Değişkenin Türünü Kontrol Et: Teşhis Kontrol Listesi
  5. Sık Sorulan Sorular

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?

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:

  • null veya atanmamış değer: Sorgu, fonksiyon ya da koşul beklenen veriyi üretmemiş olabilir.
  • Değişken adı hatası: Değer $veriler değişkenine atanmışken döngüde yanlışlıkla $veri kullanı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

  1. Verinin kaynağını belirle: form alanı, veritabanı sorgusu veya fonksiyon dönüşü.
  2. Atamayı görünür yaz ve döngüde kullanılan değişken adını karşılaştır.
  3. Geliştirme sırasında var_dump($veri) ile gerçek değeri ve türü incele.
  4. Beklenen tür ile gelen türü karşılaştır: dizi mi, tek değer mi, yoksa hata sonucu mu?
  5. Tür uygun değilse kontrollü bir hata yolu veya boş veri yaklaşımı seç, ardından foreach döngüsünü çalıştır.

is_array() ile Güvenli Varsayılan Değer Kullanımı

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.

  1. foreach satırındaki değişkeni belirle. Örneğin döngü $liste üzerinde çalışıyorsa incelemeye bu değişkenden başla.
  2. 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.
  3. Son atamaya geri git. $liste değişkeninin son değerini hangi form alanı, veritabanı sonucu veya fonksiyon dönüşü oluşturuyor, bunu incele.
  4. 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.
  5. 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.
  6. Çı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.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara