定義済み変数

定義済み変数

定義済み変数 説明
$_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 スクリプトに渡された引数の配列
$HTTP_RAW_POST_DATA 生のPOST データ

PHP 5.6以降は非推奨。同様の内容は、file_get_contents('php://input')として取得可能 PHP: PHP 5.6.x で推奨されなくなる機能 - Manual

$GLOBALS グローバルスコープで使用可能なすべての変数への参照
PHP: 定義済の変数 - Manual

$_GET

$_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 )

$_POST

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には$_FILES[ 要素名 ][ 情報の項目名 ]の形式で、アップロードされた複数のファイルの情報が連想配列として格納されます。詳細については、ファイルをアップロードしてもらう方法で解説しています。

$_SERVER

分類 連想配列のキー 説明
サーバ情報 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 スクリプトに渡された引数の配列
  • $argv[0] … スクリプトのファイル名
  • $argv[1] … 1個目の引数
  • $argv[n] … n個目の引数
argc スクリプトに渡された引数の数
PHP: $_SERVER - Manual

$_ENV

連想配列のキー 説明
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  
PHP: $_ENV - Manual

不正なコードの実行防止

POSTやGETなどのユーザーからの入力をブラウザに出力するときには、XSSを防止するためにHTMLタグを無効化する必要があります。それにはhtmlspecialchars()が便利で、この関数は記号を文字参照へ変換するため、簡単にタグを取り除けます。なお既定ではシングルクォートは変換されないため、必ず引数にENT_QUOTESを指定します。PHPのhtmlspecialcharsにはENT_QUOTESを付ける:phpspot開発日誌

$new = htmlspecialchars( '<a href="test">Test</a>', ENT_QUOTES );
htmlspecialchars()による変換
変換対象 変換結果
& &amp;
" &quot;
'※1 &#039;
< &lt;
> &gt;
※1 ENT_QUOTESが指定された場合のみ。

エスケープの除去

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

PHPのマニュアルから検索