Bir PDO sonucu geri sarmak mümkün mü?

4 Cevap php

Ben bir PDO deyimi sonuçları için bir yineleyici yazmaya çalışıyorum ama ilk satıra sarma herhangi bir yol bulamıyorum. Ben fetchAll çağıran ve tüm sonucu veri depolama yükü önlemek istiyorum.

// first loop works fine
foreach($statement as $result) {
    // do something with result
}

// but subsequent loops don't
foreach($statement as $result) {
    // never called 
}

Deyimi Sıfırlanmasını veya ilk satırı arayan bazı yolu var mı?

4 Cevap

Ben bu veritabanı bağımlı eminim. Bu nedenle, bunu önlemek için çalışmalısınız bir şeydir. Ancak, ben seni buffered queries sağlayarak istediğinizi elde edebilirsiniz düşünüyorum. Bu işe yaramazsa, her zaman fetchAll ile bir diziye sonucu çekebilirsiniz. Resultsets büyükse Her iki çözüm de, senin uygulamaları performans etkileri var, bu yüzden bu konuda iki kez düşünün.

Yazdığım Bu küçük sınıf bir PDOStatement sarar. Sadece getirilen veri depolar. Bu işe yaramazsa, okumak ve dosyaya yazmak için önbelleği hareket olabilir.

// Wrap a PDOStatement to iterate through all result rows. Uses a 
// local cache to allow rewinding.
class PDOStatementIterator implements Iterator
{
    public
        $stmt,
        $cache,
        $next;

    public function __construct($stmt)
    {
        $this->cache = array();
        $this->stmt = $stmt;
    }

    public function rewind()
    {
        reset($this->cache);
        $this->next();
    }

    public function valid()
    {
        return (FALSE !== $this->next);
    }

    public function current()
    {
        return $this->next[1];
    }

    public function key()
    {
        return $this->next[0];
    }

    public function next()
    {
        // Try to get the next element in our data cache.
        $this->next = each($this->cache);

        // Past the end of the data cache
        if (FALSE === $this->next)
        {
            // Fetch the next row of data
            $row = $this->stmt->fetch(PDO::FETCH_ASSOC);

            // Fetch successful
            if ($row)
            {
                // Add row to data cache
                $this->cache[] = $row;
            }

            $this->next = each($this->cache);
        }
    }
}

Bir tamponlu sorgu için geçerlidir, slide 31 from this presentation, bir $statement->rewind() yapabileceğini görmek. Eğer mysql kullanıyorsanız, kullanarak tamponlu sorguları taklit PDO_MYSQL_ATTR_USE_BUFFERED_QUERY yapabilirsiniz:

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 1);

@ NoahGoodrich spl sizi işaret etti. İşte her zaman çalışan bir örnek:

$it = new ArrayIterator($stmt->fetchAll());

Muhtemelen nesnelere dizi benzeri erişimi sağlamak için uzatılabilir PHP SPL bazı sınıfların bakmak isteyeceksiniz.