PDO Update avec Foreign Key

Fermé
J@rodd Messages postés 39 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 26 octobre 2015 - 24 oct. 2015 à 02:01
 Utilisateur anonyme - 26 oct. 2015 à 19:24
Bonjour,

La question comment faire le update ?

J'ai 3 tables 'article', 'categories' et 'artcategories'. Dans la table artCategories contient des foreign key 'article_id' et 'category_id' => Un article peut avoir plusieurs categories et une category peut appartenir à plusieurs articles.

Donc je cherche à savoir comment par exemple faire un UPDATE sur la 'artCategories' ?


UPDATE artCategories SET category_id=1 WHERE article_id = 10;


Mais ce code me renvoie une erreur duplicate entry, que je comprend très bien puisque j'ai plusieurs entrées avec article_id = 10 et comme ça fonctionne avec des foreign key en CASCADE sur Update et restrict avec delete.


Merci pour vos idées !
A voir également:

4 réponses

DelNC Messages postés 2234 Date d'inscription samedi 25 octobre 2014 Statut Membre Dernière intervention 22 février 2020 1 999
24 oct. 2015 à 09:41
Bonjour,

Voici un exemple de UPDATE

$query      = "UPDATE  users ";
$query .= "SET ";
$query .= " login = '" . $login . "',";
$query .= "WHERE id_user = 10 ";
$query .= "; ";
$result = execute_query($query);


Le problème c'est que, comme vous le d^tes, s'il y a plusieurs lignes dans la table artCategories qui ont article_id = 10
elles seront toues mdifiées en même temps
0
J@rodd Messages postés 39 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 26 octobre 2015
24 oct. 2015 à 15:56
Salut et merci pour ta réponse.

Mais je en pense pas que ça fonctionnera (deja testé), le truc c'est que comme la table "ARTICLES" peux avoir plusieurs CATEGORY et inverse aussi.

Donc je veux surtout pas que j'ai un doublons, tu vois ?

si j'ai pas exemple un resultat dans ma table "articles_categories" :=>

article_id,category_id
1=>8
1=>15
1=>4


Dans ma table j'ai quelque chose de similaire..Et si si je veux changer les category de l'article(1) ça bloque.

J'espère que j'ai été clair et je m'en mêle pas les pinceaux.

@Sunr =>

Articles(article_id(INT) PRIMARY KEY)
Categories(category_id(INT) PRIMARY KEY)

FOREIGN KEY (article_id) REFERENCES articles(article_id)
FOREIGN KEY (category_id) REFERENCES categories(category_id)



Ils sont aussi en UPDATE Cascade et DELETE Restrict

Je ne pense pas que j'ai mal structuré la table
0
Utilisateur anonyme > J@rodd Messages postés 39 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 26 octobre 2015
24 oct. 2015 à 20:08
Hmm, quel est le message d'erreur en entier que tu reçois? duplicate entry for ...
0
Utilisateur anonyme
24 oct. 2015 à 11:49
Nah, je ne crois pas que l'update de plusieurs lignes renvoie cette erreur, ce doit plutôt être parce que la colonne category_id est unique. Pour remédier à ce problème, il faut te rendre dans phpMyAdmin, et changer le type d'index de cette colonne.
0
J@rodd Messages postés 39 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 26 octobre 2015
24 oct. 2015 à 20:26
( ! ) Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '10-1' for key 'PRIMARY'' in (..)\tutos\beta\class\Database.php on line 17
( ! ) PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '10-1' for key 'PRIMARY' in (..)\tutos\beta\class\Database.php on line 17

Le fichier database contient une class qui m'exécute mes query et la connexion bdd.

Voici la requete que j'utilise actuellement et qui me donne ce message :

UPDATE articles a
LEFT JOIN aticles_categories ac
ON a.article_id = ac.article_id
LEFT JOIN categories c
ON c.category_id = ac.category_id
SET ac.category_id = :new, ac.last_update = NOW()
WHERE (ac.category_id = :old AND a.article_id = :id)


C'est le seul moyen que j'au pu trouver si loin pour pouvoir faire les update même si je dois récupérer les ancien enregistrements, et lui dire me remplace le old vs le new sur la table articles_categories where article = 1 par exemple.

Au niveau du php, ça se pourrai que c'est la que je bloque et non au SQl ?
PHP :

<select name="cats[]">
<option value="1">test1</option>
</select>

----------
$new= $_POST['cats'];

foreach($data = Categories::getArticleCategories($db,$id) as $data => $old){//Récupère les anciens enregistrements liée à l'article

Article::updateArticle($db,$old->CID,$new,$id);
//update les enregistrement présents dans la table

}


A mon avis c'est au PHP que je bloque...
0
Utilisateur anonyme
26 oct. 2015 à 05:05
Nah, c'est bel et bien un message d'erreur de mysql! #=
Le problème est que tu tentes de donner une valeur à un champs dans une colonne où cette valeur existe déjà. As-tu créé une colonne id primary avec auto_increment dans la table articles_categories? Encore une fois, rends-toi dans phpmyadmin, sur la table articles_categories, sous l'onglet structure et clique sur le petit + Index. Dis-moi ce que tu y trouves ou prend une capture écran, c'est la que ça bloque je crois.
0
J@rodd Messages postés 39 Date d'inscription mercredi 5 octobre 2011 Statut Membre Dernière intervention 26 octobre 2015
26 oct. 2015 à 09:07
Salut,
Voici la structure de la table et y a pas de AI car les données correspondent au ID de la table articles et categories :

CREATE TABLE IF NOT EXISTS `articles_categories` (
`article_id` smallint(5) unsigned NOT NULL,
`category_id` tinyint(3) unsigned NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`article_id`,`category_id`),
KEY `fk_article_category_category` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
0
Utilisateur anonyme
26 oct. 2015 à 19:24
Bon je comprend absolument ton point, mais si on y ajoutait un tout petit id, question qui ait une colonne vraiment unique. comme ceci!, ça fonctionne?

CREATE TABLE IF NOT EXISTS `articles_categories` (
	`id` int unsigned NOT NULL auto_increment,
	`article_id` smallint(5) unsigned NOT NULL,
	`category_id` tinyint(3) unsigned NOT NULL,
	`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	/*Les clés primaires identifient chaque ligne
	de façon unique. Ainsi, si category_id ou
	article_id en sont, ces colonnes ne pourront 
	pas supporter 2 valeurs identiques, d'où
	duplicate entry '10-1' for key PRIMARY.*/
	PRIMARY KEY (`id`),
	KEY `fk_article_category_category` (`category_id`)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;
0