$sql = "SELECT count(*) FROM `table` WHERE foo = ?";
$result = $con->prepare($sql);
$result->execute([$bar]);
$number_of_rows = $result->fetchColumn();
Não é a maneira mais elegante de fazer isso, além de envolver uma consulta extra.
O DOP possui PDOStatement::rowCount()
, o que aparentemente não funciona no MySQL. Que dor.
Do documento DOP:
Para a maioria dos bancos de dados, PDOStatement :: rowCount () não retorna o número de linhas afetadas por uma instrução SELECT. Em vez disso, use PDO :: query () para emitir uma instrução SELECT COUNT (*) com os mesmos predicados que a instrução SELECT pretendida, depois use PDOStatement :: fetchColumn () para recuperar o número de linhas que serão retornadas. Seu aplicativo pode executar a ação correta.
EDIT: O exemplo de código acima usa uma instrução preparada, que em muitos casos é provavelmente desnecessária para a contagem de linhas, portanto:
$nRows = $pdo->query('select count(*) from blah')->fetchColumn();
echo $nRows;
fetchColumn()
retorna uma string "1234" ... sua EDIT possuiecho count($nRows);
-count()
é uma função de matriz: P. Eu também recomendo digitar o resultado defetchColumn()
um número inteiro.$count = (int) $stmt->fetchColumn()
Como escrevi anteriormente em uma resposta a uma pergunta semelhante , a única razão pela qual
mysql_num_rows()
funcionou é porque ele buscava internamente todas as linhas para fornecer essas informações, mesmo que não parecesse isso para você.Portanto, na DOP, suas opções são:
FOUND_ROWS()
função do MySQL .fetchAll()
função do PDO para buscar todas as linhas em uma matriz e usecount()
nela.SELECT COUNT(*)
, como karim79 sugeriu.fonte
Como costuma acontecer, essa pergunta é confusa como o inferno. As pessoas estão vindo para cá com duas tarefas diferentes em mente:
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
Significa que você já fez errado. Usar
mysql_num_rows()
ourowCount()
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:
Caso você precise obter muitas linhas, poderá usá-lo
fetchAll()
.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()
nemfetchAll()
.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 usoLIMIT
,WHERE
ou uma cláusula semelhante em seu SQL. E para uma quantidade tão moderada de dados, tudo bem em usarfetchAll()
. E, novamente, basta usar o resultado desta função na condição: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.
fonte
Isso é muito tarde, mas encontrei o problema e faço o seguinte:
É realmente simples e fácil. :)
fonte
Acabei usando isso:
fonte
Esta publicação é antiga, mas Obter contagem de linhas em php com DOP é simples
fonte
Este é um post antigo, mas está ficando frustrado em busca de alternativas. É lamentável que o DOP não tenha esse recurso, especialmente porque o PHP e o MySQL tendem a andar de mãos dadas.
Existe uma falha infeliz no uso de fetchColumn (), pois você não pode mais usar esse conjunto de resultados (efetivamente), pois o fetchColumn () move a agulha para a próxima linha. Por exemplo, se você tiver um resultado semelhante a
Se você usar fetchColumn (), poderá descobrir que há três frutas retornadas, mas se agora percorrer o resultado, terá apenas duas colunas. O preço de fetchColumn () é a perda da primeira coluna de resultados apenas para encontrar de quantas linhas foram retornadas. Isso leva à codificação desleixada e a resultados totalmente errados, se implementados.
Então agora, usando fetchColumn (), você precisa implementar uma chamada totalmente nova e uma consulta MySQL apenas para obter um novo conjunto de resultados de trabalho. (que, espero, não tenha sido alterado desde sua última consulta), eu sei, improvável, mas isso pode acontecer. Além disso, a sobrecarga de consultas duplas na validação de todas as linhas. Que neste exemplo é pequeno, mas analisa 2 milhões de linhas em uma consulta unida, não é um preço agradável a pagar.
Eu amo PHP e apoio todos os envolvidos em seu desenvolvimento, bem como a comunidade em geral, usando PHP diariamente, mas realmente espero que isso seja resolvido em versões futuras. Esta é 'realmente' a minha única reclamação com o PHP PDO, que de outra forma é uma ótima classe.
fonte
Respondendo a isso porque eu me prendi a ela agora, sabendo disso e talvez seja útil.
Lembre-se de que você não pode buscar resultados duas vezes. Você precisa salvar o resultado da busca na matriz, obter a contagem de linhas
count($array)
e gerar resultados comforeach
. Por exemplo:fonte
Se você quiser apenas obter uma contagem de linhas (não os dados), por exemplo. usando COUNT (*) em uma instrução preparada, tudo o que você precisa fazer é recuperar o resultado e ler o valor:
Na verdade, recuperar todas as linhas (dados) para executar uma contagem simples é um desperdício de recursos. Se o conjunto de resultados for grande, seu servidor poderá engasgar.
fonte
Dê uma olhada neste link: http://php.net/manual/en/pdostatement.rowcount.php Não é recomendável usar rowCount () nas instruções SELECT!
fonte
Para usar variáveis em uma consulta, você deve usar
bindValue()
oubindParam()
. E não concatenar as variáveis com" . $variable . "
GL
fonte
Quando se trata de mysql como contar ou obter quantas linhas em uma tabela com o PHP PDO eu uso este
créditos vão para Mike @ codeofaninja.com
fonte
Um forro rápido para obter a primeira entrada retornada. Isso é bom para consultas muito básicas.
Referência
fonte
Eu tentei
$count = $stmt->rowCount();
com o Oracle 11.2 e não funcionou. Decidi usar um loop for, como mostrado abaixo.fonte
Para consultas diretas em que desejo uma linha específica e quero saber se foi encontrada, uso algo como:
fonte
Há uma solução simples. Se você usa o DOP, conecte-se ao seu banco de dados da seguinte maneira:
Em seguida, a consulta ao DB será:
E, finalmente, para contar as linhas correspondentes à sua consulta, escreva assim
fonte
fetchColumn ()
usado se quiser obter a contagem do registro [effisien]
inquerir()
usado se desejar recuperar dados e contagem de registros [opções]
PDOStatement :: rowCount
fonte
quando você cria COUNT (*) na sua instrução mysql como em
sua consulta mysql já está contando o número de resultados por que contar novamente em php? para obter o resultado do seu mysql
e
$nb
conterá o número inteiro que você contou com sua instrução mysql um pouco longo para escrever, mas rápido para executarEdit: desculpe pela postagem errada, mas como algum exemplo mostra consulta com count in, eu estava sugerindo o uso do resultado do mysql, mas se você não usar a contagem no sql fetchAll () é eficiente, se você salvar o resultado em uma variável você não perderá uma linha.
count($table)
retornará o número de linha e você ainda poderá usar o resultado depois de gostar$row = $table[0]
ou usar umforeach
fonte
Aqui está uma extensão personalizada da classe PDO, com uma função auxiliar para recuperar o número de linhas incluídas pelos critérios "WHERE" da última consulta.
Você pode precisar adicionar mais 'manipuladores', dependendo de quais comandos você usa. No momento, ele funciona apenas para consultas que usam "FROM" ou "UPDATE".
fonte
Você pode combinar o melhor método em uma linha ou função e gerar a nova consulta automaticamente:
fonte
fonte
fonte
Use o parâmetro
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, senão mostre -1:Usen parametro
array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
, sin ello venda -1exemplo:
fonte