質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1632閲覧

preg_matchでフォームの入力を制限したら画面が真っ白になる

ariiiiiga

総合スコア66

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/06/18 11:02

編集2019/06/19 10:14

phpとmysqlで①入力フォーム(form.php)、②入力確認フォーム(confirm.php)、③完了画面(submit.php)の3つのページを使って完了するログイン機能付きの予約サイトを作っています。

②の確認画面(confirm.php)でpreg_matchを使って入力をを許可しデータベースへ入れるもしくははじくを選別したいのですが、現状form.phpで送信するとconfirm.phpが真っ白になってしまいます。

confrim.phpでpreg_matchのif文を追加するまでは動作していたので、そこが原因だと思うのですが、原因がわかりません。

ご指摘していただけると助かります。
宜しくお願い致します。

*データベースに接続確認済み

入力したい文字
大小数字、日本語、大小アルファベット、空欄、改行、。

拒否したい文字の例
<a href="">URL</a>
https://teratail.com/questionsのようなURL
javascript文

form.php var_dump($shop_result['shop_id']); //->数字 <form action="confirm.php?shop_id=<?=htmlspecialchars( $shop_result['shop_id'], ENT_QUOTES, 'UTF-8');?>" method="post"> <div class="form-group"> <label for="InputReserveComment" >コメント</label><br> <textarea col="10" rows="2" name="comment" class="form-control" placeholder="予約条件など"></textarea><br><br> </div> <input id="send" name="reserve" type="submit" value="送信" > </form>
confirm.php <?php if (preg_match("/\A[a-zA-Z0-90-9ぁ-んァ-ヶー一-龠、。\n\r]\z/mu",$_POST['comment'])|| ($_POST['comment'] == null)){ $_SESSION['comment'] = $_POST['comment']; exit; } else { header('Location: error.php'); } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title></title> </head> <body> <form action="reserve_submit.php?shop_id=<?=htmlspecialchars($shop_result['shop_id']);?>" method="post" > <table > <tr><th > 店舗名: </th><td ><?=htmlspecialchars( $shop_result['shop_name'],ENT_QUOTES,'utf-8');?></td></tr> <tr><th>コメント:</th><td><?php echo htmlspecialchars($_SESSION['comment'] ,ENT_QUOTES,'utf-8') ?></td></tr> </table> <input id="send" name="reserve" type="submit" value="登録する"> </form> </body> </html>
submit.php $comment = $_SESSION['comment']; // データの追加 $sql = "INSERT INTO reserve(reserve_shop_id,reserve_comment,reserve_tel) VALUES(?,?,?)"; $stmt = $pdo -> prepare($sql); $stmt -> execute([$shop_id,$comment,$tel]);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/06/18 11:08

$_SESSION['comment'] の内容をチェックしているように思いますが、その内容が貴殿の期待通りの値が入っているのかは確認済ですか? であれば、ソースをズラズラ提示するのではなく、入力文字列に対してどのようなチェックをしたいと言うだけのコードを書いてみて、確認すれば良いのでは?それでもわからない場合、その確認コードを提示して質問された方がお互いのためかと思います。 もし期待通りの値になっていないのであれば、なぜ期待通りにならないのかを調査されると良いかと。
m.ts10806

2019/06/18 11:14 編集

実際に入力して試した文字情報をご提示ください。 「のような」だけでは再現確認に必要な情報ではありません。 ><a href="#">URL</a> 上記はURLではないですね。単なるタグと文字列です。http://またはhttps://で始まるものではないのでしょうか。
m.ts10806

2019/06/18 11:16

起きている問題に対して提示されている内容に無関係な情報が多すぎます。要はノイズだらけです。 単体実行で確認できるコードのみご提示ください。 そのほうが回答を得やすくなります。
m.ts10806

2019/06/18 12:01

2回目 実際に入力して試した文字情報をご提示ください。 「のような」だけでは再現確認に必要な情報ではありません。 ><a href="#">URL</a> 上記はURLではないですね。単なるタグと文字列です。http://またはhttps://で始まるものではないのでしょうか。 「URLという文字列」なのか「URL」なのかでは実態が大きく異なります。書かないとわかりません。
退会済みユーザー

退会済みユーザー

2019/06/18 14:12

全く同じ正規表現パターンを2度実行するナンセンスさ。一度の実行で結果を変数に持つなどすればいいと思うんですよね。で、なぜconfirm.phpは掲載しないのだろうかと。そもそもどういう入力項目を想定していて、それぞれでどういう入力が妥当なのかまでしっかり検討されてあるのだろうか。決めてあるのであれば質問文中に追記してほしい。
papinianus

2019/06/18 22:50

