PHPでHTTPリクエストでWebページを取得、処理する際のプログラミング方法などについてメモ書きしています。
※目次をクリックすると目次の下部にコンテンツが表示されます。
- 1.URLのクエリー文字列を処理
- 2.JSON形式のPOSTデータを受け取り、処理する方法
- 3.Expiresヘッダー、Last-Modifiedヘッダーを設定
- 4.$_POSTの代わりにfilter_inputを使用
- 5.画像データを出力
URLのクエリー文字列を処理
1)サンプルコード
<?php if (isset($_GET["sleep"]) && is_numeric($_GET["sleep"])) { sleep($_GET["sleep"]); $result = "hello! sleep = " . $_GET["sleep"] ; } echo $result; ?>
2)サンプルコードの補足
●$_GET
URLパラメータで現在のスクリプトに渡された変数の連想配列
●isset
〇構文
bool isset ( mixed $var [, mixed $… ] )
変数がセットされており、それがNULLでないことを調べる。
●is_numeric
〇構文
bool is_numeric ( mixed $var )
指定した変数が数値であるかどうかを調べる。
JSON形式のPOSTデータを受け取り、処理する方法
(1)JSON形式のPOSTデータを受け取り
●HTTPヘッダーのContent-Typeが”application/json”形式の場合
・{id: “0101”,name: “鈴木”}の形式でデータが送信される。
・php://inputという読み込み専用のストリームを使って、 リクエストのbody部から生のデータを読み込む。そして、file_get_contentsを使って文字列に読み込む。
例)
$json_string = file_get_contents(‘php://input’);
※HTTPヘッダーのContent-Typeが”x-www-form-urlencoded”形式の場合
・”id=3&name=鈴木”のような形式でPOSTデータが送信される。
・$_POSTの配列に格納され、$_POST[“id”]、$_POST[“name”]でデータを取得できる。
(2)JSONエンコードされた文字列をPHPの変数に変換
①オブジェクトに変換する例
$jdon_obj = json_decode($json_string); var_dump($jdon_obj); object(stdClass)#1 (2) { ["id"]=> int(5) ["name"]=> string(3) "tom" } echo $json_obj->name;
②配列に変換する例
$jdon_ary = json_decode($json_string, true); var_dump(json_decode($jdon_ary); array(2) { ["id"]=> int(5) ["name"]=>string(3) "tom" } echo $json_ary["name"];
(3)連想配列にキーを追加
入力
{id: “0101”,name: “鈴木”}
PHPで受信してキーを追加する例
$input_str = file_get_contents("php://input"); $input_json = json_decode($input_str,true); $output = array( 'name' => $input_json["name"], 'id' => ++$id );
(4)配列をJSON形式の文字列に変換してリターン
例)
$arr = array(‘a’ => 1, ‘b’ => 2, ‘c’ => 3, ‘d’ => 4, ‘e’ => 5);
echo json_encode($arr);//{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}
PHPでExpiresヘッダー、Last-Modifiedヘッダーを設定
(1)PHPでExpiresヘッダーを設定
●HTTPのExpiresヘッダー
〇構文
Expires = “Expires” “:” HTTP-date
例)
Expires: Thu, 01 Dec 1994 16:00:00 GMT
※HTTP-date
HTTP-date = rfc1123-date | rfc850-date | asctime-date rfc1123-date = wkday "," SP date1 SP time SP "GMT" rfc850-date = weekday "," SP date2 SP time SP "GMT" asctime-date = wkday SP date3 SP time SP 4DIGIT date1 = 2DIGIT SP month SP 4DIGIT ; day month year (e.g., 02 Jun 1982) date2 = 2DIGIT "-" month "-" 2DIGIT ; day-month-year (e.g., 02-Jun-82) date3 = month SP ( 2DIGIT | ( SP 1DIGIT )) ; month day (e.g., Jun 2) time = 2DIGIT ":" 2DIGIT ":" 2DIGIT ; 00:00:00 - 23:59:59 wkday = "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun" weekday = "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday" | "Sunday" month = "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun" | "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec"
●サンプルコード
<?php header('Expires: '.gmdate('D, d M Y H:i:s', time() + 60).' GMT'); if (isset($_GET["sleep"]) && is_numeric($_GET["sleep"])) { sleep($_GET["sleep"]); $result = "hello! sleep = " . $_GET["sleep"] ; } echo $result; ?>
(2)PHPでLast-Modifiedヘッダーを設定
●HTTPのLast-Modifiedヘッダー
〇構文
Last-Modified = “Last-Modified” “:” HTTP-date
例)
Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
●Last-Modifiedヘッダーの注意点
・静的コンテンツの場合は、ファイルの最終更新日を基にLast-Modifiedヘッダーが設定されてリターンされる。
・PHPなどの動的コンテンツの場合は、PHPファイルの最終更新日時が変更されていなくても出力内容が動的に変化する可能性があるので、ファイルの最終更新日時を使ってLast-Modifiedヘッダーが自動で設定されない。
PHPコードの出力内容が動的に変更されず、Last-Modifiedヘッダーを設定したい場合は、下記のように明示的にヘッダーを指定する必要がある。
●サンプルコード
<?php header('Last-Modified: ' . gmdate('D, d M Y H:i:s', time() - 3600 ) . ' GMT'); if (isset($_GET["sleep"]) && is_numeric($_GET["sleep"])) { sleep($_GET["sleep"]); $result = "hello! sleep = " . $_GET["sleep"] ; } echo $result; ?>
$_POSTの代わりにfilter_inputを使用
ユーザー入力をSQLの条件として指定する場合があるが、その際に$_POSTではなくfilter_inputを使用する事が推奨されています。
●filter_input
〇構文
mixed filter_input ( int $type , string $variable_name [, int $filter = FILTER_DEFAULT [, mixed $options ]] )
○$type
INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER、INPUT_ENV
○$filter
適用するフィルタのID。デフォルトは、FILTER_DEFAULT。
・FILTER_DEFAULT
FILTER_UNSAFE_RAWと同等。何もフィルタリングをしない。
・FILTER_SANITIZE_ENCODED
文字列をURLエンコード。オプションで特殊文字を取り除いたりエンコードしたりする。
・FILTER_SANITIZE_SPECIAL_CHARS
“<>&およびASCII値が32未満の文字をHTMLエスケープする。
・FILTER_SANITIZE_STRING
タグを取り除く。
○$options
オプションあるいはフラグの論理和の連想配列。
オプションを指定可能なフィルタの場合、この配列の”flags”フィールドにフラグを指定する。
・FILTER_REQUIRE_ARRAY
値が配列であることを必須とする。
・FILTER_FLAG_NO_ENCODE_QUOTES
シングルクォート(‘)およびダブルクォート(“)をエンコードしない。
・FILTER_FLAG_STRIP_LOW
コードが32未満の文字を除去
・FILTER_FLAG_STRIP_HIGH
コードが127より大きい文字を除去
・FILTER_FLAG_ENCODE_LOW
コードが32未満のすべての文字をエンコード。
・FILTER_FLAG_ENCODE_HIGH
コードが127より大きいすべての文字をエンコード
・FILTER_FLAG_ENCODE_AMP
アンパサンド(&)をエンコード
○使用例
$name = filter_input(INPUT_POST, ‘name’, FILTER_SANITIZE_STRING);
$var = filter_input(INPUT_POST, ‘var’, FILTER_DEFAULT , FILTER_REQUIRE_ARRAY)
●filter_input
〇構文
mixed filter_input ( int $type , string $variable_name [, int $filter = FILTER_DEFAULT [, mixed $options ]] )
○$type
INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER、INPUT_ENV
○$filter
適用するフィルタのID。デフォルトは、FILTER_DEFAULT。
・FILTER_DEFAULT
FILTER_UNSAFE_RAWと同等。何もフィルタリングをしない。
・FILTER_SANITIZE_ENCODED
文字列をURLエンコード。オプションで特殊文字を取り除いたりエンコードしたりする。
・FILTER_SANITIZE_SPECIAL_CHARS
“<>&およびASCII値が32未満の文字をHTMLエスケープする。
・FILTER_SANITIZE_STRING
タグを取り除く。
○$options
オプションあるいはフラグの論理和の連想配列。
オプションを指定可能なフィルタの場合、この配列の”flags”フィールドにフラグを指定する。
・FILTER_REQUIRE_ARRAY
値が配列であることを必須とする。
・FILTER_FLAG_NO_ENCODE_QUOTES
シングルクォート(‘)およびダブルクォート(“)をエンコードしない。
・FILTER_FLAG_STRIP_LOW
コードが32未満の文字を除去
・FILTER_FLAG_STRIP_HIGH
コードが127より大きい文字を除去
・FILTER_FLAG_ENCODE_LOW
コードが32未満のすべての文字をエンコード。
・FILTER_FLAG_ENCODE_HIGH
コードが127より大きいすべての文字をエンコード
・FILTER_FLAG_ENCODE_AMP
アンパサンド(&)をエンコード
○使用例
$name = filter_input(INPUT_POST, ‘name’, FILTER_SANITIZE_STRING);
$var = filter_input(INPUT_POST, ‘var’, FILTER_DEFAULT , FILTER_REQUIRE_ARRAY)
PHPで画像データを出力するサンプル
●サンプルコードの仕様
・PHPで画像データを出力し、ブラウザで表示する。
・ある一定時間スリープしてから画像を表示する。
●HTMLファイル
<img src=”sleep.php?sleep=5″>
PHPファイル名の後にURLパラメータ”sleep”を指定しています。ここで指定した秒数サーバー側でスリープしてから画像データを送信して表示します。
●PHPファイル(sleep.php)
・PHPで画像データを出力し、ブラウザで表示する。
・ある一定時間スリープしてから画像を表示する。
●HTMLファイル
<img src=”sleep.php?sleep=5″>
PHPファイル名の後にURLパラメータ”sleep”を指定しています。ここで指定した秒数サーバー側でスリープしてから画像データを送信して表示します。
●PHPファイル(sleep.php)
<?php if (isset($_GET["sleep"]) && is_numeric($_GET["sleep"])) { sleep($_GET["sleep"]); header('Content-Type: image/gif'); $filename = "spritebg.gif"; $handle = fopen($filename, "rb"); $contents = fread($handle, filesize($filename)); fclose($handle); } print $contents; ?>