Ronny Santana Postado Dezembro 27, 2010 Denunciar Share Postado Dezembro 27, 2010 Ola Amigos, boa tarde, como faço pra contar resultados com o PDO?Fiz um teste com o rowCount mais não deu certo.Vejam:<?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(); }Vlw Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jefferson Oliveira Postado Dezembro 27, 2010 Denunciar Share Postado Dezembro 27, 2010 (editado) Qual o erro?Da um:print_r($select);pra ver se esta retornando o array Editado Dezembro 27, 2010 por Jefferson Oliveira Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Ronny Santana Postado Dezembro 27, 2010 Autor Denunciar Share Postado Dezembro 27, 2010 Ola Jefferson, não estou com o COD aqui, a parte do select retorna numa boa, só o rowCount que retorna 0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jefferson Oliveira Postado Dezembro 27, 2010 Denunciar Share Postado Dezembro 27, 2010 Já que ele retorna o array bacana, e so por então count($select);Poderia ser? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Ronny Santana Postado Dezembro 27, 2010 Autor Denunciar Share Postado Dezembro 27, 2010 Eu peguei o COD e coloquei online, não funciona nada, nem dá erro.Já local dá alguma resposta.Entrei em contato com o servidor para ver se o PDO mySQL estava habilitado e esta.Estranho.Há algo de errado no COD?<?php try{ $conn = new PDO("mysql:host=localhost;port=3306;dbname=XXX_XXX", "XXX_XXX", "XXX"); $select = $conn->query("SELECT * FROM Down_Loads"); $select->execute(); $rowCount = $select->rowCount(); print "{$rowCount} <br />"; print_r($conn); if($select) { foreach($select as $row) { print "{$row['Down_Loads_id']} | {$row['Down_Loads_nome']} | {$row['Down_Loads_ulink']} | {$rowO['Down_Loads_active']} | {$row['Down_Loads_count']} <br/>"; } } $con_PDO = null; } catch (PDOException $error) { print "Erro!: " . $error->getMessage() . "<br/>"; die(); } ?> Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Dezembro 28, 2010 Denunciar Share Postado Dezembro 28, 2010 (editado) A função rowCount, diferentemente da função columCount, quando utilizado numa query do tipo Select já não funciona mais no MySQL5.1+, pois ela retorna apenas a quantidade de linhas afetadas pela query, logo o Select não afeta nenhuma. Há outras formas de saber a quantidade de registros retornados, como executando uma outra query com o comando sql COUNT ou utilizando a função count do PHP:$totalRegistros = count($select->fetchAll()); Mas se caso você apenas precise saber se há registros, utilize a função columnCount (pois se foi retornado colunas, é porque há registros): $totalRegistros = $select->columnCount(); Editado Dezembro 29, 2010 por Stoma Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Ronny Santana Postado Dezembro 29, 2010 Autor Denunciar Share Postado Dezembro 29, 2010 Ola Stoma, testei aqui das duas maneiras.// Dessa maneira, retorna tudo certo (19), porem, não retorna os registros. $rowCount = count($select->fetchAll()); // Já dessa maneira, retorna os registros, e retorna o count (10). $rowCount = count($select->fetch()); // Já dessa maneira, retorna os registros, e retorna (5). $rowCount = $select->columnCount(); Abaixo o COD completo. 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(); $rowCount = $select->columnCount(); print_r($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(); }Nossa... como esse PDO é complicado para Contar resultados...Vlw amigos... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Dezembro 29, 2010 Denunciar Share Postado Dezembro 29, 2010 (editado) Bom... está funcionando??A diferença entre as funções fetchAll() e fetch() é que a fetch() retorna apenas um registro por vez, ou seja, um array associativo e um outro array com índices numéricos (por padrão, a não ser que você passe os parâmetros), exemplo:$dados = $select->fetch(); // fetch() Retornará um array desta maneira: $dados['nome'] //nome $dados['0'] //nome $dados['idade'] //idade $dados['1'] //idade $dados['sexo'] //sexo $dados['2'] //sexo // a função count do PHP retornaria 6, pois por padrão serão criados dois arrays, a não ser que seja passado o parâmetro que define como vai ser retornado A função fetchAll é bem parecida com a fetch(), com a diferença de que ela retornará todos os registros de uma vez (como se você fizesse um while utilizando fetch() e a cada iteração você colocasse o array associativo dentro de um outro array), a estrutura retornada pela função fetchAll() é esta: $dados = $select->fetchAll(); // primeira registro $dados['0']['nome'] //nome $dados['0']['0'] //nome $dados['0']['idade'] //idade $dados['0']['1'] //idade $dados['0']['sexo'] //sexo $dados['0']['2'] //sexo // segundo registro e assim por diante $dados['1']['nome'] //nome $dados['1']['0'] //nome $dados['1']['idade'] //idade $dados['1']['1'] //idade $dados['1']['sexo'] //sexo $dados['1']['2'] //sexo // Aqui a função count retornaria 2, pois o array $dados possui 2 índices principais (a função só conta as posições da 'raíz' do array) Por este motivo a função fetch() retorna 10 (que é a quantidade de índices do array retornado (lembre-se que por padrão é retornado 2 arrays para cada registro), a função fetchAll() retorna 19 (que é a quantidade de registros) e columnCount() retorna 5 (que é a quantidade de colunas do registro). Tente fazer estas alterações no seu código e veja se funciona: <?php // Configura para que qualquer erro, warning ou notice do PHP seja exibido ini_set('display_errors', 1); error_reporting(E_ALL); try{ $conn = new PDO('mysql:host=localhost;port=3306;dbname=controle_produtos', 'root', ''); // configura para que qualquer erro que der ocorra a exceção, inclusive erros de comandos SQL (sem isto, não serão notificados erros na consulta) $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $select = $conn->query("SELECT * FROM contato ORDER BY id DESC"); // Coloca todos os registros dentro de $dados (o parâmetro define que será retornado apenas 1 array associativo, e não um associativo e outro com índices numéricos, para evitar processos desnecessários) $dados = $select->fetchAll(PDO::FETCH_ASSOC); if(!$select->rowCount()){ print "Nenhum resultado encontrado na sua consulta!"; }else{ echo "<b>Quantidade de registros: ".count($dados)."</b><br/>"; foreach($dados as $row){ print "{$row['id']} | {$row['nome']} | {$row['telefone']} | {$row['nextel']} | {$row['email']} <br/>"; } } $conn = null; }catch(PDOException $error){ print $error->getMessage() . "<br/>"; die(); } ?> Editado Dezembro 29, 2010 por Stoma Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Ronny Santana Postado Dezembro 29, 2010 Autor Denunciar Share Postado Dezembro 29, 2010 Ola Stoma, testei aqui separado do meu aplicativo dessa forma.<?php ini_set('display_errors', 1); error_reporting(E_ALL); try{ $conn = new PDO('mysql:host=localhost;port=3306;dbname=agenda', 'root', ''); $select = $conn->query("SELECT * FROM contato ORDER BY id DESC"); $dados = $select->fetchAll(PDO::FETCH_ASSOC); echo "<b>Quantidade de registros: ".count($dados)."</b><br/>"; foreach($dados as $row){ print "{$row['id']} | {$row['nome']} | {$row['telefone']} | {$row['nextel']} | {$row['email']} <br/>"; } $conn = null; }catch(PDOException $error){ print $error->getMessage() . "<br/>"; die(); } ?> Funcionou numa boa, mais quando tentei colocar no aplicativo, já não funcionou, ele retorna a quantidade (19) mais não retorna os dados. Abaixo. // Conexao.class.php public function Conectar() { try{ $this->db = new PDO($this->dsn, $this->usuario, $this->senha); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // print "Conectado via PDO"; } catch (PDOException $error) { print "Erro!: " . $error->getMessage() . "<br/>"; die(); } // $this->db = new mysqli($this->host, $this->usuario, $this->senha, $this->banco); } // Agenda.class.php 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; } public function Listar($p1) { $dados = $p1->query("SELECT * FROM contato ORDER BY id DESC"); $count_fetchall = $dados->fetchAll(PDO::FETCH_ASSOC); $retorno = array(); foreach($dados as $w) { $retorno[] = new Agenda($w['nome'],$w['telefone'],$w['nextel'],$w['email'], $w['id']); } return $retorno; } // index.php $ObjAgenda = new Agenda(); $cont = $ObjAgenda->Listar($ObjConexao->db); print "{$ObjAgenda->Count}";Dá uma analisada ai amigo, veja se esta algo errado, agradeço sua ajuda.Obs.: Sobre as includes, os new Class, esta tudo funcionando td beleza.Vlw amigo... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Dezembro 29, 2010 Denunciar Share Postado Dezembro 29, 2010 Hm... o que acontece é que quando a função fetch é utilizada o ponteiro é movido para o próximo registro. No caso do fetchAll, como ele obtém todos os registros de uma vez, o ponteiro é movido para o final (após o último registro). Sendo assim, se você utilizar a função fetch uma vez e depois fazer o foreach, o foreach começará do segundo registro, pois quando você chamou a função fetch ela pegou o primeiro registro e moveu o ponteiro para o segundo... a mesma coisa acontece com o fetchAll, mas esta função move o ponteiro para o fim dos registros, logo a função foreach encontrará 0 registros. Então como você está utilizando a função fetchAll, ao invés de utilizar a variável $dados no foreach, utilize a variável à qual você atribui o fetchAll...Na função listar, tente alterar desta maneira:public function Listar($p1){ $consulta = $p1->query("SELECT * FROM contato ORDER BY id DESC"); $dados = $consulta->fetchAll(PDO::FETCH_ASSOC); $retorno = array(); foreach($dados as $w) { $retorno[] = new Agenda($w['nome'],$w['telefone'],$w['nextel'],$w['email'], $w['id']); } return $retorno; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Ronny Santana Postado Dezembro 30, 2010 Autor Denunciar Share Postado Dezembro 30, 2010 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... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Dezembro 31, 2010 Denunciar Share Postado Dezembro 31, 2010 Opa! Não há de quê ^_^ Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Ronny Santana
Ola Amigos, boa tarde, como faço pra contar resultados com o PDO?
Fiz um teste com o rowCount mais não deu certo.
Vejam:
Vlw
Link para o comentário
Compartilhar em outros sites
11 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.