Hello,
je ne parviens pas à faire un insert ou update à l'aide de ON DUPLICATE KEY UPDATE SET
je récupère un array de valeurs noté $obj ainsi que l'$id de mon object, voici mon code :

            $fields = '(';
            $values = '(';
            $value2 = array(); // pour fabriquer le duplicate
            $first = true;
            foreach($obj as $k => $v){
                $obj[$k] = trim($v);
                $value2[$k.'2'] = trim($v);
                $fields.= $first?'`'.$k.'`':', `'.$k.'`';
                $values.= $first?':'.$k:', :'.$k;
                $first = false;
            }
            $fields.= ')';
            $values.= ')';

            $sql = 'INSERT INTO `db` ';
            $sql.= $fields.' VALUES '.$values ;

            $sql.= ' ON DUPLICATE KEY UPDATE SET ';
            foreach($obj as $k => $v){
                $sql.= '`'.$k.'` = :'.$k.'2, ';
            }
            $sql = substr($sql, 0, -2); // mouai, je préfère le $first ;)
            $sql.= ' WHERE `id` = '.$id;
            $req = $db->prepare($sql);
            $obj = array_merge($obj, $value2); // je combine les 2 array 
            try {
                $req->execute($obj); // je lui balance mon array
            }
            catch (PDOException $e) {
                self::fatal( "An SQL error occurred: ".$e->getMessage(), $sql ); 
            }

malgré le try catch je n'ai aucun retour d'erreur...
j'ai debuggué le $sql et il semble correct....
bref, je suis perdu. je dois avoir raté qqc
merci

5 réponses


Kenor
Réponse acceptée

Tu n'a pas à mettre "WHERE id_pdt = 3771" à la fin.

Le principe étant que si la clé est déjà existante, il update, et si elle n'est pas présente, il ajoute.
Par conséquent, la clé doit juste être au niveau de l'insert.

INSERT INTO `vegetal_produits_extends` (id_pdt, `famille` ...) VALUES (3771, :famille ...) ON DUPLICATE etc..

Ce qui signifie "Insert moi les données de l'id 3771, si ça existe pas, tu me l'ajoutes, si ça existe, tu mets à jour."

Hi,

Il n'y a pas de "SET" après "ON DUPLICATE KEY UPDATE"

Si tu as toujours un soucis après, fais-nous un echo de $sql

saibe
Auteur

hello, merci pour ta réponse rapide et ta correction...
voici le $sql généré :

INSERT INTO `vegetal_produits_extends` (`famille`, `rusticite`, `fleurs`, `floraison`, `feuillage`, `hauteur`, `largeur`, `utilisation`, `exposition`, `sol`, `conseils`, `varietes`, `img_insitu`, `img_macro`) VALUES (:famille, :rusticite, :fleurs, :floraison, :feuillage, :hauteur, :largeur, :utilisation, :exposition, :sol, :conseils, :varietes, :img_insitu, :img_macro) ON DUPLICATE KEY UPDATE `famille` = :famille2, `rusticite` = :rusticite2, `fleurs` = :fleurs2, `floraison` = :floraison2, `feuillage` = :feuillage2, `hauteur` = :hauteur2, `largeur` = :largeur2, `utilisation` = :utilisation2, `exposition` = :exposition2, `sol` = :sol2, `conseils` = :conseils2, `varietes` = :varietes2, `img_insitu` = :img_insitu2, `img_macro` = :img_macro2 WHERE `id_pdt` = 3771

c bien ce que j'attends donc je dois me planter qq part

saibe
Auteur

ok, merci beaucoup.
je teste ça demain et je te tiens au courant.

saibe
Auteur

merci, ct bien ça.