Error in PHP code of "Invalid Parameter number" in sales code that must restore or remove the quantity of products in another table

Asked

Viewed 140 times

-1

My code involves updating a PHP sale should perform two actions when updated:

  • Make the total calculation of the sale in the table itens_venda(if the quantity column is changed, a recalculation is required. STATUS: Executes)
  • Reset quantity or remove from table produto (STATUS: Does not execute).

I will explain with an example:

  • There is a quantity of 15 products of a table record produto.

inserir a descrição da imagem aqui

  • And a quantity of 5 products on the table itens_venda.

inserir a descrição da imagem aqui

  • Case to quantity of 5 was changed to a lower value of 2 the 3 products would return to the table record produto, getting the total of 18 products instead of 15.

inserir a descrição da imagem aqui

  • And the table itens_venda register 2 products sold instead of 5.

inserir a descrição da imagem aqui

  • Case to quantity of 5 was changed to a higher value of 7 there would be a withdrawal of 2 more products from the table record produto, getting the total of 13 products instead of 15.

inserir a descrição da imagem aqui

  • And the table itens_venda register 7 products sold instead of 5.

inserir a descrição da imagem aqui

Only if the following mistake happened:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
Linha do erro: $quantidade_produto->execute();
  • Form to update the sale
<form method="POST">
    <p> ID item venda:
    <select name="cd_itens_venda" required="">
            <option value=""> </option>
            <?php
                foreach ($resultado_vendas as $valor) {
                    echo "<option value='{$valor['cd_itens_venda']}'>{$valor['cd_itens_venda']}</option>";
                }
            ?>
        </select>
        </p>

        <p> ID produto:
            <select name="cd_produto" required="">
                <option value=""> </option>
                <?php
                    foreach ($resultado_produto as $v1) {
                        echo "<option value='{$v1['cd_produto']}'>{$v1['nome']}</option>";
                    }
                ?>
            </select>
        </p>

        <p> ID funcionário:
            <select name="cd_funcionario" required="">
                <option value=""> </option>
                <?php
                    foreach ($resultado_funcionario as $v2) {
                        echo "<option value='{$v2['cd_funcionario']}'>{$v2['nome']}</option>";
                    }
                ?>
            </select>
        </p>

        <p> ID cliente:
            <select name="cd_cliente" required="">
                <option value=""> </option>
                <?php
                    foreach ($resultado_cliente as $v3) {
                        echo "<option value='{$v3['cd_cliente']}'>{$v3['nome']}</option>";
                    }
                ?>
            </select>
        </p>
        <p> Pagamento:
            <select name="tipo_pagamento" required="">
                <option value=""> </option>
                <option value="Pagamento á vista">Pagamento á vista</option>
            </select>
        </p>
        <p> Valor do item: <input type="text" name="valor_item" step="0.01" required=""> </p>
        <p> Quantidade: <input type="number" name="quantidade" size="30" required=""> </p>
        <button name="Atualizar"> Atualizar item de venda </button>
</form>
  • Full PHP code
