2016-04-05 22 views
1

döngüler. Neden foreach'i bir kereden fazla kullanamıyorum? Nasıl düzeltebilirim lütfen?PHP/PDO PDO deyimi birden çok kez birden foreach kullanarak Aşağıdaki kod var

+2

belki ilginç? kaydırılabilir imlecin mysql'de bulunmadığını belirtir. http://stackoverflow.com/a/19076778/3184785. –

+1

Örnek kodunuz, birbiri ardına birden çok foreach bloğunuz olduğu durumu göstermediğinden başarısız olmayacaktır - bu yüzden arkadaşların kafası karışmıştır. Kod, tüm sonuç kümesinde ilk yinelemede durmuyor, başka bir şekilde, ikinci tam yinelemeyi deniyorsunuz. – Ray

cevap

0

$sqlQueryLocalityAdd bir sonuç kümesi değil, bir PDOStatement nesnesidir ve bunu yalnızca bir kez doğrudan değiştirebilirsiniz (açık bir şekilde belirtildiği gibi).

execute() ifadesi, boolean ifadesini döndürür true veya false sorgunun başarısı. Bunun üstesinden kadar çok kez yinelemek böylece

$success = $sqlQueryLocalityAdd->execute(array(':country_add' => $postCountryAdd)); 
    if($success) { 

     $results = $sqlQueryLocalityAdd->fetchAll(); 

     foreach($results as $localityAddRow) { 
      echo '<option value="'; 
      .... 

çıkan dizi $results, sadece vanilya dizidir: başarılı bir şekilde çalışırsa

, post-sorgu ondan sonuçlarını getirmek ve dizi dönen yinelemek gerekiyor istediğin gibi.

Not: execute() yanlış döndürürse, sorguda bir sorun var - boş bir sonuç kümesini döndüren başarılı bir çalışma sorgusu sonuçları yine de true ile sonuçlanacaktır.

+0

'PDOStatement' Traversable' uygular, böylece * doğrudan * yineleyebilirsiniz! – deceze

+0

@deceze gerçekten öyle, iyi bir nokta.Tam olarak nasıl uygulandığını gösteren belgeleri bulamıyor, tam olarak ne beklediğinden emin değilsiniz. Sahnenin arkasında bir şey mi var? Sonuçların üzerinde yineleme olacağına inanır. – Ray

+2

'' ($ row = $ stmt-> fetch()) '... – deceze

0

$sqlQueryLocalityAdd bu durumda bir olan bir nesnedir - gösteriyorum ve OP kullanmış - yinelenemez. (cesur yani @deceze anlayabilir).

Ancak bunu gerçekleştirmek için foreach döngüsünde fetchAll() döngüsünü kullanabilirsiniz.

Kodunuz şöyle görünmelidir:

[...] 
    if($sqlQueryLocalityAdd->execute(array(':country_add' => $postCountryAdd)): 
     foreach($sqlQueryLocalityAdd->fetchAll() as $row): 
      echo $row['column']; 
      [...] 
     endforeach; 
    endif; 
[...] 

Difference between an array and an Object

+0

Nesneleri, özellikle de PDOStatement'in yaptığı gibi, Traversable'ı uyguladıkları zaman, gerçekten iyi bir şekilde sorgulayabilirsiniz. – deceze

+0

Bunu hiç görmediniz, ama bu onun sorusunu cevaplıyor ... 'Sadece' düzenleyeceğim. @deceze – KDOT

+0

Hala yanlış olan "yinelenemeyen" diyorsunuz. OP aynı zamanda (şifreli), bir kez * çalıştığını söyler (soruyu doğru olarak yorumlarsam). – deceze

0

sorun sonuç kümesi yalnızca bir kez iterated olmasıdır; o zaman bitkin olur, MySQL onu atar ve tekrar yineleyemezsiniz.

Aslında bu hiç denemedim, ancak birkaç kez tekrarlanır edilebilir bir sonuç kümesi oluşturmak için, size thusly oluşturmak mümkün olmalıdır bir kaydırılabilir imleci, gerek:

$sqlQueryLocalityAdd = $dbh->prepare(..., [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]); 

Daha sonra teorik olarak sonucu birkaç kez yineleyebilirsiniz.

Bu işe yaramazsa, verileri $sqlQueryLocalityAdd->fetchAll() kullanarak bir diziye getirin ve istediğiniz sıklıkta yineleyin. Aslında, bu MySQL ile tek seçenek olarak görünüyor: https://stackoverflow.com/a/19076778/476

+1

Sonunda anladım. Kafa karıştırıcı kısım OP sadece tek bir foreach bloğu gösterir. İfadenin oluşturduğu sonuç kümesinin ilk tam yinelemesinin bir adımı olarak ölmüyor, ama ölüyor, çünkü bir yerlerde daha sonra (postayla gösterilmiyor) başka bir foreach iterasyonunu deniyor. – Ray

+0

@Ray Ding ding ding ding! Bir kazananımız var! – deceze

İlgili konular