teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/05/11 07:29

投稿

yambejp
yambejp

スコア117908

answer CHANGED
@@ -1,4 +1,46 @@
1
1
  [マニュアル](https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html)は見ましたか?
2
2
 
3
3
  文字通り、インサートするけど重複があったら更新する構文です。
4
- 重複かどうかを定義するために該当テーブルにはユニークを担保するカラムが必要です
4
+ 重複かどうかを定義するために該当テーブルにはユニークを担保するカラムが必要です
5
+
6
+ # 追記
7
+ 前回の質問
8
+ > ボタンを押された回数をデータベースに記録する仕組み
9
+
10
+ を前提にまずテーブルの作成します。
11
+ とあるユーザーのユーザーIDをuidとして、ボタンをおした数をcountとします
12
+
13
+ ```SQL
14
+ create table log(uid int not null unique,count int);
15
+ ```
16
+ [追加、更新]
17
+ ユーザーID=100の人がボタンを押したときに発行するSQL
18
+ ```SQL
19
+ insert into log values(100,1) on duplicate key update count=count+1;
20
+ ```
21
+ 初めて発行するとlogテーブルに100,1というデータが登録されます。
22
+ 2回目に発行するとlogテーブルにあるuid=100のレコードのcountが2にインクリメントされます
23
+ 3回目以降も同様です
24
+
25
+ PHPからの接続は仮にPDOを利用するとして
26
+ ```PHP
27
+ $uid=100;
28
+ try{
29
+ $dsn = 'mysql:host=localhost; dbname=test';
30
+ $user = '****';
31
+ $password = '****';
32
+ $pdo = new PDO($dsn, $user,$password);
33
+ $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
34
+ $pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8');
35
+ $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
36
+ $sql ="INSERT INTO log VALUES(?,1) ";
37
+ $sql.="ON DUPLICATE KEY UPDATE count=count+1 ";
38
+ $stmt = $pdo->prepare($sql);
39
+ $stmt->execute([$uid]);
40
+ }catch(PDOException $e){
41
+ die($e->getMessage());
42
+ }
43
+
44
+ ```
45
+ のようなやり方になります。
46
+ ちなみに$uidはログインデータを元にセッションなどで管理するのが妥当でしょう