<?php
    require_once 'conexao.php'; 

    if(isset($_POST['Atualizar'])){
        // Especifica a variável
        $cd_itens_venda = $_POST['cd_itens_venda'];
        $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'];
        // Cálcula o valor total da compra multiplicando o valor com a quantidade
        $valor_total = ($valor_item * $quantidade);
        try {
            // Tabela ITENS_VENDA
            $conexao->beginTransaction();
            $atualizacao = "UPDATE itens_venda SET cd_produto = :cd_produto, 
            cd_funcionario = :cd_funcionario, cd_cliente = :cd_cliente, 
            tipo_pagamento = :tipo_pagamento, valor_item = :valor_item, 
            quantidade = :quantidade, valor_total = :valor_total WHERE cd_itens_venda = :cd_itens_venda";
            $atualiza_dados = $conexao->prepare($atualizacao);
            $atualiza_dados->bindValue(':cd_itens_venda',$cd_itens_venda);
            $atualiza_dados->bindValue(':cd_produto',$cd_produto);
            $atualiza_dados->bindValue(':cd_funcionario',$cd_funcionario);
            $atualiza_dados->bindValue(':cd_cliente',$cd_cliente);
            $atualiza_dados->bindValue(':tipo_pagamento',$tipo_pagamento);
            $atualiza_dados->bindValue(':valor_item',$valor_item);
            $atualiza_dados->bindValue(':quantidade',$quantidade);
            $atualiza_dados->bindValue(':valor_total',$valor_total);
            $atualiza_dados->execute();

            // Tabel PRODUTO
            // Query que faz o cálculo da diferença do produto atualizado
            $nova_quantidade = "UPDATE itens_venda SET quantidade = quantidade - :quantidade 
            WHERE cd_itens_venda = :cd_itens_venda";
            // Query que faz a busca do registro do produto para fazer a reposição
            $procurar_produto = "SELECT quantidade FROM produto WHERE cd_produto = :cd_produto";
            // Condicional para saber se vai tirar ou adicionar mais produtos
            if ($nova_quantidade < $quantidade) {
                // Haverá retirada de produto (caso a nova quantidade seja menor que a antiga)
                $calculo_reposicao = "UPDATE produto SET quantidade = '$procurar_produto' - quantidade WHERE cd_produto = :cd_produto";
            }else{
                // Haverá reposição do produto (caso a nova quantidade seja maior que a antiga)
                $calculo_reposicao = "UPDATE produto SET quantidade = '$procurar_produto' + quantidade WHERE cd_produto = :cd_produto";
            }
            $quantidade_produto = $conexao->prepare($calculo_reposicao);
            $quantidade_produto->bindValue(':cd_itens_venda',$cd_itens_venda);
            $quantidade_produto->bindValue(':cd_produto',$cd_produto);
            $quantidade_produto->bindValue(':quantidade',$quantidade);
            $quantidade_produto->execute(); // Linha do erro
            $conexao->commit();
                
        } catch (PDOException $falha_atualizacao) {
            echo "A atualização não foi feita".$falha_atualizacao->getMessage();
        }
    }
    // Query que seleciona chave de itens_venda
    $seleciona_vendas = $conexao->query("SELECT cd_itens_venda FROM itens_venda");
    // Resulta em uma matriz
    $resultado_vendas = $seleciona_vendas->fetchAll();  

    // Query que seleciona chave e nome do produto
    $seleciona_produto = $conexao->query("SELECT cd_produto, nome FROM produto");
    // Resulta em uma matriz
    $resultado_produto = $seleciona_produto->fetchAll();

    // Query que seleciona chave e nome do funcionario
    $seleciona_funcionario = $conexao->query("SELECT cd_funcionario, nome FROM funcionario");
    // Resulta em uma matriz
    $resultado_funcionario = $seleciona_funcionario->fetchAll();
        
    // Query que seleciona chave e nome do cliente
    $seleciona_cliente = $conexao->query("SELECT cd_cliente, nome FROM cliente");
    // Resulta em uma matriz
    $resultado_cliente = $seleciona_cliente->fetchAll();    
?>
  • 1

    Regarding your question, the parameters of the query are not set correctly, but this occurs because you are confusing what is actually a query. Here if ($nova_quantidade < $quantidade), for example, vc is comparing a string with what is sent via post. The same error happens other times, such as in the assignment of $calculo_reposicao. I haven’t even looked at the rest because I probably need to redo everything...

  • This error happens when there is a parameter more or less in the query, in the update

4 answers

0


Invalid parameter number - the error means that there are a number of invalid parameters between Binds and SQL

The variables $procurar_produto and $nova_quantidade should return something similar to:

$search_product: SELECT quantidade FROM produto WHERE cd_produto = :cd_produto

$nova_quantity: UPDATE itens_venda SET quantidade = quantidade - :quantidade WHERE cd_itens_venda = :cd_itens_venda

what is not the desired

Comparing $nova_quantidade < $quantidade will always fall into the else of probation

"UPDATE produto SET quantidade = '$procurar_produto' + quantidade WHERE cd_produto = :cd_produto";

and replacing

$procurar_produto for SELECT quantidade FROM produto WHERE cd_produto = :cd_produto

should generate a query like this

UPDATE produto SET quantidade = 'SELECT quantidade FROM produto WHERE cd_produto = :cd_produto' + quantidade WHERE cd_produto = :cd_produto

