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

Melhorando o tratamento do Botão Excluir do PHP

Boa tarde, A inserção dos produtos no BD MYSQL está OK, a edição dos produtos estão OK e a exclusão direta SEM um tratamento de exclusão (ex. Deseja mesmo excluir esse produto?) está OK.... ao criar um tratamento na hora de exclusão estou tendo problema.

Foi criado trata-botao.php... No listra-produto.php chama a função trata-botao.php, porem na funçao trata-botao.php ao usar uma condição IF e caso ele confirme a exclusão chama a função remove-produto.php...

Porém ele faz o processo de exclusão, confirma que o produto foi excluído com sucesso, mas não excluir da minha lista de Produto e do meu BD.

Gostaria de saber o que eu estou fazendo de errado.

Deixei esse projeto no meu Guithub: https://github.com/flavio-magela/PHP inclusive deixei o SQL no Guithub tb.... Obrigado;

8 respostas

Boa tarde Flávio,

Você já verificou se o ID passado pro SQL está certo?

Luiz boa tarde; Verifiquei o ID, pedi para imprimir na minha msg:

".<?php echo $id; ?>"

e está me mostrando o id correto... Ele informa que o produto foi excluído com sucesso... mas quando vou no BD ou na minha lista o produto não foi excluído.

No form lista-produto.php onde direciona a exclusão direta sem tratamento que coloquei.. é removido o produto normalmente (remove-produto.php no exemplo anterior:

<td>
                <form action="remove-produto.php" method="POST"  >
                    <input  type="hidden" name="id" value="<?= $produto['id']?>">
                    <button tabindex="0" class=" fas fa-trash-alt text-danger btn btn-link  ml-auto titulo" data-toggle="popover"  data-placement="right" data-trigger="focus" title="Excluir" type="Submit" id="btn-excluir"></button>
                </form>

            </td>

) substitui o remove-produto pelo trata-botao.php :

<form action="trata-botao.php" method="POST"  ></br>
                    <input  type="hidden" name="id" value="<?= $produto['id']?>">
                    <button tabindex="0" class=" fas fa-trash-alt text-danger btn btn-link  ml-auto titulo" data-toggle="popover"  data-placement="right" data-trigger="focus" title="Excluir" type="Submit" id="btn-excluir"></button>
                </form>

Onde ele vai e chama outra pagina para fazer o tratamento da msg.

<?php include("cabecalho.php"); 
 include("conecta.php"); 
 include("BD-produto.php");



 $id = $_POST['id']; 

?> 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">


  <div class="modal-dialog modal-md tela" ></br>

    <div class="modal-content">
      <div class="modal-body">
          <?php
        $produtos =buscaProduto($conexao, $id);


        ?>    
            <p> Deseja realmente excluir esse Produto: <?= $id?>?</p>
          </div>
          <div class="modal-footer">

            <div  class="modal-footer"></br>


                <input  type="hidden"  name="id" value="<?= $id['id']?>">

                <a href="remove-produto.php" method="POST" type="button" class="btn btn-danger" >Excluir</a>

                <a href="produto-formulario.php" method="POST" type="button" class="btn btn-info" >Cancelar</a>
              </div>  

            <?php echo $id;  ?>

      </div>
    </div>

  </div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

E... dessa página chama o remove-produto.php onde ele faz a exclusão, mas na verdade não remove o produto. Poderia me informar onde estou pecando, inseri nesse trata-botao.php algumas codificações mas todas deram errado.

Boa tarde.

Esse return está retornando o que?


function removeProduto($conexao, $id){
    $query = "delete from produtos where id = {$id}";
    return mysqli_query($conexao, $query);
}

Essa função remove o produto cujo o Id é informado na hora da exclusão... ou seja quando vou no botão (ícone ) e clico excluir.... O Id que tiver nesse produto, ele vai na $query = "delete from produtos where id = {$id}"; e me retorna a exclusão desse produto. Através dessa chamada da função remove-produto.php:

