Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Erro: Cannot use object of type stdClass as array

Guilherme, constantemente recebo o erro "Cannot use object of type stdClass as array" ao carregar a session para uma variável e depois tentar usá-la como um array.

Por exemplo: No exercício desse capítulo criamos a função index no controller vendas, tal como abaixo:

    public function index() {
        $this->load->helper("currency_helper");
        $usuario = $this->session->userdata("usuario_logado");
        $this->load->model("produtos_model");
        $produtosVendidos = $this->produtos_model->buscaVendidos($usuario);
        $dados = array("produtosVendidos" => $produtosVendidos);
        $this->load->view("vendas/index", $dados);
    }

Depois usamos a variável $usuario como um array carregando dentro da variável $id o que consta em $usuario["id"]. Isso é feito dentro da função buscaVendidos criada dentro do produtos_model, tal como abaixo:

    public function buscaVendidos($usuario) {
        $id = $usuario["id"];
        $query = array(
            "usuario_id" => "$id",
            "vendido" => "1"
        );
        return $this->db->get_where("produtos", $query)->result_array();
    }

Quando vamos testar no navegador recebemos o erro:

Fatal error: Cannot use object of type stdClass as array in /var/www/mercado/application/models/produtos_model.php on line 41

Onde a linha 41 é:

$id = $usuario["id"];

Por que está acontecendo isso? Eu consegui resolver o problema de outra maneira, passando somente o usuario_id para a função buscaVendidos. Mas se eu precisar mandar todos os dados que estão na sessão do usuário, fica meio feio dessa forma.

No próximo post mandarei como eu fiz para resolver.

6 respostas

Para resolver o problema descrito acima eu tive que mandar apenas o usuario_id para a função buscaVendidos. Para isso, dentro do controller fiz da seguinte forma:

    public function index() {
        $this->load->helper("currency_helper");
        $usuario_id = $this->session->userdata("usuario_logado")->id;
        $this->load->model("produtos_model");
        $produtosVendidos = $this->produtos_model->buscaVendidos($usuario_id);
        $dados = array("produtosVendidos" => $produtosVendidos);
        $this->load->view("vendas/index", $dados);
    }

E a função buscaVendidos ficou dessa maneira dentro do produtos_model:

    public function buscaVendidos($usuario_id) {
        $query = array(
            "usuario_id" => "$usuario_id",
            "vendido" => true
        );
        return $this->db->get_where("produtos", $query)->result_array();
    }

Volto a dizer, dessa maneira está ótimo, pois eu preciso apenas passar o usuario_id mesmo. Mas em uma situação que eu tivesse que mandar todos os dados da session, utilizando essa forma, eu teria que mandar todos os dados um a um.

Marcelo, não gosto quando alguém me responde: "comigo isto não acontece"!

No entanto, ao terminar a aula, o seu post me surgiu como exercício.

Eu testei o seu código e não consegui replicar o erro. Foi um copy e cola mesmo.

Por isto, imagino que o problema seja alguma configuração relativa a array.

Mas, voltando ao início, comigo isto não acontece, rs.

Apenas para complementar: Você tem certeza de que $usuário é um array?

No meu caso, eu tenho esta certeza, pois no login.php acontecem duas coisas que garantem isto.

1)$usuario = $this->usuarios_model->buscaPorEmailESenha($email, $senha); A buscaPorEmailESenha retorna os dados em forma de array. veja o código:

    public function buscaPorEmailESenha($email, $senha) {

        $this->db->where("email" , $email);
        $this->db->where("senha" , $senha);
        return $this->db->get("usuarios")->row_array();


    }

2) A variável $usuario é montada a partir da chamada de buscaPorEmailESenha.

$usuario = $this->usuarios_model->buscaPorEmailESenha($email, $senha);

Será que seu problema não está aí? ou seja, será que você realmente tem um array? (ou apenas um objeto).

Seria legal que você postasse como está instanciando $usuario.

Bom, agora espero uma resposta sua, ok?

solução!

Sou teimoso. Consegui simular seu erro. Alterei a buscaPorEmailESenha, fazendo com que ela não devolva um array:

    public function buscaPorEmailESenha($email, $senha) {

        $this->db->where("email" , $email);
        $this->db->where("senha" , $senha);
        return $this->db->get("usuarios");   

    }

Apenas retirei o -> row_ array()

Tudo funciona perfeitamente, até que se queira tratar $usuario como array. Eu imagino que seu problema esteja aí.

Perfeito Sidnei!!!

A sua função buscaPorEmailESenha realiza o mesmo papel da minha função buscaUsuario que tinha o seguinte código:

public function buscaUsuario($usuario) {
    return $this->db->get_where("usuarios", $usuario)->first_row();
}

Só pra você entender, a variável $usuario que a função buscaUsuario recebe é enviada pela função login como um array da seguinte forma:

$usuario = array(
    "email" => $this->input->post("email"),
    "senha" => md5($this->input->post("senha"))
);

É por isso que a minha função não recebe o parâmetro senha, como a sua. Na verdade o usuário e a senha vão dentro do array $usuario.

O problema está exatamente, conforme apontado por você, na forma em que eu estou retornando o usuário pela função buscaUsuario. Isso acontece quando utilizou o fisrt_row(). Então eu fui na documentação e li com mais calma (o que eu não costumo fazer, porque sou apressado kkkk) e entendi o problema. Veja:

If you want a specific row returned you can submit the row number as a digit in the first parameter:
$row = $query->row_array(5);

In addition, you can walk forward/backwards/first/last through your results using these variations:

$row = $query->first_row()
$row = $query->last_row()
$row = $query->next_row()
$row = $query->previous_row()

By default they return an object unless you put the word "array" in the parameter:

$row = $query->first_row('array')
$row = $query->last_row('array')
$row = $query->next_row('array')
$row = $query->previous_row('array')

O meu erro foi simples. Conforme diz o manual "By default they return an object unless you put the word "array" in the parameter".

Dessa maneira, apenas acrescentei a palavra array dentro do first_row e tudo funcionou perfeitamente. Abaixo a correção.

public function buscaUsuario($usuario) {
    return $this->db->get_where("usuarios", $usuario)->first_row('array');
}

Muito obrigado, por sua boa vontade e iniciativa.

Falou, Marcelo.

Logo terá a chance de retribuir... Estou com um problema que em breve vou postar, kkkk