Sık sık olduğu gibi, bu soru cehennem gibi kafa karıştırıcı. İnsanlar buraya iki farklı görev düşünerek geliyorlar :
- Tabloda kaç satır olduğunu bilmeleri gerekir
- Bir sorgunun herhangi bir satır döndürüp döndürmediğini bilmeleri gerekir
Bu, ortak hiçbir şeyi olmayan ve aynı işlevle çözülemeyen iki farklı görevdir. İronik olarak, ikisi için gerçek PDOStatement::rowCount()
işlev kullanılmamalıdır.
Bakalım neden
Tablodaki satırları sayma
PDO kullanmadan önce sadece kullandım mysql_num_rows()
.
Bunu zaten yanlış yaptığınızı gösterir. Tablodaki satır sayısını saymak için mysql_num_rows()
veya kullanmak , sunucu kaynaklarını tüketmek açısından gerçek bir felakettir . Bir veritabanının diskteki tüm satırları okuması, veritabanı sunucusundaki belleği tüketmesi ve ardından tüm bu veri yığınını PHP'ye göndermesi, PHP işleminin hafızasını da tüketmesi ve sunucunuzu mutlak bir sebep olmadan yüklemesi gerekir.
Ayrıca, satırları yalnızca saymak için seçmek mantıklı değildir. Bunun yerine bir sorgu çalıştırılmalıdır. Veritabanı , gerçek satırları okumadan ve yalnızca bir satır döndürmeden kayıtları dizinden sayar .rowCount()
count(*)
Bu amaçla, kabul edilen cevapta önerilen kod adildir.
Döndürülen sayı satırlarını sayma.
İkinci kullanım durumu, anlamsız olduğu kadar felaket değildir: sorgunuzun herhangi bir veri döndürüp döndürmediğini bilmeniz gerekiyorsa, her zaman verileriniz vardır!
Diyelim ki, yalnızca bir satır seçiyorsanız. Tamam, getirilen satırı bayrak olarak kullanabilirsiniz:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
Çok sayıda satır almanız gerekirse, kullanabilirsiniz fetchAll()
.
fetchAll()
bazen büyük veri kümeleriyle uğraşabileceğim için istemeyeceğim bir şey
Evet, ilk kullanım durumunda iki kat daha kötü olurdu. Daha önce öğrenmiş gibi, sadece yok olan ne, bunları saymak için yalnızca satırları seçin rowCount()
ne de fetchAll()
.
Ancak, seçilen satırları gerçekten kullanacaksanız, kullanımda yanlış bir şey yoktur fetchAll()
. Bir web uygulamasında asla büyük miktarda satır seçmemeniz gerektiğini unutmayın. Aslında bir web sayfasında kullanılacak Sadece satırlar dolayısıyla kullanım lazım, seçilmelidir LIMIT
, WHERE
ya da SQL benzer bir fıkra. Ve böylesine ılımlı miktarda veri için her şey yolunda fetchAll()
. Ve tekrar, bu fonksiyonun sonucunu şu durumda kullanın:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
Ve elbette , diğer iki sorgunun en üstteki iki yanıtta önerildiği gibi herhangi bir satır döndürüp döndürmediğini söylemek için fazladan bir sorgu çalıştırmak mutlak delilik olacaktır .
Büyük bir sonuç kümesindeki satır sayısını sayma
Böyle nadir bir durumda, çok büyük miktarda satır seçmeniz gerektiğinde (örneğin bir konsol uygulamasında), kullanılan bellek miktarını azaltmak için arabelleksiz bir sorgu kullanmanız gerekir . Ancak bu rowCount()
mevcut olmadığında gerçek durumdur , bu nedenle bu işlev için de bir faydası yoktur.
Bu nedenle, seçilen satır sayısı için yakın bir tahmin bilmeniz gerektiğinde, fazladan bir sorgu çalıştırmanız gerekebileceği tek kullanım durumudur.