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

Php Listar produtos por categoria

Olá pessoal, não consigo desenvolver uma solução para o problema de listar produtos por categoria. Na página consigo listar as categorias para o usuario escolher. ok. consigo disponibilizar o id da categoria para própria página. Mas não consigo pegar este codigo, enviar ao banco-produto para executar a consulta no banco e devolver a lista de produtos por aquela determinada categoria. Alguém poderia me dar uma luz? Segue o que fiz até o momento:

  1. escolha-produtos.php

aqui eu recebo o id da categoria e disponibilizo para a pagina.

<?php $categorias = listaCategorias($conexao); ?>

<script type="text/javascript" src="assets/js/jquery.min.js"></script>

<script type="text/javascript">

   $(document).ready(function () {
        // Evento quando o valor da combo é alterado
       $('#select-relatorio').change(function () {
         // Redirecionamento por Javascript quando uma das opções com valor for selecionado
         if ($(this).val()!="") {

               window.location = "escolha-produtos.php?id="+$(this).val();

         }
       });
    });
</script>

aqui eu pego (pelo menos estou tentando) o id da categoria:

<?php

$categorias = listaCategorias($conexao);
$marcas = listaMarcas($conexao);
$id = "";
$comando = "";


if (isset($_GET["id"])) {
    $id = $_GET['id'];
    $comando = "LISTAR";

} 
  if ($comando == "LISTAR"){
    $produto = listaProdutosporCategoria($conexao, $id); 

?>

 <div class="section ">
      <div class="container container-border">
          <div class="title">
            <h4>Escolha os Produtos que Deseja Ganhar</h4>
               </div>
            <div class="row">

                <div class="col-md-4">
                    <div class="card card-product card-plain">
                        <div class="image">
                            <a href="#">
                                <img src="fotos/<?=$produto->getFoto() ?>" alt="Sem Imagem"/>
                            </a>
                        </div>
                        <div class="content">
                            <a href="#">
                                <h4 class="title"><?=$produto->getNome() ?></h4>
                            </a>
                            <p class="description">
                              <?= substr($produto->getDescricao(), 0, 40) ?>
                            </p>
                            <div class="footer">
                                <span class="price">R$ <?=$produto->getPreco() ?></span>
                                <button class="btn btn-danger btn-simple btn-hover pull-right" rel="tooltip" title="" data-placement="left" data-original-title="Adicionar a lista">
                                    <i class="fa fa-heart-o"></i>
                                </button>
                            </div>
                        </div>
                    </div> <!-- end card -->
                </div>


    </div>


    </div>

    <?php
}
?>

este é o banco-produto onde estou tentando fazer a query para o BD e retornar o resultado para a escolha-produtos:

