161 votes

Incrémenter la valeur dans la requête de mise à jour MySQL

J'ai créé ce code pour attribuer +1 point, mais cela ne fonctionne pas correctement.

mysql_query("
    UPDATE member_profile 
    SET points= ' ".$points." ' + 1 
    WHERE user_id = '".$userid."'
");

La variable $points correspond aux points actuels de l'utilisateur. Je veux lui ajouter un point. Par exemple, s'il avait 5 points, il devrait avoir 5+1 = 6, mais cela ne se produit pas, cela passe juste à 1.

Qu'est-ce que j'ai mal fait?

2 votes

J'ai rencontré un problème similaire puis j'ai réalisé que le type par défaut du champ était 'NULL', je l'ai changé en 0 et tout était résolu.

372voto

Tomas Markauskas Points 6505

Il suffit d'incrémenter la valeur qui existe déjà dans la base de données

$sql = "UPDATE member_profile SET points = points + 1 WHERE user_id = ?";
$db->prepare($sql)->execute([$userid]);

Ce code fonctionnerait pour PDO et mysqli dans les versions récentes de PHP

61 votes

@Steve votre commentaire peut sembler intelligent pour quelqu'un qui sait ce qu'est PDO, mais pour moi qui plonge juste dans PHP/MySQL, cela n'éclaire pas vraiment la question. Est-ce que PDO rend ce code plus court ou plus élégant ? Si c'est le cas, veuillez éditer la réponse ou en poster une nouvelle où vous montrez en quoi c'est mieux avec PDO. Merci.

5 votes

@CamiloMartin J'étais curieux aussi. J'ai trouvé cela utile net.tutsplus.com/tutorials/php/…

11 votes

@CamiloMartin la page des manuels de php.net pour mysql_query comporte la note suivante : Cette extension est obsolète depuis PHP 5.5.0, et sera supprimée à l'avenir. Au lieu de cela, l'extension MySQLi ou PDO_MySQL devrait être utilisée. Voir aussi le guide MySQL: choisir une API et la FAQ associée pour plus d'informations.

24voto

Daan Points 1015

Vous pouvez le faire sans avoir à interroger le montant réel de points, ce qui vous fera gagner du temps et des ressources pendant l'exécution du script.

mysql_query("UPDATE `member_profile` SET `points`= `points` + 1 WHERE `user_id` = '".intval($userid)."'");

10voto

user272563 Points 214

J'espère ne pas m'éloigner du sujet dans mon premier message, mais j'aimerais élargir un peu sur la conversion d'entier en chaîne de caractères car certains répondants semblent se tromper.

Étant donné que l'expression dans cette requête utilise un opérateur arithmétique (le symbole plus +), MySQL convertira toutes les chaînes de caractères de l'expression en nombres.

Pour illustrer, ce qui suit produira le résultat 6:

SÉLECTIONNER ' 05.05 '+'.95';

La concaténation de chaînes de caractères en MySQL nécessite la fonction CONCAT(), il n'y a donc aucune ambiguïté ici et MySQL convertit les chaînes en nombres décimaux et les additionne.

Je pense en fait que la raison pour laquelle la requête initiale ne fonctionnait pas est très probablement parce que la variable $points n'était pas réellement définie sur les points actuels de l'utilisateur. Elle était soit définie sur zéro, soit non définie : MySQL convertira une chaîne vide en zéro. Pour illustrer, ce qui suit retournera 0:

SÉLECTIONNER ABS('');

Comme je l'ai dit, j'espère ne pas être trop hors sujet. Je suis d'accord avec Daan et Tomas, qui ont les meilleures solutions pour ce problème particulier.

0 votes

+1 compton très bons points, vous avez raison à propos du casting qui travaille, qu'il y ait des citations ou non. Bienvenue sur SO!

8voto

Mark Byers Points 318575
"MISE À JOUR member_profile SET points = points + 1 WHERE user_id = '".intval($userid)."'"

1 votes

Que se passerait-il si j'utilisais une variable au lieu de value=1? Devrais-je le faire de cette façon "points = points + $variable" ? ou "points = points + '$variable' "

7voto

bushkonst Points 31

Aussi, pour "incrémenter" une chaîne de caractères, utilisez CONCAT lors de la mise à jour

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X