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

質問編集履歴

4

編集

2019/06/19 10:14

投稿

ariiiiiga
ariiiiiga

スコア66

title CHANGED
@@ -1,1 +1,1 @@
1
- preg_matchでフォームの入力を制限した
1
+ preg_matchでフォームの入力を制限したら画面が真っ白になる
body CHANGED
File without changes

3

修正

2019/06/19 10:14

投稿

ariiiiiga
ariiiiiga

スコア66

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,6 @@
1
1
  phpとmysqlで①入力フォーム(form.php)、②入力確認フォーム(confirm.php)、③完了画面(submit.php)の3つのページを使って完了するログイン機能付きの予約サイトを作っています。
2
2
 
3
- ②の確認画面(confirm.php)でpreg_matchを使って入力をを許可しデータベースへ入れるもしくははじくを選別したいのですが、現状form.phpで送信すると入力がなもerror.phpへ移動てしまいます。
3
+ ②の確認画面(confirm.php)でpreg_matchを使って入力をを許可しデータベースへ入れるもしくははじくを選別したいのですが、現状form.phpで送信するとconfirm.php真っ白にてしまいます。
4
4
 
5
5
  confrim.phpでpreg_matchのif文を追加するまでは動作していたので、そこが原因だと思うのですが、原因がわかりません。
6
6
 
@@ -31,7 +31,7 @@
31
31
  ```ここに言語を入力
32
32
  confirm.php
33
33
  <?php
34
- if (preg_match("/\A[a-zA-Z0-90-9ぁ-んァ-ヶー一-龠、。\n\r]\z/mu",$_POST['comment'])){
34
+ if (preg_match("/\A[a-zA-Z0-90-9ぁ-んァ-ヶー一-龠、。\n\r]\z/mu",$_POST['comment'])|| ($_POST['comment'] == null)){
35
35
 
36
36
  $_SESSION['comment'] = $_POST['comment'];
37
37
 

2

情報の追加

2019/06/19 10:13

投稿

ariiiiiga
ariiiiiga

スコア66

title CHANGED
File without changes
body CHANGED
@@ -1,26 +1,72 @@
1
1
  phpとmysqlで①入力フォーム(form.php)、②入力確認フォーム(confirm.php)、③完了画面(submit.php)の3つのページを使って完了するログイン機能付きの予約サイトを作っています。
2
2
 
3
- 完了画面(submit.php)でpreg_matchを使って日本語、数字、アルファベット、(、。)を許可しデータベースへ入れるもしくははじくを選別したいのですが<a href="#">URL</a>のようなURLがはじかれとなくそのままDB入ってしまいます。用意しているエラーメッセージも出力されずどこを直せばいいのかわかりません。
3
+ 確認画面(confirm.php)でpreg_matchを使って入力許可しデータベースへ入れるもしくははじくを選別したいのですが、現状form.phpで送信すると入力がなくてもerror.php移動してしまいます。
4
4
 
5
+ confrim.phpでpreg_matchのif文を追加するまでは動作していたので、そこが原因だと思うのですが、原因がわかりません。
6
+
5
7
  ご指摘していただけると助かります。
6
8
  宜しくお願い致します。
7
9
 
8
10
  *データベースに接続確認済み
9
11
 
12
+ 入力したい文字
13
+ 大小数字、日本語、大小アルファベット、空欄、改行、。
10
14
 
15
+ 拒否したい文字の例
16
+ <a href="">URL</a>
17
+ https://teratail.com/questionsのようなURL
18
+ javascript文
11
19
  ```ここに言語を入力
