8791 sujets

Développement web côté serveur, CMS

Voilà, ce que je voudrais faire c'est que si mysql ne trouve pas un enregistrement, il le crée, par contre si l'enregistrement existe, il incrémente juste de 1 un champ.

J'ai bien une solution actuellement, mais elle demande 2 query vers la base et ça m'étonne que mysql n'ait pas une solution miracle pour ça faire tout seul.

$mysql_quete=mysql_query("select * from table where champs1=valeurs1 AND champs2=valeurs2");
        if(mysql_num_rows($mysql_quete)!=0)
        {
          if($mysql=mysql_fetch_assoc($mysql_quete))
          {
            $quantite=$mysql['champs3'];
            $quantite=$quantite+1;
            $sql_histo="UPDATE `table` SET `champs3`=".$quantite." WHERE champs1=valeurs1 AND champs2=valeurs2";
          }
        }
        else
        {
          $sql_histo="INSERT INTO table (champs1, champs2) VALUES (valeurs1,valeurs2)";
        }



en sachant que tout les champs sont des int ou dérivés (tinyint et smallint); que champs1 et champs2 ensemble sont la clé primaire et donc le champs d'unicité de ma table. Que champs3 a comme valeur par défaut 1, ce qui explique que je ne l'ajoute pas dans l'insertion
Modifié par Lothindil (21 Oct 2010 - 12:43)
Hello,

tu as 2 solutions:
- replace (http://dev.mysql.com/doc/refman/5.0/fr/replace.html)
- Insert ... on duplicate key update (http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html) qui semble être plus ce que tu recherches. la page semble ne pas exister en français.

hth

Pierre
ah bah je l'avais loupé la seconde... C'est exactement ce que je chercher, merci ^^


edit, tant qu'on y est :

y a la même à l'inverse ?
En gros, on décrémente au lieu d'incrémenter. Et si ça tombe à 0, on supprime le champ ?

$mysql_inventaire=mysql_query("select * from table where champs1=valeur1 AND champs2=valeur1");
    if($mysql=mysql_fetch_assoc($mysql_inventaire))
    {
      $quantite=$mysql['champs3'];
      if($quantite>$nombre) //s'il reste des objets dans le sac
      {
        $quantite=$quantite-$nombre;
        $sql=mysql_query("UPDATE `table` SET `champs3`=".$quantite." WHERE champs1=valeur1 AND champs2=valeur2");
      }
      else //si on enlève tous les objets
      {
        $sql=mysql_query("DELETE FROM `table` WHERE `champs1`=valeur1 AND `champ2`=valeur2 LIMIT 1");
      } 
    }

Modifié par Lothindil (21 Oct 2010 - 12:48)
Peut etre en regardant du côté des "case when" en sql ?

J'essaye de te dénicher un code et je le propose Smiley cligne



----> Quand on ne sait pas, on se tait ! Désolé d'avoir posté inutilement Smiley ohwell
Je continue de chercher x|
Modifié par Black-Sun (21 Oct 2010 - 14:57)
sinon c'est pas grave, je peux sans problème ne pas supprimer l'enregistrement ce qui m'évitera de devoir optimiser ma table toutes les 3 semaines ^^
Je sais que vu que mon ancien post était inutile, on peut considérer celui ci pour un double post, mais ...


Un "delete from .... where champ=0" en bas de toutes les pages ne peut pas résoudre le problème ?



Et on peut automatiser l'optimisation ... si cela ne te ( ou vous Smiley ohwell ) dérange pas de devoir faire une requête de plus par page
bah je suis justement entrain de limiter un maximum mes requêtes car j'ai des problèmes avec... mais rien ne m'empêche de faire une routine en crontab qui une fois tous les x jours fait le delete...
Pour la décrémentation, tu peux faire comme l'incrémentation, avec insert ... on duplicate keys update.

En ce qui concerne la suppression automatique quand ton champ tombe à 0, il y a peut-être une piste du côté des contraintes d'intégrité.

En ce qui concerne spécifiquement MySQL, ça m'étonnerais qu'on puisse définir une telle contrainte. C'est peut-être possible avec des SGBD plus évolués comme posgresql, Microsoft SQL ou oracle... mais probablement pas avec MySQL. Donc à mon avis, la requête delete s'impose.