Como costuma acontecer, essa pergunta é confusa como o inferno. As pessoas estão vindo para cá com duas tarefas diferentes em mente:
- Eles precisam saber quantas linhas na tabela
- Eles precisam saber se uma consulta retornou alguma linha
São duas tarefas absolutamente diferentes que não têm nada em comum e não podem ser resolvidas pela mesma função. Ironicamente, para nenhum deles, a PDOStatement::rowCount()
função real deve ser usada.
Vamos ver porque
Contando linhas na tabela
Antes de usar o DOP, simplesmente usei mysql_num_rows()
.
Significa que você já fez errado. Usar mysql_num_rows()
ou rowCount()
contar o número de linhas na tabela é um desastre real em termos de consumo dos recursos do servidor. Um banco de dados precisa ler todas as linhas do disco, consumir a memória no servidor de banco de dados e enviar toda essa pilha de dados para o PHP, consumindo também a memória do processo do PHP, sobrecarregando o servidor sem motivo.
Além disso, selecionar linhas apenas para contá-las simplesmente não faz sentido. Uma count(*)
consulta deve ser executada. O banco de dados contará os registros do índice, sem ler as linhas reais e, em seguida, apenas uma linha retornada.
Para esse fim, o código sugerido na resposta aceita é justo.
Contando o número de linhas retornadas.
O segundo caso de uso não é tão desastroso quanto inútil: caso você precise saber se sua consulta retornou algum dado, você sempre terá os dados em si!
Digamos, se você estiver selecionando apenas uma linha. Tudo bem, você pode usar a linha buscada como um sinalizador:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
Caso você precise obter muitas linhas, poderá usá-lo fetchAll()
.
fetchAll()
é algo que eu não vou querer, pois às vezes posso lidar com grandes conjuntos de dados
Sim, é claro, para o primeiro caso de uso, seria duas vezes pior. Mas, como já aprendemos, não selecione as linhas apenas para contá-las, nem com rowCount()
nem fetchAll()
.
Mas no caso de você realmente usar as linhas selecionadas, não há nada errado em usar fetchAll()
. Lembre-se de que em um aplicativo Web você nunca deve selecionar uma quantidade enorme de linhas. Somente linhas que serão efectivamente utilizados em uma página web deve ser selecionado, portanto, você tem que uso LIMIT
, WHERE
ou uma cláusula semelhante em seu SQL. E para uma quantidade tão moderada de dados, tudo bem em usar fetchAll()
. E, novamente, basta usar o resultado desta função na condição:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
E é claro que será uma loucura absoluta executar uma consulta extra apenas para saber se sua outra consulta retornou alguma linha, conforme sugerido nas duas principais respostas.
Contando o número de linhas em um grande conjunto de resultados
Em um caso tão raro, quando você precisa selecionar uma quantidade enorme de linhas (em um aplicativo de console, por exemplo), é necessário usar uma consulta sem buffer , para reduzir a quantidade de memória usada. Mas este é o caso real quando rowCount()
não estará disponível , portanto, não há uso para essa função também.
Portanto, esse é o único caso de uso em que talvez você precise executar uma consulta extra, caso precise conhecer uma estimativa aproximada do número de linhas selecionadas.