Ir para conteúdo

POWERED BY:

Arquivado

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

ro.fonseca

[Resolvido] Capturar Dados pelo PDO

Recommended Posts

Pessoal, to migrando aqui o sistema para o PDO, enfim, abaixo eu tento fazer algo bem simples, que é puxar os dados do BD e exibi-los no select da pagina, mas nao consigo, já pesquisei, inclusive tenho um livro e ele ensina q é dessa forma, mas eu nao to conseguindo, alguem tem alguma ideia de onde esta o erro??? Detalhe, na pagina nao exibe nenhuma msg de erro, mas os dados nao sao buscados.

 

Guardo na variavel o resource da query:

$resultado_tipo_produto = $anuncio->anuncioTipoProduto();

 

Aqui tem a funcao de "anuncioTipoProduto()" que eu chamei antes:

public function anuncioTipoProduto(){
		$this->con->query("SELECT id_tipo_produto, tipo_produto FROM tb_tipo_produto ORDER BY tipo_produto ASC") or die(print_r($this->con->errorInfo(), true));
}

 

 

E aqui era pra exibir os resultados no loop, mas simplesmente nao exibe:

<?php foreach($resultado_tipo_produto as  $dado_tipo_produto){  ?>
           <option value="<?=$dado_tipo_produto['id_tipo_produto'];?>" <?=$dado_tipo_produto['tipo_produto']==$dado['tipo_produto']?"selected='selected'":"";?>><?=$dado_tipo_produto['tipo_produto'];?></option> 
       <?php } ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você poderia dar uma var_dump na variavel $resultado_tipo_produto e colocar aqui os resultados?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pera lá, a PDO não vai fazer tudo sozinha né.

 

Com MySQL proceduralvocê não faria um while() com mysql_fetch_assoc() por exemplo? Então, com a PDO é quase a mesma coisa.

 

Só que ao invés de loop manual, um PDOStatement (que é o que PDO::query() retorna) temos o método fetchAll(), que vai te trazer esse array.

 

Aliás, como que tu não viu um erro passando um PDOStatement para o foreach? Até onde eu sei essa classe não é iterável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pera lá, a PDO não vai fazer tudo sozinha né.

 

Com MySQL proceduralvocê não faria um while() com mysql_fetch_assoc() por exemplo? Então, com a PDO é quase a mesma coisa.

 

Só que ao invés de loop manual, um PDOStatement (que é o que PDO::query() retorna) temos o método fetchAll(), que vai te trazer esse array.

 

Aliás, como que tu não viu um erro passando um PDOStatement para o foreach? Até onde eu sei essa classe não é iterável.

Cara dá pra usar sim o foreach, vi isso no livro e alguns exemplos na net, aliás, é até melhor usar o foreach pq ele é mt mais rapido q o while e o for, pra sanar as duvidas, eu tb fiz pelo while da seguinte forma:

 

<?php while($dado_tipo_produto = $resultado_tipo_produto->fetch()){ ?>
           <option value="<?=$dado_tipo_produto['id_tipo_produto'];?>" <?=$dado_tipo_produto['tipo_produto']==$dado['tipo_produto']?"selected='selected'":"";?>><?=$dado_tipo_produto['tipo_produto'];?></option> 
       <?php } ?> 

 

E nao deu em nada tb, fiz o var_dump na variavel $resultado_tipo_produto e nao saiu nada, tentei exibi-la e nao deu em nada tb, tem alguma coisa mt errada q eu sozinho nao to conseguindo detectar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não está retornando resultados, você já verificou se tem dados para serem retornados na DB?

Tenta usar o metódo prepare e execute. Ex:

       $sql = "SELECT u.guid, u.id from user AS u where u.email = ? and u.password = ?";

       try {
           $stmt = $conn->prepare($sql);
           $data = array($email, $password);
           $stmt->execute($data);
           $result = $stmt->fetchAll();
       } catch(PDOException $e){
           die($e->getMessage());
       }

 

 

Outra coisa, tente persistir a conexão e vá ao banco de dados e verifique as conexões abertas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vou te falar mais ou menos com base no que eu faço (já que faço na View).

 

Crio uma variável com fetchAll() e condiciono.

 

Se for iguala FALSE, não tenho registros a serem utilizados (e exibo uma mensagem). Se tenho, itero.

 

Se der algum erro pode vir a cair na exceção,daí trato de outro jeito que não vem ao caso do/no escopo do tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem sim dados para serem retornados do BD, até pq os dados sao fixos, é uma coisa bem simples q quero fazer, é somente puxar do BD os dados e incluir no select do html e to apanhando feio pra isso hehe, mas nao entendo o q tá havendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui, ficou assim:

 