<?php include("cabecalho.php"); 
 include("conecta.php"); 
 include("BD-produto.php");?>

<?php

 $id = $_POST['id'];

 removeProduto($conexao,$id); 
 header("Location: produto-formulario.php?removido=true");
 die();

 ?>

Mas quando a função remove-produto.php é colocada no lugar do trata-botao.php dentro do lista-produto.php ela faz a exclusão normalmente.

Acredito que seja um erro na minha função trata-botao.php. utilizando essa codificação :

<div  class="modal-footer"></br>

    <input   type="hidden" name="id" value="<?=$produto['id'] ?>"></br>

            <a href="remove-produto.php" method="POST" type="button" class="btn btn-danger" >Excluir</a>

                <a href="produto-formulario.php" method="POST" type="button" class="btn btn-info" >Cancelar</a>
</div>  

Boa tarde Luiz Fernando; Comecei o curso de PHP 2 e fiz algumas melhorias alterações no código lá no Github. Porém a meu Form trata-botão.php está dando erro ainda... coloquei uma mensagem de erro para me ajudar: Erro:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\loja\BD-produto.php on line 33
Erro ao Excluir o Produto no valor de R$ : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1 

Esse erro acontece quando chamo o trata-botao.php dentro do produto-lista.php em vez de chamar o remove-produto.php direto.... quando chamo ele faz a exclusão normalmente.

Com a chamada do trata-botao.php: Erro acontece

<?php //include("cabecalho.php"); 
 include("conecta.php"); 
 include("BD-produto-lista.php");

?> 

<?php// include("BD-produto.php"); retirar o //, caso for usar só a lista separada;?>

 <table class="table table-striped table-bordered">
     <h2 class="fa fa-list-alt titulo" > Lista de Produtos</h2> 
     <tr></br>            
            <th class=" titulo1">Produto</th>
            <th class=" titulo1">Preço</th>
            <th class=" titulo1">Descrição</th>
            <th class=" titulo1">Usado</th>
            <th class=" titulo1">Categoria</th>
            <th class=" titulo1">Alterar</th>
            <th class="titulo1">Excluir</th>

    </tr>    
    <?php
    $produtos =listaProduto2($conexao);
    foreach ($produtos as $produto) :
    ?>        
        <tr>            
            <td ><?= $produto['nome']?></td>
            <td >R$ <?= $produto['preco']?></td>
            <td ><?= substr($produto['descricao'], 0, 40)?></td>
            <td ><?= $produto['usado']?></td>
            <td ><?= $produto['categoria_nome']?></td>    
            <td>
                <form action="alterar-formulario-produto.php" method="POST"  >
                    <input  type="hidden" name="id" value="<?= $produto['id']?>">
                    <button tabindex="0" class=" fa fa-edit btn btn-link  ml-auto titulo2" aria-hidden="true" data-toggle="popover"  data-placement="right" data-trigger="focus" title="alterar" type="Submit" id="btn-alterar"></button>
                </form>

            </td>        
            <td>
                <form action="trata-botao.php" method="POST"  >
                    <input  type="hidden" name="id" value="<?= $produto['id']?>">
                    <button tabindex="0" class=" fas fa-trash-alt text-danger btn btn-link  ml-auto titulo" data-toggle="popover"  data-placement="right" data-trigger="focus" title="Excluir" type="Submit" id="btn-excluir"></button>
                </form>

            </td>

        </tr>
    <?php    
    endforeach

    ?>
</table>

<?php include("rodape.php"); ?>

Com a chamado direta remove-produto.php: Erro não acontece... A exclusão é realizada com sucesso

<?php //include("cabecalho.php"); 
 include("conecta.php"); 
 include("BD-produto-lista.php");

?> 

