Doubt when using ON DUPLICATE KEY UPDATE

Asked

Viewed 2,295 times

3

I’m trying to use ON DUPLICATE KEY UPDATE in my query and for some reason it’s not working.

I withdraw the ID and no use ON DUPLICATE KEY UPDATE: values are saved in a new line in the database.

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."');

Faulty 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;
}

Shows no error, just do not save any value in the bank.

  • Take a look at this article, it exemplifies the use of ON DUPLICATE KEY UPDATE I had the same problem solved with this article. Good luck http://blog.glaucocustodio.com/2012/10/26/actualizr-registro-existi-senao-inserir-no-mysql-com-on-duplicate-key-update/ See documentation also if necessary https://dev.mysql.com/docrefman/5.0/en/insert-duplicate.html.

3 answers

3

I had already looked at the link and it didn’t help me much, but I found that the mistake was about how I called the strings.

After ON DUPLICATE KEY UPDATE I call the strings simply, 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 search vi that is using an UPDATE instead of ON DUPLICATE KEY UPDATE has more performance in this case. The second option would be very useful in an import where duplication should be avoided.

Thus, 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;
}

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 is just an add-on so that your site does not suffer Sqlinjection, use Prepared statements for the connection.

The characters of the parameters are as follows::

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

0

I think simple quotation marks are missing from on Uplicate key update.

ON DUPLICATE KEY UPDATE (cod_produto='$cod_produto', dsc_produto='$dsc_produto')"

Browser other questions tagged

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