Como suele suceder, esta pregunta es confusa como el infierno. La gente viene aquí con dos tareas diferentes en mente:
- Necesitan saber cuántas filas hay en la tabla.
- Necesitan saber si una consulta devolvió alguna fila
Son dos tareas absolutamente diferentes que no tienen nada en común y que no pueden resolverse con la misma función. Irónicamente, para ninguno de ellosPDOStatement::rowCount()
se debe usar la función real .
Veamos porque
Contando filas en la tabla
Antes de usar PDO simplemente lo usé mysql_num_rows()
.
Significa que ya lo hiciste mal. Usar mysql_num_rows()
o rowCount()
contar el número de filas en la tabla es un verdadero desastre en términos de consumo de los recursos del servidor. Una base de datos tiene que leer todas las filas del disco, consumir la memoria en el servidor de la base de datos, luego enviar todo este montón de datos a PHP, consumiendo también la memoria del proceso de PHP, cargando su servidor sin ninguna razón.
Además, seleccionar filas solo para contarlas simplemente no tiene sentido. En su lugar, count(*)
se debe ejecutar una consulta. La base de datos contará los registros del índice, sin leer las filas reales y luego solo se devolverá una fila.
Para este propósito, el código sugerido en la respuesta aceptada es justo.
Contando el número de filas devueltas.
El segundo caso de uso no es tan desastroso como bastante inútil: en caso de que necesite saber si su consulta devolvió algún dato, ¡siempre tiene los datos en sí!
Diga, si está seleccionando solo una fila. Muy bien, puedes usar la fila obtenida como una bandera:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
En caso de que necesite obtener muchas filas, puede usar fetchAll()
.
fetchAll()
es algo que no querré, ya que a veces estoy tratando con grandes conjuntos de datos
Sí, por supuesto, para el primer caso de uso sería el doble de malo. Pero como ya aprendimos, simplemente no seleccione las filas solo para contarlas, ni con rowCount()
ni fetchAll()
.
Pero en caso de que realmente vaya a usar las filas seleccionadas, no hay nada de malo en usarlas fetchAll()
. Recuerde que en una aplicación web nunca debe seleccionar una gran cantidad de filas. Sólo las filas que se utilizan realmente en una página web deben ser seleccionados, por lo tanto, usted tiene que usar LIMIT
, WHERE
o una cláusula similar en su SQL. Y para una cantidad tan moderada de datos está bien usarlo fetchAll()
. Y nuevamente, solo use el resultado de esta función en la condición:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
Y, por supuesto, será una locura absoluta ejecutar una consulta adicional solo para saber si su otra consulta devolvió alguna fila, como se sugiere en las dos respuestas principales.
Contando el número de filas en un conjunto de resultados grande
En un caso tan raro cuando necesita seleccionar una gran cantidad real de filas (en una aplicación de consola, por ejemplo), debe usar una consulta sin búfer para reducir la cantidad de memoria utilizada. Pero este es el caso real cuando rowCount()
no estará disponible , por lo tanto, no hay uso para esta función también.
Por lo tanto, ese es el único caso de uso cuando posiblemente necesite ejecutar una consulta adicional, en caso de que necesite conocer una estimación cercana para el número de filas seleccionadas.