Após a implementação eu recebo este erro: Fatal error: Uncaught Error: Call to a member function getId() on string in /var/www/html/php/banco-produto.php:27 Stack trace: #0 /var/www/html/php/adiciona-produto.php(24): insereProduto(Object(mysqli), Object(Produto)) #1 {main} thrown in /var/www/html/php/banco-produto.php on line 27
<?php
class Categoria{
private $id;
private $nome;
function setId($valor){
$this -> id = $valor;
}
function setNome($valor){
$this -> nome = $valor;
}
function getId(){
return $this -> id;
}
function getNome(){
return $this -> nome;
}
}
?>
O Arquivo citado esta da seguinte forma
<?php
require_once("conecta.php");
require_once("class/Produto.php");
require_once("class/Categoria.php");
function listaProdutos($conexao) {
$produtos = array();
$resultado = mysqli_query($conexao, "select p.*,c.nome as categoria_nome from produtos as p join categorias as c on c.id=p.categoria_id");
while($produto_array = mysqli_fetch_assoc($resultado)) {
$produto = new Produto();
$categoria = new Categoria();
$categoria -> setNome($produto_array['categoria_nome']);
$categoria -> setId($produto_array['categoria_id']);
$produto -> setNome($produto_array['nome']);
$produto -> setId($produto_array['id']);
$produto -> setPreco($produto_array['preco']);
$produto -> setDescricao($produto_array['descricao']);
$produto -> setCategoria($categoria);
array_push($produtos, $produto);
}
return $produtos;
}
function insereProduto($conexao, Produto $produto) {
$query = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$produto ->getNome()}', {$produto ->getPreco()}, '{$produto -> getDescricao()}', {$produto -> getCategoria() -> getId()}, {$produto -> getUsado()})";
return mysqli_query($conexao, $query);
}
function alteraProduto($conexao,Produto $produto) {
$query = "update produtos set nome = '{$produto -> getNome()}', preco = {$produto -> getPreco()}, descricao = '{$produto -> getDescricao()}', categoria_id= {$produto -> getCategoria() -> getId()}, usado = {$produto -> getUsado()} where id = '{$produto -> getId()}'";
return mysqli_query($conexao, $query);
}
function buscaProduto($conexao, $id) {
$query = "select * from produtos where id = {$id}";
$resultado = mysqli_query($conexao, $query);
$produto_buscado = mysqli_fetch_assoc($resultado);
$produto = new Produto();
$categoria = new Categoria();
$categoria-> setId($produto_buscado['categoria_id']);
$produto-> setId($produto_buscado['id']);
$produto-> setNome($produto_buscado['nome']);
$produto-> setDescricao($produto_buscado['descricao']);
$produto->setCategoria($categoria);
$produto->setPreco($produto_buscado['preco']);
$produto->setUsado($produto_buscado['usado']);
return $produto;
}
function removeProduto($conexao, $id) {
$query = "delete from produtos where id = {$id}";
return mysqli_query($conexao, $query);
}
Já o adiciona-produto-formulario.php Esta desta forma:
<?php
require_once("class/Produto.php");
require_once("class/Categoria.php");
require_once("logica-usuario.php");
verificaUsuario();
require_once("banco-produto.php");
$produto = new Produto();
$categoria = new Categoria();
$categoria -> setId($_POST['categoria_id']);
$produto -> setNome($_POST['nome']);
$produto -> setPreco($_POST['preco']);
$produto -> setDescricao($_POST['descricao']);
$produto -> setCategoria($categoria);
if(array_key_exists('usado', $_POST)) {
$produto -> setUsado("true");
} else {
$produto -> setUsado("false");
}
if(insereProduto($conexao, $produto)) {
session_start();
$_SESSION['produto'] = "Produto " . $produto -> getNome() . " Foi adicionado com sucesso !!";
header("Location: produto-formulario.php");
var_dump($_SESSION['produto']);
} else {
$msg = mysqli_error($conexao);
?>
<p class="text-danger">O produto <?= $produto -> getNome() ?> não foi adicionado: <?= $msg?></p>
<?php
}
?>
<?php require_once("rodape.php"); ?>
Este é o formulario de inclusão de produtos e em seguida o formulario base
/*produto-formulario.php */
<?php
session_start();
require_once("logica-usuario.php");
verificaUsuario();
require_once("cabecalho.php");
require_once("banco-categoria.php");
require_once("class/Produto.php");
$usado = "";
$categoria = new Categoria();
$categoria -> setId(1);
$produto = new Produto();
$produto->setCategoria($categoria);
$categorias = listaCategorias($conexao);
?>
<?php if(isset($_SESSION['produto'])){?>
<p class='alert-success'><?= $_SESSION['produto']?>
<?php } ?>
<?php unset($_SESSION['produto']);?>
<h1>Formulário de produto</h1>
<form action="adiciona-produto.php" method="post">
<table class="table">
<?php require_once("produto-formulario-base.php");?>
<tr>
<td>
<button class="btn btn-primary" type="submit">Cadastrar</button>
</td>
</tr>
</table>
</form>
<?php require_once("rodape.php"); ?>
/* produto-formulario-base.php */
<tr>
<td>Nome</td>
<td> <input class="form-control" type="text" name="nome" value="<?=$produto -> getNome()?>"></td>
</tr>
<tr>
<td>Preço</td>
<td><input class="form-control" type="number" name="preco" value="<?=$produto -> getPreco()?>"></td>
</tr>
<tr>
<td>Descrição</td>
<td><textarea class="form-control" name="descricao"><?=$produto -> getDescricao() ?></textarea></td>
</tr>
<tr>
<td></td>
<td><input type="checkbox" name="usado" <?=$produto -> getUsado()?> value="true"> Usado
</tr>
<tr>
<td>Categoria</td>
<td>
<select name="categoria_id" class="form-control">
<?php
foreach($categorias as $categoria) :
$essaEhACategoria = $produto-> getCategoria() -> getId() == $categoria->getId();
$selecao = $essaEhACategoria ? "selected='selected'" : "";
?>
<option value="<?=$categoria-> getId()?>" <?=$selecao?>>
<?=$categoria-> getNome()?>
</option>
<?php endforeach ?>
</select>
</td>
</tr>
Para alterar um produto da o mesmo problema, mas se esse for resolvido acho que consigo resolver o outro ... alguém pode me ajudar ?