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

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

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

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

673閲覧

HTMLの制限とPHPのバリデーションについて

ranerane0101

総合スコア70

PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/09/03 09:56

編集2021/09/03 14:21

簡単なバリデーションを実装したのですが、HTMLでの

予算:<input type="number" min="1" max="9999" name="budget">円

この制限?が働いてここでは例えば予算を10000円としたらオレンジ色でその数値が入力できない旨のエラーが出るのですが、同じくphpの方で正規表現で表している10000円が入力されたときにバリデーションが実行されるものとの判別が出来ません。この判別法が知りたく質問させていただきました。

ディレクトリ構成はC:\xampp\varidation.php,C:\xampp\htdocs\Recipes\add.phpとなっていて、varidation.phpはドキュメントルートより上の階層に作成しています。
varidation.php↓

varidation.php

1<?php 2if(!preg_match('/\A[[:^cntrl:]]{1,100}+\z/u',$_POST['recipe_name'])){ 3 throw new Exception('料理名を正しく入力してください。'); 4} 5if(!preg_match('/\A[123]\z/',$_POST['category'])){ 6 throw new Exception('カテゴリを正しく入力してください。'); 7} 8if(!preg_match('/\A[123]\z/',$_POST['difficulty'])){ 9 throw new Exception('難易度を正しく入力してください。'); 10} 11if(!preg_match('/\A[0-9]{1,4}+\z/',$_POST['budget'])){ 12 throw new Exception('予算を正しく入力してください。'); 13} 14if(!preg_match('/\A[\r\n[:^cntrl:]]{1,200}+\z/u',$_POST['howto'])){ 15 throw new Exception('作り方を正しく入力してください。'); 16} 17 18 ?>

form.html↓

form.html

1<form method="post" action="add.php"> 2 料理名:<input type="text" name="recipe_name" required><br> 3 カテゴリ: 4 <select name="category"> 5 <option value="">選択してください</option> 6 <option value="1">和食</option> 7 <option value="2">中華</option> 8 <option value="3">洋食</option> 9 </select> 10 <br> 11 難易度: 12 <input type="radio" name="difficulty" value="1">簡単 13 <input type="radio" name="difficulty" value="2" checked>普通 14 <input type="radio" name="difficulty" value="3">難しい 15 <br> 16 予算:<input type="number" min="1" max="9999" name="budget">円 17 <br> 18 作り方: 19 <textarea name="howto" cols="40" rows="4" maxlength="150"></textarea> 20 <br> 21 <div class="d-flex justify-content-center"> 22 <input type="submit" value="送信"> 23 </form>

add.php↓

add.php

1<?php 2//$user = ""; 3 4$user = "Heroku"; 5//$pass = ""; 6$pass = "Heroku"; 7 8 9 10try{ 11 include_once '\xampp\varidation.php'; 12 $dbh = new PDO('mysql:host=heroku;dbname=heroku;charset=utf8mb4', 13 $user,$pass); 14 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 15 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 16 17 echo "の登録が完了しました。<br>"; 18 echo "<a href='index.php'>トップページへ戻る</a>"; 19} catch (Exception $e) { 20 echo "エラー発生:" . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>"; 21 die(); 22} 23 24 25 ?> 26

実行環境:Heroku
データベース接続先:clearDB

参照サイトhttps://book.impress.co.jp/books/1116101152

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

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

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

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

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

maisumakun

2021/09/03 10:51 編集

> 判別が出来ません。 「判別」とは、どういう意味合いでしょうか?
ranerane0101

2021/09/03 14:38

HTMLのバリデーションが働いてerrorなのか、PHPのバリデーションが働いてerrorなのか、です。どちらであってもエラーは吐くので、エラーの出所が知りたかったということです
guest

回答3

0

とりあえずHTMLでバリデーション

HTML

1予算:<input type="number" min="1" max="9999" name="budget" required>円<br>

