PHPの定義済み変数(スーパーグローバル)徹底解説!$_SERVER・$_GET・$_POSTなどの使い方
はじめに
すべてのPHPスクリプトは、あらかじめシステム側で用意された多数の「定義済み変数(スーパーグローバル変数)」にアクセスできます。ただし、その多くはWebサーバーソフトウェアやPHPのバージョンなど、実行環境に依存する点に注意が必要です。また、一部の変数はコマンドラインモードで動作するスクリプトでは利用できません。
$GLOBALSには、グローバルスコープで利用可能なすべての定義済み変数への参照が格納されており、これらの変数の大半はphpinfo()の出力でも確認できます。本記事では、実務で特によく使われる定義済み変数について、具体例とともにわかりやすく解説します。
$_SERVER:サーバー情報と実行環境の取得
$_SERVERは、HTTPヘッダー、スクリプトのパス、サーバー環境に関する情報を格納する配列変数です。以下に、代表的な要素を紹介します。
PHP_SELF
現在実行中のスクリプトのファイル名を保持します。たとえば、ローカルサーバーのドキュメントルート直下にあるtestフォルダ内のスクリプトは、次のようなパスを返します。
<?php echo $_SERVER['PHP_SELF']; ?>
https://localhost/test/testscript.php というURLでアクセスした場合の表示結果は次のとおりです。
/test/testscript.php
SERVER_ADDR
現在のスクリプトが実行されているサーバーのIPアドレスを返します。
SERVER_NAME
現在のスクリプトが実行されているサーバーホストの名前です。ローカル環境で実行している場合は「localhost」が返されます。
QUERY_STRING
クエリ文字列とは、「key=value」形式のペアを&記号で連結し、URLの?記号以降に付加した文字列のことです。たとえば、https://localhost/testscript?name=xyz&age=20 というURLの場合、末尾の「name=xyz&age=20」がクエリ文字列として返されます。
REQUEST_METHOD
ページへアクセスする際に使用されたHTTPリクエストメソッド(GET、POST、PUT、DELETEなど)です。前述の例のように、URLに?記号でクエリ文字列を付けてアクセスした場合は、GETメソッドによるリクエストとなります。
DOCUMENT_ROOT
サーバー上でドキュメントルートとして設定されているディレクトリ名を返します。XAMPPのApacheサーバーでは「htdocs」がドキュメントルートの名称として返されます。
C:/xampp/htdocs
HTTP_USER_AGENT
現在ページにアクセスしているユーザーエージェント(ブラウザ)を表す文字列です。訪問者のブラウザの種類やOSなどを判別する際に利用されます。
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
REMOTE_ADDR
現在のページを閲覧しているユーザーのマシンのIPアドレスです。
SERVER_PORT
Webサーバーがリクエストを待ち受けているポート番号です。デフォルトは80番です。
$_GET:URLパラメータの受け取り
デフォルトでは、クライアントのブラウザはHTTP GETメソッドを使ってサーバー上のURLへリクエストを送信します。URLに付加されたクエリ文字列には、&記号で連結されたkey=valueペアが含まれることがあり、$_GET連想配列はこれらのキーと値のペアを保持します。
ここで、ブラウザのURLがhttps://localhost/testscript?name=xyz&age=20であると仮定します。
<?php echo "Name : " . $_GET["name"] . "<br>"; echo "Age : " . $_GET["age"]; ?>
実行結果:
Name : xyz Age : 20
$_POST:フォームデータの受け取り
$_POSTは、HTTP POSTメソッドで送信されたkey=valueペアからなる連想配列です。リクエストのContent-TypeはURLEncodedまたはmultipart/form-dataである必要があります。
POSTメソッドでPHPスクリプトへデータを送るには、HTMLフォームでmethod属性に「POST」を指定します。以下はtest.htmlの記述例です。
<form action="testscript.php" method="POST"> <input type="text" name="name"> <input type="text" name="age"> <input type="submit" value="submit"> </form>
データを受け取る側のPHPスクリプトは次のとおりです。
<?php echo "Name : " . $_POST["name"] . "<br>"; echo "Age : " . $_POST["age"]; ?>
実行結果:
Name : xyz Age : 20
$_FILES:アップロードファイルの処理
$_FILESは、HTTP POSTメソッド経由でアップロードされたファイルの情報を格納する連想配列です。ファイルをアップロードするには、enctype属性を「multipart/form-data」に設定したPOSTフォームが必要です。
<form action="testscript.php" method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="submit"> </form>
PHPスクリプト内では、$_FILES変数を次のように参照できます。
<?php print_r($_FILES); ?>
実行結果:
Array ( [file] => Array ( [name] => hello.html [type] => text/html [tmp_name] => C:\xampp\tmp\php9647.tmp [error] => 0 [size] => 56 ) )
各キーの意味は次のとおりです。
name:元のファイル名
type:ファイルのMIMEタイプ
tmp_name:サーバー上一時保存先のパス
error:アップロード時のエラーコード(0は成功)
size:ファイルサイズ(バイト単位)
その他の主な定義済み変数
$_REQUEST
$_GET、$_POST、$_COOKIEの内容をまとめて提供する連想配列です。送信方法を意識せずに値を受け取れる反面、データの出所が曖昧になるため、用途に応じて$_GETや$_POSTを直接使うことが推奨されます。
$_SESSION
HTTPセッションを表す変数群を格納する連想配列です。ログイン状態の管理などに活用されます。利用する際は、スクリプトの先頭でsession_start()を呼び出す必要があります。
$_ENV
環境変数を格納する配列です。これらの変数はPHPのグローバル名前空間にインポートされます。
$_COOKIE
サーバーはCookieという仕組みを使って、クライアントのコンピュータに一定のデータを保存できます。Cookieはリクエストのたびに自動的に送信されます。$_COOKIEは、Cookie変数とその値からなる連想配列です。
まとめ
PHPの定義済み変数は、サーバー情報の取得、フォームデータやファイルの受信、セッションやCookieの管理など、Webアプリケーション開発に不可欠な機能を提供します。それぞれの変数の特性を正しく理解し、適切に使い分けることで、安全で効率的なスクリプトを作成できるようになります。
-
PHPのextract()関数とは?使い方とパラメータを徹底解説
extract()関数とはPHPのextract()関数は、配列のキーと値を現在のシンボルテーブルに変数としてインポートする関数です。連想配列の各要素が「キー名=変数名、値=変数の値」として展開され、戻り値としては正常に抽出された変数の個数が返されます。構文extract(arr, rules, prefix)パラメータarr − 変数として展開したい対象の配列を指定します。rules − 無効な変数名や既存変数との衝突(コンフリクト)が発生した場合の扱い方を指定します。指定できる値は以下の通りです。EXTR_OVERWRITE − デフォルト値。同名の変数が既に存在する場合、既存の変数を上書
-
JavaScript変数の値をPHPに渡して取得する方法をわかりやすく解説
JavaScript変数をPHPで扱う基本の考え方JavaScriptとPHPは実行されるタイミングが異なります。PHPはサーバーサイドで先に処理され、JavaScriptはその結果を受け取ったブラウザ(クライアントサイド)で後から動作します。そのため、JavaScriptの変数をPHPへ「直接」渡すことはできず、何らかの方法でサーバーへ値を送信する必要があります。ただし、同じページ内でJavaScriptの変数の値を出力・表示するだけであれば、以下のように簡単に実現できます。同じページ内でJavaScript変数の値を表示するサンプルコード<script> var res