function listaProdutosporCategoria($conexao){
$produtos = array();
$resultado = mysqli_query($conexao, "select p.*, c.nome as categoria_nome, m.nome as marca_nome 
from produtos p 
inner join categorias c on(p.categoria_id = c.id)
inner join marcas m on(p.marca_id = m.id) 
ON p.categoria_id = id ");
while($array = mysqli_fetch_assoc($resultado)) {
$produto = new Produto();

$produto->setId($array['id']);
$produto->setNome($array['nome']);
$produto->setPreco($array['preco']);
$produto->setReferencia($array['referencia']);
$produto->setDescricao($array['descricao']);
$produto->setMarca(new Marca());
$produto->getMarca()->setId($array['marca_id']);
$produto->getmarca()->setNome($array['marca_nome']);
$produto->setCategoria(new Categoria());
$produto->getCategoria()->setId($array['categoria_id']);
$produto->getCategoria()->setNome($array['categoria_nome']);

array_push($produtos, $produto);
}
return $produtos;
}
7 respostas

Segue uma possível solução:

Vc precisa alterar os parametros da função para receber o id:

function listaProdutosporCategoria($conexao, $id){...}

E também alterar a string SQL para simplificar a busca:

$resultado = mysqli_query($conexao, "
    select p.*, c.nome as categoria_nome, m.nome as marca_nome 
    from produtos p 
    inner join categorias c on(p.categoria_id = c.id)
    inner join marcas m on(p.marca_id = m.id) ON p.categoria_id = id 
     where c.id = " . $id . ";");

Muito obrigado Gabriel, me parece que com sua solução a parte do sql está funcionando. Mas ainda não consigo trazer os produtos de determinada categoria. E o erro fatal que aparece agora é este:

<img src="fotos/<br />
<b>Fatal error</b>:  Call to a member function getFoto() on array in <b>C:\Bitnami\wampstack-5.6.19-0\apache2\htdocs\casamento\escolha-produtos.php</b> on line <b>163</b><br />

Tenta colocar os INNER JOINS entre parênteses.

$resultado = mysqli_query($conexao, "
    select p.*, c.nome as categoria_nome, m.nome as marca_nome 
    from ((produtos p 
    inner join categorias c on(p.categoria_id = c.id))
    inner join marcas m on(p.marca_id = m.id)) ON p.categoria_id = id 
     where c.id = " . $id . ";");

Obrigado Rafael, fiz isso mas ainda não resolveu.

O método getFoto() é de qual classe ?

Pode mostrar a linha que está provocando o erro ?

Oi Gabriel, andei mexendo tentando resolver por aqui mas ainda não consegui. Fiz algumas mudanças depois da sua sugestão que foi certinha no sql. Agora não está mostrando nenhum erro, porém, não lista os produtos por categoria. Seguem os arquivos: escolha-produtos.php

<?php

$categorias = listaCategorias($conexao);
$marcas = listaMarcas($conexao);
$id = "";
$comando = "";


if (isset($_GET["id"])) {
    $id = $_GET['id'];
    $comando = "LISTAR";

} 
  if ($comando == "LISTAR"){
    $produto = listaProdutosporCategoria($conexao, $id); 

?>

 <div class="section ">
      <div class="container container-border">

      <?php

$produto = new Produto();
$produto->setId( $_POST['id'] );
$produto->setFoto( $_POST['foto'] );
$produto->setNome( $_POST['nome'] );
$produto->setDescricao( $_POST['descricao'] );
$produto->setPreco( $_POST['preco'] );

echo ("* O ID nao esta vazio * "); //Aviso de teste
?>

          <div class="title">
            <h4>Escolha os Produtos que Deseja Ganhar</h4>
               </div>
            <div class="row">

                <div class="col-md-4">
                    <div class="card card-product card-plain">
                        <div class="image">
                            <a href="#">
                                <img src="fotos/<?=$produto->getFoto() ?>" alt="Sem Imagem"/>
                            </a>
                        </div>
                        <div class="content">
                            <a href="#">
                                <h4 class="title"><?=$produto->getNome() ?></h4>
                            </a>
                            <p class="description">
                              <?= substr($produto->getDescricao(), 0, 40) ?>
                            </p>
                            <div class="footer">
                                <span class="price">R$ <?=$produto->getPreco() ?></span>
                                <button class="btn btn-danger btn-simple btn-hover pull-right" rel="tooltip" title="" data-placement="left" data-original-title="Adicionar a lista">
                                    <i class="fa fa-heart-o"></i>
                                </button>
                            </div>
                        </div>
                    </div> <!-- end card -->
                </div>


    </div>


    </div>

    <?php
}
?>

banco-produto na funçaõ listaProdutosporCategoria

function listaProdutosporCategoria($conexao,$id){
$produtos = array();
$resultado = mysqli_query($conexao, "select p.*, c.nome as categoria_nome, m.nome as marca_nome 
from produtos p 
inner join categorias c on(p.categoria_id = c.id)
inner join marcas m on(p.marca_id = m.id) 
 where c.id = " . $id . ";");
while($array = mysqli_fetch_assoc($resultado)) {
$produto = new Produto();

$produto->setId($array['id']);
$produto->setNome($array['nome']);
$produto->setPreco($array['preco']);
$produto->setReferencia($array['referencia']);
$produto->setDescricao($array['descricao']);
$produto->setMarca(new Marca());
$produto->getMarca()->setId($array['marca_id']);
$produto->getmarca()->setNome($array['marca_nome']);
$produto->setCategoria(new Categoria());
$produto->getCategoria()->setId($array['categoria_id']);
$produto->getCategoria()->setNome($array['categoria_nome']);
$produto->carregaCaminhoFoto($array['foto']);

array_push($produtos, $produto);
}
return $produtos;
}

classe produto

<?php
class Produto
{
private $id;
private $codigo;
private $referencia;
private $nome;
private $preco;
private $peso;
private $medida;
private $ncm;
private $descricao;
private $marca;
private $categoria;
private $destaque;
private $foto;

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 getReferencia()
{
return $this->referencia;
}
public function setReferencia($referencia)
{
$this->referencia = $referencia;
}

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

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

public function getPeso()
{
return $this->peso;
}
public function setPeso($peso)
{
$this->peso = $peso;
}

public function getMedida()
{
return $this->medida;
}
public function setMedida($medida)
{
$this->medida = $medida;
}

public function getNcm()
{
return $this->ncm;
}
public function setNcm($ncm)
{
$this->ncm = $ncm;
}

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

public function getMarca()
{
return $this->marca;
}
public function setmarca($marca)
{
$this->marca = $marca;
}

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

public function getDestaque()
{
return $this->destaque;
}
public function setDestaque($destaque)
{
$this->destaque = $destaque;
}

public function getFoto()
{
return $this->foto;
}

public function carregaCaminhoFoto($foto)  {
        $this->foto = $foto;
}

    public function gerarNovoNome( $nomeAntigo )
    {
        // Pega extensão da imagem
        preg_match("/\.(gif|bmp|png|jpg|jpeg){1}$/i", $nomeAntigo, $ext);
        // Gera um nome único para a imagem
        $nome_imagem = md5(uniqid(time())) . "." . $ext[1];

        return $nome_imagem;
    }

    public function setFoto($foto)
    {

        // esta variavel precisa existir, mesmo que vazia
        $nome_imagem = null;

        // armazena erros se houver
        $error = array();

        // Se a foto estiver sido selecionada
        if (!empty($foto["name"]))
        {
            // Largura máxima em pixels
            $largura = 1200;
            // Altura máxima em pixels
            $altura = 1200;
            // Tamanho máximo do arquivo em bytes
            $tamanho = 1500000;
            // Verifica se o arquivo é uma imagem
            if(!preg_match("/^image\/(pjpeg|jpeg|png|gif|bmp)$/", $foto["type"]))
            {
                $error[1] = "Isso não é uma imagem.";
            }

            // Pega as dimensões da imagem
            $dimensoes = getimagesize($foto["tmp_name"]);

            // Verifica se a largura da imagem é maior que a largura permitida
            if($dimensoes[0] > $largura)
            {
                $error[2] = "A largura da imagem não deve ultrapassar ".$largura." pixels";
            }

            // Verifica se a altura da imagem é maior que a altura permitida
            if($dimensoes[1] > $altura)
            {
                $error[3] = "Altura da imagem não deve ultrapassar ".$altura." pixels";
            }

            // Verifica se o tamanho da imagem é maior que o tamanho permitido
            if($foto["size"] > $tamanho)
            {
                $error[4] = "A imagem deve ter no máximo ".$tamanho." bytes";
            }
// Se não houver nenhum erro
            if (count($error) == 0)
            {
                $nome_imagem = $this->gerarNovoNome($foto["name"]);

                // caso o diretório não exista
                if( !is_dir("../cadastro/fotos") ) //volta duas pastas, ou seja, estamos no HTDOCS
                    mkdir("/cadastro/fotos", "0777", true);

                // Caminho de onde ficará a imagem
                $caminho_imagem = "../../cadastro/fotos" . DIRECTORY_SEPARATOR . $nome_imagem;
                // Faz o upload da imagem para seu respectivo caminho
                move_uploaded_file($foto["tmp_name"], $caminho_imagem);
                $this->foto = $foto;
            }
           else
            {
                echo "<pre>";
                echo "Opa!, foto com os seguintes problemas: <br>";
                echo implode("<br>", $error);
                exit;
            }

            return $nome_imagem;
}
    }
}
solução!

Segue solução para o problema:

para pagina escolha-produto: Eu estava esquecendo de "pegar" o id (categoria_id que vem do banco). Segue como fazer:

<?php
$id = $_GET["id"];
$produtos = listaProdutosporCategoria($conexao, $id);
?>
<table class="table table-striped table-bordered">
<?php foreach($produtos as $produto) : ?>

 <div class="section ">
      <div class="container container-border">


          <div class="title">
            <h4>Escolha os Produtos que Deseja Ganhar</h4>
               </div>
            <div class="row">

Na Função listaProdutosporCategoria : Alterar final da query de busca fica com where c.id = {$id}"); simples assim.

function listaProdutosporCategoria($conexao,$id){
$produtos = array();
$resultado = mysqli_query($conexao, "select p.*, c.nome as categoria_nome,
    m.nome as marca_nome 
from produtos p 
inner join categorias c on(p.categoria_id = c.id)
inner join marcas m on(p.marca_id = m.id) 
where c.id = {$id}");
while($array = mysqli_fetch_assoc($resultado)) {

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