public function anuncioTipoProduto(){
		$resultado = $this->con->query("SELECT id_tipo_produto, tipo_produto FROM tb_tipo_produto ORDER BY tipo_produto ASC");
		return $resultado->fetchAll();
}

 

Detalhe, eu nao queria colocar o fetchAll direto na funcao, queria joga-lo na variavel, tipo:

 

 

$resultado_tipo_produto->fetchAll();

 

Mas ae da pau pq diz q a variavel nao é um objeto, o q é correto, obviamente ela nao é, mas teria como eu usar esse fetch fora do metodo??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compara esse seu CODE com o primeiro.

 

No primeiro faltou o return. Se você fizer:

 

public function anuncioTipoProduto(){
   return $this->con->query("SELECT id_tipo_produto, tipo_produto FROM tb_tipo_produto ORDER BY tipo_produto ASC");
}

A variável que você associar esse método terá um objeto PDOStatement, te permitindo usar fetchAll() manualmente.

 

Porém, isso não é interessante do ponto de vista de performance.

 

Imagina que você precise usar os resultados dessa query várias vezes na mesma ação. Você deveriafazer uma chamada à fetchAll() toda vez, ao passo que chamando esse método do wrapper da query, só haverá uma chamada, quando associar à uma variável.

 

Sei que não se aplica ao caso atual, mas vale a dica. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compara esse seu CODE com o primeiro.

 

No primeiro faltou o return. Se você fizer:

 

public function anuncioTipoProduto(){
   return $this->con->query("SELECT id_tipo_produto, tipo_produto FROM tb_tipo_produto ORDER BY tipo_produto ASC");
}

A variável que você associar esse método terá um objeto PDOStatement, te permitindo usar fetchAll() manualmente.

 

Porém, isso não é interessante do ponto de vista de performance.

 

Imagina que você precise usar os resultados dessa query várias vezes na mesma ação. Você deveriafazer uma chamada à fetchAll() toda vez, ao passo que chamando esse método do wrapper da query, só haverá uma chamada, quando associar à uma variável.

 

Sei que não se aplica ao caso atual, mas vale a dica. :thumbsup:

 

Acho q como já disse antes, meu codigo ficou assim:

 

public function anuncioTipoProduto(){
		$resultado = $this->con->query("SELECT id_tipo_produto, tipo_produto FROM tb_tipo_produto ORDER BY tipo_produto ASC");
		return $resultado->fetchAll();
}

 

Nao entendi o mt bem o q tu quis dizer na parte que está em negrito. E uma outra duvida, no caso de muitos resultados, é melhor no quesito performance chamar o fetchAll ou chamar o fetch dentro de um loop??? Já li que o fetchAll era mais rapido, mas consumia mais memoria.

 

abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao entendi o mt bem o q tu quis dizer na parte que está em negrito.

Na verdade peço desculpas. Não sei onde estava com a cabeça quando escrevi isso.

 

A real intenção, apesar de muito improvável sria, por exemplo, você tem 10 classes que utiliza esse mesmo método em 10 lugares diferentes.

 

Vai que de repente o pessoal do PHP resolve modificar o nome ~do método para qualquer outra coisa que não fetchAll().

 

Eu sei, é uma hipótese ridícula, mas vai que...

 

Daí você tem que procurar por 100 ocorrências ao invés de UMA, se fetchAll() estivesse no método da classe.

 

E uma outra duvida, no caso de muitos resultados, é melhor no quesito performance chamar o fetchAll ou chamar o fetch dentro de um loop??? Já li que o fetchAll era mais rapido, mas consumia mais memoria.

Nunca parei para analisar, mas em termos de velocidade fetchAll() é melhor poius é um recurso nativo da linguagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao entendi o mt bem o q tu quis dizer na parte que está em negrito.

Na verdade peço desculpas. Não sei onde estava com a cabeça quando escrevi isso.

 

A real intenção, apesar de muito improvável sria, por exemplo, você tem 10 classes que utiliza esse mesmo método em 10 lugares diferentes.

 

Vai que de repente o pessoal do PHP resolve modificar o nome ~do método para qualquer outra coisa que não fetchAll().

 

Eu sei, é uma hipótese ridícula, mas vai que...

 

Daí você tem que procurar por 100 ocorrências ao invés de UMA, se fetchAll() estivesse no método da classe.

 

A sim, entendi, na verdade nós como programadores devemos pensar nisso sempre, mas se isso acontecesse agora, bastaria mudar em apenas 1 lugar que seria na classe de conexao... :joia:

 

Nunca parei para analisar, mas em termos de velocidade fetchAll() é melhor poius é um recurso nativo da linguagem.

Já ouvi falar que o fetchAll é mais rapido que o fetch, embora ele consuma mais memoria... De qualquer maneira vlw pela atenção. :)

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.