2010-02-13 7 views
98

J'ai créé ce code pour donner +1 point, mais cela ne fonctionne pas correctement.Valeur d'incrémentation dans la requête de mise à jour mysql

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

la variable $ les points sont les points D'UTILISATION dès maintenant .. Je veux que ce plus un à lui .. donc par exemple s'il avait comme 5 points, il devrait y avoir 5 + 1 = 6 .. mais il doesnt, il change juste à 1

Qu'ai-je fait de mal? merci

+1

J'ai eu un Le problème similaire s'est alors rendu compte que le type par défaut du champ était 'NULL', l'a changé à 0 et tout allait bien. – Azmeer

Répondre

222

Vous pouvez également faire ceci:

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

@Steve votre commentaire peut sembler intelligent pour quelqu'un qui sait ce qu'est PDO, mais pour moi qui plonge juste dans PHP/MySQL, il ne brille pas vraiment beaucoup de lumière dans le sujet. Est-ce que PDO rend ce code plus petit ou plus élégant? Si oui, veuillez éditer la réponse ou poster la vôtre, où vous montrerez à quel point c'est mieux avec AOP. Merci. –

+5

@CamiloMartin J'étais curieux aussi. J'ai trouvé cela utile http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-show-you-use/ –

+8

@CamiloMartin the [manuels php.net] (http://php.net /manual/fr/function.mysql-query.php) page pour mysql_query a la note suivante: Cette extension est obsolète depuis PHP 5.5.0, et sera supprimée dans le futur. Au lieu de cela, le [MySQLi] (http://www.php.net/manual/en/book.mysqli.php) ou [PDO_MySQL] (http://www.php.net/manual/en/ref.pdo- mysql.php) extension doit être utilisée. Voir aussi le guide [MySQL: choose a API] (http://www.php.net/manual/fr/mysqlinfo.api.choosing.php) et [FAQ connexe] (http://www.php.net/manual /fr/faq.databases.php#faq.databases.mysql.deprecated) pour plus d'informations. – aland

6
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'" 
+1

Et si j'utilisais une variable au lieu de valeur = 1? devrais-je le faire de cette façon "points = points + $ variable"? ou "points = points + '$ variable'" –

1

Suppression du ' autour du point:

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

Vous "casting" une valeur entière à la chaîne dans votre requête originale ...

0

Pourquoi ne pas vous laissez PHP fait le travail?

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

Bon point, mais faites attention dans un environnement simultané car la valeur de DB peut avoir changé entre-temps. –

+1

Merci @VincentNikkelen, vous frappez le clou sur la tête. Concurrence! –

+1

Si vous utilisez cette méthode, vous devez d'abord CHOISIR les données, ce qui signifie un accès supplémentaire à la ligne. Ce n'est pas la voie à suivre si vous avez juste besoin de mettre à jour la valeur. – andufo

16

Vous pouvez le faire sans avoir à demander la quantité réelle de points, il vous permettra d'économiser du temps et des ressources au cours de l'exécution du script.

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

Sinon, ce que vous faites mal est que vous avez passé la vieille quantité de points sous forme de chaîne (points='5'+1), et vous ne pouvez pas ajouter un numéro à une chaîne. ;)

10

Espoir Je ne vais pas offtopic sur mon premier post, mais je voudrais développer un peu sur la coulée de nombre entier à chaîne comme certains les répondants semblent avoir tort. Étant donné que l'expression de 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, ce qui suit produira le résultat 6:

SELECT ' 05.05 '+'.95'; 

concaténation de chaîne dans MySQL nécessite la CONCAT() fonction donc il n'y a pas d'ambiguïté ici et MySQL convertit les chaînes de flotteurs et les additionne.

Je pense en fait 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 mis à zéro, soit était non défini: MySQL va lancer une chaîne vide à zéro. À titre d'illustration, ce qui suit retourne 0:

SELECT ABS(''); 

Comme je l'ai dit, je l'espère, je ne suis pas hors-sujet. Je suis d'accord que Daan et Tomas ont les meilleures solutions pour ce problème particulier.

+0

+1 très bon points compton, vous avez raison sur le casting fonctionne, qu'il y ait des citations ou non. Bienvenue à SO! –

7

En outre, à la chaîne "incrément", lors de la mise à jour, utilisez CONCAT

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

Qui a besoin de mettre à jour la chaîne et le nombre SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:[email protected]+1);

0

Vous devez utiliser PDO pour prévenir le risque d'injection SQL.

Vous pouvez vous connecter à DB 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 DB pour obtenir le nombre de points. Vous pouvez incrémenter directement dans la requête de mise à jour (points = points + 1).

(note: En outre, ce n'est pas une bonne idée d'augmenter la valeur avec PHP parce que vous devez d'abord sélectionner les données et la valeur peut changer si d'autres utilisateurs sont mis à jour il.)

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

$req->execute(array(
    'user_id' => $userid 
));