[MySQL] INSERT / UPDATE conditionnel

WRInaute discret
Bonjour à tous :)

J'ai une table "compteur" qui se présente ainsi :

ID_ARTICLE (l'identifiant de l'article dans la table "articles")
DATE (type date 0000-00-00)
COMPTEUR (le nombre de vues)

Voici ce que j'aimerai faire :

A chaque fois que j'affiche mon article, je dois vérifier sur la table "compteur" si une ligne avec l'ID_ARTICLE / DATE est présente.

Si c'est le cas : je fais un UPDATE.
Si ce n'est pas le cas : je fais un INSERT.


Exemple en PHP :

<?php
// Requête de vérification
// SELECT count(*) AS ok FROM compteur WHERE id_article=$_GET['id_article'] AND date='la date avec PHP';

if($ok==1)
{
// Requête de mise à jour
// UPDATE compteur SET compteur=compteur+1 WHERE id_article=$_GET['id_article'] AND date='la date';
}
else
{
// Requête d'insertion
// INSERT INTO compteur SET id_article=$_GET['id_article'] AND date='la date', compteur=1;
}
?>


Simplement, voici mon problème :

Sur certaines pages, j'affiche plusieurs articles (jusqu'à 100), et je me vois mal faire 100 "SELECT" pour vérifier la présence des lignes, puis 100 insert ou update en fonction...

Existe-t-il une astuce pour faire un UPDATE/INSERT en fonction ?

Merci par avance :)
 
WRInaute discret
Je connais la méthode "ON DUPLICATE KEY UPDATE" mais je n'ai pas de clé primaire sur cette table, la "clé primaire" serait en réalité l'association id_article/date :(
 
WRInaute impliqué
En théorie, tu auras toujours plus de UPDATE que d'INSERT.
L'astuce est de toujours effectuer UPDATE en premier.
Lorsque tu fais une requête UPDATE, la fonction retourne le nombre de ligne qui ont été modifiée. Comme tu as "compteur+1", tu es certain de récupérer un nombre supérieur à 0.

Donc, tu fais une truc de ce genre :
Code:
if (0 === mysql_query('UPDATE bla bla bla')) {
    // il n'existe pas encore d'occurence
    mysql_query('INSERT INTO bla bla bla');
}

Le problème, c'est que si en parallèle, une autre requête intervient entre les deux "mysql_query", tu auras une incohérence.
Il faut donc gérer une contrainte UNIQUE, et vérifie l'erreur retournée par l'insertion (si c'est un "Duplicate content" tu refais UPDATE).
 
Nouveau WRInaute
JulienV a dit:
Je connais la méthode "ON DUPLICATE KEY UPDATE" mais je n'ai pas de clé primaire sur cette table, la "clé primaire" serait en réalité l'association id_article/date :(

Raison de plus pour définir une clé primaire :
Code:
ALTER TABLE `compteur`
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id_article`, `date`);

ON DUPLICATE KEY UPDATE devrait dès lors fonctionner.
 
Discussions similaires
Haut