Solucionado (ver solução)
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!