その上でPHPでPOST/GETのバリデーションはfilter_inputを利用します
(上記でやると入力制限がかかるのでフリー入力できるinputにしておきます)

PHP

1<?PHP 2$budget=filter_input(INPUT_POST,"budget",FILTER_VALIDATE_INT,["options"=>["min_range"=>1,"max_range"=>9999]]); 3if(!is_null($budget)){ 4 var_dump($budget); 5} 6?> 7<form method="post"> 8予算(テスト用):<input type="text" name="budget"><br> 9<input type="submit" value="送信"> 10</form>

投稿2021/09/03 10:28

編集2021/09/03 10:28
yambejp

総合スコア115012

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

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

ranerane0101

2021/09/03 14:36

HTMLではrequiredがありましたね、、覚えていませんでした。filter_inputはadd.phpで修正する形でよろしいのでしょうか? <<(上記でやると入力制限がかかるのでフリー入力できるinputにしておきます) これはこのやり方であればHTMLのバリデーションが無効になってPHPのバリデーションが優位になりこっちが働くということですか?前回ほかの質問で何が何だか分からなくなり解答くださっていたのに返せなくて申し訳ありませんでした。
guest

0

ベストアンサー

HTMLのバリデーションが働いてerrorなのか、PHPのバリデーションが働いてerrorなのか、です。どちらであってもエラーは吐くので、エラーの出所が知りたかったということです

(Ajaxで動的にPHPと通信する状況でなければ)フォーム送信前に発生するのがHTMLでのバリデーションエラー、フォームを送信して再表示される画面に出るのがPHPでのエラーです。

投稿2021/09/03 22:58

maisumakun

総合スコア145208

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

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

ranerane0101

2021/09/04 03:05

ありがとうございます!質問で求めていたこと直接の解答となっているためベストアンサーにさせていただきます。補足のajaxで~も解答の例外も示していただき大変親切で助かりました。ありがとうございました。
guest

0

PHPのほうだけで全てのバリデーションを行う。

htmlは改ざん可能なのでセキュリティ観点ではむしろ不要です。

ただ、PHP側の実装でバリデーションによって例外投げるのは微妙だと思います。想定されるものなので。

蛇足。
\xampp
と環境依存する名前をそのまま書くのはやめましょう。
マジック定数__DIR__など使えば相対パス的な絶対パスが書けるので(ちょっと語弊があるかも)依存はなくせます。

投稿2021/09/03 10:14

編集2021/09/03 23:16
m.ts10806

総合スコア80861

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

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

ranerane0101

2021/09/03 14:09

たしかにクロスサイトスクリプティングとかSQLインジェクションとか改ざん関連で聞いたことありますし、HTMLでのバリデーションは気にしないというか信用しないほうがいいですね。定数__DIR__は片方_これが1つずつに見えるのですが_二つ書くのであってるんでしょうか?少し自信なかったもので・・・
m.ts10806

2021/09/03 22:56

PHPマニュアルに載ってる既定の定数なのでPHPマニュアル確認してください。
maisumakun

2021/09/03 22:59 編集

> htmlは改ざん可能なのでむしろ不要です。 たしかにセキュリティ的には無意味ですが、フォーム送信前にチェックが入るので、UX向上という観点では有用です。
m.ts10806

2021/09/03 23:18 編集

>たしかにセキュリティ的には無意味ですが、フォーム送信前にチェックが入るので、UX向上という観点では有用です。 ご指摘ありがとうございます。 要件次第かもしれません。「サーバーサイドでも同じチェックをすること」が前提となるのでそれならサーバーサイドだけでいいという考え方もあるとは思います。
ranerane0101

2021/09/04 06:37

>PHPマニュアルに載ってる既定の定数なのでPHPマニュアル確認してください。 リンク張っていただいていましたね。ありがとうございます。確認できました。 >たしかにセキュリティ的には無意味ですが、フォーム送信前にチェックが入るので、UX向上という観点では有用です。 UXの観点も普段考えていなかったので参考になります。 お二方ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問