Doubt when using ON DUPLICATE KEY UPDATE

3

I'm trying to use ON DUPLICATE KEY UPDATE in my query and for some reason is not working.

I remove the ID and do not use ON DUPLICATE KEY UPDATE : the values are saved in a new line in the bank.

Example:

$sql = "INSERT INTO estoque ( cod_produto, dsc_produto, preco_produto, qtd_estoque, qtd_limitador) VALUES ('".$cod_produto."', '".$dsc_produto."', '".$preco_produto."', '".$qtd_estoque."', '".$qtd_limitador."');

Failed code:

if (isset($_POST["submit"])) {

            $id = $_GET[id];
            $cod_produto = $_POST['cod_produto'];
            $dsc_produto = $_POST['dsc_produto'];
            $preco_produto = $_POST['preco_produto'];
            $qtd_estoque = $_POST['qtd_estoque'];
            $qtd_limitador = $_POST['qtd_limitador'];

            $sql = "INSERT INTO estoque (id, cod_produto, dsc_produto, preco_produto, qtd_estoque, qtd_limitador) VALUES ('".$id."','".$cod_produto."', '".$dsc_produto."', '".$preco_produto."', '".$qtd_estoque."', '".$qtd_limitador."') ON DUPLICATE KEY UPDATE (cod_produto=$cod_produto, dsc_produto=$dsc_produto)";

            $mysql = mysqli_query($conexao,$sql);
                if (!mysql) {
                    die('Error: ' . mysqli_error()); 
                }

                else {
                    echo "Feito";

                }

echo $id;
}

It does not display any errors, it just does not save any values in the database.

    
asked by anonymous 14.09.2015 / 17:50

3 answers

3

I had already looked at the link and it did not help me much, but I ended up finding out that the error was about what I called the strings.

After the ON DUPLICATE KEY UPDATE I simply call the strings when I should use '. $ string.' ', so it was not working.

$sql = "INSERT INTO estoque (id, cod_produto, dsc_produto, preco_produto, qtd_estoque, qtd_limitador) VALUES ('".$id."','".$cod_produto."', '".$dsc_produto."', '".$preco_produto."', '".$qtd_estoque."', '".$qtd_limitador."') ON DUPLICATE KEY UPDATE (cod_produto=$cod_produto, dsc_produto=$dsc_produto)"

Also, with a little more research I saw that using an UPDATE instead of ON DUPLICATE KEY UPDATE has more perfomance in that case. The second option would be very useful in an import where duplication should be avoided.

In this way, it follows the correct code:

if (isset($_POST["submit"])) {

            $id = $_GET[id];
            $cod_produto = $_POST['cod_produto'];
            $dsc_produto = $_POST['dsc_produto'];
            $preco_produto = $_POST['preco_produto'];
            $qtd_estoque = $_POST['qtd_estoque'];



            $sql = "UPDATE estoque SET cod_produto='".$cod_produto."', dsc_produto='".$dsc_produto."', preco_produto='".$preco_produto."', qtd_estoque='".$qtd_estoque."' WHERE id='".$id."'";

            $mysql = mysqli_query($conexao,$sql);
                if (!mysql) {
                    die('Error: ' . mysqli_error()); 
                }

                else {
                    echo "Feito";

                }

echo $id;
}
    
14.09.2015 / 19:18
0
if (isset($_POST["submit"])) {

    $id = $_GET[id];
    $cod_produto = $_POST['cod_produto'];
    $dsc_produto = $_POST['dsc_produto'];
    $preco_produto = $_POST['preco_produto'];
    $qtd_estoque = $_POST['qtd_estoque'];

    $sql = <<<SQL
        UPDATE estoque 
        SET cod_produto = ?, 
            dsc_produto = ?, 
            preco_produto = ?, 
            qtd_estoque = ? 
        WHERE id = ?;
SQL;
    $stmt = $conexao->prepare($sql);

    if (!$stmt) {
        echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
    }

    // http://php.net/manual/en/mysqli-stmt.bind-param.php#refsect1-mysqli-stmt.bind-param-parameters
    $stmt->bind_param('isdii', $cod_produto, $dsc_produto, $preco_produto, $qtd_estoque)
    $stmt->execute();

    printf("%d linhas alteradas.\n", $stmt->affected_rows);

    $stmt->close();
}

It's just a complement for your site not to suffer SQLInjection, use prepared statements for the connection.

The characters of the parameters are as follows:

  • i : type integer
  • d : type double
  • s : type string
  • b : variable is a blob and will be sent in packets
31.01.2017 / 14:26
0

I think the single quotes are missing from the on duplicate key update.

ON DUPLICATE KEY UPDATE (cod_produto='$cod_produto', dsc_produto='$dsc_produto')"
    
09.11.2018 / 19:43