which will perform absolutely nothing.



Faced with such problems I have made the proper corrections and I believe it will work out contentedly and that you will tell me.

The code is commented

<?php

   require_once 'conexao.php';

    if(isset($_POST['Atualizar'])){
        // Especifica a variável
        $cd_itens_venda = $_POST['cd_itens_venda'];
        $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'];
        // Cálcula o valor total da compra multiplicando o valor com a quantidade
        $valor_total = ($valor_item * $quantidade);

        
        try {
        
            // Quantidade inicial na tabela itens_venda
            $procurar_produto = "SELECT quantidade FROM itens_venda WHERE cd_produto = :cd_produto";
            $busca_registro = $conexao->prepare($procurar_produto);
            $busca_registro->bindValue(':cd_produto',$cd_produto);
            $busca_registro->execute();
            $linha = $busca_registro->fetch(PDO::FETCH_ASSOC);
            $quantidade_antiga = $linha['quantidade'];        
        
        
            // Tabela ITENS_VENDA
            $conexao->beginTransaction();
            $atualizacao = "UPDATE itens_venda SET cd_produto = :cd_produto, 
            cd_funcionario = :cd_funcionario, cd_cliente = :cd_cliente, 
            tipo_pagamento = :tipo_pagamento, valor_item = :valor_item, 
            quantidade = :quantidade, valor_total = :valor_total WHERE cd_itens_venda = :cd_itens_venda";
            $atualiza_dados = $conexao->prepare($atualizacao);
            $atualiza_dados->bindValue(':cd_itens_venda',$cd_itens_venda);
            $atualiza_dados->bindValue(':cd_produto',$cd_produto);
            $atualiza_dados->bindValue(':cd_funcionario',$cd_funcionario);
            $atualiza_dados->bindValue(':cd_cliente',$cd_cliente);
            $atualiza_dados->bindValue(':tipo_pagamento',$tipo_pagamento);
            $atualiza_dados->bindValue(':valor_item',$valor_item);
            $atualiza_dados->bindValue(':quantidade',$quantidade);
            $atualiza_dados->bindValue(':valor_total',$valor_total);
            $atualiza_dados->execute();

            // Tabel PRODUTO
            // Query que faz o cálculo da diferença do produto atualizado
            
            /* #########  serve pra nada pode excluir #######################################
            $nova_quantidade = "UPDATE itens_venda SET quantidade = quantidade - :quantidade 
            WHERE cd_itens_venda = :cd_itens_venda";
            ############################################################################### */           
            
            
            // Condicional para saber se vai tirar ou adicionar mais produtos
            // fiz algumas correções nessa lógica e acho que dá para entender

            if ($quantidade < $quantidade_antiga) {
                // Haverá reposição do produto (caso a nova quantidade seja menor que a antiga)
                $calculo_reposicao = "UPDATE produto SET quantidade = quantidade + ('$quantidade_antiga'-:quantidade) WHERE cd_produto = :cd_produto";
            }else{
                // Haverá retirada de produto (caso a nova quantidade seja maior que a antiga)
                $calculo_reposicao = "UPDATE produto SET quantidade = quantidade - (:quantidade-'$quantidade_antiga') WHERE cd_produto = :cd_produto";
            }
            
            $quantidade_produto = $conexao->prepare($calculo_reposicao);

    /* linha indevida ################################################ */
    //$quantidade_produto->bindValue(':cd_itens_venda',$cd_itens_venda);
    /* ############################################################### */

            $quantidade_produto->bindValue(':cd_produto',$cd_produto);
            $quantidade_produto->bindValue(':quantidade',$quantidade);
            $quantidade_produto->execute();
            $conexao->commit();
              
        } catch (PDOException $falha_atualizacao) {
            echo "A atualização não foi feita".$falha_atualizacao->getMessage();
        }
    }
    // Query que seleciona chave de itens_venda
    $seleciona_vendas = $conexao->query("SELECT cd_itens_venda FROM itens_venda");
    // Resulta em uma matriz
    $resultado_vendas = $seleciona_vendas->fetchAll();  

    // Query que seleciona chave e nome do produto
    $seleciona_produto = $conexao->query("SELECT cd_produto, nome FROM produto");
    // Resulta em uma matriz
    $resultado_produto = $seleciona_produto->fetchAll();

    // Query que seleciona chave e nome do funcionario
    $seleciona_funcionario = $conexao->query("SELECT cd_funcionario, nome FROM funcionario");
    // Resulta em uma matriz
    $resultado_funcionario = $seleciona_funcionario->fetchAll();
        
    // Query que seleciona chave e nome do cliente
    $seleciona_cliente = $conexao->query("SELECT cd_cliente, nome FROM cliente");
    // Resulta em uma matriz
    $resultado_cliente = $seleciona_cliente->fetchAll();    

