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

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

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

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

Q&A

解決済

3回答

2694閲覧

会員登録フォームの制作においてページ遷移の判定がうまくできない

earnest_gay

総合スコア615

PHP

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

0グッド

2クリップ

投稿2016/06/08 18:09

編集2016/06/08 18:21

下記コードは制作中のものの一部ですが、会員登録フォームを制作しています。
2つの入力フィールドに入力したアドレスが異なっていた場合
・配列に何かしらの文字(ここではerror)を代入
・それと同時にエラー文を作っておく

異なっていた場合はEmail::equal()でエラー文を表示させる

異なっていなければ
sessionにPOST内容を記録させて
header('Location: register1.php');で
次のページに遷移する。

<?php class Email{ function equal(){ $email1 = filter_input(INPUT_POST, 'email1'); $email2 = filter_input(INPUT_POST, 'email2'); if(isset($email1,$email2)){ if($email1 !== $email2 ){ $error['mailequal'] = "error"; $errorms = '<div class="r_em">' . "メールアドレスが一致しません" . '</div>' ; return $errorms; } } } } if(!empty($_POST)){ if($error['mailequal'] !== "error"){ $_SESSION['join'] = $_POST; header('Location: register1.php'); exit(); } } ?> <tr> <td>E-mail</td> <td colspan="2"><input type="email" name="email1" maxlength="50" size="46" placeholder="info@example.com" ></td> </tr> <tr> <td>E-mail (確認用)</td> <td colspan="2"><input type="email" name="email2" maxlength="50" size="46" placeholder="info@example.com" ></td> <td><?php echo Email::equal(); ?></td> </tr>

なのですが、ページ遷移のところでてこずっています。
異ならないアドレスで試してもページ遷移してしまうのですが、どうしたら良いでしょうか...?

多分、問題は外部からクラスへのアクセス方法になっているとおもいます。
$error['mailequal']をクラス外で使っているので未定義の変数を呼び出していることになって判定がうまくできないのだと思います。(違っていたら申し訳ない)

エラー文の表示では、クラスはインスタン化せずに::で使てますが
クラスのプロパティ(変数?)にアクセスする方法が分かれば...

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

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

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

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

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

guest

回答3

0

ベストアンサー

とりあえず元のイメージを維持した形で書きました。
通常なら、Validate クラスでまとめるほうが無難だと思います。

html

1<?php 2 3class Email 4{ 5 6 /** 7 * エラーメッセージ 8 * 複数のエラーメッセージを格納できるように配列に 9 * 10 * @var array 11 */ 12 private $error = array(); 13 14 /** 15 * メールアドレスの入力チェック 16 * @return bool 17 */ 18 public function check() 19 { 20 if (is_null(filter_input_array(INPUT_POST))) { 21 return true; 22 } 23 $email = filter_input(INPUT_POST, 'email'); 24 $email_conf = filter_input(INPUT_POST, 'email_conf'); 25 26 if ($email !== $email_conf) { 27 $this->error[] = 'メールアドレスが一致しません。'; 28 return false; 29 } 30 return true; 31 } 32 33 /** 34 * エラーメッセージを取得する 35 * @return array 36 */ 37 public function getErrorMessage() 38 { 39 return $this->error; 40 } 41 42} 43 44$objEmail = new Email(); 45 46if (!$objEmail->check()) { 47 $errMsg = implode(',', $objEmail->getErrorMessage()); 48} 49?><!DOCTYPE HTML> 50<html lang=""> 51 <head> 52 <meta charset="UTF-8"> 53 <title></title> 54 </head> 55 <body> 56 <form action="" method="post"> 57 <table> 58 <tr> 59 <td>E-mail</td> 60 <td><input type="post" name="email" /></td> 61 </tr> 62 <tr> 63 <td>E-mail (確認用)</td> 64 <td><input type="post" name="email_conf" /></td> 65 </tr> 66 <tr> 67 <td></td> 68 <td><button>送信</button></td> 69 </tr> 70 </table> 71 <?php 72 if (isset($errMsg)) { 73 printf('<p>%s</p>', $errMsg); 74 } 75 ?> 76 </form> 77 </body> 78</html>

