patcunha Posted December 5, 2021 at 03:46 PM Report Share #624800 Posted December 5, 2021 at 03:46 PM Preciso de ajuda! Não consigo que as operações de Inset e Update funcionem. Este é o código dessa parte no ficheiro registo.php que contém o formulário de registo de produtos a guardar na tabela inventário. Verifiquei que as operações são detetadas corretamente, mas quando carrego no botão submeter não acontece nada (não insere na tabela nem faz o redirect). <?php if($_POST && count($validacao)!=0) { $con = ligaBD(); echo 'Ligado'; //na situação da operação INSERT if($operacao=="insert") { $stm = $con->prepare("INSERT into inventario values(0,?,?,?,?,?,?,?,?,?,?)"); echo 'Prepared and binding parameters<br>'; // verificar se a execução do código chegou a este ponto date_default_timezone_set("Europe/Lisbon"); $stm->bind_param("sissssdss", $_POST["nome_reg"], $_POST["quant_reg"], $_POST["tipo_reg"], $_POST["estado_reg"], $_POST["sala_reg"], $_POST["obs_reg"], $_POST["loja_reg"],$_POST["preco_reg"], $_POST["link_reg"], $_POST["data_reg"]); echo 'Ready to execute<br>';// verificar se a execução do código chegou a este ponto if($stm->execute()) { header("Location: mostra_reg.php"); }else { echo '<script>alert("Ocorreu um erro a inserir o registo.")</script>'; header("Refresh: 5; url=mostra_reg.php"); } $stm->close(); } //na situação da operação UPDATE if($operacao=="update") { $stm = $con->prepare("UPDATE inventario set nome_reg=?, quant_reg=?, tipo_reg=?, estado_reg=?, sala_reg=?, obs_reg=?, loja_reg=?, preco_reg=?, link_reg=?, data_reg=? WHERE id_reg=?"); echo 'Prepared and binding parameters<br>';// verificar se a execução do código chegou a este ponto date_default_timezone_set("Europe/Lisbon"); $stm->bind_param("sissssdssi", $_POST["nome_reg"], $_POST["quant_reg"], $_POST["tipo_reg"], $_POST["estado_reg"], $_POST["sala_reg"], $_POST["obs_reg"], $_POST["loja_reg"],$_POST["preco_reg"], $_POST["link_reg"], date("Y-m-d", strtotime($_POST["data_reg"])), $_GET["id"]); echo 'Ready to execute<br>';// verificar se a execução do código chegou a este ponto if($stm->execute()) { header("Location: mostra_reg.php"); }else { echo '<script>alert("Ocorreu um erro a atualizar o registo.")</script>'; header("Refresh: 5; url=mostra_reg.php"); } $stm->close(); } /*$con->close();*/ } Os campos (com os tipos de dados) da tabela inventário são estes: Tenho o bind_param bem escrito? É que não passa daqui para as linhas de baixo! No caso do Insert: $stm->bind_param("sissssdss", $_POST["nome_reg"], $_POST["quant_reg"], $_POST["tipo_reg"], $_POST["estado_reg"], $_POST["sala_reg"], $_POST["obs_reg"], $_POST["loja_reg"],$_POST["preco_reg"], $_POST["link_reg"], $_POST["data_reg"]); No caso do update: $stm->bind_param("sissssdssi", $_POST["nome_reg"], $_POST["quant_reg"], $_POST["tipo_reg"], $_POST["estado_reg"], $_POST["sala_reg"], $_POST["obs_reg"], $_POST["loja_reg"],$_POST["preco_reg"], $_POST["link_reg"], date("Y-m-d", strtotime($_POST["data_reg"])), $_GET["id"]); Link to comment Share on other sites More sharing options...
patcunha Posted December 7, 2021 at 11:56 AM Author Report Share #624844 Posted December 7, 2021 at 11:56 AM Já resolvi uma parte do problema, mas agora julgo que a parte do formulário que tem os botões rádio está mal, pois só consigo que funcione se a 1ª opção estiver marcada (com as outras dá erro). require_once '../ligacao.php'; require_once '../testa_sessao.php'; if (testaSessao()) { if ($con = ligaBD()) { //quando faz o update, leva na url o id if(isset($_GET["id"])) { $operacao = "update"; $con = ligaBD(); $stm = $con->prepare("SELECT * from inventario WHERE id_reg = ?"); $stm->bind_param("i", $_GET["id"]); $stm->execute(); $res = $stm->get_result(); $row = $res->fetch_assoc(); $con->close(); } else $operacao = "insert"; //verificar se o formulário já foi enviado if ($_SERVER["REQUEST_METHOD"] == "POST") { require("../validacao.php"); $validacao = validarFormulario(); } Esta é a parte dos botões rádio do formulário: <label>Estado: <input name="estado_reg" type="radio" value="Bom" <?php if($_POST){ if($_POST["estado_reg"]=="Bom") echo "checked"; }elseif ($operacao=="update") if($row["estado_reg"]=="Bom") echo "checked"; ?> > Bom <input name="estado_reg" type="radio" value="Sinais de uso" <?php if($_POST){ if($_POST["estado_reg"]=="Sinais de uso") echo "checked"; }elseif ($operacao=="update") if($row["estado_reg"]=="Sinais de uso") echo "checked"; ?> > Sinais de uso <input name="estado_reg" type="radio" value="Não funciona" <?php if($_POST){ if($_POST["estado_reg"]=="Não funciona") echo "checked"; }elseif ($operacao=="update") if($row["estado_reg"]=="Não funciona") echo "checked"; ?> > Não funciona </label> <?php if($_POST && count($validacao)!=0) { $con = ligaBD(); //na situação da operação INSERT if($operacao=="insert") { $stm = $con->prepare("INSERT into inventario values(0,?,?,?,?,?,?,?,?,?)"); date_default_timezone_set("Europe/Lisbon"); $stm->bind_param("sssssssss", $_POST["nome_reg"], $_POST["quant_reg"], $_POST["tipo_reg"], $_POST["estado_reg"], $_POST["obs_reg"], $_POST["loja_reg"],$_POST["preco_reg"], $_POST["link_reg"], $_POST["data_reg"]); if($stm->execute()) { echo '<script>alert("Registo inserido com sucesso.")</script>'; header("Refresh: 5; url=mostra_reg.php"); }else { echo '<script>alert("Ocorreu um erro a inserir o registo.")</script>'; header("Refresh: 5; url=mostra_reg.php"); } $stm->close(); } //na situação da operação UPDATE if($operacao=="update") { $stm = $con->prepare("UPDATE inventario set nome_reg=?, quant_reg=?, tipo_reg=?, estado_reg=?, obs_reg=?, loja_reg=?, preco_reg=?, link_reg=?, data_reg=? WHERE id_reg=?"); date_default_timezone_set("Europe/Lisbon"); $stm->bind_param("sssssssssi", $_POST["nome_reg"], $_POST["quant_reg"], $_POST["tipo_reg"], $_POST["estado_reg"], $_POST["obs_reg"], $_POST["loja_reg"],$_POST["preco_reg"], $_POST["link_reg"], $_POST["data_reg"], $_GET["id"]); if($stm->execute()) { echo '<script>alert("Registo atualizado com sucesso.")</script>'; header("Refresh: 2; url=mostra_reg.php"); }else { echo '<script>alert("Ocorreu um erro a atualizar o registo.")</script>'; header("Refresh: 2; url=mostra_reg.php"); } $stm->close(); } /*$con->close();*/ } Entretanto se não usar outro valor que não o Bom (1ª opção), funciona mas não faz o redirect (nem no update nem no insert) --> código acima O meu trabalho final num servidor externo: http://inventario.rf.gd/index.php login: admin pwd: 123456 O que pode estar mal? Link to comment Share on other sites More sharing options...
Ivo Vicente Posted February 15, 2022 at 10:22 PM Report Share #625418 Posted February 15, 2022 at 10:22 PM (edited) Viva, Já passou um tempo desta pergunta, possivelmente já foi resolvido, em todo o caso o que me salta logo à vista que está mal é a construção dos statements com o bindParam Em resumo existem duas maneiras de escrever os queries a executar pelo PDO, ou usar ponto de interrogação para definir posições ou usar uma chave de texto exemplo :columnName // Com placeholders de posição $stmt->prepare("INSERT INTO table (column1, column2) VALUES (?, ?)"); // Com placeholder com nomes $stmt->prepare("INSERT INTO table (column1, column2) VALUES (:column1, :column2)"); Depois para atribuir os valores via bindParams vai depender da maneira como foi escrito o código // Para placeholders de posição onde: // - primeiro parametro é a posição do ? na query // - segundo paramentro é a variavel com o valor a subtituir // - terceiro parametro é o tipo de valor esperado (https://www.php.net/manual/en/pdo.constants.php) $stmt->bindParam(1, $column1, PDO::PARAM_INT); // Para placeholders com chave, a mesma regra mas com o valor da chave $stmt->bindParam(":column1", $column1, PDO::PARAM_INT); // Alternativa é possivel ainda passar no metodo a chaves e valores sem usar o bindParam $stmt->execute( ["column1"=> 1, "column2" => "Name 2"] ); Documentação util https://www.phpdelusions.net/pdo https://www.php.net/manual/en/book.pdo.php https://www.php.net/manual/en/pdostatement.bindparam.php https://www.php.net/manual/en/pdo.constants.php Edited February 15, 2022 at 10:24 PM by Ivo Vicente Feito é melhor que perfeito Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now