2012-06-06 16 views
7

2 ay boyunca PHP'yi ilk komut dosyası dilimde okuyorum. Sorunlarımın çoğunda çevrimiçi bir cevabı kolayca bulabilirim, ancak PDO hakkında anlayamadığım bir şey var.Bir PDO sonuç kümesi nasıl saklanır

Veritabanından veri almak için PDO sınıfının yeni bir nesnesini başlatıyorum ve PDO :: query() yöntemini çağırın. Bu, sonuç kümesini SQL sorgusundan taşıyan bir PDOStatement nesnesini döndürür. İşte problem nerede başlıyor. Sonuç kümesindeki verilerin nasıl ve nerede depolandığını anlayamıyorum.

PHP Manual'da, döndürülen satırları bir foreach döngüsü ile PDOStatement nesnesi üzerinde yinelemeyi öğrendim. Ancak, PHP el kitabında, bir nesne bir diziye dönüştürülürse, sonuç öğelerinin nesnesinin özellikleri olan bir dizi olduğunu açıkça belirtir. PDOStatement yalnızca, verilen sorgu dizesini içeren - $ queryString özellikli bir özelliğine sahiptir. Peki ... sorgu sonuçları nerede saklanıyor? Ve neden onlara bir foreach döngüsü olan bir dizi üzerinden ulaşabilirim, ama bunun dışında değil?

// Instantiate new PDO object to establish a new connection with MySQL database 
$db = new PDO('mysql:dbhost=localhost;dbname=world', 'root', 'secret'); 

// Execute SQL query - Returns a PDOStatement object 
$result = $db->query("SELECT Name, Continent, Population FROM Country"); 


// Result set can be accessed with a foreach loop iterating over the PDOStatement object 
foreach ($result as $row) { 
    echo "$row[Name] - $row[Continent] - $row[Population] <br />"; 
} 

// Outside the foreach loop, $result cannot be accessed this way. 
// This produces 'Cannot use object of type PDOStatement as array' 
echo $result[0]['Name']; 
+0

eşdeğerdir. net/Iterator) arayüzü, dolaylı bir yöntem çağrısı bireysel sonuçları döndürür; bu yüzden, özellik veya iç veri olarak mevcut olmaları gerekmez. – mario

cevap

6

PDOStatement sınıfı objeleri ile iterated olanak sağlayan, Iterator interface uygular. // php: Yineleyici arabirimini uygulayan bir nesne için


Iterator extends Traversable { 
    /* Methods */ 
    abstract public mixed current (void) 
    abstract public scalar key (void) 
    abstract public void next (void) 
    abstract public void rewind (void) 
    abstract public boolean valid (void) 
} 
,

foreach($result as $row) { 
    // Code 
} 

Bu [ `Iterator`] (http uygulayan

for ($result->rewind(); $result->valid(); $result->next()) { 
    $row = $result->current(); 
    // Code 
} 
+1

Teşekkürler çok! SPL ve özellikle Iterator arayüzü hakkında bilgi edinmek için zaman ayırdım. Şimdi nesnenin üzerinde yinelemenin nasıl mümkün olduğunu görüyorum, ancak hala sorgudan alınan sonucun nerede saklandığını anlamıyorum. Nesnelerin yalnızca ağaç türlerine sahip olabileceğini öğrendim: özellikler, yöntemler ve sabitler. Sonuç kümesi bir özellikte kayıtlı değilse, nerede depolanır? Bir çeşit tampon var mı? – user1440560

+0

İlginç bir soru. PDOStatement nesnesinin mysql_query döndürdüğü kaynakla aynı türde bir kaynak tutmasını beklerdim. Ancak, http://php.net/manual/en/class.pdostatement.php göre değil. – ddlshack

+0

Ayrıca, cevabım biraz yanıldı. PDOStatement, "Iterator" tarafından genişletilen dahili bir sınıf olan "Traversable" ı doğrudan uygular. – ddlshack

İlgili konular