Bonjour,
désolé si cette question a déjà été postée, je n'ai pas trouvé...
j'ai une table de relations sans clef primaire avec 4 champs : id1, id2, type_rel, options_rel
est-il possible de vérifier qu'un trio (id1, id2 et type_rel) n'existe pas avant de l'insérer en une seule requête ?
(je pourrais faire 2 requêtes : une qui vérifie l'autre qui insère si besoin, mais... ;))
mon code
$db = Helper::getDB();
foreach($ids as $id){
$p = array(
'id1' => $id,
'id2' => $params['user'],
'type_rel' => 'produits_user',
'options_rel' => ''
);
$sql = 'INSERT INTO `'.DB_PRE.'relations` ';
$sql.= '(`id1`, `id2`, `type_rel`, `options_rel`) ';
$sql.= "VALUES ";
$sql.= '(:id1, :id2, :type_rel, :options_rel) ';
// $sql.= 'ON DUPLICATE KEY UPDATE `??`="??"'; // je ne peux pas car je n'ai pas de key
$sql.= 'WHERE NOT EXISTS ('; // j'ai essayé avec une sous requête mais ça ne fonctionne pas
$sql.= 'SELECT * FROM `'.DB_PRE.'relations` ';
$sql.= 'WHERE `id1` = '.$id.' ';
$sql.= 'AND `id2` = '.$params['user'].' ';
$sql.= 'AND `type_rel` = "produits_user"';
$sql.= ')';
$req = $db->prepare($sql);
try {
$req->execute($p);
}
catch (PDOException $e) {
echo "An SQL error occurred: ".$e->getMessage();
}
}
echo 'lébon';
$db = null;
ça me retourne :
An SQL error occurred: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT * FROM `vegetal_relations` WHERE `id1` = 28051 AND `id2' at line 1
merci
Pourquoi tu ne crées pas un index unique composé des 3 colonnes
comme ça l'insertion sera bloquée si le triplet existe.
Merci @Huggy, tout simplement...
le code :
$db = Helper::getDB();
foreach($ids as $id){
$p = array(
'id_rel' => $id.$params['user'].'pdtusr', // le trio gagnant !! merci @huggy
'id1' => $id,
'id2' => $params['user'],
'type_rel' => 'produits_user',
'options_rel' => $params['options']
);
$sql = 'INSERT INTO `'.DB_PRE.'relations` ';
$sql.= '(`id_rel`, `id1`, `id2`, `type_rel`, `options_rel`) ';
$sql.= "VALUES ";
$sql.= '(:id_rel, :id1, :id2, :type_rel, :options_rel) ';
$sql.= 'ON DUPLICATE KEY UPDATE `options_rel`= "'.$params['options'].'"';
$req = $db->prepare($sql);
try {
$req->execute($p);
}
catch (PDOException $e) {
echo "An SQL error occurred: ".$e->getMessage();
}
}
echo 'lébon';
$db = null;
++
seb