• 29-09-2018, 21:30:13
    #1
    İyi forumlar,

    Pure PHP 'de genelde kodları incelediğim zaman veritabanından verileri çekerken sürekli while döngüsü kullanıyorlar. Neden foreach değil ?

    while($row = mysql_fetch_array result($sql)) {
         $data[] = $row['name'];
    }
    Neden bu şekilde farkı ne yani tam anlamı ile açıklayabilecek olan var mı ?

    foreach($row as $name){
         $data[] = $name->firstName;
    }
    Böyle kullanılamıyor mu ?
  • 29-09-2018, 21:48:43
    #2
    Kendi bildiğim kadarı ile açıklamam gerekirse, yapısı farklı olmasına ramen işlevleri ve amaca giden yolları aynıdır. İkisi de bir dizini yazdırmaya yönelik kodlardır. Bu nedenle ben bir farkının olduğunu düşünmüyorum. Yazılımcının kendi tercihine bağlı bir yol olduğunu düşünüyorum.
    Tabi bunu teknik detayları ile bilen illaki vardır.
  • 29-09-2018, 21:50:24
    #3
    benim bildiğim kadarıyla
    veri tabanından gelen cevaplar ramde tutulur.
    ramde tutulan değerler direk ulaşılamaz bunun için cevapların saklandığı yere ulaşabilen mysql deth fonksiyonları kullanılır.
    mysql select sorgusunun sonucu direk array olarak alamadığımız için sonuçların saklandığı adresten fetch fonksiyonları her çalıştırma bir sonuç getirir ve adresten siler. bu yüzden adres boşalana kadar while kullanılınır.


    bu yapı sadece pure php de değil bütün sql serverlerde geçerlidir.


    resimde görüldüğü gibi query fonksiyonu sorgu sonucu rama a kopyalar
    ramden de fetch fonksiyonları betik içinde cevapları bizim kullandığımız değişkenlere taşır.
    taşınan her satır ramden silinir. ram de ne kadar satır olduğu bilinmediği içinde while döngüsü kullanılır.


    etkili ve hızlı bir yazılım için ram kullanımına kadar herşey ince ince ele alınması gerekir. select * from fmd ile select id,ad,email from fmd arasındaki fark aslında ramde harcanan yerdir.

    umarım anlatabilmişimdir.
  • 29-09-2018, 21:53:51
    #4
    Çünkü mysql_fetch_array tüm satırları vermez. her çalışmasında tek satır sonuç döndürür.

    GundogduYakici adlı üyeden alıntı: mesajı görüntüle
    İyi forumlar,

    Pure PHP 'de genelde kodları incelediğim zaman veritabanından verileri çekerken sürekli while döngüsü kullanıyorlar. Neden foreach değil ?

    while($row = mysql_fetch_array result($sql)) {
         $data[] = $row['name'];
    }
    Neden bu şekilde farkı ne yani tam anlamı ile açıklayabilecek olan var mı ?

    foreach($row as $name){
         $data[] = $name->firstName;
    }
    Böyle kullanılamıyor mu ?
    ikinci kullanımda $row değişkenine mysql_fetch_array den dönen veriyi ataman lazım.
    ama mysql fetch array her çalıştığında tek satır döndürür.
    yani

    $row = mysql_fetch_array result($sql);
    foreach($row as $name){
         $data[] = $name->firstName;
    }
    Yaptığında sorgu sonucu 10 satır da olsa tek satır sonuç döner.
    Foreach in inputu array olmak zorundadır.
    While ise bir bir fonksiyon, ya da true false döndürebilen bir ifadeyi input olarak alabildiği için fonksiyonu while içinde değişkene atıyoruz.
    mysql_fetch_array son satırı verene kadar true döndürür ve satırlar değişkene atanır. false verdiğinde işlem biter.

    foreach için herhangi bir true false koşulu yoktur, input array olmak zorundadır ve dizinin tüm elemanlarını bitirene kadar sıralı işlem yapar.
    foreach ile yapabilmen için mysql_fecth_array değil mysql_fetch_all kullanman lazım. yoksa mysql_fetch_Array tek satır döndürür, foreach tek elemanlı arrayi çalıştırır ve işlem biter.
    böylece mysql den dönen sorgu sonucunu toptan bir array halinde foreach içine atabilirsin.

    foreach (mysql_fetch_all($result) as $row){
         $data[] = $row['name'];
    }
    Ama bu şekilde tüm sonuçları bir arada döndüreceğin için bellek kullanımın artacaktır.
    while daha okunabilir, daha az kaynak tüketir.
  • 29-09-2018, 23:21:06
    #5
    Herkese çok teşekkürler ben size şu şekilde sorayım birde.
    // select
    $query = $db->from('post')
                ->orderby('post_id', 'desc')
                ->limit(0, 10)
                ->all();
      
    // bu döngü ile
    while( $row = mysql_fetch_assoc($query) ) {
           print_r($row);
    }
    
    // bu foreach döngüsü
    foreach ( $query as $row ){
           print_r($row);
    }
    buradaki "mysql_fetch_assoc" veya "mysql_fetch_array" olmasından bahsetmiyorum ben sadece array döndürürken neden while kullanıyorlar niye foreach değil ama foreach'de var falan genelde pure PHP'de görüyorum bu while döngüsünü.

    Şu iki döngü aynı işlemi yapamaz mı ? yapar ise neden bazen while kullanıyorlar. Bu kısmı anlamadım ram'den dolayı mı yani nedir eğer öyleyse niye foreach var. foreach sadece SQL'den gelmeyen değerler için. Ve tek satır döndürür dediğiniz nedir ? tam anlayamadım o yüzden ya da ben anlatamadım.
  • 30-09-2018, 10:31:13
    #6
    GundogduYakici adlı üyeden alıntı: mesajı görüntüle
    Herkese çok teşekkürler ben size şu şekilde sorayım birde.
    // select
    $query = $db->from('post')
                ->orderby('post_id', 'desc')
                ->limit(0, 10)
                ->all();
     
    // bu döngü ile
    while( $row = mysql_fetch_assoc($query) ) {
           print_r($row);
    }
    
    // bu foreach döngüsü
    foreach ( $query as $row ){
           print_r($row);
    }
    buradaki "mysql_fetch_assoc" veya "mysql_fetch_array" olmasından bahsetmiyorum ben sadece array döndürürken neden while kullanıyorlar niye foreach değil ama foreach'de var falan genelde pure PHP'de görüyorum bu while döngüsünü.

    Şu iki döngü aynı işlemi yapamaz mı ? yapar ise neden bazen while kullanıyorlar. Bu kısmı anlamadım ram'den dolayı mı yani nedir eğer öyleyse niye foreach var. foreach sadece SQL'den gelmeyen değerler için. Ve tek satır döndürür dediğiniz nedir ? tam anlayamadım o yüzden ya da ben anlatamadım.
    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.
  • 30-09-2018, 12:07:43
    #7
    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
  • 30-09-2018, 12:21:57
    #8
    Konu çözülmüş ama ben tebrik istedim. Sadece bu tarz soruları sormaktan vazgeçme
    seni daha iyiye götürecek şeyler bu tarz sorulardır. Tabi Stack overflow gibi kaynakları da değerlendirmen bir çok sorunun cevabına ulaşmanı hızlandırır. (Örnek) Gerçekten özlemişim, anet news günlerime döndüm
  • 30-09-2018, 12:29:54
    #9
    Daky adlı üyeden alıntı: mesajı görüntüle
    Konu çözülmüş ama ben tebrik istedim. Sadece bu tarz soruları sormaktan vazgeçme
    seni daha iyiye götürecek şeyler bu tarz sorulardır. Tabi Stack overflow gibi kaynakları da değerlendirmen bir çok sorunun cevabına ulaşmanı hızlandırır. (Örnek) Gerçekten özlemişim, anet news günlerime döndüm
    Teşekkürler hocam öyle yapacağım Stackoverflow'da çok iyi tabi ki ama işte ingilizce zayıf olunca pek etkili olmuyor benim için, ingilizceyi öğrenmeden bu meslekte de gelişmek çok zor