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

FP-73 - Fatal error: Call to a member function getId() on string

Boa noite a todos. Não consigo encontrar o erro que está aparecendo no meu banco-produto. Alguém poderia me ajudar a encontrar? Agradeco de antemão.

Fatal error: Call to a member function getId() on string in C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\beladuquesa\sys\banco-produto.php on line 85

esta é a função alteraProduto:

function alteraProduto($conexao, $produto) {


echo ("* inicio funcao alteraProduto * "); //Aviso de teste

81)$query = "update produtos set nome = '{$produto->getNome()}',
82)codigo = {$produto->getCodigo()},
83)preco = {$produto->getPreco()},
84)descricao = '{$produto->getDescricao()}',
85)categoria_id = {$produto->getCategoria()->getId()},
86)cor_id = {$produto->getCor()->getId()},
87)tamanho_id = {$produto->getTamanho()->getId()} where id = 88)'{$produto->getId()}'";**

return mysqli_query($this->conexao, $query);

echo ($query); //Aviso de teste
}

Este é o teste que fiz do que está vindo do altera-produto:

* inicio alteração * * Envia para Banco Produto * array(8) { ["id"]=> string(1) "1" ["codigo"]=> string(2) "12" ["nome"]=> string(13) "Vestido Paula" ["preco"]=> string(6) "100.00" ["descricao"]=> string(20) "Vestido em Tricoline" ["cor_id"]=> string(2) "20" ["tamanho_id"]=> string(1) "5" ["categoria_id"]=> string(1) "2" } * inicio funcao alteraProduto *

Este é o arquivo altera-produto:

<?php
require_once 'conecta.php';
require_once 'banco-produto.php';
require_once 'banco-cor.php';
require_once 'banco-tamanho.php';
require_once 'banco-categoria.php';
require_once 'produto.php';
require_once 'cor.php';
require_once 'tamanho.php';
require_once 'categoria.php';


$produto = new Produto();
echo ("* inicio alteração * "); //Aviso de teste
$produto->setId( $_POST['id'] );
$produto->setCodigo( $_POST["codigo"]) ;
$produto->setNome( $_POST["nome"]);
$produto->setPreco( $_POST["preco"]);
$produto->setDescricao( $_POST["descricao"]);
$produto->setCor(new Cor());
$produto->setCor( $_POST["cor_id"]);
$produto->setTamanho(new Tamanho());
$produto->setTamanho( $_POST["tamanho_id"]);
$produto->setCategoria(new Categoria());
$produto->setCategoria( $_POST["categoria_id"]);
echo ("* Envia para Banco Produto * "); //Aviso de teste
var_dump($_POST);
6 respostas

Oi Sergio, tudo bem? Cola aqui pra gente o código classe Produto pra gente ver?

Oi Wanderson, obrigado pelo retorno. Segue:

<?php
class Produto
{
private $id;
private $codigo;
private $nome;
private $preco;
private $descricao;
private $cor;
private $tamanho;
private $categoria;

function __construct()
{

}

public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}

public function getCodigo()
{
return $this->codigo;
}
public function setCodigo($codigo)
{
$this->codigo = $codigo;
}


public function getNome()
{
return $this->nome;
}
public function setNome($nome)
{
$this->nome = $nome;
}

public function getPreco()
{
return $this->preco;
}
public function setPreco($preco){
  if(!is_numeric($preco)){
    $preco_convertido = str_replace("R$ ", "", $preco);
    $preco_convertido = str_replace(".", "", $preco_convertido);
    $preco_convertido = (float) str_replace(",", ".", $preco_convertido);
    $this->preco = $preco_convertido;
  }else {
    $this->preco = $preco;
  }
}

public function getDescricao()
{
return $this->descricao;
}
public function setDescricao($descricao)
{
$this->descricao = $descricao;
}


public function getCor()
{
return $this->cor;
}
public function setCor($cor)
{
$this->cor = $cor;
}


public function getTamanho()
{
return $this->tamanho;
}
public function setTamanho($tamanho)
{
$this->tamanho = $tamanho;
}

public function getCategoria()
{
return $this->categoria;
}
public function setCategoria($categoria)
{
$this->categoria = $categoria;
}

}

O que tá acontecendo é que o getCategoria não está retornando um objeto da classe Categoria, Sergio, verifica isso, como a categoria é criada dentro do objeto Produto. Na hora do setCategoria, você está passando apenas o nome ou está passando um objeto da classe Categoria?

Na mosca Wanderson, aí está o erro besta que eu cometi... Muito calor.... meus neurônios não estão prestando atenção...rsrsr

Muito obrigado pela sua dica e observação. Segue solução:

$produto->setCategoria(new Categoria());
$produto->**setCategoria**( $_POST["categoria_id"]);

correto:

$produto->setCategoria(new Categoria());
$produto->getCategoria( $_POST["categoria_id"]);
solução!

Oi Sergio, esse seu código me parece estranho. Não deveria ser assim?

$produto->setCategoria(new Categoria( $_POST["categoria_id"]));
$produto->getCategoria();

O getCategoria apenas retorna o objeto categoria, não precisa de parametros. O setCategoria, precisa do new Categoria. E o construtor da categoria pede o Id se não me engano.

Oi Wanderson, isso mesmo esse era meu erro.

Muito obrigado

abraços

Sergio

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software