PDO ile satır sayısı

10 Cevap php

Birçok çelişkili ifadeler etrafında vardır, PHP PDO kullanarak sayısını satır en iyi yolu nedir? Ben sadece kullanılan PDO kullanarak önce mysql_num_rows.

fetchAll Benim kullanım için iyi bazen büyük veri setleri ile ilgili olabilir gibi ben istemiyorum bir şeydir, öyle değil.

Herhangi bir öneriniz?

10 Cevap

$sql = "SELECT count(*) FROM `table` WHERE foo = bar"; 
$result = $con->prepare($sql); 
$result->execute(); 
$number_of_rows = $result->fetchColumn(); 

Değil en şık bunu yapmak için bir yol, artı ekstra bir sorgu içerir.

PDO görünüşe göre not MySQL çalışmak neden olan, PDOStatement::rowCount() vardır. Ne bir ağrı.

PDO Doc:

For most databases, PDOStatement::rowCount() does not return the number of rows affected by a SELECT statement. Instead, use PDO::query() to issue a SELECT COUNT(*) statement with the same predicates as your intended SELECT statement, then use PDOStatement::fetchColumn() to retrieve the number of rows that will be returned. Your application can then perform the correct action.

EDIT: Yukarıdaki kod örneği birçok durumda bir hazır deyimi kullanır satırları sayma amacıyla muhtemelen gereksizdir, yani:

$nRows = $pdo->query('select count(*) from blah')->fetchColumn(); 
echo $nRows;

Ben tek nedeni, an answer to a similar question daha önce yazdığım gibi mysql_num_rows() bu dahili sana bunun gibi görünmüyordu bile, size bu bilgileri vermek için tüm satır getiriliyor çünkü çalışmış .

Yani PDO'de seçenekler:

  1. MySQL FOUND_ROWS() işlevini kullanın.
  2. Bunun üzerine PDO'su fetch_all() function to fetch all the rows into an array, then use count() kullanın.
  3. Karim79 önerdiği gibi, SELECT COUNT(*) için ekstra bir sorgu yapmak.

Bu eski bir yazı olduğunu, ancak alternatifler arıyor sinirli alıyorum. PHP ve MySQL el ele gitmek eğilimindedir özellikle, PDO bu özelliği yoksun süper talihsiz bir durumdur.

