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.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
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