htecmac 0 Denunciar post Postado Outubro 22, 2007 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
Arzanardi 0 Denunciar post Postado Março 6, 2008 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
ademirs 0 Denunciar post Postado Setembro 8, 2011 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
William Bruno 1501 Denunciar post Postado Setembro 8, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Setembro 8, 2011 Posta tua classe. Compartilhar este post Link para o post Compartilhar em outros sites
ademirs 0 Denunciar post Postado Setembro 8, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Setembro 8, 2011 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
ademirs 0 Denunciar post Postado Setembro 8, 2011 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
William Bruno 1501 Denunciar post Postado Setembro 8, 2011 faça o debug que sugeri no post #4 http://forum.imasters.com.br/topic/254263-problema-select-usando-pdo/page__view__findpost__p__1752664 Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Setembro 8, 2011 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
ademirs 0 Denunciar post Postado Setembro 9, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Setembro 9, 2011 Aí está o seu problema, erro de sintaxe, faz teu read assim print_r($db->read('posts','id=1')); Compartilhar este post Link para o post Compartilhar em outros sites
ademirs 0 Denunciar post Postado Setembro 9, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Setembro 9, 2011 Cara, esquece o php.ini, ele não tem nada haver, você fez a troca que te falei ? Compartilhar este post Link para o post Compartilhar em outros sites
ademirs 0 Denunciar post Postado Setembro 9, 2011 Fiz a troca aqui sim...mas não deu em nada sabe Compartilhar este post Link para o post Compartilhar em outros sites
Leonardo Leal 4 Denunciar post Postado Setembro 9, 2011 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
ademirs 0 Denunciar post Postado Setembro 9, 2011 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
William Bruno 1501 Denunciar post Postado Setembro 9, 2011 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