Artık () sonraki satıra iğneyi hareket fetchColumn olarak bu sonuç kümesini (etkili) olarak kullanabilirsiniz fetchColumn kullanarak talihsiz bir kusur () vardır. Yani, örneğin, size benzer bir sonuç varsa

  1. Meyve> Banana
  2. Meyve-> Elma
  3. Meyve-> Orange

) Eğer fetchColumn kullanırsanız () döndürülen 3 meyve olduğunu öğrenebilirsiniz, ancak sonucu ile artık döngü eğer, sadece iki sütun, fetchColumn ve fiyatı var (sadece bulmak için sonuçların ilk sütunun kaybı üzerinden kaç satır iade edildi. Bu özensiz kodlama yol açar, ve eğer uygulanırsa tamamen hata sonucu basmış.

Yani şimdi, fetchColumn kullanarak () uygulamak zorunda ve tamamen yeni çağrı ve MySQL sorgusu sadece taze bir çalışma sonucu seti almak. (Ki umarım son sorgu bu yana değişmedi), I, olası biliyorum, ama olabilir. Ayrıca, tüm satır sayısı doğrulama dual sorguları havai. Bu örnek için küçük, ama bir katıldı sorgu, ödemek için keyifli bir fiyat 2 milyon satır ayrıştırma hangisi.

Ben PHP seviyorum ve bir günlük bazda PHP kullanarak büyük onun gelişimine dahil herkes gibi topluma destek, ama gerçekten bu gelecek sürümlerde ele umuyoruz. Bu 'gerçekten' aksi takdirde büyük bir sınıf PHP PDO, benim tek şikayet.

Ben bu kullanarak sona erdi:

$result = $db->query($query)->fetchAll();

if (count($result) > 0) {
    foreach ($result as $row) {
        echo $row['blah'] . '<br />';
    }
} else {
    echo "<p>Nothing matched your query.</p>";
}

Bu süper geç, ama sorun koştu ve ben bunu:

function countAll($table){
   $dbh = dbConnect();
   $sql = "select * from `$table`";

   $stmt = $dbh->prepare($sql);
    try { $stmt->execute();}
    catch(PDOException $e){echo $e->getMessage();}

return $stmt->rowCount();

Gerçekten basit ve kolay. :)

Eğer gibi mysql tablosunda COUNT (*) yaptığınızda

$q = $db->query("SELECT COUNT(*) FROM ...");

php tekrar saymaya neden mysql sorgu zaten sonucu sayısını sayıyor? MySQL sonucu almak için

$q = $db->query("SELECT COUNT(*) as counted FROM ...");
$nb = $q->fetch(PDO::FETCH_OBJ);
$nb = $nb->counted;

and $nb will contain the integer you have counted with your mysql statement a bit long to write but fast to execute

Edit: sorry for the wrong post but as some example show query with count in, I was suggesting using the mysql result, but if you don't use the count in sql fetchAll() is efficient, if you save the result in a variable you won't loose a line.

$data = $dbh->query("SELECT * FROM ...");
$table = $data->fetchAll(PDO::FETCH_OBJ);

count($table) satır sayısını döndürür ve sonra gibi $row = $table[0] kullanılarak veya bir foreach Hala sonucu kullanabilirsiniz

foreach($table as $row){
  print $row->id;
}

İşte son sorgunun "NEREDE" kriterlerine göre bulunan satır sayısını almak için bir yardımcı fonksiyonu ile PDO sınıfının bir ısmarlama uzantısı bulunuyor.

Eğer kullandığınız komutları ne bağlı olsa da, daha 'eylemcileri' eklemek gerekebilir. Şu anda sadece "DAN" veya "UPDATE" kullanan sorguları için çalışıyor.

class PDO_V extends PDO
{
    private $lastQuery = null;

    public function query($query)
    {
        $this->lastQuery = $query;    
        return parent::query($query);
    }
    public function getLastQueryRowCount()
    {
        $lastQuery = $this->lastQuery;
        $commandBeforeTableName = null;
        if (strpos($lastQuery, 'FROM') !== false)
            $commandBeforeTableName = 'FROM';
        if (strpos($lastQuery, 'UPDATE') !== false)
            $commandBeforeTableName = 'UPDATE';

        $after = substr($lastQuery, strpos($lastQuery, $commandBeforeTableName) + (strlen($commandBeforeTableName) + 1));
        $table = substr($after, 0, strpos($after, ' '));

        $wherePart = substr($lastQuery, strpos($lastQuery, 'WHERE'));

        $result = parent::query("SELECT COUNT(*) FROM $table " . $wherePart);
        if ($result == null)
            return 0;
        return $result->fetchColumn();
    }
}

İlk giriş almak için hızlı bir liner döndü. Bu çok temel sorguları için güzel.

<?php
$count = current($db->query("select count(*) from table")->fetch());
?>

Reference

Uh ? Guys what about :

mysqli_result::$num_rows

$ = $ Mydb-> sorgu ('SELECT * yourTable DAN') saymak -> num_rows;

echo $ sayımı. 'Select deyiminde satırları';

Hayır mı? Ya ilk soru / ihtiyacının özünü eksik?

Ayrıca sadece Kılavuzu bir göz alarak bir çok yardımcı olur:

http://php.net/mysqli

Çok kötü, bu soru pek çok kişi karıştı.

Ancak, "he has already done a select query and now wants to know how many rows were returned." OP bir onay var

Yani, aslında bir iki soru var.

1. Should a developer select more rows than needed on the page?

No. LIMIT clause or similar operator have to be used to limit the number of rows returned.
If he needs no data but only count - he shouldn't have selected the data at all, but te very count only. So, no function to get the number of rows ever applicable here.

2. How to count them rows returned?

Sadece onları saymak. FetchAll kullanarak dizi () veri almak için right yoludur. Bir dizinin sayısı almak için çocuk oyuncağı iken.

Therefore, we can conclude that

  • Hayır özel bir fonksiyon, hiç ihtiyaç mysql_num_rows veya rowCount () olmak: İlk veri almak ve daha sonra bunu saymak mümkün olacak.
  • Ekstra bir sorgu ne satırların sayısını almak için bir aklı başında bir fikir you already have. Neden kabul cevabı belirsiz ve aldatıcı budur. A COUNT (*) sorgu sayısını gerekiyorsa only kullanılmak zorunda, ancak veri kendisi. Ama bu tamamen farklı bir soru.
  • for the usual case of the search query with pagination, you actually need two queries:
    • bir LIMIT kullanarak belirli bir sayfa için veri almak için
    • bir toplam sayısını elde etmek için (bir şekilde gizlenmiş olabilir, örneğin SQL_CALC_FOUND_ROWS bakınız)

Hem veri ve rowCount () aslında gerekli olacak durumda çok küçük bir şans hala var. Ama bu konuda konuşmak için çok nadiren oluşur. Ama evet, bu tür istisnai durumda hem çok fazla veri ve bir sayım gerektiğinde - zaten Mysql yıllar ile çalışır gibi rowCount (), kullanılması gerekir.