?>

In the case of delete it is as follows

<?php
require_once 'conexao.php';  
    if(isset($_POST['Deletar'])){
    // Especifica a variável
    $cd_itens_venda = $_POST['cd_itens_venda'];
    try {
            $conexao->beginTransaction();
            // Quantidade inicial na tabela itens_venda
            $procurar_produto = "SELECT cd_produto,quantidade FROM itens_venda WHERE cd_itens_venda = :cd_itens_venda";
            $busca_registro = $conexao->prepare($procurar_produto);
            $busca_registro->bindValue(':cd_itens_venda',$cd_itens_venda);
            $busca_registro->execute();
            $linha = $busca_registro->fetch(PDO::FETCH_ASSOC);
            
            //variaveis a serem usadas no update da tabela produto
            
            $quantidade = $linha['quantidade']; 
            $cd_produto = $linha['cd_produto'];
        
        
        // TABELA ITENS_VENDA
        $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();
       
        // Query que faz a atualização da quantidade de estoque da tabela produto
        $atualiza_quantidade = "UPDATE produto SET quantidade = quantidade + ('$quantidade') WHERE cd_produto = '$cd_produto'";
        $quantidade_produto = $conexao->prepare($atualiza_quantidade);
        $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();      
?> 
  • sale update code is working, plus sale record deletion code is showing an error A remoção não foi feitaThere is already an active transaction

  • Sorry, it was a mistake my two codes work, thank you Leo if my doubts(s) with reward(s) were not closed I would accept your reply as the best.

  • @Vorbbel, the greatest reward is knowing that you were helped and I participated in that joy :-)

  • variable $humility has been successfully declared.

0

Hey, hey, it’s okay?

From what I noticed, the error happens because you are giving bind in tokens that do not exist.

Note that your query variable is like this:

$calculo_reposicao = "UPDATE produto SET quantidade = '$procurar_produto' - quantidade WHERE cd_produto = :cd_produto";

Her only token is:cd_product.

But in the object you’re putting

$quantidade_produto->bindValue(':cd_produto',$cd_produto);
$quantidade_produto->bindValue(':quantidade',$quantidade);

Your error is coming from that quantity variable, which does not exist in the query. try taking this variable and see if it works.

Abs

0

Talk buddy, all right? You’re not passing :cd_itens_sale and :amount in the query $calculus but it’s giving bind in them.

Has amount but is without the : in the query to reference:

[..]SET quantidade = '$procurar_produto' - /*faltam os dois pontos (:) aqui */quantidade WHERE cd_produto[...] 

Just remove these lines:

$quantidade_produto->bindValue(':cd_itens_venda',$cd_itens_venda);
$quantidade_produto->bindValue(':quantidade',$quantidade); //Remova esta linha se não for usar o :quantidade na query $calculo_reposicao.

Note: I do not know if you passed summarized the code but it is missing to execute the two queries of the variables to get the total: $nova_quantity and $search_product

Hugs!

-1

@vorbbel,

It seems to me that there is an error in your question, if you have 15 and were sold a quantity of 5 items and then 3 were withdrawn, being sold only 2, then your stock would be with 13 and not 18 as you say in your question.

About the error, the log informs an sql error where the number of parameters you are passing in execute is not equal to the number of columns in your table... check your sql $calculo_reposicao. Test this query directly in your database and see if it is correct, if it is, then you check if there are any errors in your code relative to the parameters/columns and compare with the result you got directly in the database...

Browser other questions tagged

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