Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

Faltou apresentar os demais códigos para conferirmos com os códigos que alteramos

No exercício foi proposto que os arquivos: adiciona-produto.php, altera-produto.php, banco-categoria.php, banco-produto.php, produto-altera-formulario.php, produto-formulario-base.php, produto-formulario.php e produto-lista.php deveriam ser modificados, no entanto não foi apresentado os códigos do mesmos para correção!! Apenas é apresentado um código de um arquivo. No meu caso estou tomando erro pra inserir e pra alterar produto! Ambos problemas estão relacionados com o arquivo banco-produto.php. Como sou nova no PHP, preciso conferir em algum lugar e não encontro o problema de jeito nenhum! Inclusive segui com a aula imaginando que pudesse ser apresentado o código mais adiante, porém o conteúdo vai prosseguindo e nada de apresentar o código todo. Peço por gentileza que alguém me ajude pois já não consigo identificar a causa do problema.

11 respostas

Oi Priscila blz? Então tem como voce mandar o codigo desses dois ? Ai a gente olha aqui e ve oque ta dando de errado. Lembro de ter feito essa aula e errar alguma coisa.

Alterei esta primeira resposta - retirei o código na íntegra, já que ficou muito grande... pra ficar melhor de visualizar nos comentários seguintes:

Segue os erros que estão acontecendo na página:

1) Mensagem de erro ao tentar incluir produto: O produto Livro de PHP não foi adicionado: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' true)' at line 1

2)Mensagem de erro ao tentar alterar o produto (http://localhost/loja/produto-altera-formulario.php?id=) - pelo que vi ele não carrega o id do produto!. Ele apresenta o formulário de alteração todo em branco: ( ! ) SCREAM: Error suppression ignored for ( ! ) Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\wamp\www\loja\banco-produto.php on line 54 Call Stack

Time Memory Function Location

1 0.0012 143888 {main}( ) ..\produto-altera-formulario.php:0 2 1.0222 183040 buscaProduto( ) ..\produto-altera-formulario.php:8 3 1.0226 183416 mysqli_fetch_assoc ( ) ..\banco-produto.php:54

Trecho do código relacionado ao item 1 acima (Arquivo adiciona-produto.php):

//..outra parte do código

$categoria= new Categoria(); $categoria->setId($_POST['categoria_id']);

$nome = $_POST['nome']; $preco = $_POST['preco']; $descricao = $_POST['descricao']; $categoria = $categoria; //aqui está estranho mas não sei como fazer!

if (array_key_exists('usado', $_POST)) {//verifica se existe a variavel usado no post (se foi selecionado o checkbox) $usado = "true"; } else{ $usado = "false"; //tem que ser colocado entre aspas senao dá pau na query pq ele entende como nulo sem aspas }

$produto= new Produto($nome, $preco, $descricao, $categoria, $usado); //instanciando o produto

if(insereProduto($conexao, $produto)) { ?>

O produto <?= $produto->getNome(); ?>, <?= $produto->getPreco(); ?> adicionado com sucesso!

<?php } else { $msg = mysqli_error($conexao); ?>

O produto <?= $produto->getNome(); ?> não foi adicionado: <?= $msg?>

<?php

}

Trecho do arquivo banco-produto.php:

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->isUsado()})"; //echo $query; //para debug return mysqli_query($conexao, $query); //retorna o resultado, entao nao e mais variavel que uso e sim return }

Esse erro ao inserir produto pode estar relacionado a estar faltando algum campo, ou o campo estar com o nome errado ou sem conteúdo.

Tente imprimir a query que ele tenta executar, isso deve ajudar a identificar o que está faltando. Pela mensagem, o suspeito pode ser o campo categoria.

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->isUsado()})"; 
echo $query; //Para ver o que esta faltando!

return mysqli_query($conexao, $query);
}

//Trechos que estão relacionados ao item 2:

//Arquivo: produto-altera-formulario.php:

$id = $_GET['id']; $produto = buscaProduto($conexao, $id); $categorias = listaCategorias($conexao);

$selecao_usado = $produto->isUsado() ? "checked='checked'" : ""; $produto->setUsado($selecao_usado); ?>

//Trecho do arquivo banco-produto.php:

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->isUsado()} where id = '{$produto->getId()}'"; //echo $query; //para debug return mysqli_query($conexao, $query); }

Daniel Bins, quando debuguei ontem (agora não estou podendo acessar o projeto pois estou no trabalho) o campo categoria_id estava vindo em branco!

Até comentei no trecho do código que acho estranho como ficou no meu código mas não sei como seria a forma certa:

Arquivo: adiciona-produto.php Trecho : $categoria = $categoria; //aqui está estranho mas não sei como fazer!

Coloquei todo o bloco do arquivo adiciona-produto.php em outro comentário.

Da sim eu coloco na minha ide e fica tranquilo.

Mas vamos la pro primeiro erro, você consegue imprimir a query que esta sendo executada pra eu ver ? e se possível sua classe Produto também. Acredito que o erro do primeiro esteja na função isUsado(), pode me mandar arquivo dela também? Ai a gente resolve isso. E sobre a categoria não precisa usar , pelo que vi voce ja instanciou ela em cima né? é só adicionar a sua $categoria ao atributo categoria do se Produto

Poxa Rubens, não tenho como debugar o projeto pois não trouxe meu note pro trabalho... Apenas trouxe o projeto mas não estou executando nda... só de noite mesmo que poderei printar, mas ontem eu coloquei um echo $query e estava vindo em branco o campo categoria_id...

Segue o arquivo Produto.php:

<?php

class Produto { private $id; //definindo os atributos private $nome; private $preco; private $descricao; private $categoria; //Vem da classe class/Categoria.php, $categoria é um atributo que é um objeto private $usado;

function __construct($nome, $preco, $descricao, Categoria $categoria, $usado){ //esse método torna esses 2 campos obrigatórios - sempre que instanciar um produto tem q passar esses 2 $this->nome = $nome; $this->preco = $preco; $this->descricao = $descricao; $this->categoria = $categoria; $this->usado = $usado; }

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

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

public function getPreco(){ return $this->preco; }

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

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

public function isUsado(){ return $this->usado; } public function setUsado($usado){ $this->usado = $usado; }

public function precoComDesconto($valor = 0.1) { //é um MÉTODO pq é uma função que está dentro da classe //$this// o "this" é um atributo que faz referência ao proprio objeto - referencia ele mesmo pra entender que é o preco dessa classe mesmo. Se fosse em outra página seria $produto. valor padrão 0.1 se nao for passado outro parametro na chamada da função. Com esse valor padrão é feito uma SOBRECARGA DE MÉTODO if ($valor > 0 && $valor <= 0.5){ //impede que seja aplicado valor negativo ou maior do que 50% $this->preco -= $this->preco * $valor; } return $this->preco; }

function __toString(){ //método que serve para imprimir um objeto return $this->nome.": R$ ".$this->preco; }

// function __destruct(){ //destroi o objetopara ele não ficar na memoria // echo "Produto destruido"; // }

} ?>

solução!

Olá Priscila, eu já modifiquei o exercício e acrescentei o código para você comparar. Você pode baixar o projeto feito até este exercício aqui.

Gente, obrigada pela ajuda!

Professor, obrigada por disponibilizar o código para comparação! Descobri o problema: Ontem qdo fui digitar o código o "i" da minha funçao setId da Categorias.php acabei digitando com acentuação e acabei não visualizando!! Então o problema foi na seguinte linha: $this->ìd = $id; ao invés de: $this->id = $id;

Assim, finalmente consegui fazer funcionar! Obrigada a tds!