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

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

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

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

Q&A

解決済

3回答

490閲覧

php クラスの処理

yuki911

総合スコア27

PHP

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

0グッド

1クリップ

投稿2020/02/17 03:24

編集2020/02/17 07:54

phpでバリデーションチェックのクラスを作っています。
クラスは呼び出せてはいるのですが、フォームからPOSTされた値が間違えてもエラーが帰ってきません。
何か方法があれば教えていただけると助かります。
よろしくお願いします。

php

1//class.php 2 3<?php 4class ValidateForm 5{ 6 7 public static function check_input($value,$colName) 8 { 9 $error = []; 10 if($value = ''){ 11 $error[] = $colName . 'は入力必須です。'; 12 } 13 return $error; 14 } 15 16 public static function check_name($value,$colName,$length) 17 { 18 $error = []; 19 self::check_input($value,$colName); 20 $name = filter_input(INPUT_POST, $value); 21 $name_length = mb_strlen($name,"UTF-8"); 22 if($name_length > $length){ 23 $error[] = $colName . 'は'. $length . '文字以下で入力してください。'; 24 } 25 return $error; 26 } 27 28 public static function check_mail($value,$colName) 29 { 30 $error = []; 31 self::check_input($value,$colName); 32 $mail = filter_input(INPUT_POST, $value); 33 if(filter_var($mail,FILTER_VALIDATE_EMAIL) === false){ 34 $error[] = $colName . 'を正しい形式で入力してください。'; 35 } 36 return $error; 37 } 38 39 public static function check_pass($value,$colName) 40 { 41 $error = []; 42 self::check_input($value,$colName); 43 $pass = filter_input(INPUT_POST, $value); 44 if(preg_match('/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{6,10}+\z/i',$pass)){ 45 $error[] = $colName . 'は半角英数字をそれぞれ1種類以上含む6文字以上10文字以下で入力してください。'; 46 } 47 return $error; 48 } 49} 50

php

1//index.php 2 3require 'class.php'; 4$error = []; 5 6if ($_SERVER['REQUEST_METHOD'] === 'POST') { 7 ValidateForm::check_name($_POST['name'],'名前',6); 8 ValidateForm::check_mail($_POST['mail'],'メール'); 9 ValidateForm::check_pass($_POST['pass'],'パスワード'); 10} 11 ?> 12 13 <!DOCTYPE html> 14 <html lang="ja" dir="ltr"> 15 <head> 16 <meta charset="utf-8"> 17 <title>aaa</title> 18 </head> 19 <body> 20 <?php if(count($error) > 0) : ?> 21 <?php foreach($error as $e) : ?> 22 <p><?php echo $e; ?></p> 23 <?php endforeach; ?> 24 <?php endif; ?> 25 <form action="" method="post"> 26 <p> 27 <label for="name">ユーザー名</label> 28 <input type="text" name="name" id="name"> 29 </p> 30 <p> 31 <label for="mail">メールアドレス</label> 32 <input type="email" name="mail" id="mail"> 33 </p> 34 <p> 35 <label for="pass">パスワード</label> 36 <input type="password" name="pass" id="password"> 37 </p> 38 <p> 39 <button type="submit">新規登録</button> 40 </p> 41 </form> 42 </body> 43 </html>

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

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

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

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

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

guest

回答3

0

ベストアンサー

フォームからPOSTされた値が間違えてもエラーが帰ってきません。

正確には「返ってきたエラー($error)を呼びもとで受け取ってない」ですね。

投稿2020/02/17 03:30

m.ts10806

総合スコア80875

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

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

yuki911

2020/02/17 08:00

確かにそうですね。 ですが、呼びもとでvar_dumpし,値を入力したのですが、array(0) { }と出てくるのですが、メソッドの処理がいけないんでしょうか?
m.ts10806

2020/02/17 08:55

あと蛇足ですが、 要素単位で関数作ってしまってはオブジェクト指向のメリット全くないですし、関数が増えてくだけです。 要素単位なのに値だけ渡すのも意味がないです。 それなら「必須チェック」「文字数チェック」など、チェック単位で関数つくって、要素に対してなんのチェックをさせるかだけを渡した方がコードとしては生産性も高くなります。
yuki911

2020/02/17 15:53

呼び出し元で変数に代入するということですか? 確かに要素が増えるだけだとオブジェクト指向が意味ないですね。 なるほどです、要素単位で決めてしまうと生産性がなくなりますね。
m.ts10806

2020/02/17 22:23

>呼び出し元で変数に代入するということですか? 私が提示したPHPマニュアル確認されたのでしょうか。 オブジェクト指向というか、関数の基本部分です。
yuki911

2020/02/18 01:48

確認しましたが受け取る処理がわからないです 関数を呼んで、引数を入れ、変数に代入することだと思っていました 受け取る処理を教えてもらえませんか
m.ts10806

2020/02/18 02:01

私が提示したPHPマニュアル確認されたのでしょうか。 そこにきちんと書いてありますよ。確認してわからないところがあるなら、何がどうわからないのか教えてください。 もしかしたら「変数のスコープ」と言ってもわからなかったりしますか?
m.ts10806

2020/02/18 02:05

言わば、「キャッチボール」なんですよ。 通常はAさんとBさんがいて、 AさんがBさんに向かって投げる(関数呼び出し)。 Bさんがボールを受け取り(処理)、Aさんに向かって投げる(return) AさんがBさんから投げられたボールを受け取る 質問者さんのコードは、 BさんがAさんに向かってボールは投げ返してるのに、そこにAさんがいない状態です。 ボールを受け取る人がいないんですよ。
m.ts10806

2020/02/18 02:15

