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

質問編集履歴

1

form_insert.phpを全文表示

2019/07/22 13:32

投稿

hello_mate
hello_mate

スコア21

title CHANGED
File without changes
body CHANGED
@@ -35,40 +35,95 @@
35
35
  ob_start();
36
36
  session_start();
37
37
  require_once('common_function.php');
38
+ date_default_timezone_set('Asia/Tokyo');
39
+ $user_input_data = array();
38
40
 
41
+ // 「パラメタの一覧」を把握
39
42
  $params = array('name', 'post', 'address', 'birthday_yy', 'birthday_mm', 'birthday_dd');
40
43
  // データを取得する
41
44
  foreach($params as $p) {
42
45
  $user_input_data[$p] = (string)@$_POST[$p];
43
46
  }
44
47
 
48
+ $error_flg = false;
49
+ $error_detail = array(); // エラー情報の詳細を入れるための配列を用意する
50
+ // 必須チェックを実装
51
+ $validate_params = array('name', 'post', 'address', 'birthday_yy', 'birthday_mm', 'birthday_dd');
52
+ foreach($validate_params as $p) {
53
+ // 空文字(未入力)なら
54
+ if ('' === $user_input_data[$p]) {
55
+ // 「必須情報の未入力エラー」であることを配列に格納しておく
56
+ $error_detail["error_must_{$p}"] = true; // 例えば「名前が未入力」の場合は、key名は「error_must_name」となる
57
+ // エラーフラグを立てる
58
+ $error_flg = true;
59
+ }
60
+ }
61
+
62
+ if (1 !== preg_match('/\A[0-9]{3}[- ]?[0-9]{4}\z/', $user_input_data['post'])) {
63
+ // 「郵便番号のフォーマットエラー」であることを配列に格納しておく
64
+ $error_detail["error_format_post"] = true;
65
+ // エラーフラグを立てる
66
+ $error_flg = true;
67
+ }
68
+
69
+ $int_params = array('birthday_yy', 'birthday_mm', 'birthday_dd');
70
+ foreach($int_params as $p) {
71
+ $user_input_data[$p] = intval($user_input_data[$p]);
72
+ }
73
+
74
+ if (false === checkdate($user_input_data['birthday_mm'], $user_input_data['birthday_dd'], $user_input_data['birthday_yy'])) {
75
+ $error_detail["error_format_birthday"] = true;
76
+ // エラーフラグを立てる
77
+ $error_flg = true;
78
+ }
79
+
80
+ // CSRFチェック
81
+ if (false === is_csrf_token()) {
82
+ $error_detail["error_csrf"] = true;
83
+ $error_flg = true;
84
+ }
85
+ // エラーが出たら入力ページに遷移する
86
+ if (true === $error_flg) {
87
+ // エラー情報をセッションに入れて持ちまわる
88
+ $_SESSION['output_buffer'] = $error_detail;
89
+ // 入力値をセッションに入れて持ちまわる
90
+ // XXX 「keyが重複しない」はずなので、加算演算子でOK
91
+ $_SESSION['output_buffer'] += $user_input_data;
92
+ // 入力ページに遷移する
93
+ header('Location: ./form_insert.php');
94
+ exit;
95
+ }
45
96
  // DBハンドルの取得
97
+ try{
46
- $dbh = get_dbh();
98
+ $dbh = get_dbh();
47
- // INSERT文の作成と発行
48
- // ------------------------------
49
- // 準備された文(プリペアドステートメント)の用意
50
- $sql = 'INSERT INTO test_form(name, post, address, birthday, created, updated)
99
+ $sql = 'INSERT INTO test_form(name, post, address, birthday, created, updated)
51
- VALUES (:name, :post, :address, :birthday, :created, :updated);';
100
+ VALUES (:name, :post, :address, :birthday, :created, :updated);';
52
- var_dump($sql);
101
+
53
- $pre = $dbh->prepare($sql);
102
+ $pre = $dbh->prepare($sql);
54
- // 値のバインド
103
+ // 値のバインド
55
- $pre->bindValue(':name', $user_input_data['name'], PDO::PARAM_STR);
104
+ $pre->bindValue(':name', $user_input_data['name'], PDO::PARAM_STR);
56
- $pre->bindValue(':post', $user_input_data['post'], PDO::PARAM_STR);
105
+ $pre->bindValue(':post', $user_input_data['post'], PDO::PARAM_STR);
57
- $pre->bindValue(':address', $user_input_data['address'], PDO::PARAM_STR);
106
+ $pre->bindValue(':address', $user_input_data['address'], PDO::PARAM_STR);
58
- //
107
+ //
59
- $birthday = "{$user_input_data['birthday_yy']}-{$user_input_data['birthday_mm']}-{$user_input_data['birthday_dd']}";
108
+ $birthday = "{$user_input_data['birthday_yy']}-{$user_input_data['birthday_mm']}-{$user_input_data['birthday_dd']}";
60
- $pre->bindValue(':birthday', $birthday, PDO::PARAM_STR);
109
+ $pre->bindValue(':birthday', $birthday, PDO::PARAM_STR);
61
- $pre->bindValue(':created', date(DATE_ATOM), PDO::PARAM_STR);
110
+ $pre->bindValue(':created', date(DATE_ATOM), PDO::PARAM_STR);
62
- $pre->bindValue(':updated', date(DATE_ATOM), PDO::PARAM_STR);
111
+ $pre->bindValue(':updated', date(DATE_ATOM), PDO::PARAM_STR);
63
- // SQLの実行
112
+ // SQLの実行
64
- $r = $pre->execute();
113
+ $r = $pre->execute();
114
+ }catch(PDOException $e){
115
+ var_dump($e);
116
+
65
- if (false === $r) {
117
+ if (false === $r) {
66
- // XXX 本当はもう少し丁寧なエラーページを出力する
67
- echo 'システムでエラーが起きました';
118
+ echo 'システムでエラーが起きました';
68
- exit;
119
+ exit;
120
+ }
121
+
122
+ }
69
123
  // ダミーのOK:後で削除する
70
124
  echo 'OK';
71
125
  ```
72
126
 
127
+
128
+ みなさま色々な指摘ありがとうございます。
73
- dbへ接続部分と、INSERT文の部分削っ取りました。
129
+ form_insert.php中身全文載せさせいただきました。
74
- ご教授していただけると助かります。よろしくお願いします。