PHP SCHOOL.biz

PHPの学習をする為のブログです。プログラム未経験の方にも理解できるよう基本的な、PHPの知識について身に付けることができるようにわかりやすい内容にしていきたいと思っています。


PHPでのスーパーグローバル変数

スーパーグローバル変数はPHP 4.1.0で導入され、常にすべてのスコープで使用可能な組み込み変数です。

PHPでのスーパーグローバル変数

PHPのいくつかの事前定義された変数が "スーパーグローバル変数"です。つまり、スコープに関係なく常にアクセス可能であり、何か特別な処理をすることなく関数、クラスなどのPHPスクリプトからアクセスできます。

スーパーグローバル変数には、次の様なものがあります。


・$GLOBALS
・$_SERVER
・$_REQUEST
・$_POST
・$_GET
・$_FILES
・$_ENV
・$_COOKIE
・$_SESSION

この章では幾つかのスーパーグローバル変数について学びます。残りのスーパーグローバル変数については、別の章で紹介します。

$GLOBALS

$ GLOBALSはPHPのスーパーグローバル変数で、PHPスクリプト内のどこからでも(関数やメソッド内からでも)グローバル変数にアクセスする際に使用されます。
PHPはすべてのグローバル変数を$ GLOBALS [index]という配列に格納します。インデックスには変数名が格納されます。
次の例は、スーパーグローバル変数$ GLOBALSを使用する方法です。

<?php 
$x = 75; 
$y = 25;
 
function addition() { 
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}
 
addition(); 
echo $z; 
?>

実行結果
上の例では、$GLOBALS内に変数が格納されているので、関数外から$zにアクセスすることが出来ます。

$_SERVER

$_SERVER は、ヘッダ、パス、スクリプトの位置のような 情報を有する配列です。この配列のエントリは、Web サーバーにより 生成されます。全ての Web サーバーがこれら全てを提供する保障はありません。 サーバーは、これらのいくつかを省略したり、この一覧にない他のものを 定義する可能性があります。

<?php 
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>

実行結果

次の表は、$ _SERVERの中で重要な要素の幾つかを紹介したものです。

Element/Code 説明
$_SERVER['PHP_SELF'] 実行中のスクリプトのファイル名を返します。
$_SERVER['GATEWAY_INTERFACE'] サーバーが使用している CGI のバージョンを返します。
$_SERVER['SERVER_ADDR'] サーバーのIPアドレスを返します。
$_SERVER['SERVER_NAME'] サーバーの名前を返します(www.study-php.biz)。
$_SERVER['SERVER_SOFTWARE'] webサーバーの名称とバージョンを返します(Apache/2.2.24)。
$_SERVER['SERVER_PROTOCOL'] プロコトルの情報とバージョンを返します(HTTP/1.1)。
$_SERVER['REQUEST_METHOD'] POSTやGETとといったリクエストのメソッドを返します。
$_SERVER['REQUEST_TIME'] リクエストを実行したタイムスタンプを返します(1256953732)
$_SERVER['QUERY_STRING'] クエリ文字列を介してページにアクセスした場合は、クエリ文字列を返します。
$_SERVER['HTTP_ACCEPT'] 現在のリクエストの Accept: ヘッダがもしあれば その内容。
$_SERVER['HTTP_ACCEPT_CHARSET'] 現在のリクエストの Accept-Charset: ヘッダが もしあればその内容。例: 'iso-8859-1,*,utf-8'
$_SERVER['HTTP_HOST'] 現在のリクエストのHost: ヘッダが もしあればその内容。
$_SERVER['HTTP_REFERER'] 現在のページに遷移する前にユーザーエージェントが参照していた ページのアドレス(もしあれば)。これはユーザーエージェントに よってセットされます。全てのユーザーエージェントが これをセットしているわけではなく、また、HTTP_REFERER を変更する機能を持つものもあります。 要するに、信頼するべきものではありません。
$_SERVER['HTTPS'] スクリプトが HTTPS プロトコルを通じて実行されているか。
$_SERVER['REMOTE_ADDR'] ユーザーが現在のページを表示している場所のIPアドレスを返します。
$_SERVER['REMOTE_PORT'] Webサーバーと通信するためにユーザーのマシンで使用されているポートを返します。
$_SERVER['SCRIPT_FILENAME'] 現在実行中のスクリプトの絶対パス名を返します。
$_SERVER['SERVER_ADMIN'] Web サーバーの設定ファイルの SERVER_ADMIN (Apache の場合)ディレクティブ にセットされている値。スクリプトがバーチャルホスト上で 実行されている場合、バーチャルホストに対して値が定義されます。
$_SERVER['SERVER_PORT'] Webサーバが通信に使用しているサーバマシンのポートを返します(80など)。
$_SERVER['SERVER_SIGNATURE'] サーバー上で生成されたページに追加される、 サーバーのバージョン名とバーチャルホスト名の文字列。 Web サーバーの設定で有効になっていることが必要。
$_SERVER['PATH_TRANSLATED'] 現在のスクリプトへのファイルシステムベースのパスを返します。
$_SERVER['SCRIPT_NAME'] 現在のスクリプトのパス。 スクリプト自身のページを指定するのに有用です。
$_SERVER['SCRIPT_URI'] 現在実行中のスクリプトのURLを返します。