キャッチボールで分かりにくいなら 「自販機で缶コーヒーを買うときに自販機が缶コーヒー出してるのに当の購入したはずの人がいない」でも良いです。 要するに「返してるのに受け取ってない」ので(結局回答に戻りましたね)
yuki911

2020/02/18 02:51

確認させてもらっています 変数のスコープと言われてもピンときません 受け取ってないが、どうやって受け取ればいいのかがわかりません
m.ts10806

2020/02/18 02:56

PHPマニュアル確認されましたかね…。スコープについてもPHPマニュアルを確認してください。 というかスコープ分からないのにオブジェクト指向に入るのは無理があります。 下記のような簡単なコードの理解から入ってください。 function test(){ return 'test'; } $a = test(); echo $a;
Y.H.

2020/02/18 02:58

> $name = filter_input(INPUT_POST, $value); filter_input()の結果を$errorに代入して受け取ってますね > $name_length = mb_strlen($name,"UTF-8"); mb_strlen()の結果を$name_lengthに代入して受け取ってますね では、 ValidateForm::check_name($_POST['name'],'名前',6) の結果はどこへどうやって受け取ればいいですか? https://www.php.net/manual/ja/functions.returning-values.php
m.ts10806

2020/02/18 03:02

Y.H.さん フォローありがとうございます。 そうなんですよね。既に自分で書いてるんですよね。 なのに「わからない」というのが「わからない」
guest

0

端的に修正するなら

PHP

1if ($_SERVER['REQUEST_METHOD'] === 'POST') { 2 $error[] = ValidateForm::check_name($_POST['name'],'名前',6); 3 $error[] = ValidateForm::check_mail($_POST['mail'],'メール'); 4 $error[] = ValidateForm::check_pass($_POST['pass'],'パスワード'); 5} 6 7var_dump($error); 8die(); 9

みたいにするとメソッドで返しているエラーを$error配列の新しい要素として受け取ることが出来ます。

もちろん、このままだと常に死んでしまうので

PHP

1if ($_SERVER['REQUEST_METHOD'] === 'POST') { 2 $nameError = ValidateForm::check_name($_POST['name'],'名前',6); 3 if($nameError){ 4 $error['name'] = $nameError; 5 } 6 7 $mailError = ValidateForm::check_mail($_POST['mail'],'メール'); 8 if($mailError){ 9 $error['mail'] = $mailError; 10 } 11 12 $passwordError = ValidateForm::check_pass($_POST['pass'],'パスワード'); 13 if($passwordError){ 14 $error['password'] = $passwordError; 15 } 16 17} 18 19if(count($error) > 0){ 20 //実際にはHTMLの中でforeachと組み合わせてエラー表示をする 21 var_dump($error); 22 die(); 23} 24

みたいにすると、エラーがあるときだけ死にます。
まずはここまでの流れを把握してみてください。

($errorを参照渡ししたり、スタティックメソッドではなくValidateForm->hasErrors()みたいなメソッドを用意したりするともっとすっきり書くことが出来ます。が、まずは返り値と配列の扱いの基礎的な部分を把握されることをお勧めします。)


このコードが何をしているかは

m.ts10806さんの回答中のリンク
PHPマニュアル 返り値

PHPマニュアル 配列
のサンプルを上から順に試してみて、

  • 返り値の挙動と返り値をその後に利用する方法
  • 配列の操作そのもの

を確認すると理解できるかと思います。

投稿2020/02/18 03:30

編集2020/02/18 03:53
tanat

総合スコア18716

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

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

0

filter_inputを利用するなら、postを引数として渡すのではなく
各バリデータ内でpostをfilter_inputで処理するのが妥当です

投稿2020/02/17 03:35

yambejp

総合スコア116459

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

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

yuki911

2020/02/17 08:03

なるほどです。 呼び出し元で$_POST['name']などとし、メソッドで引数を受け取り、 $name = filter_input(INPUT_POST, $value); のようなことでしょうか?
yambejp

2020/02/17 08:32

たとえばこう <?PHP class ValidateForm { public function blank_check($value="",$colName="",&$error=[]){ if($value ===""){ $error[] = $colName . 'は入力必須です。'; } } public function check_name($value,$colName,$length,&$error= []){ $name = filter_input(INPUT_POST,$value); var_dump($name); if(is_null($name)) return false; $this->blank_check($name,$colName,$error); if(mb_strlen($name) > $length){ $error[] = $colName . 'は'. $length . '文字以下で入力してください。'; } return true; } } $error=[]; $vdf=new ValidateForm; $vdf->check_name('name','名前',6,$error); print_r($error); ?> <form method="post"> <input type="text" name="name"> <input type="submit" value="send"> </form>
yuki911

2020/02/17 16:19

ありがとうございます 具体的なイメージがわかりました。
m.ts10806

2020/02/17 22:26

ここで参照渡しは質問者さんが混乱してしまわないかとちょっと懸念。
yambejp

2020/02/18 00:30 編集

セッタの方がよいですかね・・・ちょっと検討します <?PHP class ValidateForm { private $error=[]; private function blank_check($value="",$colName=""){ if($value ===""){ $this->set_error($colName . 'は入力必須です。'); } } private function set_error($val){ $this->error[]=$val; } public function get_error(){ return $this->error; } public function check_name($value,$colName,$length){ $name = filter_input(INPUT_POST,$value); var_dump($name); if(is_null($name)) return false; $this->blank_check($name,$colName); if(mb_strlen($name) > $length){ $this->error[]= $colName . 'は'. $length . '文字以下で入力してください。'; } return true; } } $vdf=new ValidateForm; $vdf->check_name('name','名前',6); print_r($vdf->get_error()); ?> <form method="post"> <input type="text" name="name"> <input type="submit" value="send"> </form>
yuki911

2020/02/18 01:50

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問