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
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
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