ようやくPHPっすよ。
前回の最終的なPerlスクリプトが
だったんですが、こいつと同じ機能をPHPで書くと
となりました。
------------
サンプルソース:test.php.zip
なんか格段にシンプルになってますな。こいつを例えばWebのルートフォルダ(Macintosh HD→ライブラリ→WebServer→Documents)に置いて
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091004/13/xcc/8b/bb/j/o0500022110267340257.jpg?caw=800)
ここね
Safariで直接以下のURLを打ち込んでリターンキーを押せば(てっとりばやくクリックしてもいいよ)
http://localhost/test.php?name=test+data&location=osaka%2Cjapan
前回同様の結果が得られる。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091004/13/xcc/bf/7d/j/o0429029710267344146.jpg?caw=800)
CGI経由が以下のような、Webサーバー外部への全面的なHTML文発注だとすると
![$テン・シー・シー-4](https://stat.ameba.jp/user_images/20091004/14/xcc/2b/0f/j/o0411052010267358322.jpg?caw=800)
PHPの場合は以下のような、Webサーバー内部のPHPインタプリタによる、部分的HTML文の差し替えというところでしょうかね~。
![$テン・シー・シー-5](https://stat.ameba.jp/user_images/20091004/14/xcc/47/56/j/o0329054210267360999.jpg?caw=800)
じゃ、続いて軽くPHP文の解析。
まず、CGI経由のPerlスクリプトだと、このファイルがPerlスクリプトだという宣言とContent-Typeの指定が必要で、その上でH1指定のhelloの出力だったのが
PHPだと、基本HTMLファイルということなので
で済んでます。
で、PHPはHTML文の中で任意の場所に、任意の回数埋め込む事ができるという特徴があるので、HTML文の中のPHPインタプリタに任せる部分を示すために以下のタグで囲むようです。
やってることは
で、Perlスクリプト同様受信方式によるデータの違いの吸収。
変数に$が付くのはPerl同様みたいですな。Perlだと
という部分。$_SERVER、$_POST、$_GETってのが設定済みの変数みたいです。
Perlだとその後、データ内容の部品分割処理('&'や'='での分割)となるけど、PHPではすでに$dic(元の$_POST、$_GET)が、分解済みのデータの連想配列(前回の$ENV変数のような)になってるようです。
なので、いきなり
で$dic連想配列に入っている要素すべてを順に取り出してループしてます。ここで使ってる
という記述は連想配列内の$kで指定したデータを$vに入れろって指示みたい。
前回書いた連想配列の
文字列"a" → データ1
文字列"b" → データ2
の"a"、"b"てのが$kに入り、データ1、データ2が$vに入るってことですな。
具体的には"name","location"が$k、"test data"、"osaka,japan"が$vに入るってことです。
最後は
で
部分を実際の内容に差し替えという処理でおしまい。
ちなみに、PHPファイルはCGI用ファイルと違ってどこに置いても機能します。
なので、自分のホームページに置いてもOK。ただしCGI用ファイルと違って拡張子.phpは必須みたいっす。
![$テン・シー・シー-1](https://stat.ameba.jp/user_images/20091004/13/xcc/42/a4/j/o0500028810267335253.jpg?caw=800)
ここね
実行するにはURL記述が
http://localhost/自分のホームページ/test.php?name=test+data&location=osaka%2Cjapan
となります。自分のホームページはシステム環境設定の共有で調べる事ができます。
![$テン・シー・シー-6](https://stat.ameba.jp/user_images/20091004/15/xcc/3c/8b/j/o0500041010267391478.jpg?caw=800)
ここね
それと、ここで書かれているhttp://192.168.0.13/...というのは、人によって10.0.0.0~10.255.255.255とか192.168.0.0~192.168.255.255に変化する。この記述法だとWebサーバーと違うマシンからも実行できます。http://localhost/...という記述法はWebサーバーと同じマシンでWebブラウザを実行する時にだけ使えるんですな。
なので「iPhoneアプリ開発、その(130)」のiPhoneアプリで実験したろと思うなら
部分を、システム環境設定の共有の表示が192.168.0.13なら
として実行ね。シミュレータでWebサーバと同じマシン上で試すだけなら
でもOKっす。
URIとかRFCとかの整理は次回!
前回の最終的なPerlスクリプトが
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "<h1>hello</h1>";
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'});
} else {
$alldata = $ENV{'QUERY_STRING'};
}
foreach $data (split(/&/, $alldata)) {
($key, $value) = split(/=/, $data);
$value =~ s/\+/ /g;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
print "$key = ";
print "$value<p>";
}
だったんですが、こいつと同じ機能をPHPで書くと
<H1>hello</H1>
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
$dic = $_POST;
} else {
$dic = $_GET;
}
foreach($dic as $k => $v) {
echo $k, " = ", $v, "<p>";
}
?>
となりました。
------------
サンプルソース:test.php.zip
なんか格段にシンプルになってますな。こいつを例えばWebのルートフォルダ(Macintosh HD→ライブラリ→WebServer→Documents)に置いて
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091004/13/xcc/8b/bb/j/o0500022110267340257.jpg?caw=800)
ここね
Safariで直接以下のURLを打ち込んでリターンキーを押せば(てっとりばやくクリックしてもいいよ)
http://localhost/test.php?name=test+data&location=osaka%2Cjapan
前回同様の結果が得られる。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091004/13/xcc/bf/7d/j/o0429029710267344146.jpg?caw=800)
CGI経由が以下のような、Webサーバー外部への全面的なHTML文発注だとすると
![$テン・シー・シー-4](https://stat.ameba.jp/user_images/20091004/14/xcc/2b/0f/j/o0411052010267358322.jpg?caw=800)
PHPの場合は以下のような、Webサーバー内部のPHPインタプリタによる、部分的HTML文の差し替えというところでしょうかね~。
![$テン・シー・シー-5](https://stat.ameba.jp/user_images/20091004/14/xcc/47/56/j/o0329054210267360999.jpg?caw=800)
じゃ、続いて軽くPHP文の解析。
まず、CGI経由のPerlスクリプトだと、このファイルがPerlスクリプトだという宣言とContent-Typeの指定が必要で、その上でH1指定のhelloの出力だったのが
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "<h1>hello</h1>";
PHPだと、基本HTMLファイルということなので
<H1>hello</H1>
で済んでます。
で、PHPはHTML文の中で任意の場所に、任意の回数埋め込む事ができるという特徴があるので、HTML文の中のPHPインタプリタに任せる部分を示すために以下のタグで囲むようです。
<?php
・
・
?>
やってることは
if($_SERVER['REQUEST_METHOD'] == "POST") {
$dic = $_POST;
} else {
$dic = $_GET;
}
で、Perlスクリプト同様受信方式によるデータの違いの吸収。
変数に$が付くのはPerl同様みたいですな。Perlだと
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'});
} else {
$alldata = $ENV{'QUERY_STRING'};
}
という部分。$_SERVER、$_POST、$_GETってのが設定済みの変数みたいです。
Perlだとその後、データ内容の部品分割処理('&'や'='での分割)となるけど、PHPではすでに$dic(元の$_POST、$_GET)が、分解済みのデータの連想配列(前回の$ENV変数のような)になってるようです。
なので、いきなり
foreach($dic as $k => $v) {
で$dic連想配列に入っている要素すべてを順に取り出してループしてます。ここで使ってる
$k => $v
という記述は連想配列内の$kで指定したデータを$vに入れろって指示みたい。
前回書いた連想配列の
文字列"a" → データ1
文字列"b" → データ2
の"a"、"b"てのが$kに入り、データ1、データ2が$vに入るってことですな。
具体的には"name","location"が$k、"test data"、"osaka,japan"が$vに入るってことです。
最後は
echo $k, " = ", $v, "<p>";
で
<?php・・・?>
部分を実際の内容に差し替えという処理でおしまい。
ちなみに、PHPファイルはCGI用ファイルと違ってどこに置いても機能します。
なので、自分のホームページに置いてもOK。ただしCGI用ファイルと違って拡張子.phpは必須みたいっす。
![$テン・シー・シー-1](https://stat.ameba.jp/user_images/20091004/13/xcc/42/a4/j/o0500028810267335253.jpg?caw=800)
ここね
実行するにはURL記述が
http://localhost/自分のホームページ/test.php?name=test+data&location=osaka%2Cjapan
となります。自分のホームページはシステム環境設定の共有で調べる事ができます。
![$テン・シー・シー-6](https://stat.ameba.jp/user_images/20091004/15/xcc/3c/8b/j/o0500041010267391478.jpg?caw=800)
ここね
それと、ここで書かれているhttp://192.168.0.13/...というのは、人によって10.0.0.0~10.255.255.255とか192.168.0.0~192.168.255.255に変化する。この記述法だとWebサーバーと違うマシンからも実行できます。http://localhost/...という記述法はWebサーバーと同じマシンでWebブラウザを実行する時にだけ使えるんですな。
なので「iPhoneアプリ開発、その(130)」のiPhoneアプリで実験したろと思うなら
NSURLRequest* request = [NSURLRequest requestWithURL:
[NSURL URLWithString:@"http://rssblog.ameba.jp/xcc/rss20.xml"]];
部分を、システム環境設定の共有の表示が192.168.0.13なら
NSURLRequest* request = [NSURLRequest requestWithURL:
[NSURL URLWithString:
@"http://192.168.0.13/test.php?name=test+data&location=osaka%2Cjapan"]];
として実行ね。シミュレータでWebサーバと同じマシン上で試すだけなら
NSURLRequest* request = [NSURLRequest requestWithURL:
[NSURL URLWithString:
@"http://localhost/test.php?name=test+data&location=osaka%2Cjapan"]];
でもOKっす。
URIとかRFCとかの整理は次回!