Ir para conteúdo

POWERED BY:

Arquivado

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

htecmac

[Resolvido] problema select usando PDO ...

Recommended Posts

Olá galera...To tentando fazer uma consulta no mysql usando PDO. É a primeira vez que uso isso e não estou conseguindo resolver o problema. Essa é a consulta: public function getIdProduto($nomeProd){$sql = "SELECT id_produto FROM produtos WHERE produto = $nomeProd";return $this->getConn()->query($sql)->fetchAll(PDO::FETCH_ASSOC);}E o erro nque ele me retorna é o seguinte: Fatal error: Call to a member function fetchAll() on a non-object in C:\wamp\www\...\class\Modelo\ManutencaoModelo.php on line 64O que estou fazendo de errado????Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Estou enfrentando o mesmo problema que você!

 

Voce encontrou alguma solução?

 

Obrigado

 

Olá!

 

Estou enfrentando o mesmo problema que você!

 

Voce encontrou alguma solução?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite pessoal!

 

Vi este post e estou enfrentando o mesmo tipo de problema.

Alguém poderia dar um help?

 

ERRO: Fatal error: Call to a member function fetchAll() on a non-object in C:\servidor_local\htdocs\MVC\system\model.php on line 24

 

Abaixo o trecho de código onde ocorre o problema.

 

$qs = $this->db->query(" SELECT * FROM `{$tabela}` {$where} ");
$rows = $qs->fetchAll();
$count = count($rows);
    foreach($rows as $row) {
        return $row;
    }
$qs = null;

Compartilhar este post


Link para o post
Compartilhar em outros sites

debugue o teu código:

 

 

$sql = " SELECT * FROM `{$tabela}` {$where} ";
$qs = $this->db->query( $sql );

echo '<pre>', $sql, '<br />';
var_dump( $qs ); 
exit();

entenda o retorno e corrija.

 

só vai dar esse erro, se a query falhar. Veja o motivo de ter falhado. E prepare o teu sistema, para só prosseguir com o fetch se estiver tudo certo com o objeto q o método espera receber.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelo retorno amigos.

Estava pensando se não poderia ser algo na configuração do PHP.ini, mas lembro ter ativado o extension=php_pdo.dll e o extension=php_pdo_mysql.dll

 

Segue o método Read...

 

   public function read($tabela, $where = null){
$where = ($where != null ? " WHERE {$where}" : "");
$qs = $this->db->query(" SELECT * FROM `{$tabela}` {$where} ");
//$qs->setFetchMode(PDO::FETCH_BOTH);
$rows = $qs->fetchAll();
$count = count($rows);
    foreach ($rows as $row) {
        return $row;
    }
$qs = null;

   }

 

