How to perform the calculation of updating a product’s stock in a table within the PHP code of another table?

Asked

Viewed 58 times

1

My table itens_venda performs two calculations within a PHP code:

  • The first calculation multiplies the price with the quantity of the product in the table itens_venda (That part is OK).
  • The 2nd calculation updates the quantity of products available in the table produto (That part is not OK).

The 1st calculation works perfectly because it affects the table itself, only that the 2nd calculation I do not know how to affect the other table within the PHP code.

That is, make the column quantidade table itens_venda is subtracted by the column quantidade table produto.

Ex: 20(quantidade da tabela produto) - 2(quantidade da tabela itens_venda) = 18 (quantidade da tabela produto atualizada);

Obs: I don’t want the use of Rigger, because it’s less complicated for me.

Tables and their columns

inserir a descrição da imagem aqui

PHP code

<?php  
        
    require_once 'conexao.php'; 
        
    if (isset($_POST['Inserir'])) {
            
        $cd_produto = $_POST['cd_produto'];
        $cd_funcionario = $_POST['cd_funcionario'];
        $cd_cliente = $_POST['cd_cliente'];
        $tipo_pagamento = $_POST['tipo_pagamento'];
        $valor_item = $_POST['valor_item'];
        $quantidade = $_POST['quantidade'];
            
        $valor_total = ($valor_item * $quantidade); // 1º cálculo funciona perfeitamente
        
        $atualiza_quantidade = ($quantidade - $quantidade); // 2º cálculo que não sei como faze-lo funcionar

        try {
                    
            $insercao = "INSERT INTO itens_venda (cd_produto,cd_funcionario,cd_cliente,
            tipo_pagamento,valor_item,quantidade,valor_total,data_venda) 
            VALUES (:cd_produto,:cd_funcionario,:cd_cliente,
            :tipo_pagamento,:valor_item,:quantidade,:valor_total,CURRENT_TIMESTAMP())";
                
            $insere_dados = $conexao->prepare($insercao);
                
            $insere_dados->bindValue(':cd_produto',$cd_produto);
            $insere_dados->bindValue(':cd_funcionario',$cd_funcionario);
            $insere_dados->bindValue(':cd_cliente',$cd_cliente);
            $insere_dados->bindValue(':tipo_pagamento',$tipo_pagamento);
            $insere_dados->bindValue(':valor_item',$valor_item);
            $insere_dados->bindValue(':quantidade',$quantidade);
            $insere_dados->bindValue(':valor_total',$valor_total);
                
            $insere_dados->execute();
            
            } catch (PDOException $falha_insercao) {
                echo "A insercão não foi feita".$falha_insercao->getMessage();
        }
    }
?>
  • Example: Two products sold were registered in the column quantidade table itens_venda which will be subtracted by the column quantidade table produto which has 20 products, that is to say 20 - 2 = 18.

  • Search by Trigger. https://dev.mysql.com/doc/refman/8.0/en/triggers.html

  • @anonimo I’m wanting to do this without help of triggers.

  • @anonimo I had many problems and lost hours with the triggers, so the way they recommended me about doing these operations within PHP were welcomed.

1 answer

1


Since you want to make more than one change "atomically" you need to use a transaction.

Copying your original code and adding a transaction:

try {
    $conexao->beginTransaction();

    $insercao = "INSERT INTO itens_venda (cd_produto,cd_funcionario,cd_cliente,
    tipo_pagamento,valor_item,quantidade,valor_total,data_venda) 
    VALUES (:cd_produto,:cd_funcionario,:cd_cliente,
    :tipo_pagamento,:valor_item,:quantidade,:valor_total,CURRENT_TIMESTAMP())";
        
    $insere_dados = $conexao->prepare($insercao);
        
    $insere_dados->bindValue(':cd_produto',$cd_produto);
    $insere_dados->bindValue(':cd_funcionario',$cd_funcionario);
    $insere_dados->bindValue(':cd_cliente',$cd_cliente);
    $insere_dados->bindValue(':tipo_pagamento',$tipo_pagamento);
    $insere_dados->bindValue(':valor_item',$valor_item);
    $insere_dados->bindValue(':quantidade',$quantidade);
    $insere_dados->bindValue(':valor_total',$valor_total);
        
    $insere_dados->execute();
    
    // Atualiza estoque
    $queryAtualizaEstoque = "UPDATE produto SET quantidade = quantidade - :quantidade_venda WHERE cd_produto = :cd_produto";

    $atualizaEstoque = $conexao->prepare($queryAtualizaEstoque);

    $atualizaEstoque->bindValue(':cd_produto', $cd_produto);
    $atualizaEstoque->bindValue(':quantidade_venda', $quantidade);
    
    $atualizaEstoque->execute();
    
    $conexao->commit();
}
catch (PDOException $falha_insercao) {
    $db->rollback(); // desfaz qualquer alteração dentro da transação
    echo "A insercão não foi feita".$falha_insercao->getMessage();
}
  • I can use beginTransaction(); in a table with 3 changes (1 native table change and 2 changes in other tables?

  • @tvidas worked right, thank you I was unaware of the use of beginTransaction(),commit() and rollback().

  • Yes, as many as you need. The transaction starts in Begin transaction and ends in commit OR rollback, when any change is reversed.

  • I recommend that you read about what is a transaction and problems it can cause (such as Locks and Dead Locks). But overall, to do this kind of operation will not have any problem.

Browser other questions tagged

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