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

Php - Exibir Foto

Bom dia, agradeceria ajuda. Tenho um formulário de alteração e gostaria de exibir uma foto do produto em um dos campos " imagem do produto" mas não estou conseguindo. Poderiam me corrigir onde estou errando?

formulário produto-altera-adiciona

<main class="container">
    <article class="principal">

<?php

$categorias = listaCategorias($conexao);
$cores = listaCores($conexao);
$tamanhos = listaTamanhos($conexao);

$produto = new Produto();
$produto->setCategoria(new Categoria());
$produto->setcor(new Cor());
$produto->settamanho(new Tamanho());
$ehAlteracao = false;
$action = "adiciona-produto.php";
$id = "";

//Campos do formulario
//Inserir os demais campos do formulario

if (array_key_exists('id', $_GET)) {
    $id = $_GET['id'];
    if ($id <> ""){
        $produto = buscaProduto($conexao, $id);
        $ehAlteracao = true;
        $nome = $produto->getNome() ;
        //Carregar os demais campos do formulário

        $action = "altera-produto.php";
    }
}

?>
<h1><?=$ehAlteracao ? "Alterar" : "Cadastrar" ?> produto</h1>
<form action="<?=$action ?>" method="post" enctype="multipart/form-data">

   <!-- Adicionar os demais campos do formulário -->

    <input type="hidden" name="id" value="<?=$id; ?>" />

    <div class="form-group">
        <label>Codigo Barras:</label>
            <input type="text" name="codigo" class="form-control"
                value="<?=$produto->getCodigo() ?>" >
    </div>

    <div class="form-group">
    <label>Nome:</label>
    <input class="form-control" type="text" name="nome"
        value="<?=$produto->getNome() ?>">
    </div>

    <div class="form-group">
        <label>Preco:</label>
            <input type="text" name="preco" class="form-control"  
                value="<?=$produto->getPreco() ?>">

    </div>

<div class="form-group">
        <label>Descricao:</label>
            <textarea class="form-control" name="descricao"><?=$produto->getDescricao() ?></textarea>
    </div>

    <div class="form-group">
        <label>Cor:</label>
            <select name="cor_id" class="form-control">
            <?php
            foreach($cores as $cor) :
            $essaEhACor = $produto->getCor()->getId()
            == $cor->getId();
            $selecao = $essaEhACor ? "selected='selected'" : "";
            ?>
                <option value="<?=$cor->getId() ?>" <?=$selecao ?> >
                        <?=$cor->getNome() ?>
                </option>
                <?php endforeach ?>

            </select>
    </div>
    <div class="form-group">
        <label>Tamanho:</label>
            <select name="tamanho_id" class="form-control">
            <?php
            foreach($tamanhos as $tamanho) :
            $essaEhATamanho = $produto->getTamanho()->getId()
            == $tamanho->getId();
            $selecao = $essaEhATamanho ? "selected='selected'" : "";
            ?>
                <option value="<?=$tamanho->getId() ?>" <?=$selecao ?> >
                        <?=$tamanho->getNome() ?>
                </option>
                <?php endforeach ?>

            </select>
    </div>
<div class="form-group">
        <label>Categoria:</label>
            <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>
    </div>


<div class="form-group">
        <label>Imagem do Produto:</label>
            <img src="fotos/<?= $produto->getFoto() ?>.jpg">
    </div>

<div class="form-group">
        <label>Upload da Imagem:</label>
            <input type="file" name="foto" class="form-control"  
                value="foto">
<br>

        <button class="btn btn-danger" type="submit">Enviar</button>
</form>

</article>
</main>

classe produto

<?php
class Produto
{
    private $id;
    private $codigo;
    private $nome;
    private $preco;
    private $descricao;
    private $categoria;
    private $cor;
    private $tamanho;
    private $foto;
    private $gerarNovoNome;
    private $quantidade;
    private $atualizado;


    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 getNome()
    {
        return $this->nome;
    }
    public function setNome($nome)
    {
        $this->nome = $nome;
    }

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

    public function setPreco($preco)
    {
          if(!is_numeric($preco))
          {
            $preco_convertido = str_replace("R$ ", "", $preco);
            $preco_convertido = str_replace(".", "", $preco_convertido);
            $preco_convertido = (float) str_replace(",", ".", $preco_convertido);
            $this->preco = $preco_convertido;
          }
          else
          {
            $this->preco = $preco;
          }
    }

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

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

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

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

    public function getCor()
    {
        return $this->cor;
    }

    public function setCor($cor)
    {
        $this->cor = $cor;
    }


    public function getTamanho()
    {
        return $this->tamanho;
    }

    public function setTamanho($tamanho)
    {
        $this->tamanho = $tamanho;
    }

