Quantity return error in deleting the registration of a sale in PHP code

Asked

Viewed 87 times

3

I’m having trouble with my code that excludes a record of a sale and that must make the replenishment of the quantity of products in the table of origin.

Example of how this code works:

  • On the table produto has a quantity of 17 products from the same stock.

inserir a descrição da imagem aqui

  • Was sold a quantity of 3 products on the table itens_venda.

inserir a descrição da imagem aqui

  • When deleting the record from the table itens_venda with the quantity of 3 products sold these 3 products return to the register with 17 products from the table produto getting a quantity of 20 products.

inserir a descrição da imagem aqui

The only problem with the code is that does not return the quantity sold when the record of the sale is deleted!.

  • Code of the exclusion form
form method="POST">
    <p> ID item venda:
        <select name="cd_itens_venda" required="">
            <option value=""> </option>
                <?php
                    foreach ($resultado_selecao as $valor) {
                        echo "<option value='{$valor['cd_itens_venda']}'>{$valor['cd_itens_venda']}</option>";
                    }
                ?>
        </select>
    </p>
    <button name="Deletar">Deletar item de venda</button>
</form>
  • Full PHP code
<?php
    require_once 'conexao.php';  
    if(isset($_POST['Deletar'])){
        // Especifica a variável
        $cd_itens_venda = $_POST['cd_itens_venda'];
        try {
            // TABELA ITENS_VENDA
            $conexao->beginTransaction();
            $remove = "DELETE FROM itens_venda WHERE cd_itens_venda = :cd_itens_venda";
            $remocao = $conexao->prepare($remove);
            $remocao->bindValue(':cd_itens_venda',$cd_itens_venda);
            $remocao->execute();

            // TABELA PRODUTO
            // Seleciona o registro do produto a ser excluído
            $seleciona_produto = "SELECT cd_produto FROM itens_venda WHERE cd_itens_venda = :cd_itens_venda";
            // Pega a quantidade de determinado registro de venda tabela itens_venda
            $quantidade_vendida = "SELECT quantidade FROM itens_venda WHERE cd_itens_venda = :cd_itens_venda";
            // Query que faz a atualização da quantidade de estoque da tabela produto
            $atualiza_quantidade = "UPDATE produto SET quantidade = quantidade + '$quantidade_vendida' WHERE cd_produto = '$seleciona_produto'";
            $quantidade_produto = $conexao->prepare($atualiza_quantidade);
            $quantidade_produto->bindValue(':cd_itens_venda',$cd_itens_venda);
            $quantidade_produto->execute(); 
            $conexao->commit();
        } catch (PDOException $falha_remocao) {
            echo "A remoção não foi feita".$falha_remocao->getMessage();
        }
    }
    // Query que seleciona o registro de itens_venda
    $seleciona_nomes = $conexao->query("SELECT cd_itens_venda FROM itens_venda");
    // Resulta em uma matriz
    $resultado_selecao = $seleciona_nomes->fetchAll();      
?>

3 answers

0

You can take the following approach, in your form you ta getting only the product item to be removed, the cd_product is not being used.

When you receive it in PHP in the form post, you can take the product that is being removed, IE, you will know what is the amount of it.

And then remove the product, that way, you’ll already know how much that item sells, without having to use the $cd_produto = $_POST['cd_produto'];

There are other approaches to improve the form in the frontend and treat the sending of it via javascript already sending the amount that is being removed from that item.

  • I understand I’m not using the $cd_produto = $_POST['cd_produto'] and that to make the code work I need to put a field in the form asking for this value (using data request to speed up), you could reformulate your response in PHP code because the idea is that I just use the $cd_itens_venda = $_POST['cd_itens_venda']

  • Try it this way: $cd_itens_venda = intval($_POST['cd_itens_venda']); , bindValue only accepts values, you can try using bindParam()

  • @Ivanferrer reworked the question, runs without appearing the error in the browser, only it does not return the quantity in the table produto when the record in the table itens_venda is excluded.

0

you can define the $cd_produto through a Select, as it did with the quantity, since it is not receiving it via $_POST:

$cd_produto = "SELECT cd_produto FROM itens_venda WHERE cd_itens_venda = :cd_itens_venda";

  • I changed the question based on your answer, runs without appearing the error in the browser, only it does not return the quantity in the table produto when the record in the table itens_venda is excluded.

  • surround variables with parentheses in the main query: $atualiza_quantidade = "UPDATE produto SET quantidade = quantidade + ('$quantidade_vendida') WHERE cd_produto = ('$seleciona_produto')";

0

There’s n errors in your case, you are creating a false query, because you are not taking the value returned from a query, but its string:

That:

$quantidade_vendida = "SELECT quantidade FROM itens_venda WHERE cd_itens_venda = :cd_itens_venda";
            // Query que faz a atualização da quantidade de estoque da tabela produto
            $atualiza_quantidade = "UPDATE produto SET quantidade = quantidade + '$quantidade_vendida' WHERE cd_produto = '$seleciona_produto'";

Will return an invalid SQL query:

UPDATE produto SET quantidade = quantidade + 'SELECT quantidade FROM itens_venda WHERE cd_itens_venda = :cd_itens_venda' WHERE cd_produto = '123';
  • I don’t quite understand.

  • What was not clear to you?! That you are not concatenating given, (your first query returns nothing, look at what you wrote), your query is just a string concatenation and nothing else, so it is giving error.

  • The variable $seleciona_produto has no data, it is just the string of your query.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.