Classe de testes (Eu queria usar o print_r, mas dai nada feito... Obs: Sou novo em MVC / PDO e estou estudando!

 

   class Produtos extends Controller { // classe do controler
       public function index(){

           $db = new Produtos_Model(); // estou instanciando a classe (estou trabalhando com autoload)...
           print_r($db->read('posts','id=1'));
       }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, eis o seu erro:

print_r($db->read('posts','id=1'));

troque por

print_r($db->read('posts','where id=1'));

 

Outra coisa ..

$count = count($rows);

O PDO tem um método chamado rowCount(), retorna o número de linhas de um resultset, então você pode substituir isso aí por:

$count = $qs->rowCount();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey, muito obrigado.

 

Mas o mesmo erro persiste. Veja mais detalhes do fonte...

 


<?php
   class Model {

       protected $db;
       public function __construct(){
           $this->db = new PDO('mysql:host=localhost;dbname=dbn_empresa', 'root', '********');
       }


       public function insert( $tabela, Array $dados){

           // [...]
       }
       public function read($tabela, $where = null){
		$where = ($where != null ? " WHERE {$where}" : "");
		$qs = $this->db->query(" SELECT * FROM `{$tabela}` {$where} ");
		//$qs->setFetchMode(PDO::FETCH_BOTH);
		$rows = $qs->fetchAll();
		$count = count($rows);
		//$count = $qs->rowCount();
			foreach ($rows as $row) {
				return $row;
			}
	    $qs = null;

	}
       public function update(){
	// [...]	
	}
       public function delete(){
	// [...]	
	}
   }
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, então faça isso:

$this->db = new PDO('mysql:host=localhost;dbname=dbn_empresa', 'root', '********');
$this->db->setAttribute( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION );

 

Execute o script novamente, poste o retornado, ou o debug que o William Bruno sugeriu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos,

Segue o resultado...

 

--------------------------------

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where id=1' at line 1' in C:\servidor_local\htdocs\MVC\system\model.php:23 Stack trace: #0 C:\servidor_local\htdocs\MVC\system\model.php(23): PDO->query(' SELECT * FROM ...') #1 C:\servidor_local\htdocs\MVC\app\controllers\produtosController.php(14): Model->read('posts', 'where id=1') #2 C:\servidor_local\htdocs\MVC\index.php(26): Produtos->index() #3 {main} thrown in C:\servidor_local\htdocs\MVC\system\model.php on line 23

--------------------------------

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mistério amigo...eu devo ter cometido algum erro muito sério ou tem problema no php.ini sei lá...

 

Fatal error: Call to a member function fetchAll() on a non-object in C:\servidor_local\htdocs\MVC\system\model.php on line 24

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz a troca aqui sim...mas não deu em nada sabe

Compartilhar este post


Link para o post
Compartilhar em outros sites

ademirs,

 

Peguei o seu script e colei em um arquivo aqui para testar, e funcionou perfeitamente.

 

Só gerou o erro: Call to a member function fetchAll() on a non-object in ...

quando eu passei o nome de uma tabela que não existia ou um campo q não existe.

não sei se vai te adiantar esta dica, mas vai mesmo assim. :D

 

Quanto ao php.ini ele geraria um erro de driver desabilitado caso não estivesse ativo esta extensão.

 

Dei uma mudadinha :P...

Soh tratei em caso de erros

<?php
   class Model {

       protected $db;
       public function __construct(){
           $this->db = new PDO('mysql:host=localhost;dbname=project', 'root', '');
       }


       public function insert( $tabela, Array $dados){

           // [...]
       }
       public function read($tabela, $where = null){
                       $where = ($where != null ? " WHERE {$where}" : "");
                       if($qs = $this->db->query(" SELECT * FROM `{$tabela}` {$where} ") )
                       {
                       	if ($qs->rowCount() > 0)
                        {
   	                    	$rows = $qs->fetchAll();
       	                    foreach ($rows as $row) {
           	                	return $row;
               	           	}
                        }
                       }
                   	$qs = null;
                   	return 'erro';

               }
   }

   $m = new Model();
    print_r( $m->read( 'clients', 'did = 1' ));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos, obrigado pela colaboração.

Acredito que além de colaborar com meu problema, outras pessoas poderão quem sabe resolver algum problema similar.

 

De fato Leonardo, o problema realmente estava com uma tabela no banco.

Gostei muito do ajuste feito por você e agradeço a todos pela tão especial atenção.

 

Ficou desta forma o script (funcionando):

 

public function read($tabela, $where = null){
			  $where = ($where != null ? " WHERE {$where}" : "");
			  if($qs = $this->db->query(" SELECT * FROM `{$tabela}` {$where} ") )
			  {
					  if ($qs->rowCount() > 0)
					  {
					  $rows = $qs->fetchAll();
						  foreach ($rows as $row) {
							  return $row;
							  }
					  }
			  }
			  $qs = null;
			  return 'Instabilidade no banco ou tabela ausente!';        
       }

Compartilhar este post


Link para o post
Compartilhar em outros sites

atente a esse return

				foreach ($rows as $row) {
				return $row;
			}

 

dessa forma, você vai sair do método na primeira volta do laço, pois o return vai jogar a execução para fora.

 

retorne logo $rows

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.