| 定義済み変数 | 説明 |
|---|---|
| $_GET | HTTP GET変数 (urldecode()で処理されて渡される) |
| $_POST | HTTP POST変数 |
| $_COOKIE | HTTPクッキー |
| $_REQUEST | HTTPリクエスト変数 ($_GET、$_POST、$_COOKIEをまとめたもの) |
| $_SESSION | セッション変数 |
| $_FILES | HTTPファイルアップロード変数 |
| $_SERVER | サーバ情報および実行時の環境情報 |
| $_ENV | 環境変数 |
| $php_errormsg | 直近のエラーメッセージ |
| $http_response_header | HTTPレスポンスヘッダ |
| $argc | スクリプトに渡された引数の数 |
| $argv | スクリプトに渡された引数の配列 |
| 生のPOST データ
PHP 5.6以降は非推奨。同様の内容は、file_get_contents('php://input')として取得可能 PHP: PHP 5.6.x で推奨されなくなる機能 - Manual |
|
| $GLOBALS | グローバルスコープで使用可能なすべての変数への参照 |
$_GETなどの定義済み変数は配列ですので、デバッグ時には
// index.php?a=1&b=2 print_r( $_GET ); // Array ( [a] => 1 [b] => 2 )
のようにして、その内容を一覧できます。また一つの文字列として処理するには、http_build_query()やimplode()で連結することで、それを得られます。
echo http_build_query( $_GET ); // a=1&b=2 echo implode( $_GET ); // 12
取得する値は、urldecode()によってデコードされています。
// index.php?a=%40 print_r( $_GET ); // Array ( [a] => @ )
パラメータの名前が重複していると、後にあるパラメータによって上書きされます。
// index.php?a=1&a=2&a=3 print_r( $_GET ); // Array ( [a] => 3 )
Content-Typeが"application/x-www-form-urlencoded"ならば、取得する値はurldecode()によってデコードされます。post - Does PHP automatically do urldecode() on $_POST? - Stack Overflow
$_GETと同様に、パラメータの名前が重複していると、後にあるパラメータによって上書きされます。
echo file_get_contents( 'php://input' ); // a=1&a=2&a=3 print_r( $_POST ); // Array ( [a] => 3 )
POSTされた値をすべて変数に格納するには、
if( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' )
{
foreach( $_POST as $key=>$value )
{
$$key = $value;
}
}
のようにします。ここでは$$keyで、配列のインデックス名を変数名として変数を作成しています。これは可変変数を利用することにより実現できる方法です。これにより$_POST[ 'text' ]のようなデータに対して、$textのような記述でアクセスできるようになります。
またはextract()を使用します。この関数ならば、extract( $_POST )と記述するだけです。PHP: extract - Manual
これらの方法では任意の変数を上書きされてしまうため、公開サーバでは使用すべきではありません。
$_FILESには$_FILES[ 要素名 ][ 情報の項目名 ]の形式で、アップロードされた複数のファイルの情報が連想配列として格納されます。詳細については、ファイルをアップロードしてもらう方法で解説しています。
| 分類 | 連想配列のキー | 説明 |
|---|---|---|
| サーバ情報 | SERVER_ADMIN | サーバのSERVER_ADMINに設定されている値 |
| SERVER_ADDR | サーバのIPアドレス | |
| SERVER_NAME | サーバのホスト名 | |
| SERVER_SOFTWARE | サーバの認識文字列 | |
| SERVER_PORT | サーバの通信ポートとして使用されているポート番号 | |
| SERVER_SIGNATURE | サーバのバージョン名とバーチャルホスト名 | |
| GATEWAY_INTERFACE | サーバが使用しているCGIのバージョン | |
| クライアント情報 | REMOTE_ADDR | 現在のページにアクセスしているユーザーの、IPアドレス
サーバがIPv6に対応しておりユーザーからIPv6でアクセスされたならばIPv6で、さもなくばIPv4のアドレスとなる |
| REMOTE_HOST | 現在のページにアクセスしているホスト名 | |
| REMOTE_PORT | 現在のページにアクセスしているユーザーが、サーバへの通信に使用しているポート番号 | |
| スクリプト | DOCUMENT_ROOT | 実行しているスクリプトが存在するドキュメントルート ディレクトリ |
| SCRIPT_FILENAME | 実行しているスクリプトの絶対パス | |
| SCRIPT_NAME | 実行しているスクリプトのパス | |
| PHP_SELF | 実行しているスクリプトのファイル名 | |
| リクエスト | SERVER_PROTOCOL | ページがリクエストされたときのプロトコル名とバージョン |
| REQUEST_METHOD | ページがリクエストされたときのメソッド名 (GET、POST、HEADなど) | |
| REQUEST_TIME | ページがリクエストされたときの、タイムスタンプ | |
| REQUEST_URI | ページにアクセスするために指定されたURI (/index.htm) | |
| QUERY_STRING | クエリー文字列 (GETの値) | |
| リクエスト ヘッダの内容 | HTTP_ACCEPT | リクエストのAcceptヘッダの内容 |
| HTTP_ACCEPT_CHARSET | リクエストのAccept-Charsetヘッダの内容 | |
| HTTP_ACCEPT_ENCODING | リクエストのAccept-Encodingヘッダの内容 | |
| HTTP_ACCEPT_LANGUAGE | リクエストのAccept-Languageヘッダの内容 | |
| HTTP_CONNECTION | リクエストのConnectionヘッダの内容 | |
| HTTP_HOST | リクエストのHostヘッダの内容 | |
| HTTP_REFERER | リクエストのRefererヘッダの内容 (リファラ) | |
| HTTP_USER_AGENT | リクエストのUser-Agentヘッダの内容 (ユーザーエージェント) | |
| HTTPS | HTTPSプロトコルで実行されているかどうか | |
| ORIG_SCRIPT_NAME | ||
| ORIG_SCRIPT_FILENAME | ||
| PATH_INFO | ||
| PATH_TRANSLATED | バーチャルからリアルへマッピングされた後の、現在のスクリプトのファイルシステム上でのパス | |
| スクリプトの引数 | argv | スクリプトに渡された引数の配列
|
| argc | スクリプトに渡された引数の数 |
| 連想配列のキー | 説明 |
|---|---|
| HTTP_ACCEPT | |
| HTTP_ACCEPT_CHARSET | |
| HTTP_ACCEPT_ENCODING | |
| HTTP_ACCEPT_LANGUAGE | |
| HTTP_CONNECTION | |
| HTTP_COOKIE | |
| HTTP_KEEP_ALIVE | |
| HTTP_USER_AGENT | |
| REMOTE_ADDR | |
| REMOTE_PORT | |
| SCRIPT_FILENAME | |
| SERVER_NAME | |
| SERVER_PORT | |
| GATEWAY_INTERFACE | |
| SERVER_PROTOCOL | |
| REQUEST_METHOD | |
| QUERY_STRING | |
| REQUEST_URI | |
| SCRIPT_NAME | |
| LD_PRELOAD | |
| PDNET | |
| PATH | |
| DOCUMENT_ROOT | |
| ORIG_SCRIPT_NAME | |
| ORIG_SCRIPT_FILENAME | |
| PATH_INFO | |
| PATH_TRANSLATED |
POSTやGETなどのユーザーからの入力をブラウザに出力するときには、XSSを防止するためにHTMLタグを無効化する必要があります。それにはhtmlspecialchars()が便利で、この関数は記号を文字参照へ変換するため、簡単にタグを取り除けます。なお既定ではシングルクォートは変換されないため、必ず引数にENT_QUOTESを指定します。PHPのhtmlspecialcharsにはENT_QUOTESを付ける:phpspot開発日誌
$new = htmlspecialchars( '<a href="test">Test</a>', ENT_QUOTES );
| 変換対象 | 変換結果 |
|---|---|
& |
& |
" |
" |
'※1 |
' |
< |
< |
> |
> |
PHPディレクティブでmagic_quotes_gpcがonに設定されている場合、GPC ($_GET/$_POST/$_COOKIE) のデータに含まれるシングルクォート (') や ダブルクォート (") は自動でエスケープされます。
このエスケープを除去するにはstripslashes()を使用します。
foreach( $_POST as $key=>$value )
{
if( get_magic_quotes_gpc() )
{
$value = stripslashes( $value );
}
$$key = htmlspecialchars( $value, ENT_QUOTES );
}
またはPHPディレクティブへのアクセスが可能ならば、magic_quotes_gpcを無効にします。なぜならPHP 5.3.0以降、この機能は非推奨となっているからです。
magic_quotes_gpc
GPC(Get/Post/Cookie) 処理に関する magic_quotes の設定を行います。 magic_quotes が on の場合、'(シングルクォート)、" (ダブルクォート)、\(バックスラッシュ) 、NULL にはすべて自動的に バックスラッシュでエスケープ処理が行われます。magic_quotes_sybase も on の場合、シングルクォートは、バックスラッシュではなく シングルクォートでエスケープされます。
magic_quotes_gpc - PHP: 実行時設定 - Manual
同様にデータベースなどの外部ソースからの読み取り時にクォートをエスケープするmagic_quotes_runtimeもありますが、こちらもPHP 5.3.0から非推奨となっています。magic_quotes_runtime - PHP: 実行時設定 - Manual