日本PHPユーザ会 掲示板

日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。

日本PHPユーザ会 掲示板 » PHP 5 » $_POSTのキー名での変数宣言

$_POSTのキー名での変数宣言

ページ: 1

投稿者 投稿
会員
登録者: 5 月 2009
返信数: 2
初めて投稿させて頂きます。
どうぞよろしくお願いいたします。

早速ですが、
現在メールフォームを作成しておりまして、
ハマってしまったのでご教受下さい。

内容は、
$_POSTに、"name", "from", "title", "message"
という4つのキーが入っており、

foreach ($_POST as $k => $v) {
$$k = $v;
}

というコードで、$_POSTのキー名の変数を動的に宣言しようとしたのですが、
isset()で調べても変数は宣言されていなかったのです。

これは何が原因だと考えられますか?
会員
登録者: 10 2007
返信数: 71
コピー&ペーストして試してみたのですが・・・。

・・・なんででしょうね?。こちら(PHP5.2.5 linux)ではisset()でtrueが返ってきました。
値が入っていないと無視されてisset()でfalseが返ってくることもあるようです。またPOSTとGETを間違えていた、なんてことは私もやったことがあります。

少し話が変わりますが、name=kやname=vなど、phpの中で使われる変数と同じ名前を含むフォームから呼び出されるととんでもないことになりそうなので、
$name = $_POST['name'];
$from = $_POST['from'];
$title = $_POST['title'];
$message = $_POST['message'];
か、
foreach ( array("name", "from", "title", "message") as $k ) {
if ( isset($_POST[$k]) ) $$k = $_POST[$k];
}
のようにしたほうが安全かと考えてみましたが、いかがでしょうか?。
会員
登録者: 5 月 2009
返信数: 2
kona@m様

早速のご回答有り難うございます。
つい先週PHPを始めたばかりで、このコードも勉強用の書籍の通りに記述していたので、
書籍のサンプルコードからコピーペーストしてもisset()でfalseが返ってきてしまいました。

結局、フォームのhtmlと、内容確認用のphpファイル、
問題の起きた、実際にmb_send_mail()を実行するphpファイルをすべて書き直して見ると、
変数宣言が出来ていました。

ただ、すべて書き直す前に、
foreach ($_POST as $k => $v) {
$$k = $v;
echo $k, $v;
}

というコードで、そもそも$_POSTに値が入っているのか検証したところ、
$_POSTにはちゃんと値が入っていたので、
原因に関しては謎のままなのですが・・・。

しかしそもそも論として、
フォームで情報を送信する際、
for分で動的に変数宣言する程大量の変数は必要にならないでしょうから(私の場合ですが)
kona@m様のご指摘の通り、
引用
$name = $_POST['name'];
$from = $_POST['from'];
$title = $_POST['title'];
$message = $_POST['message'];

と書いた方が安全かつ、間違いないですね。


ご回答下さり有り難う御座いました。
会員
登録者: 10 2007
返信数: 71
実はもともとPHPにはフォームからのデータを自動的に変数にする機能があるのです。
私がPHPを知る前のことですが、デフォルトで有効になっていたのをセキュリティ上の理由で無効に変更されました。
少し回りくどい説明になってしまいました。ごめんなさい。

文献:グローバル変数の登録機能の使用法

ページ: 1

日本PHPユーザ会 掲示板 » PHP 5 » $_POSTのキー名での変数宣言

日本PHPユーザ会 掲示板 は UseBB 1 フォーラムソフトウェア を使用しています