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

回答編集履歴

1

修正

2020/01/27 12:07

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -1,4 +1,41 @@
1
1
  そもそも毎回create tableのお伺いたてるのって全く無駄です。
2
2
  確実に用意したテーブルのみを使いましょう。
3
3
 
4
- あとNoticeはきっとスコープの問題。
4
+ ~~あとNoticeはきっとスコープの問題。~~
5
+ 上記勘違い。既に指摘がある通りそもそもPDOのnewに失敗してて$pdoが存在しないものと思います。
6
+ というか同じロジック内でtry-catchをわけるメリットってほぼ皆無なのでひとくくりにしてしまっても差し支えないのでは。
7
+ ※ただし先に指摘したように毎回CREATE TABLEでお伺いを立てることになり、初回以外CREATEされないのでこの実装が不要です。先にテーブル作っておけば済む話。
8
+
9
+ # 以下、実装に対する指摘
10
+
11
+ ```php
12
+ } catch (Exception $e) {
13
+ ```
14
+ PDOなら[PDOException](https://www.php.net/manual/ja/class.pdoexception.php)を拾うべき。
15
+
16
+ ```php
17
+ return false;
18
+ ```
19
+ [exit()](https://www.php.net/manual/ja/function.exit.php)のほうが適切では。
20
+
21
+ ただ、今の実装だとブラウザの「戻る」押すしかないですけど、ここで止めるのは悪手のように思います。
22
+ 関連性のないバリデーションは全て表示させるように実装した方がユーザーには優しいです。
23
+
24
+
25
+ ```php
26
+ if (var_dump($_POST['username'])) {
27
+ ```
28
+ [var_dump()](https://www.php.net/manual/ja/function.var-dump.php)の結果を判定して何がしたいのでしょう。
29
+ ちなみにPHPマニュアルの通り、voidで返却値がないので、例え定義されている変数を与えてもifはfalseとなって絶対にこのif内は通りません。
30
+
31
+ ```php
32
+ } catch (\Exception $e) {
33
+ ```
34
+ 始めの方には`\`入ってなかったけど。実装が統一されてない。
35
+
36
+ ```php
37
+ echo '登録済みのメールアドレスです。';
38
+ ```
39
+ いえ、「Exceptionが起きる=重複のメールアドレス」とは限りません。
40
+ きちんとメールアドレスでSELECTかけて**INSERTする前に弾きましょう。**
41
+ これもバリデーションの範疇です。