PHPの外部から来る変数

HTML フォーム (GET と POST)

フォームが PHP スクリプトに投稿された時、フォームから渡された全て の変数は PHP により自動的にスクリプトから使用可能となります。 この情報にアクセスする手段は複数あります。例を以下に示します。

例 12-9. 簡単なHTMLフォーム

<form action="foo.php" method="post">     Name:  <input type="text" name="username" /><br />     Email: <input type="text" name="email" /><br />     <input type="submit" name="submit" value="Submit me!" /> </form>

特定の設定や個別の設定に依存し、HTMLフォームからのデータにアクセス する手段は多くあります。いくつかの例を以下に示します。

例 12-10. 簡単なPOST HTMLフォームからのデータにアクセスする

<?php  // PHP 4.1.0以降で利用可能     echo $_POST['username'];    echo $_REQUEST['username'];     import_request_variables('p', 'p_');    echo $p_username;  // Available since PHP 3. As of PHP 5.0.0, these long predefined // variables can be disabled with the register_long_arrays directive.     echo $HTTP_POST_VARS['username'];  // PHPディレクティブregister_globals = onの場合に利用可能。 // PHP 4.2.0以降、register_globalsのデフォルト値はoffとなっています。 // この方法の使用/依存は推奨されません。     echo $username; ?>

GETフォームを使用した場合も同じですが、かわりに適当な定義済みの GET変数を使用するところが異なります。 GETは、QUERY_STRING (URLの'?'の後の情報)にも代入されます。 例えば、 http://www.example.com/test.php?id=3 には、 $_GET['id'] によりアクセス可能なGETデータ が含まれます。 $_REQUEST および import_request_variables() も参照ください。

注意: $_POST および $_GET のような スーパーグローバル 配列 がPHP 4.1.0で利用可能となっています。

前記のようにPHP 4.2.0より前のバージョンでは、 register_globals のデフォルト値は on でした。 PHP 3では、常にonとなっています。 PHPコミュニティは、このディレクティブに依存しないことを推奨し、 このオプションが off でのコードの動作を仮定 することを推奨しています。

注意: magic_quotes_gpc の設定 はGET、POSTそしてCookieの値に影響します。onになっていると (It's "PHP!") という値は自動的に (It\'s \"PHP!\") となり、DBへの挿入時の エスケープが不要になります。 addslashes() stripslashes() そして magic_quotes_sybase も 参照してください。

PHPではフォーム変数のコンテキスト内で配列が使用可能です( FAQの関連箇所 も参照してください)。 例えば、関連する変数をグループ化したり、select inputで複数の値を 取得するといったことが可能です。フォームを同じスクリプトに投稿し、 投稿したデータを表示する例を示します。

例 12-11. より複雑なフォーム変数

<?php if (isset($_POST['action']) && $_POST['action'] == 'submitted') {     echo '<pre>';     print_r($_POST);     echo '<a href="'. $_SERVER['PHP_SELF'] .'">Please try again</a>';      echo '</pre>'; } else { ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">     Name:  <input type="text" name="personal[name]" /><br />     Email: <input type="text" name="personal[email]" /><br />     Beer: <br />     <select multiple name="beer[]">         <option value="warthog">Warthog</option>         <option value="guinness">Guinness</option>         <option value="stuttgarter">Stuttgarter Schwabenbräu</option>     </select><br />     <input type="hidden" name="action" value="submitted" />     <input type="submit" name="submit" value="submit me!" /> </form> <?php } ?>

PHP 3では、配列変数は1次元配列に限定されていました。PHP 4以降ではこの ような制約はありません。

IMAGE SUBMIT 変数名

フォームを投稿する際、次のタグのように標準の投稿ボタンの代わりに 画像を使用することができます。

<input type="image" src="image.gif" name="sub" />

画像のどこかがクリックされた場合、二つの変数 sub_x および sub_y が付け加えられてこのフォームはサーバーに転送されます。これらの変 数は、ユーザーがこの画像をクリックした座標を示しています。経験の ある人は、ブラウザにより送られた変数の名前においてアンダースコア がピリオドになってしまっていることを心配するかもしれません。 しかし、PHP はピリオドをアンダースコアに自動的に変換します。

HTTP Cookie

PHP は、 Netscapeの規約 に定 義されたHTTP Cookieを完全にサポートします。Cookieは、リモート ブラウザにデータを保持し、再訪するユーザーを追跡し、特定する機構 です。 setcookie() 関数によりCookieをセットす ることができます。Cookieは、HTTP ヘッダの一部なので、SetCookie 関数をブラウザに何かを出力する前にコールする必要があります。 この制約は、 header() 関数のものと同じです。 Cookieのデータは、 $_COOKIE , $HTTP_COOKIE_VARS のような適当なCookieデータ 配列で参照可能です。また、 $_REQUEST でも 参照可能です。詳細および例については、 setcookie() のマニュアルページを参照してください。

単一のCookieに複数の値を代入したい場合は、配列として 代入することが可能です。以下に例を示します。

<?php
  setcookie
( "MyCookie[foo]" , 'Testing 1' , time ()+ 3600 );
  
setcookie ( "MyCookie[bar]" , 'Testing 2' , time ()+ 3600 );
?>

上記スクリプトにおいては、2つの異なるCookieを生成されますが、 この場合、スクリプトではMyCookieという単一の配列になります。 一つのCookieに複数の値を設定したい場合、最初の値に serialize() または explode() を用いることを考えてください。

Cookieは、パスまたはドメインが異ならない限り、 以前のクッキーをブラウザ上の同じ名前の変数に置き換えることに 注意してください。 さて、買い物かご(Shopping Cart) プログラムの場合、カウンタを保持し、 受け渡したいと思うかもしれません。 これは、次のようになります。

例 12-12. setcookie() の例

<?php
if (isset( $_COOKIE [ 'count' ])) {
    
$count = $_COOKIE [ 'count' ] + 1 ;
} else {
    
$count = 1 ;
}
setcookie ( 'count' , $count , time ()+ 3600 );
setcookie ( "Cart [ $count ] " , $item , time ()+ 3600 );
?>

外部変数名のドット

通常、PHP はスクリプトに渡された変数の名前を変更しません。しかし、 ドット(ピリオド、終止符)はPHPの変数名で有効な文字ではないというこ とに注意する必要があります。次の例を見てみましょう。

<?php
$varname
. ext ;   /* 無効な変数名 */
?>
ここで、パーサは、 $varname という名前の変数の後に 文字列結合演算子があり、その後に、裸の文字列(すなわち、既知のキー または予約語にマッチしない引用符無しの文字列) 'ext' が続くとして 解釈します。この場合、明らかに意図する結果にはなりません。

重要なことを記述しておくと、このため、外部変数に含まれるドットを PHP は自動的にアンダースコアに変換します。

変数の型の定義

PHPは、変数の型を定義し、必要に応じて変換します。このため、ある変 数の型がある時点で常に明らかであるわけではありません。PHPは、変数 の型を調べる複数の関数をサポートしています。それらは、 gettype() , is_array() , is_float() , is_int() , is_object() , is_string() です。 の章も参照ください。