web-dev-qa-db-fra.com

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

J'ai fait ce code pour donner +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 de l’utilisateur en ce moment .. Je le veux plus un .. alors par exemple s’il avait comme 5 points, il devrait être 5 + 1 = 6 ..mais ça ne marche pas, ça change juste en 1

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

123
Karem

Vous pouvez aussi simplement faire ceci:

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

Vous pouvez le faire sans avoir à interroger le nombre réel de points, ce qui vous permettra d'économiser du temps et des ressources lors de l'exécution du script.

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

Sinon, ce que vous avez fait de mal, c'est que vous avez transmis l'ancienne quantité de points sous forme de chaîne (points='5'+1) et que vous ne pouvez pas ajouter de nombre à une chaîne. ;)

20
Daan

J'espère que je ne vais pas m'embarrasser de mon premier message, mais j'aimerais développer un peu plus sur le transtypage de entier en chaîne, car certains répondants semblent avoir tort.

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

Pour démontrer, les éléments suivants produiront le résultat 6:

SELECT ' 05.05 '+'.95';

La concaténation de chaînes dans MySQL nécessite la fonction CONCAT (); il n'y a donc aucune ambiguïté ici et MySQL convertit les chaînes en flottants et les ajoute.

En fait, je pense que la raison pour laquelle la requête initiale ne fonctionnait pas est probablement due au fait que la variable $ points n'était pas définie sur les points actuels de l'utilisateur. Il était soit défini à zéro, soit non défini: MySQL convertira une chaîne vide à zéro. Pour illustration, les éléments suivants renvoient 0:

SELECT ABS('');

Comme je l'ai dit, j'espère ne pas être trop en dehors du sujet. Je conviens que Daan et Tomas ont les meilleures solutions à ce problème particulier.

10
user272563

De plus, pour "incrémenter" la chaîne, utilisez CONCAT lors de la mise à jour

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1
7
bushkonst
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"
7
Mark Byers

Qui a besoin de mettre à jour la chaîne et les nombres SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);

2
Rodolfo Souza

Vous devez utiliser PDO pour prévenir les risques d'injection SQL.

Vous pouvez vous connecter à la base de données comme ceci:

try {
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:Host=xxxx;dbname=xxxx', 'user', 'password', $pdo_options);
    $bdd->query('SET NAMES "utf8"');
} catch (PDOException $e) {
    exit('Error');
}

Pas besoin d'interroger la base de données pour obtenir le nombre de points. Vous pouvez incrémenter directement dans la requête de mise à jour (points = points + 1).

(Remarque: il n’est pas judicieux non plus d’incrémenter la valeur avec PHP car vous devez d'abord sélectionner les données et la valeur peut être modifiée si d'autres utilisateurs la mettent à jour.)

$req = $bdd->prepare('UPDATE member_profile SET 
            points = points + 1
            WHERE user_id = :user_id');

$req->execute(array(
    'user_id' => $userid
));
1
Sébastien Gicquel

Supprimez le ' autour du point:

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

Vous "convertissez" une valeur entière en chaîne dans votre requête d'origine ...

1
Amirshk