- 締切済み
フォームの値をまとめて取得する関数
以下のようなフォームから値を取得するときに、(2)のような関数化したいと思っていますが、思うように取得できません。どこが問題かアドバイスください。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=sjis" /> <title>sample</title> </head> <body> <form action="" method="post"> 名前:<br /> <input type="text" name="name" size="30" value="" /><br /> コメント:<br /> <textarea name="comment" cols="30" rows="5"></textarea><br /> <br /> <input type="submit" value="登録する" /> </form> </body> </html> (1)問題なく表示できる <?php foreach(${"_" . $_SERVER["REQUEST_METHOD"]} as $k=>$v) { ${$k}=$v; } echo "名前:$name<br>"; echo "コメント:$comment<br>"; ?> (2)表示できない? <?php function Request() { foreach(${"_" . $_SERVER["REQUEST_METHOD"]} as $k=>$v) { ${$k}=$v; } } Request(); echo "名前:$name<br>"; echo "コメント:$comment<br>"; ?>
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
送られてくるデータは全て汚染されていると考えるべきなので それを任意の変数名として使うのは問題外です ただあくまでテストというのであれば、ユーザー関数をつかわなくても 最初からextract()という関数が用意されています。 <form method="post"> 名前:<br /> <input type="text" name="name" size="30" value="" /><br /> コメント:<br /> <textarea name="comment" cols="30" rows="5"></textarea><br /> <br /> <input type="submit" value="登録する" /> </form> <?php extract(${"_" . $_SERVER["REQUEST_METHOD"]}); echo "名前:$name<br>"; echo "コメント:$comment<br>"; ?> XSSをふくむセキュリティ上のかなり問題があるソースですので インターネットに公開するサイトには絶対に使わないようにしてください
変数のスコープについての理解が足りないように思います。 PHPの場合、関数内の変数は関数内でしか使えないため、 ${$k}=$v; の部分で定義した変数は関数の外では使えません。 解決方法としては 1.関数内で定義した変数を戻り値として関数呼び出し元に戻すようにする 2.グローバル変数を使う の方法があります。 2.が簡単ですが、安易にグローバル変数を使うとコードの可読性が下がるので、 1.の方をお勧めします。 また、全く別の話ですが、 (1)問題なく表示できる の様なソースですと致命的にセキュリティが低下するので、 練習以外の使用はお勧めできません・・・
補足
実際にはサニタイズする関数を施しますが、あくまでもfunctionとして(1)と同じような挙動にしたいのですがうまくいきませんので改めて、ご教授ねがいます。