Ir para conteúdo

Arquivado

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

marcelobbt

Erro ao tentar listar dados de um BD

Recommended Posts

Eu criei uma função para listar os dados de uma tabela do BD, mas ao executar aparece o seguinte erro:

 

Fatal error: Call to a member function fetch_all() on a non-object in ... on line (*)

 

*A linha que ele indica o erro é esta: $lista = $resultado->fetch_all(MYSQLI_ASSOC);

 

Abaixo o código:

public function listar($tabela, $condicoes = array()) {
			// cria uma conexão usando a configuração "padrao" da classe Config
			$db = DB::criar('padrao');
			//Monta o select
			$sql = "select * from $tabela";
			// monta o Where de acordo com a lista de condições.
			// Funciona apenas com o operador = (depois aprimorar para outros operadores).
			
			$where = array();
			
			$i = 0;
			foreach($condicoes as $campo => $valor) {
				$where[$i] = "{$campo} = '{$valor}'";
				$i ++;
			}
			
			if ($where != array()) {
				$where = " where " . implode(' and ', $where);
			} else {
				$where = '';
			}
			
			//Junta o where no Select
			$sql .= $where;
			
			//Executa o SQL e retorna a lista de usuarios
        	$resultado = $db->query($sql);
        	$lista = $resultado->fetch_all(MYSQLI_ASSOC);
        	$resultado->free();
        	
        	return $lista;
        }

Compartilhar este post


Link para o post
Compartilhar em outros sites

A variável $sql desta query vai passar o texto select from... para poder fazer a busca no banco.

 

É isto que está querendo saber?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcelo.

 

Você não deveria estar utilizando:

$lista = $db->fetch_all(MYSQLI_ASSOC);

//ou

$lista = $db->fetch_all($resultado, 'assoc');

//ao invés de

$lista = $resultado->fetch_all(MYSQLI_ASSOC);

?

 

O erro indica que você está chamando uma função em um objeto que não foi instanciado... Ou seja "$resultado" não possui a função fetch_all(), quem possui é $db, que é uma instancia de sua classe de banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diogo, tentei desta forma:

//Executa o SQL e retorna a lista de usuarios
$db->query($sql);
$lista = $db->fetch_all(MYSQLI_ASSOC);

mas continua dando o erro:

 

Fatal error: Call to a member function query() on a non-object in...

 

indicando para a linha: "$db->query($sql);"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcelo. Não sei como está a sua classe de acesso ao banco de dados, talvez essa função "query()" não exista lá...

Será que não é "sqlQuery()" ao invez de "query()" ?

 

De uma olhada se o nome desta função está correto.

Me parece ainda que você está chamando uma função que não existe na classe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Abaixo a classe DB

class DB {
 
    /**
     * lista de conexões com o banco de dados abertas para cada tipo de configuração em Config.class.php
     */
    private static $banco = array();
 
    /**
     * Método usado para instanciar um objeto de conexão com o banco de dados.
     */
    public static function criar($tipo) {
        // Verifica se a configuração de banco de dados existe na classe config.
        // Se não existir, emite uma mensagem de erro.
        if (!array_key_exists($tipo, Config::$banco)) {
            die('Configuração de banco de dados não encontrada!');
        }
 
        // Verifica se o tipo de banco de dados já foi instanciado.
        // Se já tiver sido criado retorna a conexão com o banco existentene
        if (array_key_exists($tipo, self::$banco)) {
            return self::$banco[$tipo];
        }
 
        // Se o banco de dados ainda não tiver sido criado cria uma nova conexão com o banco de dados.
        if (Config::$banco[$tipo]['driver'] == 'mysqli') {
            self::$banco[$tipo] = new mysqli(
                Config::$banco[$tipo]['servidor'],
                Config::$banco[$tipo]['usuario'],
                Config::$banco[$tipo]['senha'],
                Config::$banco[$tipo]['banco']
            );
 
            if (Config::$banco[$tipo]['charset'] != '') {
                self::$banco[$tipo]->set_charset(
                    Config::$banco[$tipo]['charset']);
            }
 
            return self::$banco[$tipo];
        }
 
    }
}

Antes que perguntem, a classe config segue abaixo:

class Config {
 
    /**
     * Um array de configurações possibilita a criação de modelos para múltiplos bancos de dados.
     */
    public static $banco = array(
        'padrao' => array(
            'servidor' => '127.0.0.1',
            'usuario' => 'root',
            'driver' => 'mysqli',
            'senha' => '******',
            'porta' => '',
            'banco' => 'votacaoeletronica',
            'charset' => 'utf-8'
        ) ,
 
        'outro_banco' => array(
            'servidor' => '***',
            'usuario' => '***',
            'driver' => '***',
            'senha' => '***',
            'porta' => '***',
            'banco' => '***',
            'charset' => 'utf-8'
        )
        
    );
 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcelo, acho que minha ajuda não pode ir muito longe. Da pouca experiência que tenho com conexão a BD, a maior parte é utilizando PDO, não Mysqli. Tentando deduzir, sem fazer testes, me parece que seu código (inicial, aquele que propus uma alteração) está certo, contudo gostaria de saber se já tentou instanciar a classe DB utilizando NEW?

 

$db = DB::criar('padrao');

 

$db = new criar('padrao');

 

ou

 

$db = new DB::criar('padrao');

Percebi também que você já teve este problema antes (à um mês) e disse que ele foi corrigido.
topico antigo
No outro tópico, não foi corrigido de fato?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É que aqui no meu micro não aparece erro algum, mas quando coloco no servidor da este erro que apontei acima.

 

Na verdade preferia até fazer como PDO mas como não conheço muito do assunto acho que acabei me enrolando. Vou tentar colocar o new para ver se muda algo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente, 127.0.0.1 para localhost

 

em driver tente mysql . se a conexão e PDO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diogo, ao modificar como você falou, colocando o new, como ficaria a declaração da query?

 

a minha está assim:

 

$resultado = $db->query($sql);

 

mas aí da erro. Como deveria ser a forma correta em PDO?

 

 

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

 

paulinhosupriano,

 

já está como 127.0.0.1. Mas este funciona. Não funciona quando jogo no servidor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí o erro indicado fica:

 

"Fatal error: Call to a member function query() on a non-object in ..."

 

apontando para a linha:

 

"$resultado = $db->query($sql);"

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.