Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ronny Santana

[Resolvido] PDO-> Contar Resultados

Recommended Posts

Ola amigos, boa tarde,

 

Como faço para contar resultados de uma query com PDO?

 

Abaixo meu COD

class Agenda {

public function __construct($p1='' ,$p2='', $p3='', $p4='', $p5='') {

$this->nome = $p1;
$this->telefone = $p2;

$this->nextel = $p3;
$this->email = $p4;
$this->id = $p5;

$this->Count;
// $this->colCount = $colCount;

}

public function Listar($p1) {
$dados = $p1->query("SELECT * FROM contato ORDER BY id DESC");
       $this->Count = $dados->columnCount();
       // $this->Count = $dados->rowCount();
       // print $colCount;
       $retorno = array();
       foreach($dados as $w) {
           $retorno[] = new Agenda($w['nome'],$w['telefone'],$w['nextel'],$w['email'], $w['id']);
       }
       return $retorno;
   }
}

 

Qual a forma correta de fazer isso? columnCount ou rowCount?

 

Testei os dois sem nenhum resultado.

 

Vlw amigos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Eliseu, boa tarde

 

Já tentei dessa forma, mais não sei dá errado...

 

// Agenda.class.php

public function __construct() {
$this->Count;
}
public function Listar($p1) {
$dados = $p1->query("SELECT * FROM contato ORDER BY id DESC");
$dados->execute();
$this->Count = $dados->rowCount();
}
//BuscarListarContato.php
$ObjConexao->Conectar();
$ObjAgenda = new Agenda();
$cont = $ObjAgenda->Listar($ObjConexao->db);
print "{$ObjAgenda->Count}";

 

Tem algo de errado ai?

 

--------------- Ponto de Mesclagem ---------------

 

Amigos, coloquei o COD separado do aplicativo, só pra testar.. Não deu certo, vejam

 

http://phpbin.net/x/1039236687

 

Alguem ai que já passou por esse problema e resolveu ou sabe como fazer?

 

 

 

<?php
try{
$conn = new PDO('mysql:host=localhost;port=3306;dbname=agenda', 'root', '');
$select = $conn ->query("SELECT * FROM contato ORDER BY id DESC");
$select->execute();
$rowCount = $select->rowCount();
print "{$rowCount} <br />";
if($select) {
foreach($select as $row) {
print "{$row['id']} | {$row['nome']} | {$row['telefone']} | {$rowO['nextel']} | {$row['email']} <br/>";
}

}
$con_PDO = null;
}

