-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
.
- And a quantity of 5 products on the table
itens_venda
.
- 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.
- And the table
itens_venda
register 2 products sold instead of 5.
- 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.
- And the table
itens_venda
register 7 products sold instead of 5.
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();
?>
This answers your question? SQLSTATE[HY093]: Invalid Parameter number Insert problem
– tvdias
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...– tvdias
This error happens when there is a parameter more or less in the query, in the update
– ElvisP