Seperti yang sering terjadi, pertanyaan ini membingungkan sekali. Orang-orang datang ke sini memiliki dua tugas berbeda :
- Mereka perlu tahu berapa banyak baris dalam tabel
- Mereka perlu tahu apakah kueri mengembalikan baris apa pun
Itu dua tugas yang sangat berbeda yang tidak memiliki kesamaan dan tidak dapat diselesaikan dengan fungsi yang sama. Ironisnya, untuk keduanyaPDOStatement::rowCount()
fungsi yang sebenarnya harus digunakan.
Mari kita lihat mengapa
Menghitung baris dalam tabel
Sebelum menggunakan PDO saya hanya cukup digunakan mysql_num_rows()
.
Berarti kamu sudah melakukan kesalahan. Menggunakan mysql_num_rows()
atau rowCount()
menghitung jumlah baris dalam tabel adalah bencana nyata dalam hal mengkonsumsi sumber daya server. Database harus membaca semua baris dari disk, menggunakan memori pada server database, kemudian mengirim semua tumpukan data ini ke PHP, menggunakan memori proses PHP juga, membebani server Anda dengan mutlak tanpa alasan.
Selain itu, memilih baris hanya untuk menghitungnya tidak masuk akal. Sebuah count(*)
permintaan harus dijalankan sebagai gantinya. Basis data akan menghitung catatan dari indeks, tanpa membaca baris yang sebenarnya dan kemudian hanya satu baris yang dikembalikan.
Untuk tujuan ini, kode yang disarankan dalam jawaban yang diterima adalah adil.
Menghitung jumlah baris yang dikembalikan.
Kasus penggunaan kedua tidak seburuk yang tidak ada gunanya: jika Anda perlu tahu apakah permintaan Anda mengembalikan data, Anda selalu memiliki data itu sendiri!
Katakanlah, jika Anda hanya memilih satu baris. Baiklah, Anda dapat menggunakan baris yang diambil sebagai bendera:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
Jika Anda perlu mendapatkan banyak baris, maka Anda dapat menggunakannya fetchAll()
.
fetchAll()
adalah sesuatu yang tidak saya inginkan karena saya terkadang berurusan dengan dataset besar
Ya tentu saja, untuk kasus penggunaan pertama akan dua kali lebih buruk. Tapi seperti yang sudah kita pelajari, jangan pilih baris hanya untuk menghitungnya, baik dengan rowCount()
maupunfetchAll()
.
Tetapi jika Anda benar-benar akan menggunakan baris yang dipilih, tidak ada yang salah dalam menggunakan fetchAll()
. Ingatlah bahwa dalam aplikasi web Anda tidak boleh memilih jumlah baris yang besar. Hanya baris yang akan benar-benar digunakan pada halaman web yang harus dipilih, maka Anda harus menggunakan LIMIT
, WHERE
atau klausa yang sama dalam SQL Anda. Dan untuk jumlah data yang moderat tidak apa-apa untuk digunakan fetchAll()
. Dan sekali lagi, cukup gunakan hasil fungsi ini dalam kondisi:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
Dan tentu saja akan menjadi kegilaan mutlak untuk menjalankan kueri tambahan hanya untuk mengetahui apakah kueri Anda yang lain mengembalikan baris, seperti yang disarankan dalam dua jawaban teratas.
Menghitung jumlah baris dalam hasil yang besar
Dalam kasus yang jarang terjadi ketika Anda perlu memilih jumlah baris yang sangat besar (dalam aplikasi konsol misalnya), Anda harus menggunakan kueri yang tidak dikacaukan , untuk mengurangi jumlah memori yang digunakan. Tetapi ini adalah kasus aktual ketika rowCount()
tidak akan tersedia , sehingga tidak ada gunanya untuk fungsi ini juga.
Oleh karena itu, itulah satu-satunya kasus penggunaan ketika Anda mungkin perlu menjalankan kueri tambahan, jika Anda perlu mengetahui perkiraan dekat untuk jumlah baris yang dipilih.