mysql更新クエリの値を増分する


138

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

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

$ points変数は、ユーザーの現在のポイントです。それに1を足したいので、たとえば、ポイントが5ポイントあった場合、5 + 1 = 6.になるはずですが、そうではなく、単に変更されます。に1

何が悪いのですか?ありがとうございました


2
私は同様の問題を抱えていて、フィールドのデフォルトのタイプが「NULL」であることに気付き、それを0に変更し、すべてが順調でした。
Azmeer 2017

回答:


322

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

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

59
@Steveあなたのコメントは、PDOが何であるかを知っている人にとっては賢明に聞こえるかもしれませんが、PHP / MySQLに飛び込んでいる私にとっては、それは問題にあまり光を当てません。PDOはそのコードをより小さく、またはよりエレガントにしますか?その場合は、回答を編集するか、PDOでどのように改善されるかを示す独自の投稿を投稿してください。ありがとう。
Camilo Martin

5
@CamiloMartin私も気になりました。私はこの有用なnet.tutsplus.com/tutorials/php/…
PJ Brunet

11
@CamiloMartin mysql_queryのphp.netマニュアルページには、次の注意事項があります。代わりに、MySQLiまたはPDO_MySQL拡張機能を使用する必要があります。詳細については、MySQL:APIガイドの選択および関連するFAQも参照してください。
2013年

9
SQLクエリに示されるようにユーザーデータを連結することは、SQLインジェクションの主要なリスクです。
trognanders 2015年

1
@bigp:試してみましたがUPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)、うまくいきませんでした。どのような仕事をしたことでした:UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE
ジーリー

23

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

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

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


10

最初の投稿で話題から外れないことを願っていますが、一部の回答者は間違っているように見えるため、整数から文字列へのキャストについて少し拡張したいと思います。

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

実証するために、次の結果は6になります。

SELECT ' 05.05 '+'.95';

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

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

SELECT ABS('');

私が言ったように、私はあまり話題から外れていないことを望みます。DaanとTomasがこの特定の問題に対する最善の解決策を持っていることに同意します。


+1コンプトン非常に良い点、あなたはキャストの仕事について正しい、引用があるかどうかにかかわらず。SOへようこそ!
Pekka

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

1
value = 1の代わりに変数を使用した場合はどうなりますか?「ポイント=ポイント+ $変数」のようにこれを行う必要がありますか?または「points = points + '$ variable'」
Ivo San

7

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

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


2

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

次のように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."'");

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


-2

PHPに仕事を任せてみませんか?

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

7
良い点ですが、DB値がその間に変更された可能性があるため、並行環境では注意してください。
Vincent Nikkelen 2013

1
@VincentNikkelenに感謝します、あなたは頭に釘を打ちました。並行性!
Jimmy Ilenloa

1
この方法を使用する場合、最初にデータを選択する必要があります。これは、行への追加アクセスを意味します。値を更新する必要があるだけの場合、これは適切な方法ではありません。
アンドレスSK 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.