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

Editar produto baseado em OO.

Pessoal,

Estou a apanhar novamente... Agora o problema é que quando alterei meus cadastros de produtos para objetos, a funcionalidade de editar um produto não funciona de forma nenhuma... Poderiam me ajudar?

edita-produto.php

<?php 
require_once("cabecalho.php"); 
require_once("banco-categoria.php");
require_once("banco-produto.php");
require_once("class/produto.php");
require_once("conecta.php");

$produto = new Produto;

$produto->id = $_GET['id'];

    $query = "select * from produtos where id = {$produto->id}";
    $resultado = mysqli_query($conexao, $query);
    return mysqli_fetch_assoc($resultado);
`
15 respostas

Oi Igor,

tem um return um pouco perdido no seu código: Me parece que vc queria criar um função com aquela funcionalidade:

<?php 
function buscaProduto($conexao,$produto) { 
  $query = "select * from produto where id = {$produto->id}";   
  $resultado = mysqli_query($conexao,$query); 
  return mysqli_fetch_assoc($query); 
} 
?>

Faz sentido?

abs

Opa Nico!

Obrigado pelo retorno.

Desta forma retorna um erro, veja:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /Applications/XAMPP/xamppfiles/htdocs/localhost_igor/Primeiro curso PHP/banco-produto.php on line 64

Banco produto linha 64 - return mysqli....

function editaProduto($conexao, $produto) { 
  $query = "select * from produto where id = {$produto->id}";   
  $resultado = mysqli_query($conexao,$query); 
  return mysqli_fetch_assoc($resultado); 
}

edita-produto


<?php 
require_once("cabecalho.php"); 
require_once("banco-categoria.php");
require_once("banco-produto.php");

$produto = new Produto;

$produto->id = $_GET['id'];

editaProduto($conexao, $produto);


?>

Esta busca/função é para gerar o formulario com os dados do produto preenchidos para alterar no banco...

Oi Igor,

adicione dentro da função o código seguinte (adicione apenas o if):

function editaProduto($conexao, $produto) { 
  $query = "select * from produto where id = {$produto->id}";   
  $resultado = mysqli_query($conexao,$query); 
  if (!$resultado) {
        echo 'MySQL Error: ' . mysqli_error();
        exit;
  }
  return mysqli_fetch_assoc($resultado); 
}

Depois coloque a mensagem de erro aqui.

Outra coisa, a função não edita, apenas busca o produto pela id.

abs, Nico

Deu o seguinte erro Nico:

Warning: mysqli_error() expects exactly 1 parameter, 0 given in /Applications/XAMPP/xamppfiles/htdocs/localhost_igor/Primeiro curso PHP/banco-produto.php on line 65 MySQL Error:

Oi Igor, parece que a id do produto não existe.

Verifique se vc está realmente enviando essa id pela URL:

$produto->id = $_GET['id'];

abs

Boa noite caro Nico,

O pior é que esta:

http://localhost/localhost_igor/Primeiro%20curso%20PHP/edita-produto.php?id=148

E quando dou um echo no $produto->id aparece o que ele buscou no GET - 148...

Oi Igor,

por favor, corrige o código que te passei. A função mysqli_error() deve receber a conexão:

function editaProduto($conexao, $produto) { 
  $query = "select * from produto where id = {$produto->id}";   
  $resultado = mysqli_query($conexao, $query); 
  if (!$resultado) {
        echo 'MySQL Error: ' . mysqli_error($conexao); //aqui
        exit;
  }
  return mysqli_fetch_assoc($resultado); 
}

depois coloque novamente a saída aqui.

desculpe, Nico

Poxa Nico, Não sei o que ta acontecendo... Quando coloco a conexão no if de erro não retorna nada!

função edita produto no banco-produto

function editaProduto($conexao, Produto $produto) { 
  $query = "select * from produtos where id = {$produto->id}";   
  $resultado = mysqli_query($conexao,$query); 
  if (!$resultado) {
        echo 'MySQL Error: ' . mysqli_error($conexao);
        exit;
  }
  return mysqli_fetch_assoc($resultado); 
}

edita-produto.php

$produto->id = $_GET['id'];

echo $produto->id;

editaProduto($conexao, $produto);

echo $produto->id;

echo $produto->nome;

echo $produto->preco;

echo $produto->descricao;

Coloquei esses echo's para conferir se retornar algum valor, mas o unico valor que aparece é o do produto id que está sendo requerido do banco... Acho que é alguma coisa que está faltando nesse arquivo... Tenho que saber como declarar as variaveis do que está sendo recebido pelo banco na query... Sei la, tá um mistério viu!!!

Mas muito obrigado pela atenção meu caro!

Oi Igor,

pegue o retorno da função editaProduto:


$produtoCarregado = editaProduto($conexao, $produto);

echo $produtoCarregado->id;

echo $produtoCarregado->nome;

echo $produtoCarregado->preco;

echo $produtoCarregado->descricao;

Não vamos desistir :)

abs

Boa noite Nico, beleza?

Cara, fiz as alterações e agora não retorna nada... O echo mostra somente o primeiro ID listado antes da função e o resto em branco...

Coloquei o sistema nessa pasta, se puder conferir, será muito valiosa sua ajuda!!

https://goo.gl/XNOfMH

Os arquivos são edita-produto.php, banco-produto.php e o link que puxa o edita-produto é o 'editar' do produto-lista.php.

Mas fique a vontade!

Valeu!!

solução!

Oi Igor,

acabei de testar, faltou mais uma coisa na função editaProduto:

function editaProduto($conexao, Produto $produto) { 

  $query = "select * from produtos where id = {$produto->id}";   

  $resultado = mysqli_query($conexao,$query); 
  if (!$resultado) {
        echo 'MySQL Error: ' . mysqli_error($conexao);
        exit;
  }
  $result = mysqli_fetch_assoc($resultado); 

    //aqui eh novo
    $produto = new Produto();
    $produto->id = $result['id'];
    $produto->nome = $result['nome'];
    $produto->descricao = $result['descricao'];

  return $produto;
}

Agora vai!

abs, nico

Aaaaaaaaeeeeeeewwww! Finalmente funcionou!!! Já comecei o aniversário com o pé direito! hehehehehe

Muito obrigado cara!!!

Nico, você é instrutor da Caelum, certo? Se sim e se não for muito incomodo gostaria de saber um pouco mais sobre essa questão de retornar dados de uma query, posso?

Vamos lá,

Na seleção dos dados do banco: Qual a diferença entre a query e o fetch_assoc?

Na aplicação destas funções que retornaram do banco:

Você chamou a função editaProduto e logo abaixo definiu uma variavel para o resultado dela... Faz super sentido, mas funcionaria sem essa nova definição?

Pq até então tratamos o como $produto os detalhes do produto, inclusive no banco, a partir daqui terei que usar $produtoCarregado?

Falo isso pq no exemplo da aula 2, para o produto-lista.php o professor utiliza na função do banco como $produto ($produto->id... etc) veja

//função de listar produtos
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 p.categoria_id = c.id");
    while($produto_atual = mysqli_fetch_assoc($resultado)) {
        $produto = new Produto;
        $categoria = new Categoria;
        $categoria->nome = $produto_atual['categoria_nome'];
        $produto->id = $produto_atual['id'];
        $produto->nome = $produto_atual['nome'];
        $produto->preco = $produto_atual['preco'];
        $produto->descricao = $produto_atual['descricao'];
        $produto->categoria = $categoria;
        $produto->usado = $produto_atual['usado'];
        $produto->concluido = $produto_atual['concluido'];
        $produto->data_criacao = $produto_atual['data_criacao'];
        $produto->data_modificado = $produto_atual['data_modificado'];

        array_push($produtos, $produto);
    }

    return $produtos;
}

E para lista-los, ele print usando o termo : <?= $produto->nome ?>

Eu estou levantando essa questão pq neste exemplo funcionou chamar a variavel que imprime do mesmo nome do que chamamos no banco, mas na hora do edita-produto acabou que não funcionou...

Tenho outra questão ainda sobre o que preciso declarar entre parenteses () na hora de chamar uma função:

Veja que neste exemplo agente criou um novo objeto Produto e falamos que ele chama $produto, e lá no banco fizemos isso de novo... Testei aqui e vi que também funcionaria chamando o termo que recebemos do $_GET de somente $id na função do banco:

O codigo do edita-produto ficou assim:

$produto = new Produto;
$id = $_GET['id'];
$produtoCarregado = editaProduto($conexao, $produto);
echo $produtoCarregado->id ."</br>";
echo $produtoCarregado->nome ."</br>";
echo $produtoCarregado->preco ."</br>";
echo $produtoCarregado->descricao ."</br>";
echo $produtoCarregado->data_criacao ."</br>";

Mas assim também funciona: Pagina

$id = $_GET['id'];
$produtoCarregado = editaProduto($conexao, $id);
echo $produtoCarregado->id ."</br>";
echo $produtoCarregado->nome ."</br>";

Banco

function editaProduto($conexao, $id) { 
$query = "select * from produtos where id = {$id}";

Levando em consideração que também funciona, qual comportamento você indica?

E ainda sobre objeto, toda vez que for usar qualquer informação de um objeto preciso colocar $variavel = new Objeto ??

Desculpe-me esse testamento mas é pq eu gostaria de entender o conceito para aplicar em meus próprios exemplos, entende?

Oi Igor,

te ajudo, claro, mas vamos fechar esse tópico e criar um novo, ok?

Assim fica um pouco mais organizado.

Abs, Nico

Ah meu caro, Agora que vi essa opção!! (OO)