定義済み変数 | 説明 |
---|---|
$_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