2010年07月31日

ページからの入力を受け取る $_GET と $_POST

この二つの変数は、スーパーグローバル変数と言って、PHP がいかなるスコープでも参照を保証する特別な変数です。

通常、グローバルとローカルの差は明確で、関数定義内における変数は、デフォルトでは常にローカル変数で、グローバルな変数を参照するには、

global 変数名;

と言う宣言をする必要があります。そのような制限をされない変数がスーパーグローバル変数です。

$_GET と $_POST は、ページ内の FORM 要素内で定義された入力関係の要素( INPUT、SELECT、TEXTAREA ) で入力されたデータがセットされますが、FORM 要素の method 属性によって、どちら側にセットされるか決定します。ですから、厳密に分けて使う場合は、どちらのメソッドで送られて来たかチェックする必要がありますが、それは、$_SERVERREQUEST_METHOD でチェックします。
if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
}
else {
}

しかし、ソースコードの再利用を考えた場合、どちらのメソッドを使うかは、再利用側の都合でもあるので、以下のような方法で常に $_POST参照するという方法もあります。
foreach( $_GET as $Key => $Value ) {
	$_POST[$Key] = $_GET[$Key];
}


これは、「外部から来る変数」と言われる変数である、$_GET と $_POST ですが、PHP 側で「どこでも使えるグローバル変数エリア」として意図的に使えるという事も意味します。全てのグローバル変数を参照する、$GLOBALS や、元々 $_GET と $_POST をマージした $_REQUEST という変数もありますが、あくまで基本は $_GET と $_POST ですので、扱い方と特性を十分に知っておく必要があります。

例えば、SQL インジェクションに関連するフィールドにはそのような対象であるというprefix を付けておいて、前の例文のループ内で変換しておくというような運用方法もあります。
( または、別の変数にセットして管理する等 )

さらに、入力データですから、デバッグには欠かせない以下のような内容の表示方法も知っておく必要があります
print "<pre>";
print_r($_GET);
print_r($_POST);
print "</pre>";



posted by at 2010-07-31 19:05 | 環境 | このブログの読者になる | 更新情報をチェックする