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

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

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

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

Q&A

解決済

2回答

1843閲覧

エラーの検知がうまくできない

ryohasegawa

総合スコア437

PHP

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

0グッド

0クリップ

投稿2017/03/18 16:47

php

1<form action="" method="post" id="signup2"> 2 <p> 3 メールアドレスを入力してください。 4 <input type="text" name="email" placeholder="メールアドレス" value="<?= isset($app->getValues()->email) ? h($app->getValues()->email) : ''; ?>"> 5 </p><br> 6 <p class="err"><?= h($app->getErrors('email')); ?></p> 7 8 <p> 9 ユーザーの識別IDです。<br>半角で入力してください。 10 <input type="text" name="id" placeholder="アカウントID" value="<?= isset($app->getValues()->id) ? h($app->getValues()->id) : ''; ?>"> 11 </p><br> 12 <p class="err"><?= h($app->getErrors('id')); ?></p> 13 14 パスワードを入力してください。 15 <input type="password" name="password" placeholder="パスワード" value="<?= isset($app->getValues()->password) ? h($app->getValues()->password) : ''; ?>"> 16 </p><br> 17 <p class="err"><?= h($app->getErrors('password')); ?></p> 18 <div class="btn" onclick="document.getElementById('signup2').submit();">新規登録</div> 19 <input type="hidden" name="token" value="<?= h($_SESSION['token']); ?>"> 20 <input type="hidden" name="posttype" value="signup"> 21 </form>

ユーザ認証の勉強でフォームを作りました。そこでうまくIDを英数で入力しないとエラーがでるようにしたく下のコードを書きました。

php

1 2 try { 3 $this->signup_validate(); 4 } catch (\MyApp\Exception\InvalidEmail $e) { 5 $this->setErrors('email', $e->getMessage()); 6 } catch (\MyApp\Exception\InvalidPassword $e) { 7 $this->setErrors('password', $e->getMessage()); 8 }catch (\MyApp\Exception\InvalidId $e){ 9 $this->setErrors('id', $e->getMessage()); 10 } 11 12 13 private function signup_validate() 14 { 15 // 送られてきたトークンが本物かどうか調べる 16 if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) { 17 echo "送信中エラー エラー番号T01"; 18 exit; 19 } 20 21 // 入力したデータ(メール)が形式じゃなかったらエラーを返す 22 if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 23 throw new \MyApp\Exception\InvalidEmail(); 24 } 25 26 // 入力したデータ(パスワード)が形式じゃなかったらエラーを返す 27 if (!preg_match('/\A[a-zA-Z0-9]+\z/', $_POST['password'])) { 28 throw new \MyApp\Exception\InvalidPassword(); 29 } 30 31 // 入力したデータ(アカウントID)が形式じゃなかったらエラーを返す 32 if (!preg_match('/\A[a-zA-Z0-9]+\z/', $_POST['id'])) { 33 throw new \MyApp\Exception\InvalidId(); 34 } 35 } 36

とこんな感じにしました。そして、

php

1catch (\MyApp\Exception\InvalidId $e){ 2 $this->setErrors('id', $e->getMessage()); 3} 4```が引っかかってほしいのに、 5```php 6catch (\MyApp\Exception\InvalidEmail $e) { 7 $this->setErrors('email', $e->getMessage()); 8} 9```で引っかかってしまうので、英数で入力してくださいというメッセージではなく、メールアドレスを正しく入力してください。というメッセージが表示するバグに遭遇しています。助けてください。

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

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

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

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

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

naoyama88

2017/03/18 16:55

実際に画面のフォームからどのような入力値を送信しているか具体的に提示していただけると回答も詳しくできるかとおもいます。
guest

回答2

0

複数のバリデーションを行っていると思いますが、
コードの順序的にメールアドレスのチェックから行っており、
メールアドレスに関する例外が先に投げられていますので、
IDのチェックまでたどり着いていません。

投稿2017/03/18 20:09

sharpen

総合スコア28

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

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

ryohasegawa

2017/03/19 08:26

あーそうかもしれないです。いや、そうですね。 どうしたら、次の検知まで行えますか?方法は色々ありますよね?
guest

0

自己解決

php

1// 投稿時処理(新規作成) 2 protected function signuppostProcess() { 3 // validate 4 5 // 送られてきたトークンが本物かどうか調べる 6 if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) { 7 echo "送信中エラー エラー番号T01"; 8 exit; 9 } 10 11 try{ 12 // 入力したデータ(メール)が形式じゃなかったらエラーを返す 13 if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 14 throw new \MyApp\Exception\InvalidEmail(); 15 } 16 }catch (\MyApp\Exception\InvalidEmail $e) { 17 $this->setErrors('email', $e->getMessage()); 18 } 19 20 try{ 21 // 入力したデータ(パスワード)が形式じゃなかったらエラーを返す 22 if (!preg_match('/\A[a-zA-Z0-9]+\z/', $_POST['password'])) { 23 throw new \MyApp\Exception\InvalidPassword(); 24 } 25 }catch (\MyApp\Exception\InvalidPassword $e) { 26 $this->setErrors('password', $e->getMessage()); 27 } 28 29 try{ 30 // 入力したデータ(アカウントID)が形式じゃなかったらエラーを返す 31 if (!preg_match('/\A[a-zA-Z0-9]+\z/', $_POST['id'])) { 32 throw new \MyApp\Exception\InvalidId(); 33 } 34 }catch (\MyApp\Exception\InvalidId $e){ 35 $this->setErrors('id', $e->getMessage()); 36 } 37 38 /* 39 try { 40 // 送られてきたトークンが本物かどうか調べる 41 if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) { 42 echo "送信中エラー エラー番号T01"; 43 exit; 44 } 45 46 // 入力したデータ(メール)が形式じゃなかったらエラーを返す 47 if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 48 throw new \MyApp\Exception\InvalidEmail(); 49 } 50 51 // 入力したデータ(パスワード)が形式じゃなかったらエラーを返す 52 if (!preg_match('/\A[a-zA-Z0-9]+\z/', $_POST['password'])) { 53 throw new \MyApp\Exception\InvalidPassword(); 54 } 55 56 // 入力したデータ(アカウントID)が形式じゃなかったらエラーを返す 57 if (!preg_match('/\A[a-zA-Z0-9]+\z/', $_POST['id'])) { 58 throw new \MyApp\Exception\InvalidId(); 59 } 60 } catch (\MyApp\Exception\InvalidEmail $e) { 61 $this->setErrors('email', $e->getMessage()); 62 } catch (\MyApp\Exception\InvalidPassword $e) { 63 $this->setErrors('password', $e->getMessage()); 64 }catch (\MyApp\Exception\InvalidId $e){ 65 $this->setErrors('id', $e->getMessage()); 66 } 67 */

コメントアウトしてるところを書き直しました。すると、いくつかのエラーを同時に出す事ができました。

投稿2017/03/19 11:13

ryohasegawa

総合スコア437

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問