Ir para conteúdo
Fórum Script Brasil
  • 0

Contar Resultados com PDO


Ronny Santana

Pergunta

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

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

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();
}
?>

Link para o comentário
Compartilhar em outros sites

  • 0

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 por Stoma
Link para o comentário
Compartilhar em outros sites

  • 0

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...

Link para o comentário
Compartilhar em outros sites

  • 0

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 por Stoma
Link para o comentário
Compartilhar em outros sites

  • 0

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...

Link para o comentário
Compartilhar em outros sites

  • 0

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;
    }

Link para o comentário
Compartilhar em outros sites

  • 0

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...

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...