<?php// include("BD-produto.php"); retirar o //, caso for usar só a lista separada;?>

 <table class="table table-striped table-bordered">
     <h2 class="fa fa-list-alt titulo" > Lista de Produtos</h2> 
     <tr></br>            
            <th class=" titulo1">Produto</th>
            <th class=" titulo1">Preço</th>
            <th class=" titulo1">Descrição</th>
            <th class=" titulo1">Usado</th>
            <th class=" titulo1">Categoria</th>
            <th class=" titulo1">Alterar</th>
            <th class="titulo1">Excluir</th>

    </tr>    
    <?php
    $produtos =listaProduto2($conexao);
    foreach ($produtos as $produto) :
    ?>        
        <tr>            
            <td ><?= $produto['nome']?></td>
            <td >R$ <?= $produto['preco']?></td>
            <td ><?= substr($produto['descricao'], 0, 40)?></td>
            <td ><?= $produto['usado']?></td>
            <td ><?= $produto['categoria_nome']?></td>    
            <td>
                <form action="alterar-formulario-produto.php" method="POST"  >
                    <input  type="hidden" name="id" value="<?= $produto['id']?>">
                    <button tabindex="0" class=" fa fa-edit btn btn-link  ml-auto titulo2" aria-hidden="true" data-toggle="popover"  data-placement="right" data-trigger="focus" title="alterar" type="Submit" id="btn-alterar"></button>
                </form>

            </td>        
            <td>
                <form action="remove-produto.php" method="POST"  >
                    <input  type="hidden" name="id" value="<?= $produto['id']?>">
                    <button tabindex="0" class=" fas fa-trash-alt text-danger btn btn-link  ml-auto titulo" data-toggle="popover"  data-placement="right" data-trigger="focus" title="Excluir" type="Submit" id="btn-excluir"></button>
                </form>

            </td>

        </tr>
    <?php    
    endforeach

    ?>
</table>

<?php include("rodape.php"); ?>

Parece que o meu trata-botao.php está com alguma codificação errada. Pode me ajudar? Obrigado.

pelo trata-botao.php ao chegar no remove-produto.php, o ID está chegando? acho que ele não tá enviando via POST, pois o erro que está dando é por que no mysqli_fetch_assoc() precisa de um parâmetro, e está recebendo vazio provavelmente.

Adendo:

Esse erro é na linha 33 do DB-produto.php

return mysqli_fetch_assoc($resultado);
solução!

Blz.. Fiz uma outra função e deu certo. Obrigado. Chamando do Produto-lista.php chamando essa nova função confirma-exclusao.php

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

 $id = $_POST['id']; 
 $produto = buscaProduto($conexao,$id);

 $categorias = ListaCategorias($conexao);
  //operador ternário
 $usado = $produto ['usado']? "checked='checked'" : ""; //si for usado iqual a true retorna checked se não retorna ""

 if (buscaProduto($conexao,$id)){
?>            

    <div class="modal-dialog modal-md ">
        <div  class="modal-content"></br>
            <div class="modal-body">

                <p> Deseja realmente excluir o Produto: <?= $produto['nome']?> no valor de R$ <?= $produto['preco']?>?</p>
            </div>
               <div class="modal-footer">
                <form action="remove-produto.php" method="POST"  >                        

                    <input   type="hidden" name="id" value="<?=$produto['id'] ?>"></br>

                    <button tabindex="0" class="btn btn-danger" data-trigger="focus" text-danger btn btn-link  ml-auto titulo" data-toggle="popover"  data-placement="right" >Excluir</button>


                    <a href="produto-formulario.php" method="POST" type="button" class="btn btn-info" >Cancelar</a>

                </form>
            </div>
        </div>    
    </div>

<?php
    } else { 
        $msg = mysqli_error($conexao);
        ?>
            <p class = "text-danger"> Erro ao Excluir o Produto <?= $produto['nome']?> no valor de R$ <?= $produto['preco']?>: <?= $msg ?>
        <?php

}
mysqli_close($conexao);

?>