質問編集履歴

2

コード部分の表示位置を変えました。

2018/12/29 02:13

投稿

art_porokyu
art_porokyu

スコア44

test CHANGED
File without changes
test CHANGED
@@ -5,112 +5,6 @@
5
5
 
6
6
 
7
7
  コードを書いたのですが、どうも、重複チェックができず同じアドレスでも新規登録されてしまいます。
8
-
9
-
10
-
11
-
12
-
13
- ### 該当のソースコード
14
-
15
-
16
-
17
- PHPここに言語名を入力
18
-
19
- ソースコード
20
-
21
- if(empty($err_msg)){
22
-
23
- $dsn = 'mysql:dbname=feel.share;host=localhost;charaset=utf8';
24
-
25
- $user = 'root';
26
-
27
- $password = 'root';
28
-
29
- $options = array(
30
-
31
-
32
-
33
- PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
34
-
35
-
36
-
37
- PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
38
-
39
-
40
-
41
- PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
42
-
43
- );
44
-
45
-
46
-
47
- $dbh = new PDO($dsn,$user,$password,$options);
48
-
49
-
50
-
51
- $query = $dbh->prepare('SELECT * FROM users WHERE email = :email');
52
-
53
-
54
-
55
- $query->execute(array(':email' => $email));
56
-
57
-
58
-
59
- $result = $query->fetch(PDO::FETCH_ASSOC);
60
-
61
-
62
-
63
- if($result > 0){
64
-
65
- $err_msg['email'] = MSG06 //(このemailは既に使用されています);
66
-
67
- }
68
-
69
-
70
-
71
- $stmt = $dbh->prepare('INSERT INTO users(email,pass,login_time) VALUES (:email, :pass, :login_time)');
72
-
73
-
74
-
75
- $stmt->execute(array(':email' => $email,':pass' => $pass, ':login_time' => date('Y-m-d H:i:s')));
76
-
77
-
78
-
79
- header("Location:mypage.php");
80
-
81
- }
82
-
83
-
84
-
85
- ### 考え
86
-
87
-
88
-
89
- このコードはバリデーションチェックをクリアし$err_msgに何も代入されていない状態です。
90
-
91
- 考えはこうです。
92
-
93
-
94
-
95
- 新規登録時にDB接続した際にSELECTでemailを検索する。
96
-
97
- if文を使用し1件でも検索結果が出れば、MSG06をhtml内で表示する。
98
-
99
-
100
-
101
- 0件ならINSERTし新規登録を行いmypage.phpへアクセスする。
102
-
103
-
104
-
105
- このような考えです。
106
-
107
-
108
-
109
- ですが、重複チェックができず同じアドレスでも新規登録されてしまいます。
110
-
111
-
112
-
113
- このような場合どのような理解でコードを書けば良いでしょうか?
114
8
 
115
9
 
116
10
 
@@ -183,3 +77,35 @@
183
77
 
184
78
 
185
79
  ```
80
+
81
+
82
+
83
+ ### 考え
84
+
85
+
86
+
87
+ このコードはバリデーションチェックをクリアし$err_msgに何も代入されていない状態です。
88
+
89
+ 考えはこうです。
90
+
91
+
92
+
93
+ 新規登録時にDB接続した際にSELECTでemailを検索する。
94
+
95
+ if文を使用し1件でも検索結果が出れば、MSG06をhtml内で表示する。
96
+
97
+
98
+
99
+ 0件ならINSERTし新規登録を行いmypage.phpへアクセスする。
100
+
101
+
102
+
103
+ このような考えです。
104
+
105
+
106
+
107
+ ですが、重複チェックができず同じアドレスでも新規登録されてしまいます。
108
+
109
+
110
+
111
+ このような場合どのような理解でコードを書けば良いでしょうか?

1

コード部分の表示方法を変えました。

2018/12/29 02:13

投稿

art_porokyu
art_porokyu

スコア44

test CHANGED
File without changes
test CHANGED
@@ -111,3 +111,75 @@
111
111
 
112
112
 
113
113
  このような場合どのような理解でコードを書けば良いでしょうか?
114
+
115
+
116
+
117
+ ```lang-言語名
118
+
119
+ if(empty($err_msg)){
120
+
121
+ $dsn = 'mysql:dbname=feel.share;host=localhost;charaset=utf8';
122
+
123
+ $user = 'root';
124
+
125
+ $password = 'root';
126
+
127
+ $options = array(
128
+
129
+ // SQL実行失敗時に例外をスルー
130
+
131
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
132
+
133
+ // デフォルトフェッチモードを連想配列形式に設定
134
+
135
+ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
136
+
137
+ // バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
138
+
139
+ // SELECTで得た結果に対してもrowCountメソッドを使えるようにする
140
+
141
+ PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
142
+
143
+ );
144
+
145
+
146
+
147
+ $dbh = new PDO($dsn,$user,$password,$options);
148
+
149
+
150
+
151
+ $query = $dbh->prepare('SELECT * FROM users WHERE email = :email');
152
+
153
+
154
+
155
+ $query->execute(array(':email' => $email));
156
+
157
+
158
+
159
+ $result = $query->fetch(PDO::FETCH_ASSOC);
160
+
161
+
162
+
163
+ if($result > 0){
164
+
165
+ $err_msg['email'] = MSG06;
166
+
167
+ }
168
+
169
+
170
+
171
+ $stmt = $dbh->prepare('INSERT INTO users(email,pass,login_time) VALUES (:email, :pass, :login_time)');
172
+
173
+
174
+
175
+ $stmt->execute(array(':email' => $email,':pass' => $pass, ':login_time' => date('Y-m-d H:i:s')));
176
+
177
+
178
+
179
+ header("Location:mypage.php");
180
+
181
+ }
182
+
183
+
184
+
185
+ ```