Number of variables that do not match the number of tokens in update code in PHP

Asked

Viewed 25 times

-1

My PHP page it updates all details of a sale, the code of UPDATE affects the table itens_venda of which it is composed of:

  • Table itens_venda (of which I am updating)
CREATE TABLE itens_venda (
  cd_itens_venda INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  cd_produto INT,
  cd_funcionario INT,
  cd_cliente INT,
  tipo_pagamento VARCHAR(30),
  CHECK (tipo_pagamento IN ('Pagamento á vista')),
  valor_item DECIMAL(7,2),
  quantidade INT,
  valor_total DECIMAL(7,2),
  data_venda TIMESTAMP(0),
  FOREIGN KEY (cd_produto) REFERENCES produto (cd_produto),
  FOREIGN KEY (cd_funcionario) REFERENCES funcionario (cd_funcionario),
  FOREIGN KEY (cd_cliente) REFERENCES cliente (cd_cliente)
  ON DELETE CASCADE
  ON UPDATE CASCADE
);

Table details:

  • Column valor_total is automatically filled in by a Trigger which calculates the valor_item * quantidade.
  • Column data_venda mark the current sale time with the function CURRENT_TIMESTAMP().
  • These two columns above do not participate in the update code.

The error in my code is PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

  • Error image

inserir a descrição da imagem aqui

  • PHP code
<?php
        require_once '../conexao/conexao.php'; 
        if(isset($_POST['Atualizar'])){
            $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'];
            try {
                $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 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->execute(); // LINHA EM QUE APONTA O ERRO
                
            } catch (PDOException $falha_atualizacao) {
                echo "A atualização não foi feita".$falha_atualizacao->getMessage();
            }
        }
        $seleciona_vendas = $conexao->query("SELECT cd_itens_venda FROM itens_venda");
        $resultado_vendas = $seleciona_vendas->fetchAll();  

        $seleciona_produto = $conexao->query("SELECT cd_produto, nome FROM produto");
        $resultado_produto = $seleciona_produto->fetchAll();

        $seleciona_funcionario = $conexao->query("SELECT cd_funcionario, nome FROM funcionario");
        $resultado_funcionario = $seleciona_funcionario->fetchAll();

        $seleciona_cliente = $conexao->query("SELECT cd_cliente, nome FROM cliente");
        $resultado_cliente = $seleciona_cliente->fetchAll();        
    ?>
  • typo

1 answer

0


If you do not take care of space your UPDATE will go to space :-)

In your query

tipo_pagamento = : tipo_pagamento,

after the : has a space that is sending your update pro space. So remove the space that your UPDATE will land there in the database.

tipo_pagamento = :tipo_pagamento,

  • Again thanks Leo, I had not realized the space of tipo_pagamento = : tipo_pagamento.

Browser other questions tagged

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