html

1<?php 2 3function h($str) 4{ 5 return htmlspecialchars($str, ENT_QUOTES, 'utf-8'); 6} 7 8class Validate 9{ 10 11 /** 12 * エラーメッセージ 13 * 複数のエラーメッセージを格納できるように配列に 14 * 15 * @var array 16 */ 17 private $error = array(); 18 19 public function required() 20 { 21 if (is_null(filter_input_array(INPUT_POST))) { 22 return $this; 23 } 24 $email = filter_input(INPUT_POST, 'email'); 25 $email_conf = filter_input(INPUT_POST, 'email_conf'); 26 27 if (empty($email)) { 28 $this->error[] = 'E-mail は入力必須です。'; 29 } 30 if (empty($email_conf)) { 31 $this->error[] = 'E-mail(確認用) は入力必須です。'; 32 } 33 return $this; 34 } 35 36 /** 37 * メールアドレスの確認用との一致 38 * @return \Validate 39 */ 40 public function isEqual() 41 { 42 if (is_null(filter_input_array(INPUT_POST))) { 43 return $this; 44 } 45 $email = filter_input(INPUT_POST, 'email'); 46 $email_conf = filter_input(INPUT_POST, 'email_conf'); 47 48 if ($email !== $email_conf) { 49 $this->error[] = 'メールアドレスが一致しません。'; 50 } 51 return $this; 52 } 53 54 /** 55 * 登録済みかどうか 56 * @return \Validate 57 */ 58 public function isRegisterd() 59 { 60 if (is_null(filter_input_array(INPUT_POST))) { 61 return $this; 62 } 63 64 $email = filter_input(INPUT_POST, 'email'); 65 66 // DB への問い合わせ 67 // 68 // この辺の処理は自分で書いてね 69 // 70 if (false) { 71 $this->error[] = '既に登録済みです。'; 72 } 73 return $this; 74 } 75 76 /** 77 * バリデート結果 78 * @return boolean 79 */ 80 public function check() 81 { 82 if (count($this->error)) { 83 return false; 84 } 85 return true; 86 } 87 88 /** 89 * エラーメッセージを取得する 90 * @return array 91 */ 92 public function getErrorMessage() 93 { 94 return $this->error; 95 } 96 97} 98 99$objValidate = new Validate(); 100$objValidate->required() 101 ->isEqual() 102 ->isRegisterd(); 103if (!$objValidate->check()) { 104 $errMsg = $objValidate->getErrorMessage(); 105} else { 106 // 成功時にページ遷移 107 if (!is_null(filter_input_array(INPUT_POST))) { 108 header('Location: success.php'); 109 } 110} 111?><!DOCTYPE HTML> 112<html lang="ja"> 113 <head> 114 <meta charset="UTF-8"> 115 <title></title> 116 </head> 117 <body> 118 <form action="" method="post"> 119 <table> 120 <tr> 121 <td>E-mail</td> 122 <td><input type="post" name="email" value="<?php echo h(filter_input(INPUT_POST, 'email')); ?>" /></td> 123 </tr> 124 <tr> 125 <td>E-mail (確認用)</td> 126 <td><input type="post" name="email_conf" value="<?php echo h(filter_input(INPUT_POST, 'email_conf')); ?>" /></td> 127 </tr> 128 <tr> 129 <td></td> 130 <td><button>送信</button></td> 131 </tr> 132 </table> 133 <?php 134 if (isset($errMsg)) { 135 foreach ($errMsg as $msg) { 136 printf('<p>%s</p>', $msg); 137 } 138 } 139 ?> 140 </form> 141 </body> 142</html>

#コメントへの回答

① $error[] とすると、function required() { } の中からだけがその変数へアクセスできるため、外からアクセスできません。なので他のメソッドからもアクセスできるクラスのプロパティに値を守らせることが目的です。

②この処理がないと、POSTされていない時も、そのあとの処理が実行されてしまいます。POSTしていない時は処理する必要がないので、処理を止めるために記述しています。

③他のメソッドの結果を利用せず、単独のメソッドだけで処理することが可能なら static で定義すればいいでしょう。 Validate クラスで 提示した例では、3つのチェックを行っています。それぞれ同時にチェックして、一度にエラーメッセージを出力するために、インスタンスを同一のものに保障しなければなりませんので、new して使う方法にしました。
static で実装する方法もありますが、シングルトンパターンの利用してインスタンスの同一性を担保することというアプローチが必要になります。失礼ながら質問者様にはまだ早計かと思い、このパターンでの実装は見送りました。

でも今試しに、private $error = array();を消して試してみたら
'メールアドレスが一致しません。がしっかり表示されています。

確かに省略した場合でも、表示はされますね。

ただし、その場合、$this->error は public となり、private 変数にはなりません。
privateで定義する意味は、あくまで $this->error の値を書き換えることができるのは、そのクラスの中からのみ可能とするためです。そうすることでアプリケーションの保守性やバグの注入を防ぐ意味があります。

もし、意図しないバグがあっても、Validate クラスの内部をチェックすれば良いことになるため、プログラムの保守性も上がるはずです。

public にしてしまうと、クラスの外から値を書き換えることが可能になってしまいます。

⑤を検証するためのサンプルコード

以下のようなコードを実際に書いて、検証してみましょう。

php

1<?php 2 3class Test 4{ 5 6 /** 7 * private プロパティ 8 */ 9 private $private = 'private'; 10 11 /** 12 * protected プロパティ 13 */ 14 protected $protected = 'protected'; 15 16 /** 17 * public プロパティ 18 */ 19 public $public = 'public'; 20 21 /** 22 * private_method 23 */ 24 private function private_method() 25 { 26 // この変数にアクセスできるのは、private_method()の中からだけ 27 // protected_method, public_method からはアクセスできない 28 $private_var = 'private_var'; 29 30 // プロパティにアクセス 31 $this->private = 'private_method で書き換えました'; 32 $this->protected = 'private_method で書き換えました'; 33 $this->public = 'private_method で書き換えました'; 34 35 return array( 36 'private_var' => $private_var 37 , 'private' => $this->private 38 , 'protected' => $this->protected 39 , 'public' => $this->public 40 ); 41 } 42 43 /** 44 * protected_method 45 */ 46 protected function protected_method() 47 { 48 // プロパティにアクセス 49 $this->private = 'protected_method で書き換えました'; 50 $this->protected = 'protected_method で書き換えました'; 51 $this->public = 'protected_method で書き換えました'; 52 53 return array( 54 'private' => $this->private 55 , 'protected' => $this->protected 56 , 'public' => $this->public 57 ); 58 } 59 60 /** 61 * public_method 62 */ 63 public function public_method() 64 { 65 // プロパティにアクセス 66 $this->private = 'public_method で書き換えました'; 67 $this->protected = 'public_method で書き換えました'; 68 $this->public = 'public_method で書き換えました'; 69 70 return array( 71 'private' => $this->private 72 , 'protected' => $this->protected 73 , 'public' => $this->public 74 ); 75 } 76 77} 78

投稿2016/06/09 14:29

編集2016/06/09 19:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

earnest_gay

2016/06/09 16:14 編集

回答ありがとうございます! いくつか質問なのですが、 ① private $error = array();を記述せず $this->error[] = 'メールアドレスが一致しません。';を error[] = 'メールアドレスが一致しません。'; にしてはいけないのでしょうか? ② if (is_null(filter_input_array(INPUT_POST))) { return true; } 何も入力せずにPOST送信してしまったときは~~という記述だと思いますが、 処理を書いてないのに記述しているのは何故なのか理由が分からないです... この記述はいらないのでは? いるなら逆に理由が知りたいです。 【追記】 追記文でreturn $this;となっていますが $this->errorなら Validateクラスのerror となると思うのですが return $this;の$this;は何を表していますか? ③ public function getErrorMessage() { return $this->error; } 時系列で書いてるのでそのままいきます。 これを見て気づいたのですが、 function checkで格納したerror[]をここで使いたいから①のように書いたんですね? でも、配列ならerror[0]に保存されているはずなのに、何故errorで表示されるのでしょうか? ④$objEmail = new Email();でインスタンス化していますが、 できればインスタンス化せずにスコープ演算子で使いたいのですが その場合の下記のようになりますよね? <?php $errMsg = Email::getErrorMessage() ?> 猿覚えのようにスコープ演算子使ってますが、 インスタンス化せずに使えて楽だなぁという理由と、 ほぼ1行で済ませられるという理由で使ってます。 そもそもインスタンス化とスコープ演算子の使い分けが分かってません。 もし、インスタンス化とスコープ演算子の使い分け場面を教えて頂けると理解が深まると思います。 知らないことが多すぎて 質問する度に回答頂いたソースを見て 知りたいこと以外のことも疑問点が多く浮かぶので 今回は多いですが、すべての疑問を言ってみました。 今回知りたかったことは 「クラス化したmethod内の変数にはどうやったらアクセスできるか」 ということでしたが、 methodを定義する前に変数なり定義しておき method内では this->変数 でmethod外の変数を呼び出し method内の処理によって格納された変数は method外の変数に当てはまる という基礎を見返す内容にもなりました。 ...でも今試しに、private $error = array();を消して試してみたら 'メールアドレスが一致しません。がしっかり表示されています。 private $error = array();消してるのに $this->error[] = 'メールアドレスが一致しません。'; と return $this->error; は どこのerrorを参照しているのでしょう????? 【追記】 ⑤ 最後の疑問ですが クラス内のメソッド内の変数にはクラス外からアクセスできないけど クラス内のメソッド内の変数にはクラス内であればアクセスできる ということでしょうか?
earnest_gay

2016/06/09 16:05

編集文の追記今見ました。 ありがとうございます! ちょっと解析しながら制作中のものにごにょごにょしていきます!
earnest_gay

2016/06/09 17:17

深夜なのに詳しく解説頂いてありがとうございます! 言っていることはなんとなく分かりますが、確かに早計といいますか正直そこのレベルまでは頭がついていかずです。 ⑤の解説に関してはぼんやり分かっている感じでしたが、どこかで一度踏みとどまってしっかり理解しないとこれから先の記述も誰かに頼りっぱなしのままになってしまいそうですね。。。 ありがとうございました! こちらは何度も読み返します。
退会済みユーザー

退会済みユーザー

2016/06/09 17:29 編集

しっかり理解しようという姿勢は立派だと思います。 自分も未だにやることですが、リファレンスを読み物として読んでみましょう。知らなかったことがあったりとかなり気づかされることが多いです。少なくとも一度は、全てのページを通読してみましょう。 コピペでコードを書いたとしてもいいと思います。ただ、最終的に書いたのは本人なんだから、最後まで(死ぬまで)責任を負う覚悟でやってねってメンバーには言っています。 なぜその変数名にしたの?なぜこのロジックにしたの?というような問いかけに答えられるか、というのはとても重要なことと思います。常に自分の書くコードについて説明可能であってください。
earnest_gay

2016/06/09 17:33

ごめんなさい、もう一点だけお願いします。 会員登録フォームの制作においてページ遷移の判定がうまくできない ということで質問させて頂いており、 そのページ遷移の判定というのが下記になります。 if(!empty($_POST)){ if($error['mailequal'] !== "error"){ $_SESSION['join'] = $_POST; header('Location: register1.php'); exit(); } } 流れとしては、 最初の質問の記述でいいますと メールアドレスが異なれば $error['mailequal'] = "error"; という風に何かしらの変数に何かしらの文字をいれておく。 異なるアドレスを入力して送信ボタンを押す if($error['mailequal'] !== "error"){ $_SESSION['join'] = $_POST; header('Location: register1.php'); exit(); } 異なるのでエラー文が表示されてページ遷移はできない 同一であればそのページでPOST送信される内容をすべて配列としてセッションに記録させてregister1.phpに遷移する。 ここでもう3日程立ち往生しています... お力添えお願いいたします。
退会済みユーザー

退会済みユーザー

2016/06/09 17:35 編集

2番目の例が、まさにそのまんまなんですけど… しかもセッションなんて使うようなロジックではありません。 考え方が逆で、エラーの時はそのままのページで、成功時にはページを遷移するのがスマートです。
earnest_gay

2016/06/09 17:58

2番目とはどういうことでしょうか? 次ページでも入力するページがあったりDBに登録したりするのでセッション使わない事には実現できないような気がするのですが... セッションなんて使うようなロジックではありません。とのことなんですが 一応、参考書はよくわかるPHPの教科書というものでそちらの書籍にはこう記述されてあります。 if (empty($error)) { $_SESSION['join'] = $_POST; header('Location: check.php'); exit(); } 抜粋ですが一部なので分からないですよね...
退会済みユーザー

退会済みユーザー

2016/06/09 18:11 編集

2番目は Validate クラスで実装しているものです。 「よくわかるPHPの教科書」悪名高いあれですか… 入門書としてはまあまあかな笑 確かあの本では、次に入力値の確認画面を挟んでいたかな… 確認画面があるなら、$_SESSIONを使う必要がありますね。 とはいえ、$_SESSIONを使うかどうかとかそういうのは、アプリケーション全体を見回して初めてそれが適切かどうか判断すべきことですので。 両方のアプローチを実際に実践してみてはいかが? 本にこう書いてあったから、誰だれにそう言われたからという理由でコードを書いてはいけません。
earnest_gay

2016/06/09 18:32 編集

悪名高いとは聞きますが、どうなんでしょう? 自分は何故この本を買ったかというと 精神論だけじゃなくて実際にミニツイッターのようなWEBシステムを作りながらphpリファレンスに書いているような難しい感じの表現ではなく かみ砕いて分かりやすく説明しているところもあって買いました。 実際の記述(処理の)ですがこれだけあれば想像で分かるかな。 if (!empty($_POST)) { // エラー項目の確認 if ($_POST['name'] == '') { $error['name'] = 'blank'; } if ($_POST['email'] == '') { $error['email'] = 'blank'; } if (strlen($_POST['password']) < 4) { $error['password'] = 'length'; } if ($_POST['password'] == '') { $error['password'] = 'blank'; } // 重複アカウントのチェック if (empty($error)) { $sql = sprintf('SELECT COUNT(*) AS cnt FROM members WHERE email="%s"', mysqli_real_escape_string($db, $_POST['email']) ); $record = mysqli_query($db, $sql) or die(mysqli_error($db)); $table = mysqli_fetch_assoc($record); if ($table['cnt'] > 0) { $error['email'] = 'duplicate'; } } if (empty($error)) { $_SESSION['join'] = $_POST; header('Location: check.php'); exit(); } } という感じのロジックでしたので、これを応用すればページ遷移はできる! と思っていたのですが、書籍のはクラス化してなくてましてやオブジェクト指向の記述ではなかったんですよ。 今制作中のものは会社から言われているものでオブジェクト指向で作る様にと言われていて、処理は可読性や部品化にする意味も踏まえてindex.phpには書かないでできるだけ明細にクラス化して呼び出すような形で作ってくださいと言われているので応用で作れると思っていたものがかなりてこずっているといったところです... 入力チェックはhtmlのpatternに切り替え、requiredで必須項目にするつもりなのでそこはいいんですが、最低限phpでやらないといけないことは、 ・アドレスが登録されているかどうか ・アドレスが再入力用のアドレスと一致してるかどうか ・パスワードが再入力用のアドレスと一致してるかどうか この3つだけなんです。 この3つのエラー時に$error[]に代入して if (empty($error)) { $_SESSION['join'] = $_POST; header('Location: check.php'); exit(); } の時に$errorに何もなければページ遷移できるわけで、、、 こうやって書いていると分かるのですが、肝心の記述が...(汗) あーどうすれば!!! クラス化せずに全部index.phpに書いてもいいならできるのですが、 クラス化するとスコープの関係も影響してくるし、 もう記述が分からなくなってきます汗
退会済みユーザー

退会済みユーザー

2016/06/09 18:33 編集

私が書いた例をそのまま使えば、要求通りのものになっているでしょ? ちょくちょく、コメントごとにソースを書き換えているので、再度確認してください。
earnest_gay

2016/06/09 18:46

さっきから自分は何を言ってたんだろうと思うほど解決しました! とりあえず既にある記述と Kosuke_Shibuya さんに提示いただいたコードをごにょごにょしてて進んでいませんでした! 試しに if (empty($error)) { $_SESSION['join'] = $_POST; header('Location: check.php'); exit(); } を入れてみると! 遷移できました! って最初から$errorに合わせて作っていただいてたんですね! お蔭さまで同じようなページを作るときの参考となるページができました! 本当に感謝です!ありがとうございます!
earnest_gay

2016/06/09 19:01

んー追加で頂いたコードを 例えばtest.phpに記述して test.phpにアクセスすると まだ何も入力できていないのに header('Location: .php');で飛ばされるのですが...
退会済みユーザー

退会済みユーザー

2016/06/09 19:25

おっと、確かに。修正しておきましたよ。
earnest_gay

2016/06/09 19:37

完璧です! 迅速にご対応頂き本当にありがとうございます! 理解していない記述が自分のプロジェクトにあるのはモヤモヤするので 今回はこちらを参考にさせて頂き、理解を深めたいと思います。 これで少しは進捗送れそうです! ありがとうございました!
earnest_gay

2016/06/09 20:22 編集

本当にお時間あるときでいいので少し相談に乗っていただければ... 別質問で投稿しようと思ったのですがKosuke_Shibuyaさんに対応していただきたくて、、、なのでお時間あるときで大丈夫です。 今回はValidateというclass内でまとめてmethodを定義していますが、 これを複数のclassに分けたいのです。 ①Emailのクラス public function isRegisterd(){ if (is_null(filter_input_array(INPUT_POST))) { return $this; } $email = filter_input(INPUT_POST, 'email'); $dsn = 'mysql:dbname=test;host=localhost;charset=utf8'; $user = 'root'; $password = ''; $option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); $dbh = new PDO($dsn, $user, $password, $option); $sql = 'select count(*) as cnt from userdata where email=?'; $stmt = $dbh->prepare($sql); $arrParam = array(); $arrParam[] = $email; $stmt->execute($arrParam); $row = $stmt->fetch(PDO::FETCH_ASSOC); if (0 < $row['cnt']) { $this->error[] = '<div class="r_em">' . "{$email}は既に登録されています" . '</div>'; } return $this; } public function isEqualEmail(){ if (is_null(filter_input_array(INPUT_POST))) { return $this; } $email = filter_input(INPUT_POST, 'email'); $email_conf = filter_input(INPUT_POST, 'email_conf'); if ($email !== $email_conf) { $this->error[] = 'メールアドレスが一致しません。'; } return $this; } ②pwのクラス(これはこちらで追加しました) public function isEqualPassword(){ if (is_null(filter_input_array(INPUT_POST))) { return $this; } $pw = filter_input(INPUT_POST, 'pw'); $pw_conf = filter_input(INPUT_POST, 'pw_conf'); if ($pw !== $pw_conf) { $this->error[] = 'パスワードが一致しません。'; } return $this; } となると private $error = array(); はクラスごとに必要? getErrorMessage() での取得の仕方も多少変わってくると思います。 あと、エラーメッセージを表示させる場所ですが、以前は <tr> <td>E-mail (確認用)</td> <td colspan="2"><input type="email" name="email2" maxlength="50" size="46" placeholder="info@example.com" ></td> <td><?php echo Email::equal(); ?></td> </tr> のように<?php echo Email::equal(); ?>で呼び出したい場所で呼び出してました。 提示いただいたものの場合だと一か所にまとまって表示されるのですが 任意の場所で表示させることは可能でしょうか? 提示いただいた記述の場合だと、配列だからこうなるのですかね? $objValidate = new Validate(); $objValidate-> ->isEqualEmail() ->isEqualPassword() ->isRegisterd(); if (!$objValidate->check()) { $errMsg = $objValidate->getErrorMessage(); <tr> <td>E-mail (確認用)</td> <td colspan="2"><input type="email" name="email2" maxlength="50" size="46" placeholder="info@example.com" ></td> <td><?php echo $errMsg[0]; ?></td> </tr> お手すきの時に宜しくお願いします。 あ、$errMsgはif内だから <td><?php echo $errMsg[0]; ?></td> ってやっちゃうとエラーでますね...
退会済みユーザー

退会済みユーザー

2016/06/10 02:50 編集

if (empty($email)) { $this->error['email'] = 'E-mail は入力必須です。'; } こんな風に、連想配列にすれば、表示位置の指定は可能ですよね。 クラッスの分け方の方の質問はさすがにこのスペースで説明しきるのは難しいですねー。直接顔合わせて説明しても数時間は必要としそうです。MVCの理解が必須になってきます。もはや設計思想の問題なので。
earnest_gay

2016/06/13 18:00

ありがとうございます! 返事遅れて申し訳ないです!
earnest_gay

2016/06/13 18:23

error['email']にした場合、表示させたいところにはどう記述したらいいでしょうか? echo $errMsg[2]などとして試してもエラーが出てしまいます...
退会済みユーザー

退会済みユーザー

2016/06/13 18:27

もういい加減「エラーが出ています」なんていう曖昧な表現はやめませんかね。エラーメッセージをのものを記述してくださいよ。
earnest_gay

2016/06/13 18:29

すいません! 何かがおかしかったようで、できました。
退会済みユーザー

退会済みユーザー

2016/06/13 20:30

うーん。var_dump() という関数はご存知です?
guest

0

equal()がstatic宣言されていないことが問題なのでは?

class Email{
public static function equal(){

何もreturnしないで抜けるパスがあるので、最後に
return "";
とかを入れた方がいいと思います。

投稿2016/06/09 03:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pochi0701

2016/06/09 03:41

こっちの方が正解っぽいです。自分曲解してました。
earnest_gay

2016/06/09 14:12

試しにmethodにstaticを付けてクラス外から$error['mailequal'] にアクセスしようとしているのですができません... class Email{ static function equal(){ $email1 = filter_input(INPUT_POST, 'email1'); $email2 = filter_input(INPUT_POST, 'email2'); if(isset($email1,$email2)){ if($email1 !== $email2 ){ $error['mailequal'] = "error"; $errorms = '<div class="r_em">' . "メールアドレスが一致しません" . '</div>' ; return $errorms; } } } } echo $error['mailequal'] ;
退会済みユーザー

退会済みユーザー

2016/06/09 14:40

クラス内のメソッド内の変数にはクラス外からアクセスできません。VBじゃないので。「変数のスコープ」を調べてみてください。
guest

0

外してたらごめんなさいですが、呼び出しシーケンスを再考されてはどうでしょうか。

  1. ブラウザからPHPが呼び出される
  2. if(!empty($_POST))が評価される。emptyなので何もしない
  3. htmlが出力される。その際にEmail::equal()が評価され表示される
  4. 一旦プログラム終了。$SESSION以外の変数は消える
  5. ブラウザからformに内容を入れてPHPが呼び出される
  6. if(!empty($_POST))が評価される。!empty($POST)だが$errorは未定義

ということでサーバ側作業とクライアント(ブラウザ側)作業を切り分けて、
シーケンス図のように遷移が解る図を書いてみると良いのではと思います。

投稿2016/06/09 02:11

pochi0701

総合スコア210

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問