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

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

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

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

Q&A

解決済

3回答

3003閲覧

isset()が無視される?

earnest_gay

総合スコア615

PHP

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

0グッド

0クリップ

投稿2016/06/08 15:06

編集2016/06/08 15:07

再入力用のメールアドレスに誤りがないかをチェックするクラスがあったとします。

<?php class Email{ function equal($mail1,$mail2){ if(isset($mail1,$mail2)){ if($mail1 !== $mail2 ){ $error = '<div class="r_em">' . "メールアドレスが一致しません" . '</div>' ; return $error; } } } } ?> <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($_POST['email1'],$_POST['email2']); ?></td> </tr>

色々整理してメソッドを引数で指定するような作りにしたのですが、
isset()で初回アクセス時は$_POSTを参照しないようにしてるのですが下記のように例外がでてしまいます。

Notice: Undefined index: email1 in C:\xampp\htdocs\xxx\register_ja.php on line 26

Notice: Undefined index: email2 in C:\xampp\htdocs\xxx\register_ja.php on line 26

何が原因でどうすれば解消されますか?

ちなみに引数で指定するような作りにする前の状態

function equal(){ if(isset($_POST['email1'],$_POST['email2'])){ if($_POST['email1'] !== $_POST['email2'] ){ $error = '<div class="r_em">' . "メールアドレスが一致しません" . '</div>' ; return $error; } } }

にしてみたら例外は表示されなくなりました。

しかし、これだと「そこ」でしか使えず別のプロジェクトへの使い回しができないので
引数で指定するような作りで例外が表示されないように解決したいのです。

別のプロジェクトでもname属性がemail1とemail2になるように注意すればいいだけかもしれませんが、
ちょっと気になったので質問してみました。

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

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

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

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

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

guest

回答3

0

ベストアンサー

引数で指定するようにする前の状態のほうが自然に見えます。
$_POSTはスーパーグローバル変数なので引数で渡す必要はないかと思います。

他のプロジェクトで使い回すにしても、 Email::equal メソッドがメールに依存しているので、メールアドレスのチェック以外に利用できないです。

エラー原因についてはtest_hfさんの回答のとおりです。
issetが無視されているのではなく、isset判定してないことが原因です。

投稿2016/06/08 16:35

編集2016/06/08 16:38
romiogaku

総合スコア546

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

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

earnest_gay

2016/06/09 13:33

ありがとうございます! 結局最初の状態っで使うことにしました!
guest

0

原因はおそらくここですね↓

<td><?php echo Email::equal($_POST['email1'],$_POST['email2']); ?></td> 記載されているソースを見る限りでは定義していない$_POST['email1'],$_POST['email2']を呼んでるようにみえます。

投稿2016/06/08 16:16

test_hf

総合スコア80

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

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

earnest_gay

2016/06/09 13:34

ありがとうございます! 結局最初の状態っで使うことにしました!
guest

0

<td><?php echo Email::equal($_POST['email1'],$_POST['email2']); ?></td>

この段階で $_POST['email1'] が評価されているからですね。
'email1' が未定義ということでNoticeエラーが出ています。('email2' も同様)

変更前の

php

1if (isset($_POST['email1'], $_POST['email2'])) { 2 ... 3}

のように、直接 $_POST を調べるのが確実ですが、面倒くさかったら次のような関数を作って対応するのもありかな?

php

1function params($obj, $key, $default = null) { 2 if ( ! isset($obj[$key])) return $default; 3 return $obj[$key]; 4}

php

1<td><?php echo Email::equal(params($_POST, 'email1'), params($_POST, 'email2')); ?></td>

投稿2016/06/08 16:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

earnest_gay

2016/06/09 13:32

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問