12
- submit.php
20
+ form.php
21
+ var_dump($shop_result['shop_id']); //->数字
22
+ <form action="confirm.php?shop_id=<?=htmlspecialchars( $shop_result['shop_id'], ENT_QUOTES, 'UTF-8');?>" method="post">
23
+
24
+ <div class="form-group">
25
+ <label for="InputReserveComment" >コメント</label><br>
26
+ <textarea col="10" rows="2" name="comment" class="form-control" placeholder="予約条件など"></textarea><br><br>
27
+ </div>
28
+ <input id="send" name="reserve" type="submit" value="送信" >
29
+ </form>
30
+ ```
31
+ ```ここに言語を入力
32
+ confirm.php
33
+ <?php
34
+ if (preg_match("/\A[a-zA-Z0-90-9ぁ-んァ-ヶー一-龠、。\n\r]\z/mu",$_POST['comment'])){
35
+
36
+ $_SESSION['comment'] = $_POST['comment'];
13
37
 
38
+ exit;
14
- var_dump($_SESSION['comment']); //-> string(19) "URL"
39
+ } else {
15
- if (!preg_match("/^[ぁ-んァ-ヶーa-zA-Z0-9一-龠0-9、。\n\r]+$/u",$_SESSION['comment'])){
16
- $NOmessage = 'コメントの入力文字を確認してください。';
40
+ header('Location: error.php');
17
41
  }
42
+ ?>
43
+ <!DOCTYPE HTML>
44
+ <html lang="ja">
45
+ <head>
46
+ <meta charset="utf-8">
47
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
48
+ <meta name="viewport" content="width=device-width, initial-scale=1">
49
+ <title></title>
50
+ </head>
51
+ <body>
52
+ <form action="reserve_submit.php?shop_id=<?=htmlspecialchars($shop_result['shop_id']);?>" method="post" >
53
+ <table >
54
+ <tr><th > 店舗名: </th><td ><?=htmlspecialchars( $shop_result['shop_name'],ENT_QUOTES,'utf-8');?></td></tr>
55
+ <tr><th>コメント:</th><td><?php echo htmlspecialchars($_SESSION['comment'] ,ENT_QUOTES,'utf-8') ?></td></tr>
56
+ </table>
18
- if (preg_match("/^[ぁ-んァ-ヶーa-zA-Z0-9一-龠0-9、。\n\r]+$/u",$_SESSION['comment'])){
57
+ <input id="send" name="reserve" type="submit" value="登録する">
58
+ </form>
59
+ </body>
60
+ </html>
61
+ ```
62
+ ```ここに言語を入力
63
+ submit.php
64
+
19
- $comment = $_SESSION['comment'];
65
+ $comment = $_SESSION['comment'];
20
66
 
21
- // データの追加
67
+ // データの追加
22
- $sql = "INSERT INTO reserve(reserve_shop_id,reserve_comment,reserve_tel) VALUES('".$shop_id."','".$comment."','".$tel."')";
68
+ $sql = "INSERT INTO reserve(reserve_shop_id,reserve_comment,reserve_tel) VALUES(?,?,?)";
23
- $stmt = $pdo -> prepare($sql);
69
+ $stmt = $pdo -> prepare($sql);
24
- $stmt -> execute();
70
+ $stmt -> execute([$shop_id,$comment,$tel]);
25
- }
71
+
26
72
  ```

1

添削済み

2019/06/19 09:34

投稿

ariiiiiga
ariiiiiga

スコア66

title CHANGED
File without changes
body CHANGED
@@ -1,255 +1,21 @@
1
1
  phpとmysqlで①入力フォーム(form.php)、②入力確認フォーム(confirm.php)、③完了画面(submit.php)の3つのページを使って完了するログイン機能付きの予約サイトを作っています。
2
2
 
3
- ③の完了画面でpreg_matchを使って日本語、数字、アルファベット、(、。)を許可してデータベースへ入れるもしくははじくを選別したいのですが<a href="#">URL</a>のようなURLがはじかれることなくそのままDBへ入ってしまいます。用意しているエラーメッセージも出力されずどこを直せばいいのかわかりません。
3
+ ③の完了画面(submit.php)でpreg_matchを使って日本語、数字、アルファベット、(、。)を許可してデータベースへ入れるもしくははじくを選別したいのですが<a href="#">URL</a>のようなURLがはじかれることなくそのままDBへ入ってしまいます。用意しているエラーメッセージも出力されずどこを直せばいいのかわかりません。
4
4
 
5
5
  ご指摘していただけると助かります。
6
6
  宜しくお願い致します。
7
7
 
8
+ *データベースに接続確認済み
8
9
 
9
- ### 該当のソースコード
10
10
 
11
- ```ここに言語名を入力
12
- form.php
13
- <?php
14
- error_reporting(E_ALL);
15
- ini_set("display_errors",1);
16
-
17
- try {
18
- session_start();
19
- $db['host'] = "localhost";
20
- $db['user'] = "root";
21
- $db['pass'] = "";
22
- $db['dbname'] = "reserve";
23
-
24
- // メッセージの初期化
25
- $NOmessage = "";
26
- $OKmessage = "";
27
-
28
- // 2. ユーザIDとパスワードが入力されていたら認証する
29
- $dsn = sprintf('mysql: host=%s; dbname=%s;charset=utf8', $db['host'], $db['dbname']);
30
- $pdo = new PDO($dsn, $db['user'], $db['pass']);
31
- $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
32
- $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
33
-
34
- // ①ユーザーIDからユーザー名を取り出す
35
- $query = "SELECT * FROM users WHERE user_id=:user_id";
36
- $user_stmt = $pdo->prepare($query);
37
- $user_stmt->bindValue(':user_id', $_SESSION['user'], PDO::PARAM_INT);
38
- $user_stmt->execute();
39
-
40
- // ユーザー情報の取り出し
41
- $row = $user_stmt->fetch(PDO::FETCH_ASSOC);
42
- $user_name = $row['user_name'];
43
- $user_id = $row['user_id'];
44
- $tel = $row['tel'];
45
-
46
- // 渡されたidを受け取る
47
- $shop_id = filter_input(INPUT_GET, 'shop_id', FILTER_SANITIZE_SPECIAL_CHARS);
48
- // 受け取ったidからレコード取得sqlを生成
49
- $sql = "SELECT * FROM shop WHERE shop_id = ".$shop_id;
50
- //SQL文を実行する
51
- $PostData = $pdo->query($sql);
52
- //実行結果を配列で受け取る
53
- $shop_result = $PostData->fetch( PDO::FETCH_ASSOC);
54
- // ユーザー情報の取り出し
55
- $shop_name = $shop_result['shop_name'];
56
-
57
-
58
- } catch (PDOException $e) {
59
- var_dump($e);
60
- die();
61
- }
62
- ?>
63
- <!DOCTYPE HTML>
64
- <html lang="ja">
65
- <head>
66
- <meta charset="utf-8">
67
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
68
- <meta name="viewport" content="width=device-width, initial-scale=1">
69
- <title>予約フォーム</title>
70
- </head>
71
- <body>
72
-
73
-  <header >
74
-   <div class="site_name" style="text-align:center;font-size:30px;">
75
-    <a href="home.php?user_id=<?= $user_id ?>" style="color:white;">サイト</a>
76
-   </div>
77
-   <div class="login" >
78
-    <div class="login_name" >
79
-   <span ><a href="change_profile_form.php?user_id=<?= $user_id ?>" ><?php echo htmlspecialchars($user_name,ENT_QUOTES); ?> ログイン中</a></span>
80
-   </div>
81
-  </div>
82
- </header>
83
- <main >
84
- <p class="alert alert-success" ><?=htmlspecialchars( $shop_result['shop_name'], ENT_QUOTES, 'UTF-8');?> 予約フォーム</p>
85
- <div class="container" >
86
- <div class="row">
87
- <div class="col-xl-12" >
88
- <form action="confirm.php?shop_id=<?=htmlspecialchars( $shop_result['shop_id'], ENT_QUOTES, 'UTF-8');?>" method="post">
89
- <div class="form-group">
90
- <label for="InputReserveComment" >コメント</label><br>
91
- <textarea col="10" rows="2" name="comment" class="form-control" placeholder="予約条件など"></textarea><br><br>
92
- </div>
93
- <input id="send" name="reserve" type="submit" value="送信" >
94
- </form>
95
- </div>
96
- </div>
97
- </div>
98
- </main>
99
- </div>
100
- </body>
101
- </html>
102
-
103
- ```
104
11
  ```ここに言語を入力
105
- confirm.php
106
- <?php
107
- error_reporting(E_ALL);
108
- ini_set("display_errors",1);
109
-
110
- try{
111
- session_start();
112
- $db['host'] = "localhost";
113
- $db['user'] = "root";
114
- $db['pass'] = "";
115
- $db['dbname'] = "reserve";
116
-
117
- // メッセージの初期化
118
- $NOmessage = "";
119
- $OKmessage = "";
120
-
121
- // 2. ユーザIDとパスワードが入力されていたら認証する
122
- $dsn = sprintf('mysql: host=%s; dbname=%s;charset=utf8', $db['host'], $db['dbname']);
123
- $pdo = new PDO($dsn, $db['user'], $db['pass']);
124
- $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
125
- $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
126
-
127
- // ①ユーザーIDからユーザー名を取り出す
128
- $query = "SELECT * FROM users WHERE user_id=:user_id";
129
- $user_stmt = $pdo->prepare($query);
130
- $user_stmt->bindValue(':user_id', $_SESSION['user'], PDO::PARAM_INT);
131
- $user_stmt->execute();
132
-
133
- // ユーザー情報の取り出し
134
- $row = $user_stmt->fetch(PDO::FETCH_ASSOC);
135
- $user_name = $row['user_name'];
136
- $user_id = $row['user_id'];
137
- $tel = $row['tel'];
138
-
139
- // 渡されたidを受け取る
140
- $shop_id = filter_input(INPUT_GET, 'shop_id', FILTER_SANITIZE_SPECIAL_CHARS);
141
- // 受け取ったidからレコード取得sqlを生成
142
- $sql = "SELECT * FROM shop WHERE shop_id = ".$shop_id;
143
- //SQL文を実行する
144
- $PostData = $pdo->query($sql);
145
- //実行結果を配列で受け取る
146
- $shop_result = $PostData->fetch( PDO::FETCH_ASSOC);
147
- // ユーザー情報の取り出し
148
- $shop_name = $shop_result['shop_name'];
149
-
150
- // 入力を格納
151
- $_SESSION['comment'] = $_POST['comment'];
152
-
153
-
154
- } catch (PDOException $e) {
155
- var_dump($e);
156
- die();
157
- }
158
- ?>
159
- <!DOCTYPE HTML>
160
- <html lang="ja">
161
- <head>
162
- <meta charset="utf-8">
163
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
164
- <meta name="viewport" content="width=device-width, initial-scale=1">
165
- <title>入力確認</title>
166
- </head>
167
- <body>
168
-
169
- <header >
170
-   <div class="site_name" style="text-align:center;font-size:30px;">
171
-    <a href="home.php?user_id=<?= $user_id ?>" style="color:white;">サイト</a>
172
-   </div>
173
-   <div class="login" >
174
-    <div class="login_name" >
175
-   <span ><a href="change_profile_form.php?user_id=<?= $user_id ?>" ><?php echo htmlspecialchars($user_name,ENT_QUOTES); ?> ログイン中</a></span>
176
-   </div>
177
- </div>
178
- </header>
179
-
180
- <main style="text-align:center;">
181
- <div class="container" >
182
- <div class="row">
183
- <div class="col-xl-12" style="background-color:rgb(242, 242, 242);height:400px;">
184
- <p class="alert alert-success" style="">予約内容確認画面</p>
185
- <form action="reserve_submit.php?shop_id=<?=htmlspecialchars($shop_result['shop_id']);?>" method="post" >
186
- <table style="text-align:center;font-weight:bold;font-size:25px;">
187
- <tr><th style="background-color:pink;"> 店舗名: </th><td ><?=htmlspecialchars( $shop_result['shop_name'],ENT_QUOTES,'utf-8');?></td></tr>
188
- <tr><th>コメント:</th><td><?php echo htmlspecialchars($_SESSION['comment'] ,ENT_QUOTES,'utf-8') ?></td></tr>
189
- </table>
190
- <input id="send" name="reserve" type="submit" value="登録する">
191
- </form>
192
- </div>
193
- </div>
194
- </div>
195
- </main>
196
- </div>
197
- </body>
198
- </html>
199
- ```
200
- ```ここに言語を入力
201
12
  submit.php
202
- <?php
203
13
 
204
- error_reporting(E_ALL);
205
- ini_set("display_errors",1);
206
-
207
- try {
208
- session_start();
209
- $db['host'] = "localhost";
210
- $db['user'] = "root";
211
- $db['pass'] = "";
212
- $db['dbname'] = "reserve";
213
-
214
- // メッセージの初期化
215
- $NOmessage = "";
216
- $OKmessage = "";
217
-
218
- // 2. ユーザIDとパスワードが入力されていたら認証する
219
- $dsn = sprintf('mysql: host=%s; dbname=%s;charset=utf8', $db['host'], $db['dbname']);
220
- $pdo = new PDO($dsn, $db['user'], $db['pass']);
221
- $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
222
- $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
223
-
224
- // ①ユーザーIDからユーザー名を取り出す
225
- $query = "SELECT * FROM users WHERE user_id=:user_id";
226
- $user_stmt = $pdo->prepare($query);
227
- $user_stmt->bindValue(':user_id', $_SESSION['user'], PDO::PARAM_INT);
14
+ var_dump($_SESSION['comment']); //-> string(19) "URL"
228
- $user_stmt->execute();
229
-
230
- // ユーザー情報の取り出し
231
- $row = $user_stmt->fetch(PDO::FETCH_ASSOC);
232
- $user_name = $row['user_name'];
233
- $user_id = $row['user_id'];
234
- $tel = $row['tel'];
235
-
236
- // 渡されたidを受け取る
237
- $shop_id = filter_input(INPUT_GET, 'shop_id', FILTER_SANITIZE_SPECIAL_CHARS);
238
- // 受け取ったidからレコード取得sqlを生成
239
- $sql = "SELECT * FROM shop WHERE shop_id = ".$shop_id;
240
- //SQL文を実行する
241
- $PostData = $pdo->query($sql);
242
- //実行結果を配列で受け取る
243
- $shop_result = $PostData->fetch( PDO::FETCH_ASSOC);
244
- // ユーザー情報の取り出し
245
- $shop_name = $shop_result['shop_name'];
246
-
247
15
  if (!preg_match("/^[ぁ-んァ-ヶーa-zA-Z0-9一-龠0-9、。\n\r]+$/u",$_SESSION['comment'])){
248
16
  $NOmessage = 'コメントの入力文字を確認してください。';
249
17
  }
250
18
  if (preg_match("/^[ぁ-んァ-ヶーa-zA-Z0-9一-龠0-9、。\n\r]+$/u",$_SESSION['comment'])){
251
- $count = $_SESSION['count'];
252
- $time = $_SESSION['time'];
253
19
  $comment = $_SESSION['comment'];
254
20
 
255
21
  // データの追加
@@ -257,47 +23,4 @@
257
23
  $stmt = $pdo -> prepare($sql);
258
24
  $stmt -> execute();
259
25
  }
260
-
261
-
262
-
263
- } catch (PDOException $e) {
264
- var_dump($e);
265
- die();
266
- }
267
- ?>
268
-
269
- <!DOCTYPE HTML>
270
- <html lang="ja">
271
- <head>
272
- <meta charset="utf-8" />
273
- <meta name="viewport" content="width=device-width, initial-scale=1">
274
- <title>PHPのマイページ機能</title>
275
- </head>
276
- <body>
277
-
278
- <header >
279
-   <div class="site_name" >
280
-    <a href="home.php?user_id=<?= $user_id ?>" >サイト</a>
281
-   </div>
282
-   <div class="login" >
283
-    <div class="login_name" >
284
-   <span ><a href="change_profile_form.php?user_id=<?= $user_id ?>" ><?php echo htmlspecialchars($user_name,ENT_QUOTES); ?> ログイン中</a></span>
285
-   </div>
286
- </div>
287
- </header>
288
- <div class="main">
289
- <div class="container" >
290
- <div class="row">
291
- <div class="col-xl-12" style="">
292
- <p class="alert alert-success" >予約完了</p>
293
-  <div class="content" >
294
- <h3 >予約店舗:<?php echo htmlspecialchars( $shop_name, ENT_QUOTES, 'UTF-8');?><br>予約完了しました</h3>
295
- </div>
296
- </div>
297
- </div>
298
- </div>
299
- </div>
300
- </body>
301
- </html>
302
-
303
26
  ```