^$のかわりに\A\zとか、記号のみ含まれるコメントにするとか、試していただけませんか
退会済みユーザー

退会済みユーザー

2019/06/19 11:24

真っ白になる、ってのを見落としていたんだけど、webサーバーのerror_logにはなんてかいてあるのだろうか。
ariiiiiga

2019/06/19 11:49

confirm.phpのexit;を消したら表示されるようになりました。
m.ts10806

2019/06/19 11:55

何も出力書いてないのにexit入れてたら当然ですね。知らずに使うものではないです。
guest

回答2

0

commentをフィルタするのはconfirmでですね
postデータをバリデートしてokならsessionに入れます
sessionをpreg_match処理するのはナンセンス

pregのパターンできちんと処理するなら

PHP

1$pattern="/\A[パターン]\z/mu";

あとは通したくない文字列が通ってしまう具体的なサンプルを提示ください

データの追加についてはprepareでやるならきちんと
プレースホルダーの書式に合わせてください

PHP

1$sql = "INSERT INTO reserve(reserve_shop_id,reserve_comment,reserve_tel) VALUES(?,?,?)"; 2$stmt = $pdo -> prepare($sql); 3$stmt -> execute([$shop_id,$comment,$tel]);

投稿2019/06/19 00:42

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/19 00:56

あぁ、改行も考慮したデータ先頭と末尾の指定、\Aと\zっすね。その方が正しい。 prepare()使うなら、プレースホルダー使うのが正しい。
yambejp

2019/06/19 09:38

> sessionをpreg_match処理しない セッションに入れる前にpostデータをバリデートするんです 失敗したらセッションデータにはいれない
guest

0

ベストアンサー

忙しいんで中身も読まずに、追加情報もないまま回答しますけども。

input.php
→入力フォームの表示、及び送信前の軽微な入力エラーチェック処理(はjavascriptで)。

confirm.php
→入力データの検証、データベースに照会して判定する入力エラーチェック処理。
エラーが有る場合にinput.phpに差し戻して、
エラー情報はinput.phpにて表示できるようにする。

submit.php
→入力データの再検証(必ずしもconfirm.phpからのみ受信するわけではないので)、データベース登録処理。
この時点ではエラーは殆どないものとして、ただしconfirm.phpからsubmit.phpに至るまでに時間が経過して
条件が不成立する場合なども想定した、confirm.phpと同等以上の入力データの再検証が必要なはず。
confirm.phpからsubmit.phpに進めるのは、入力データに不備がなく登録できる条件が(その時点で)成立しているときのみ、とします。

・・っていうのが王道な処理の流れではないかと。

preg_matchを使いたいようですが、
PHP: PCRE のパターン - Manual
にあるドキュメントを理解した上で正規表現を使うことになります。
弾くためのパターンを考えて検証するよりも、
通すためのパターンを考えて検証した方が良いです。
数字や文字が一定のパターンで並ぶか否か、否の場合にエラーメッセージを表示、と。
「この場合はだめ」っていうパターンはいくらでもあるわけで
正規表現を使ってもダメパターンを全部用意するのは無茶です。
それよりも、
「こうなっていないものは全部拒否」という、通るパターンを検証するのであれば、
一つや二つの正規表現パターンで済ませられます。
具体例をあげると、
例えば電話番号をどう入力させますか。
市外局番からすべての桁を入力させるのでしょうけど、
携帯電話の番号というのもありますし、
ハイフンを入れる入れない、カッコを付けるつけない、国番号をつけるつけない、
など条件がいろいろ考えられます。
入力のしやすさを考慮して「記号なしに数字のみ、市外局番から」とした場合、
/^[0-9]+$/
っていうパターンさえ通ればOKとなります。
いちいちカッコが入っていないかどうかを検証したり、
ハイフンが入っていないかを検証したり
空白が入っていないかを検証したりしなくてよいのです。
より正確性を期するなら、先頭の数字はゼロであることを強制するために
/^0[0-9]+$/
にしてみたりとか、パターンを工夫すれば済む話です。
(この例はあくまで例示なので、想定する入力データを十分検討の上正規表現パターンを実装してください。)

よりユーザー体験を良くするには、input.phpで送信ボタンをクリックした際に
かるく入力データのチェックをjavascript上でやってその場でエラーメッセージ表示することも
ご検討ください。
チェックできるのは入力文字種、長さくらいかもしれませんが。
データベースに照会しないと判明しないエラーはphp側でやっていいと思います。
軽微な入力エラーならjavascriptで判定して送信前にエラー表示されると
ユーザーに係る負担は軽減されます。

投稿2019/06/18 12:07

編集2019/06/18 14:18
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問