Zend-çerçeve ile bir sorgudan kayıt sayısını almak için bir yolu var mı?

5 Cevap php

Aşağıda benim jenerik seçeneğini göz önüne alındığında, kayıtların sayısı Zend Framework ile bir sorgudan geri almak için bir yol var? Bir döngü içinde $ row + + I belleği kullanıyorum olarak benim çözüm için kabul edilebilir değildir (gerçi onun değil benim numunede).

Ben de "Count (*)" ile başka bir sorgu eklemek istediğiniz ETMEYİN.

$query = "Select * from Users where active = 1";
$stmt = $db->query($query);

$noOfRows = ???;

while ($row = $stmt->fetch())
{

  // processing
}

5 Cevap

FetchAll () kullanın

fetchAll bir dizi döndürür, bu yüzden böyle bir şey yapabilirsiniz:

$rows = $db->fetchAll("select ...");
$numRows = sizeof($rows);
foreach ($rows as $row)
{
  // process each row
}

Hala başka bir sorgu gerektirir, fakat MySQL ile SQL_CALC_FOUND_ROWS bir SELECT parametre var - bu bağlamda bir değeri saklar yapabilirsiniz ki o SELECT FOUND_ROWS()

Not - sınır daha sonra işlenecektir, ancak ayrı bir COUNT () daha hızlı olabilir, çünkü ilk sorgunun performansı, aşağı gidecek.

FOUND_ROWS()

$query = "Select SQL_CALC_FOUND_ROWS * from Users where active = 1 limit 20";
$stmt = $db->query($query);

while ($row = $stmt->fetch())
{

  // processing
}

$count = $db->fetchOne('SELECT FOUND_ROWS()');

Garip ama bu sadece çalışır:

$oSelect = $oTable->select()
                ->where(...)
                ->order(...)
                ->limit(...)
$oRows = $oTable->fetchAll($oSelect);
// these two lines are the solution: we simply run the query again!
$db->query($oSelect);
$iTotal = $db->fetchOne("select FOUND_ROWS()");

i should mention that i use this line in my config file:

db.profiler.enabled = true

Burada tüy fikirler için bazı kod; ancak çalışmıyor:

$query = $db->select()
->from('your_table', array(new Zend_Db_Expr('SQL_CALC_FOUND_ROWS id as fake_column'),'*'))
->where(...)
->limit(0, 10);

$db->query($query);

$iCount = $db->fetchOne('select FOUND_ROWS()');

Ayrıca http://old.nabble.com/RE:-CALC_FOUND_ROWS-vs.-count%28 *% 29-p16761518.html bir göz atın

Eğer SQL sorgusunda belirlenen tüm sonuç iade ediyorsanız, bir fetchAll() yerine fetch() yapabilir ve öğelerin ardından count() numara array fetchAll() döndü.

Bir MySQL LIMIT fıkra veya eşdeğeri ile sayfalamayı yapıyorsun Ancak, yalnızca öğelerin sayısı için sayısı o sorgu (sayfa) için geri almak olacaktır. Bu durumda SQL bir COUNT() yapmadan sonuçların tüm sayısını almak için bir yolu yok. Sadece veritabanından resultset dayanan hesaplamalar yapabilirsiniz.

Kekoa yanlış.

Eğer SQL_CALC_FOUND_ROWS ve sonra bir limit koymak eğer satır tam sayısının (hiçbir sınırı ile etkilenir) alacak koyarsanız.

Eğer basit bir tablo varsa, o zaman çok daha hızlı olduğu numaralandırılmasında sayısı (*) kullanmak için tavsiye edilir, ancak karmaşık sorguları ve veri birçok benzeri katılır ve sonucu ise o zaman benim tavsiyem SQL_CALC_FOUND_ROWS kullanmaktır.

Bu size yardımcı olur umarım.

BornForCode