回答編集履歴

1

追記

2017/05/11 07:29

投稿

yambejp
yambejp

スコア114843

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