3
respostas

[Sugestão] PHP WEB e MySQL - Correção de código - Inserção de imagem padrão

Acompanhando o instrutor durante o treinamento, pude notar algo no funcionamento do código que falhou: havia, no caso de um novo cadastro de produto (Serenatto Café & Bistrô) uma imagem padrão caso não existisse uma imagem carregada (logo-serenatto.png) que já estava determinada como valor no código para ser sobrescrita.

Porém, ao inserir um código para "rastrear" a inserção de um arquivo no cadastro, pude notar que a imagem "padrão" não era carregada. Para resolver isso, fui atrás da documentação para entender o funcionamento da função php isset e , quando entendido, efetuei a correção.

Deixo abaixo o antes e depois do código para aqueles que se depararam com a mesma questão e não sabem o que fazer.

Trecho de código anterior - cadastrar-produto.php

<?php

require './src/conectBd.php';
require './src/Model/Produto.php';
require './src/Repository/ProductRepository.php';

if(isset($_POST['cadastro'])){
    $produto = new Produto(null, $_POST['tipo'],
    $_POST['nome'],
    $_POST['descricao'],
    $_POST['preco']);

    if(isset($_FILES['imagem'])){
        $produto->setImagem(uniqid().$_FILES['imagem']["name"]);
        move_uploaded_file($_FILES['imagem']['tmp_name'], $produto->getImagemLocal());
    }

    $prodRepository = new ProductRepository($pdo);
    $prodRepository->insProd($produto);
    header('Location: admin.php');
}


?>

Trecho de código posterior - cadastrar-produto.php

<?php

require './src/conectBd.php';
require './src/Model/Produto.php';
require './src/Repository/ProductRepository.php';

if(isset($_POST['cadastro'])){
    $produto = new Produto(null, $_POST['tipo'],
    $_POST['nome'],
    $_POST['descricao'],
    $_POST['preco']);

    if(isset($_FILES['imagem']) !== true){
        $produto->setImagem(uniqid().$_FILES['imagem']["name"]);
        move_uploaded_file($_FILES['imagem']['tmp_name'], $produto->getImagemLocal());
    }

    $prodRepository = new ProductRepository($pdo);
    $prodRepository->insProd($produto);
    header('Location: admin.php');
}


?>

A correção feita foi no teste (if) com o isset procurando o arquivo de imagem que o usuário inseriu ($FILES) onde ele faz um teste (! == true), assim se não for encontrado o arquivo inserido, ele insere a imagem "padrão".

3 respostas

Olá, Wagner. Tudo bem?

Muito obrigado pelo feedback e sugestão. Vou criar uma atividade no curso alertando desse detalhe, quando estava desenvolvendo não percebi isto.

Olhando a sua implementação, eu tentei refazer aqui e nao deu certo quando eu tentei realizar o upload de uma imagem.

Mas você pode tentar realizar esta outra implementação:

    if (isset($_POST['cadastro'])){
        $produto = new Produto(null,
            $_POST['tipo'],
            $_POST['nome'],
            $_POST['descricao'],
            $_POST['preco']
        );
        

        if ($_FILES['imagem']['error'] == UPLOAD_ERR_OK){
            $produto->setImagem(uniqid() . $_FILES['imagem']['name']);
            move_uploaded_file($_FILES['imagem']['tmp_name'], $produto->getImagemDiretorio());
        }

        $produtoRepositorio = new ProdutoRepositorio($pdo);
        $produtoRepositorio->salvar($produto);

        header("Location: admin.php");

    }

No curso, eu cheguei a citar que no array de imagem temos uma chave error e ela indica se houve algum erro através de números, exemplo:

  • Valor: 0; não houve erro, o upload foi bem sucedido.
  • Valor: 4; Nenhum arquivo foi enviado.

Veja mais: Explicando mensagens de erro

Ou seja, podemos utilizar este dado para verificar se foi enviado alguma imagem, logo podemos utilizar a seguinte expressão:

  if ($_FILES['imagem']['error'] == UPLOAD_ERR_OK){
            $produto->setImagem(uniqid() . $_FILES['imagem']['name']);
            move_uploaded_file($_FILES['imagem']['tmp_name'], $produto->getImagemDiretorio());
        }

Em PHP, podemos utilizar essa constante UPLOAD_ERR_OK, que simboliza o valor 0, dessa forma o código fica mais legível.

Realizando estas modificacões, acredito que irá funcionar.

Mais uma vez, obrigado pelo aviso, e logo logo, vou subir uma atividade com mais detalhes.

Wagner, adicionei a atividade: https://cursos.alura.com.br/course/php-mysql-criando-primeira-aplicacao-web/task/135196

Obrigado mais uma vez por avisar :)

Bons estudos!

Olá Vinicius!

Imagine, não há o que agradecer. Minha implementação foi simples pois somente interpretei a resposta dada pelo isset (booleana), ainda tenho muito a aprender e a melhorar!

Acabei de salvar também a sua solução, como não tinha lido ainda muito a documentação e esqueci de alguns passos de cursos anteriores de PHP, não lembrava da instrução UPLOAD_ERR_OK (rsrs).

Agradeço a atenção na resposta e espero ganhar experiência para ajudar ainda mais no que puder! :D