Jump to content

Erro no update e insert


patcunha

Recommended Posts

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:

Captura-de-ecra-2021-12-04-a-s-15-50-47.

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

 

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

  • 2 months later...

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 by Ivo Vicente

Feito é melhor que perfeito

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.