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

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

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

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

Q&A

解決済

2回答

4198閲覧

メールアドレスが同じか比較し、異なった場合には違うという表示をさせたい

earnest_gay

総合スコア615

PHP

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

0グッド

0クリップ

投稿2016/06/04 17:28

編集2016/06/09 13:18

メールアドレスが同じか比較し、異なった場合には違うという表示をさせたいのですが、なかなかうまくいきません。

nameがemail1とemail2の入力フィールドがあり、
処理は下記コードでしております。

if($_POST['email2'] !== $_POST['email1'] ){ $error = "メールアドレスが一致しません。" ; } else { $error = "メールアドレスは一致しています。" ; }

上記のコードでテストすると、初回アクセス時(最初)から
メールアドレスが一致しません
と表示されてしまっています。

ユーザーはまだ何も入力していないので、異常表示がされてはいけません。

一応、同じアドレスと異なるアドレスを入れてテストしてみると、条件通りに表示はされます。

このメールのチェック処理は最終的にはクラス化して部品として使いまわしていきたいです。

class Email{ function collation(){ if($_POST['email2'] !== $_POST['email1'] ){ $error = "メールアドレスが一致しません。" ; return $error; } else { $error = "" ; return $error; } } }

①同じアドレスだった場合、異常表示することは何もないので下記のように書いてました。

if($_POST['email2'] !== $_POST['email1'] ){ $error = "メールアドレスが一致しません。" ; }

すると、例外エラーが発生するのでなんでだろうと思いつつ、
falseの場合の処理(冒頭のコード)も加えると例外がなくなりました。

でも、falseの時は異常表示する必要はないので
たった数行ですがコード的にも必要ない書き方があれば教えて頂きたいです。

②問題点その2として、初めてそのページにアクセスした場合だけ、
例外のUndefined indexが出てきています。

適当に送信するボタンをクリックするとこの例外は消えてます。
その後、同じアドレスと異なるアドレスを入れてテストしてみると、条件通りに表示はされます。

例外の詳細は

email1 in C:\xampp\htdocs\xxx\register.php on line 6
email2 in C:\xampp\htdocs\xxx\register.php on line 6

で、該当箇所は

if($_POST['email2'] !== $_POST['email1'] )

です。

初回アクセス時は$_POSTを参照させなければいいと思い。

if(isset($_POST['email2']) !== isset($_POST['email1']) )

に改良しました。

これで初回アクセス時には例外エラーは表示されなくなりました。

しかし今度は、同じアドレスと異なるアドレスを入れてテストしてみると、何も表示されなくなりました。

何が原因でどうしたら解決されるでしょうか...

【追記】
こうでしょうか!?

class mail{ function collation(){ if(isset($_POST['email2'])){ if($_POST['email2'] !== $_POST['email1'] ){ $error = "メールアドレスが一致しません。" ; return $error; } else { $error = "" ; return $error; } } } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

個人的には表示用とform用で別でメソッドを用意したほうがいいと思いますが、
このままのつくりで、送信時は必ずemail1とemail2が送られる想定の場合なら
こうかな。
class mail{
function collation(){
if(filter_input(INPUT_POST, 'email2') !== filter_input(INPUT_POST, 'email1')){
$error = "メールアドレスが一致しません。" ;
}
}
}

投稿2016/06/04 18:33

test_hf

総合スコア80

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

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

earnest_gay

2016/06/09 13:30

回答ありがとうございます! つい$_POSTを使いがちですがfilter_inputも使っていきます。
guest

0

はっきりとは書かれていませんが、書いている内容から推察すると、フォーム入力画面とPOST先が同じファイルになっているということですよね。

もしそうであれば、考えないといけないのは、

  • 初回アクセスなのか、入力後のPOSTなのか

の識別かと思います。
これはいくつかやり方があると思いますが、例えばGETアクセスなのかPOSTアクセスなのかでも見分けがつくかと思います。

ただ、仮にそういった見分け方を実装したとしても、エラーチェックとしてはご質問の問題にはぶつかりますね。
ということで本題です。


初回アクセス時は$_POSTを参照させなければいいと思い。

if(isset($_POST['email2']) !== isset($_POST['email1']) )

に改良しました。

発想は近くまで行っていますがやっていることが間違ったようです。

まず isset() 関数 は「変数がセットされていること、そして NULL でないことを検査する」ということで、isset($_POST['email2'])isset($_POST['email1']) も true か false を意味しています。

つまり $_POST['email2'] と $_POST['email2'] を比較したことにはなりません。

  • $_POST['email2']、$_POST['email2'] がセットされているか
  • セットされている場合、一致をチェック

となります。

つまり

PHP

1 2if( isset( $_POST['email1'], $_POST['email2']) ) 3{ 4 if( $_POST['email2'] !== $_POST['email1'] ) 5 { 6 $error = "メールアドレスが一致しません。" ; 7 } 8}

また、こういった部品的なチェックツールを汎用化するのであれば、これ自体は評価結果のみを返すようにして、その結果に応じてこの部品を使うソース側でメッセージの表示をコントロールする方がいいような気もします。

PHP

1 2// ※動作テストしていないのでどこか間違ってるかもしれませんが、流れとして。 3 4class inputCheck 5{ 6 static function email_collation($a, $b) 7 { 8 if( isset( $a, $b ) 9 { 10 return ( $a == $b ); 11 } else { 12 return false; 13 } 14 } 15} 16 17// ---- 以下が利用側ソースコード 18 19if( isset( $_POST['email1'], $_POST['email2'] ) ) 20{ 21 if( ! inputCheck::email_collation($_POST['email1'], $_POST['email2']) ) 22 { 23 $error = "メールアドレスが一致しません。" ; 24 } 25} 26

こんな感じではいかがでしょう。

投稿2016/06/04 18:09

kaz.Suenaga

総合スコア2037

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問