    public function getQuantidade()
{
return $this->quantidade;
}
public function setQuantidade($quantidade)
{
$this->quantidade = $quantidade;
}

public function getAtualizado()
{
return $this->atualizado;
}
public function setAtualizado($atualizado)
{
$this->atualizado= $atualizado;
}

 public function getFoto()
    {
        return $this->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 = 300;
            // Altura máxima em pixels
            $altura = 500;
            // Tamanho máximo do arquivo em bytes
            $tamanho = 100000;
            // 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("fotos") )
                    mkdir("fotos", "0777", true);

                // Caminho de onde ficará a imagem
                $caminho_imagem = "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;
}
    }
}

banco produto na função listaProdutos

<?php
function listaProdutos($conexao){
$produtos = array();
$resultado = mysqli_query($conexao, "select p.*, c.nome as categoria_nome, co.nome as cor_nome, t.nome as tamanho_nome from produtos p 
inner join categorias c on(p.categoria_id = c.id)
inner join cor co on(p.cor_id = co.id)
inner join tamanho t on(p.tamanho_id = t.id)
order by p.nome, c.nome, co.nome, t.nome ");

while($array = mysqli_fetch_assoc($resultado)) {
$produto = new Produto();

$produto->setId($array['id']);
$produto->setNome($array['nome']);
$produto->setPreco($array['preco']);
$produto->setCodigo($array['codigo']);
$produto->setDescricao($array['descricao']);
$produto->setCor(new Cor());
$produto->getCor()->setId($array['cor_id']);
$produto->getCor()->setNome($array['cor_nome']);
$produto->setTamanho(new Tamanho());
$produto->getTamanho()->setId($array['tamanho_id']);
$produto->getTamanho()->setNome($array['tamanho_nome']);
$produto->setCategoria(new Categoria());
$produto->getCategoria()->setId($array['categoria_id']);
$produto->getCategoria()->setNome($array['categoria_nome']);
$produto->setQuantidade($array['quantidade']);
$produto->setFoto($array['foto']);

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

Olá Sergio,

Quando você abre a página a foto não carrega certo? Se você exibir o código fonte da página e ir onde está a foto qual é o caminho que ela está apontando? Está correto?

Oi Joel, o nome (caminho) da foto não está vindo do BD. e assim, não consegue puxar a foto da pasta fotos. veja:

<img src="fotos/.jpg">

Oi Sergio,

Eu dei uma pequena identada no código, assim ficou mais fácil de identificar o problema, também tive que utilizar uma ferramenta para debug, o código identado ficou assim:

<?php
class Produto
{
    private $id;
    private $codigo;
    private $nome;
    private $preco;
    private $descricao;
    private $categoria;
    private $cor;
    private $tamanho;
    private $foto;
    private $gerarNovoNome;
    private $quantidade;
    private $atualizado;


    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 getNome()
    {
        return $this->nome;
    }
    public function setNome($nome)
    {
        $this->nome = $nome;
    }

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

    public function setPreco($preco)
    {
          if(!is_numeric($preco))
          {
            $preco_convertido = str_replace("R$ ", "", $preco);
            $preco_convertido = str_replace(".", "", $preco_convertido);
            $preco_convertido = (float) str_replace(",", ".", $preco_convertido);
            $this->preco = $preco_convertido;
          }
          else
          {
            $this->preco = $preco;
          }
    }

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

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

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

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

    public function getCor()
    {
        return $this->cor;
    }

    public function setCor($cor)
    {
        $this->cor = $cor;
    }


    public function getTamanho()
    {
        return $this->tamanho;
    }

    public function setTamanho($tamanho)
    {
        $this->tamanho = $tamanho;
    }

    public function getQuantidade()
    {
    return $this->quantidade;
    }
    public function setQuantidade($quantidade)
    {
    $this->quantidade = $quantidade;
    }

    public function getAtualizado()
    {
    return $this->atualizado;
    }
    public function setAtualizado($atualizado)
    {
    $this->atualizado= $atualizado;
    }

    public function getFoto()
    {
        return $this->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 = 300;
            // Altura máxima em pixels
            $altura = 500;
            // Tamanho máximo do arquivo em bytes
            $tamanho = 100000;
            // 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("fotos") )
                    mkdir("fotos", "0777", true);

                // Caminho de onde ficará a imagem
                $caminho_imagem = "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;
        }
    }
}

O "problema" ficou na linha:

if (!empty($foto["name"]))

Ele lê a linha e entende, que está vazio, como está negando ele não entra no if e não retorna nada pois não há tratamento para o if.

Você terá que rever essa instrução, tive que forçar um pouco para simular, mas faz um teste, coloca um else e faz um tratamento de erro.

Espero ter ajudado.

Obrigado Joel. Deixa eu te explicar melhor. esse if (!empty($foto["name"])) está na classe produto fazendo o processo de setFoto ou seja, trata a foto e depois envia a foto para o arquivo e o caminho para o BD. O inverso que é o que eu preciso (buscar a foto e exibir), é executado pelo getFoto(). Talvez por isso, quando você debugou ele disse que não existe nada no (!empty foto) porque aí diz assim: Se não (!) estiver vazio, execute, como ele não tem nada a executar porque está vazio ele não faz nada. Essa minha solução que preciso pode ser simples mas eu não consigo enxergar, parece incrivel isso..... De qualquer forma muito obrigado. Valeu pelo esforço de você ter tentado me ajudar, se tiver mais alguma idéia poste por favor. Abraços!!

Oi Sérgio, quando você faz o select você não utiliza o setFoto para colocar o retorno do banco?

$produto->setFoto($array['foto']);

Tudo bem que você está utilizando o getFoto, porém quando ele vem do banco você utiliza do setFoto. A solução talvez seria algo assim:

public function carregaCaminhoFoto($foto)  {
        $this->foto = $foto;
}
$produto->carregaCaminhoFoto($array['foto']);

Ou algo parecido com isso, pois fiz todo meu teste baseando que a função listaProdutos é a que está carregando os dados do banco.

Boa ideia Joel, faz sentido. Fiz as alterações e fiz alguns testes. Com estas alterações o caminho do BD já apareceu quando chamei no lista produto. Ele trouxe o caminho da foto quando chamo o getFoto na listagem.

<td><?=$produto->getFoto() ?></td>

Funcionou.

Mas a foto continua não aparecendo no formulario da pagina produto-altera-adiciona

<div class="form-group">
        <label>Imagem do Produto:</label>
            <img src="fotos/<?=$produto->getFoto() ?>.jpg">

Ele não traz o caminho da foto para localizar na pasta no link consultado fica assim:

The requested URL /beladuquesa/sys/fotos/.jpg was not found on this server.

somente aparece a extensão.

Oi Sérgio, verifica no código fonte da página já gerada se ele montou certo o caminho, pode ser que ficou com algum espaço ou se no banco você salvou a extensão e vc está adicionando a extensão novamente foca alto tipo foto.jpg.jpg

Oi Joel, ele não traz o caminho da foto para localizar na pasta no link consultado fica assim:

The requested URL /beladuquesa/sys/fotos/.jpg was not found on this server.

somente aparece a extensão.

segue codigo fonte:

Imagem do Produto:
<div class="form-group">
        <label>Imagem do Produto:</label>
            <img src="fotos/.jpg">
    </div>

Oi, eu não tinha visto o complemento do email.

Como está a sua função buscaProduto?

Oi Joel está assim:

function buscaProduto($conexao, $id) {
$query = "select p.*, c.nome as categoria_nome, co.nome as cor_nome, t.nome as tamanho_nome
from produtos p 
inner join categorias c on(p.categoria_id = c.id)
inner join cor co on(p.cor_id = co.id) 
inner join tamanho t on(p.tamanho_id = t.id)
where p.id = {$id}"; 

$resultado = mysqli_query($conexao, $query);
$array = mysqli_fetch_assoc($resultado);

$produto = new Produto();
$produto->setId( $array['id']);
$produto->setNome( $array['nome']);
$produto->setPreco( $array['preco']);
$produto->setCodigo( $array['codigo']);
$produto->setDescricao( $array['descricao']);
$produto->setCor(new Cor());
$produto->getCor()->setId( $array['cor_id']);
$produto->getCor()->setNome( $array['cor_nome']);
$produto->setTamanho(new Tamanho());
$produto->getTamanho()->setId( $array['tamanho_id']);
$produto->getTamanho()->setNome( $array['tamanho_nome']);
$produto->setCategoria(new Categoria());
$produto->getCategoria()->setId( $array['categoria_id']);
$produto->getCategoria()->setNome( $array['categoria_nome']);
$produto->setFoto( $array['foto']);


return $produto;

}
solução!

Bom, a buscaProduto está na mesma situação da listaProdutos

$produto->setFoto( $array['foto']);

creio que fazendo a mesma alteração vai funcionar, o detalhe é que a página sua está utilizando a buscaProduto e não a listaProdutos, por isso que no teste deu certo mas na hora de ver na página não funcionou.

Isso mesmo !!! Funcionou que foi uma beleza Joel, show !!!! Muito obrigado!!!

Uma ultima alteração que fiz foi na hora de exibir a foto, tirando a extensão ficando assim:

<div class="form-group">
        <label>Imagem do Produto:</label>
            <img src="fotos/<?=$produto->getFoto() ?>">
    </div>

Não sei como mas assim ele entende e busca a foto certa independentemente da extensão do arquivo.

abraços e muito obrigado

Legal, que bom que deu certo, depois da uma analisada com calma no código, tenta utilizar uma ferramenta de debug, fica bem mais claro.

:)

Vou sim muito obrigado Joel.