web-dev-qa-db-ja.com

mysql更新クエリの増分値

+1ポイントを与えるためにこのコードを作成しましたが、正しく機能しません。

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

$ points変数は、現在のユーザーのポイントです。1に1を加えたいです。たとえば、5ポイントの場合、5 + 1 = 6になります。しかし、そうではなく、単に1に変わります

私は何を間違えましたか?ありがとうございました

122
Karem

また、これを行うこともできます:

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

実際のポイント数を照会することなくこれを実行できるため、スクリプトの実行中に時間とリソースを節約できます。

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

それ以外の場合、間違っていたことは、古いポイント数を文字列(points='5'+1)として渡したため、文字列に数値を追加できないことです。 ;)

20
Daan

私は最初の投稿でトピックから外れることを望んでいませんが、一部の回答者が間違っているように見えるので、整数から文字列へのキャストを少し拡大したいと思います。

このクエリの式は算術演算子(プラス記号+)を使用しているため、MySQLは式の文字列を数値に変換します。

実証するために、次の結果6が生成されます。

SELECT ' 05.05 '+'.95';

MySQLの文字列連結にはCONCAT()関数が必要であるため、ここではあいまいさはなく、MySQLは文字列を浮動小数点数に変換して加算します。

実際、最初のクエリが機能しなかった理由は、$ points変数が実際にユーザーの現在のポイントに設定されていなかったためだと考えています。ゼロに設定されたか、設定されていませんでした。MySQLは空の文字列をゼロにキャストします。説明のために、以下は0を返します。

SELECT ABS('');

私が言ったように、私はあまりにもトピックから離れていないことを願っています。 DaanとTomasがこの特定の問題に対して最善の解決策を持っていることに同意します。

10
user272563

また、文字列を「インクリメント」するには、更新時にCONCATを使用します

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

文字列と数字を更新する必要があるのはSET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);

2
Rodolfo Souza

PDOを使用して、SQLインジェクションのリスクを防ぐ必要があります。

次のようにDBに接続できます。

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');
}

ポイント数を取得するためにDBを照会する必要はありません。更新クエリ(points = points + 1)で直接インクリメントできます。

(注:また、最初にデータを選択する必要があり、他のユーザーが更新した場合は値が変更される可能性があるため、PHPで値をインクリメントすることはお勧めできません。)

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

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

pointの周りの'を削除します。

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

元のクエリの文字列に整数値を「キャスト」しています...

1
Amirshk