digiklan adlı üyeden alıntı: mesajı görüntüle
Sen döngülerin ne işe yaradıklarını öğrenememişsin henüz ki neden foreach var diyorsun.
While, for ve foreach farklı inputlar alır. Bu şekilde farklı tür döngüler kullanırken yazım avantajı sağlarlar.
Yoksa tüm döngüleri yazacağın satır sayısını arttırarak bir birine çevirebilirsin.

While input olarak bir koşul alır ve koşul true döndürdüğü sürece çalışır.
Mesela while(strlen($value) < 10 ){echo 'string 10 karakterden küçük';}
Foreach input olarak bir array alır. Foreach kullanırken input olarak bir fonksiyon, bir koşul tanımlayamazsın. Dizideki tüm elemanları sırasıyla teker teker işler.
foreach($veri as $yeniveri){ echo $yeniveri;}
For döngüsünde de input verirken dizi elemanları işlenirrken hangi sıra ile hareket edileceğini koşullandırabilirsin. Mesela sadece tek rakamlı dizi üyelerini işletebilirsin.
for($i=1;$i<count($veri);$i+2){echo $veri[$i];}

Yukarıda saydığım işlemleri hem for ile, hem foreach ile hem de while ile yapabilirsin.
Ama yazdığım şekilde yaparsan sadece döngülerin input değerlerini girerek ekstra bir koşul üretmeden yapabilirsin.

Şimdi tekrar while hikayesine gelelim.
Senin kodunu bilmiyorum $query değişkenine ne dönüyor bilmiyorum çünkü classını görmüyorum.
$query'den dönen değer mysql resource ise doğrudan foreach içine veremezsin.
mysql_fetch fonksiyonlarından birinden geçirmen lazım. mysq_fetch_row, mysql_fetch_array ve mysql_fetch_assoc her çalıştıklarında bir satırı fetch ederler.
Bu yüzden while içine sokarız.
Tüm satırları fetch etmek için mysql_fetch_all fonksiyonu ile tüm resource verisini array haline sokup foreach içine alabilirsin.
Ama bu da tüm resource un aynı anda array olarak yeniden tanımlanmasına neden olur ve daha fazla kaynak tüketir.
Çünkü tek satır fetch fonksiyonları her fetch edip döndürdükler her resource satırını aynı zamanda unset ederler.
Böylece resource'un tuttuğu veriyi boşaltarak kullanacağın değişkene aktarmış olursun.

Eğer veritabanı classından $query değişkenine dönen değer zaten bir array ise.
O zaman foreach içine sokabilirsin elbette. Ama $query dizisinin her elemanını $row dizisine atıp çalıştırırken $query dizisindeki çalışan elemanı unset etmezsin.
Bu nedenle query bellekte yer işgal etmeye devam eder.
Elinize, parmaklarınıza sağlık işte şimdi anladım sizin için yorucu olsada teşekkürler