$_REQUEST

PHP $ _REQUESTは、HTMLフォームを送信した後にデータを収集するために使用されます。

次の例は、入力フィールドと送信ボタンがあるフォームです。ユーザーが「送信」をクリックしてデータを送信すると、フォームデータは

タグのaction属性で指定されたファイルに送信されます。この例では、フォームデータを処理するために同じファイルを指定しています。別のPHPファイルを使用してフォームデータを処理する場合は、actionのファイル名で置き換えます。
下の例では、formで送信されたfnameの値を、スーパーグローバル変数$ _REQUESTを使用して、収集しています。

<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
  Name: <input type="text" name="fname">
  <input type="submit">
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // collect value of input field
    $name = $_REQUEST['fname'];
    if (empty($name)) {
        echo "Name is empty";
    } else {
        echo $name;
    }
}
?>

</body>
</html>

実行結果
テキストエリアに入れた値が、submitボタンを押すと表示されたと思います。
本来は上記のような処理をする際にはセキュリティを考えなければなりません。
詳細を知りたい方は、クロスサイトスクリプティング(XSS)などで検索をして調べてみてください。

PHPでの$_POST

PHP $ _POSTは、method = "post"のHTMLフォームを送信した後にフォームデータを収集するために広く使われています。

次の例は、入力フィールドと送信ボタンがあるフォームを示しています。ユーザーが「送信」をクリックしてデータを送信すると、フォームデータはタグのaction属性で指定されたファイルに送信されます。この例では、フォームデータを処理するためのファイル自体を指定しています。別のPHPファイルを使用してフォームデータを処理する場合は、HTMLフォームを送信後の処理を行いたいファイル名で置き換えます。次に、スーパーグローバル変数$ _POSTを使用して入力フィールドの値を収集しています。

<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
  Name: <input type="text" name="fname">
  <input type="submit">
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // collect value of input field
    $name = $_POST['fname'];
    if (empty($name)) {
        echo "Name is empty";
    } else {
        echo $name;
    }
}
?>

</body>
</html>

実行結果

PHPでの$_GET

PHP $ _GETは、method = "get"でHTMLフォームを送信した後にフォームデータを収集するためにも使用されます。
$ _GETは、URLで送信されたデータを収集することもできます。
パラメータ付きのハイパーリンクを含むHTMLページがあるとします。

<html>
<body>

<a href="form3.php?subject=PHP&web=http://www.study-php.biz/">Test $GET</a>

</body>
</html>

ユーザーが "Test $ GET"リンクをクリックすると、 "subject"と "web"というパラメータが "form3.php"に送られ、 "form3.php"の値に$ _GETでアクセスできます。

下の例は "form3.php"のコードを示しています。

<html>
<body>

<?php 
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
?>

</body>
</html>

実行結果

ヒント:PHPフォームの章で$ _POSTと$ _GETの詳細を学びます。