catch (PDOException $error) {
print "Erro!: " . $error->getMessage() . "<br/>";
die();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

No seu primeiro CODE, $cont está associado ao retorno do método Listar da classe Agenda

 

Mas o que esse método retorna? Faltou postá-lo.

 

Ainda nesse mesmo CODE você exibe em tela a propriedade pública Count do objeto instanciado Agenda. Posso supor que por definição, seu valor inical seja 0 (zero).

 

Em algum momento você altera esse valor? Se sim ou se não, você tem certeza de que sua query retorna algo?

 

Pergunto pois um print sobre uma variável/propriedade de valor zero, não aparecerá. Já com var_dump() é outra história.

 

No segundo CODE, a variável $select começa certo, sendo atribuída ao retorno de PDO::query(), isto é, um objeto PDOStatement.

 

Porém, logo em seguida você usa o PDOStatement::execute() desnecessariamente, já que ele deve ser usado se anteriormente vopcê tiver usado PDO::prepare().

 

Depois de consultar com query(), você deveria verificar se a consulta foi executada, comparando com FALSE (operador !==) e só então, dentro desse IF usar PDOStatement::rowCount().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Bruno, testei das varias maneiras possiveis, e nada... tava olhando o manual no php.net http://php.net/manual/en/pdostatement.rowcount.php e vi que o rowCount só funciona bem com UPDATE, DELETE e INSERT

 

Abaixo as mudanças que fiz...

 

try{
$conn = new PDO('mysql:host=localhost;port=3306;dbname=agenda', 'root', '');
$select = $conn->query("SELECT * FROM contato ORDER BY id DESC");
$rowCount = $select->rowCount();
var_dump($rowCount);

print "<br />";

if($select == true) {
foreach($select as $row) {
	print "{$row['id']} | {$row['nome']} | {$row['telefone']} | {$row['nextel']} | {$row['email']} <br/>";
}

}
if ($rowCount === "0") {
print "Nenhum resultado encontrado na sua consulta!";
}

$conn = null;
}

catch (PDOException $error) {
print "Erro!: " . $error->getMessage() . "<br/>";
die();
}

 

Conto com a colaboração dos amigos...

 

Ou é melhor partir para o mySQLi?

 

Vllw

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
$pdo = new PDO( ... );
$stm = $pdo->query( ... );

$rows = $stm->fetchAll();
$total = count( $rows );

if ( $total > 0 ){
// temos resultados
} else {
// nenhum resultado
}

 

Ou então:

 

<?php
$pdo = new PDO( ... );
$stm = $pdo->query( 'SELECT COUNT(*) AS `total` FROM `tabela`;' );

$total = (int) $stm->fetchColumn( 0 );

if ( $total > 0 ){
// temos resultados
} else {
// nenhum resultado
}

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Bruno, testei das varias maneiras possiveis, e nada... tava olhando o manual no php.net http://php.net/manual/en/pdostatement.rowcount.php e vi que o rowCount só funciona bem com UPDATE, DELETE e INSERT

Veja o que diz no manual:

 

If the last SQL statement executed by the associated PDOStatement was a SELECT statement, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases and should not be relied on for portable applications.

Traduzindo (de forma livre)...

 

Se a última declaração SQL executada pelo PDOStatement associado for do tipo SELECT, alguns bancos de dados podem retornar o número de registros retornados pela declaração. Entretanto, este comportamento não é garantido para todos s bancos de dados and não deve ser usado em aplicações portáteis.

Funcionar vai, mas você precisa ter um certo cuidado com aqueles bancos de dados muito específicos e/ou pouco usados.

 

Quanto ao seu código você poderia fazer:

 

$select = $conn->query("SELECT * FROM contato ORDER BY id DESC");

if( $select !== FALSE ) {

   if( (int) $select -> rowCount() > 0 ) {

       // Temos resultados

   } else {

       // Não temos resultados
   }

} else {

   // Falha na consulta
}

Primeiro você condiciona o retorno de PDO::query() Se não for FALSE, significa que ocorreu tudo bem (nããããão juuuuuura!!!)

 

Se correu tudo bm significa apenas que sua query foi recebida e executada sem erros, mas não garante que algo foi retornado. Por isso um novo condicional aninhado para verificar o número de resultados.

 

Nele forçamos o cast para int para que, se algum driver retornar, por exemplo, FALSE, NULL e etc, tenhamos um zero, fazendo com que caia no else e o seu foreach (que iria edentro do segundo IF), não trabalhecom algo que não sabe o que é.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ufa... Depois de tanto tentar, consegui.

 

 

public function Listar($p1) { 
$dados = $p1->query("SELECT * FROM contato ORDER BY id DESC"); 
$count_fetchall = $dados->fetchAll(PDO::FETCH_ASSOC); 
$this->Count = count($count_fetchall); 
// print $this->Count; 
$retorno = array(); 
foreach($count_fetchall as $w) { 
$retorno[] = new Agenda($w['nome'],$w['telefone'],$w['nextel'],$w['email'], $w['id']); 
} 
return $retorno; 
} 

 

Vlw e muito obrigado a todos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com o mesmo problema, consigo trazer e identificar os nomes mais quero a quantidade de cada um e não sei como mostrar essa quantidade.

segue...

<?php

$select = "SELECT i.nome, COUNT(DISTINCT (l.numerolicenca)) AS quantidade

FROM licencas l
INNER JOIN pericias p ON l.codigopericia = p.codigopericia
INNER JOIN servidores s ON p.codigoservidor = s.codigoservidor
INNER JOIN servidoreslotacoes v ON s.codigoservidor = v.codigoservidor
INNER JOIN peritos e ON l.codigoperitoresponsavel = e.codigoperito
INNER JOIN logins i ON e.codigologin = i.codigologin
WHERE l.datacomparecimento BETWEEN '$data1' and '$data2' and l.codigosituacaolicenca NOT IN ('2') and i.codigoperfil in ('4', '6', '7') and i.contaativa = 's' GROUP BY i.nome ORDER by i.nome ";
$contagem =$inicio + 1;
try{
$result = $conexao->prepare($select);
$result->execute();
$contar = $result->rowCount();
if($contar>0){
while($mostra = $result->FETCH(PDO::FETCH_OBJ)) {

?>

<tr>
<td><?php echo $contagem++;?></td>
<td><?php echo $mostra->nome;?></td>
<td><?php echo ***************;?></td> <!--Como chamar o valor correspondente de cada-->
<td><?php if(isset($data1, $data2)){echo $data1,' à ', $data2;}else{ echo 'Sem Período';}?></td>
</tr>
<?php
}
}
}catch(PDOException $e){
echo $e;
}
?>

Exemplo do resultado:

"Ana Cristina " 123
"Ana Maria " 35
"Ana Rocha " 12
" Andrezza " 45
" Antonio " 153
"Antôn Sous " 49
"Atila Campos" 98
"Carlos José " 14
"Cla Monteiro " 33
"Cynthia Alves" 289
" Izabela " 45
"Joao Souza " 24

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.