実例でわかるPHP: 第1回

苦労のいらないWebzineのオーサリングとデリバリー

PHPは、動的なWebページ作成のための言語として、複雑で強力なWeb関連のプログラムを組み立てるための単純化された手段を提供します。Erik氏は、PHPの基本的な原理を、オリジナルで現実的なWebサイト例を使って段階的に例示します。この2部シリーズの第1回では、PHPの基本を説明し、執筆者のページを含むWebzineを特に取り上げています。そこでコンテンツ・プロバイダーは、記事のテキストに加えて、そのコンテンツを世界に提示するためのフロントエンドも入力することができます。

Erik Zoltán, 上級システム・エンジニア, EDS

Erik Zoltán氏は1990年以来、専門的にコードを書いてきました。彼はフルタイムの在宅勤務者としてマサチューセッツ州のレオミンスターに住んでいます。e-mailの連絡先は erik@zoltan.org、ホーム・ページ・アドレスはwww.zoltan.org です。Erik氏の愛車である1996年型サターンには、ヴィンセント・ヴァン・ゴッホの 星月夜(糸杉と村)」(The Starry Night) が描かれています。



2000年 12月 01日

PHPを新たにご利用の場合、実際に使ってみると大変簡単なのに驚かれるでしょう。私どもの意図は、ユーザーがPHPを使うとどうなるか良い印象を得て帰っていただき、その後でご自分に適しているかどうか決めていただきたいのです。

体験PHP

この2部シリーズの第1回では、アプリケーションにどのような働きあるか説明します。(ユーザーのシステムへのPHPのインストールについては扱っていません。)メインの索引ページを使ってみる機会があったら、幾つかのコンポーネントの働きを見るために、覆いの下をのぞいて見てください。興味を引かれたら、第2回を必ずチェックしてください。そこにはメイン索引ページの残りが詳細に載せられています。(第2回では、幾つかのコーディング例とともに、オーサリング・コンポーネントについても論じられています。ソース・コードをダウンロードし、ご自分のアイデアを試してみることができます。)

HTMLを知っていてCのような言語 (特にPerl) に精通しているのであれば、以下の例を問題なく理解することができるでしょう。Cのような言語をそれほど使ったことがなくても、以下の例に付いていくことができるでしょう。しかし、HTMLの基礎については、知っている必要があります。

サンプルPHPアプリケーションは一般読者向けのWebzineで、単純なデリバリー・モジュールが付いています (2K未満のコード)。このモジュールはトピックのリストを表示します。それぞれのトピック見出しの下に、一連の記事の要約が年代順の逆順に (新しいほうから) 列挙されています。タイトルをクリックすれば、ユーザーは記事全体を読むことができます。それにはやや複雑なオーサリング・モジュール (8K未満のコード) も含まれています。それによって読者は執筆者になることができ、自作のコンテンツをサブミットすることができます。執筆者はカテゴリーを選択して記事のタイトルを入力し、さらに、簡潔な概要と、ストーリーのテキスト全体を入力する必要があります。また、任意選択でイメージ・ファイルのURLを入力し、"プレビュー" ボタンをクリックすることにより、正しく表示されるか確認することができます。執筆者の入力は妥当性検査され、セキュリティー検査を受けます。少数の安全なタグ以外のすべてを非アクティブ・フォーマットに変換することにより、危険の伴うHTMLコーディングの悪い習慣からの保護が得られます。たとえば、<applet というストリングは、&lt;applet になります。この変換によって、タグは首尾よく使用不可になります。


特殊なPHPの技法

実際のWebzineコードを調べる前に、PHPの特性を見事に例示している簡単な例を取り上げてみましょう。PHPの構文は、HTMLおよびPHPステートメントを自由自在に混合することを可能にします。すなわち、HTMLステートメントを、ループやif/elseステートメント、関数、その他のコンテキストの中に入れることができます。このことはWebzineプログラムの中で行われていますが、以下に示すコード・サンプルではさらに簡単な方法に煮詰めています。

ここで2つの配列$names$days があるとします。それらには、各月の情報 (英語名と日数) が含まれています。たとえば、$days[0] = 31$names[0] = "January"$days[1] =28$names[1] ="February"、などとなります。日数と月の英語名のテーブルを作成するための技法を以下に示します。

リスト1: 日数と月の英語名のテーブルの作成
<table border=2>
<tr><th>Name</th><th>Days</th></tr>
<?php
 for($i=0; $i<12; $i++) { // Start of loop.
?>
<tr><td><?php echo($names[$i])?></td>
 <td><?php echo($days[$i])?></td></tr>
<?php
 } // End of for loop.
?>
</table>

分かりやすくするために、上記のPHPステートメントは赤で、HTMLステートメントは黒で示してあります。特殊タグ<?php でHTMLからPHPに切り替え、?> でHTMLに戻るという点に留意してください。

銘記すべき重要な点は、PHPに切り替えて、for ループ (またはif/else、あるいはswitch など) を開始し、それからHTMLに戻ることができ、こうしてユーザーが入力するHTMLコマンドはループ構造の一部となり、ループに沿って反復できるということです。必要に応じてPHPモードに入ったりそこから出たりすることができます。(それによって、上記の例で示したように、Webページに変数を出力するechoステートメントを発行することなどができます。)それからPHPに戻って終了の中括弧を書き込むことで、期待どおり、ループは完了します。

実際のテーブルは次のように表示されることになります。

NameDays
January31
February28
March31
April30
May31
June30
July31
August31
September30
October31
November30
December31

この動作に当惑を覚えるのであれば、次のように考えてみてください。PHPインタープリターはHTMLモードの各行をecho ステートメントに置き換えて、その行を出力ストリームに入れます。そのecho ステートメントがif/else 構造の中にある場合、それは条件付きになります。上記のようにループ内にある場合は反復します。


アプリケーション概説

Webzineドライバーであるindex.php3には、3つの主なコンポーネントがあります (ドライバーのコードの完全なリストについては、このリンクを参照)。すなわち、サブジェクト・メニュー、ストーリー・リスト、およびストーリー全体のプレゼンテーションです。さらに、読者がストーリーのないトピックを選択した場合に現れるデフォルトのテキストもあります。オーサリング・ページ (リストの表示) はやや複雑です。それには、ユーザー入力を受け入れるためのフォーム、訂正の必要な問題について執筆者に通知するためのフィードバック・メッセージ、および、執筆者が何をサブミットしたかを執筆者に示す確認メッセージが含まれています。サブミットされたストーリーを妥当性検査し、無許可のHTMLが含まれていないことを保証するために変更を加え、それをストーリー・ファイルに保管し、ストーリーに付随する適切なメニュー・ファイルを更新する方法も、それは認識しています。

このアプリケーションには3種類のデータ・ファイルがあります。Category.txt には、トピックの単純なリストが含まれていて、そこでストーリーの編成が行われます。それぞれのトピックはトピック・メニュー・ファイルに関連付けられています。最初のトピックは "Main" でなければならず、トピック・メニュー・ファイルMain.txtに関連付けられます。2番目のトピックは "The Arts" で、TheArts.txtというトピック・メニュー・ファイルに関連付けられます。メニュー・ファイルのそれぞれの行には、1つのストーリーに関する情報が収められています。すなわち、ストーリー番号、タイトル、カテゴリー、簡潔な概要、および任意指定でイメージURLが含まれています。最後に、ストーリー・ファイルには、1つのストーリーの実際の本文テキストが収められています。ファイルs1.txtには最初にサブミットされたストーリーが含まれ、s2.txtには2番目のストーリーが含まれるという具合になります。ストーリーの番号がわかっていれば (たとえば26とすると)、そのファイル名は容易に判別できます (s26.txt)。


やってみましょう!

このアプリケーションを詳細に調べる前に、まず使ってみましょう。

Webzine Driver を試行します。左側にはサブジェクトのリスト、右側にはストーリーのリストが表示されます。トピックを選択するか、または "Main" を選択してすべてのストーリーを見ることができます。最新のストーリーのリストが最初に現れ、イメージを持つ最初の2つのストーリーについてイメージが表示されます。ストーリーのタイトルをクリックすると、そのストーリーの全テキストを取り上げているページに移動します。

Authoring Page を試行します (あるいは、Webzine自体の中からそれを試行することもできます)。そこではフォームが提示され、ストーリーをサブミットすることができます。常識を働かせて小気味よくコンテンツをWebzineにサブミットしてください。プログラムが受け入れられないことを入力した場合には、エラー・メッセージが出されます。自分のストーリーが受諾されたら、Webzineに戻って、読者の観点から見栄えを確認することができます。

アプリケーションを試行し終わったら、引き続き読み進めて、その作成について学んでください。


Webzineドライバー

パラメーターの引き渡し

index.php3ページでは、次のようにパラメーターを渡すことができます。

index.php3?topic=TradeShow&story=33

上記の呼び出しでは、以下の変数割り当てがindex.php3の起動に先立って自動的に行われます。

$topic = "TradeShow";
$story = 33;

パラメーターを省いた場合、$topic および$story 変数は単に存在しないことになります。それらを明示的にテストすることもでき、PHPに依存して、それらを参照するときにデフォルトの空値を戻させることもできます。

注: この機能がご使用のシステムで作動していないように思われる場合は、php.iniを調べてregister_globals = Onになっていることを確認してください。

Webページのタイトル

多くのPHPアプリケーションに共通の技法を調べることから始めましょう。プログラムの先頭で、ある種の情報を変数割り当てステートメントに入れてみます。こうすれば、保守や、後で更新することが容易になります。

リスト2: 変数割り当て
<?php
   $title = "PHP Demo Webzine";
   $slogan = "Illustrating the coolness of PHP since September 2000";
?>
<html>
 <head>
  <title><?php echo($title)?></title>
 </head>
 <body>
  <h1><?php echo($title)?></h1>
  <p><i><?php echo($slogan)?></i></p>

<?php によって、HTMLモードから出てPHPモードに入り、 ?> で再びHTMLモードに戻ります。この切り替えは何度でも好きなだけ行うことができます。HTMLモードで行うほうが簡単なこともあれば、PHPモードで行うほうが簡単なこともあります。行う必要があるのは、プログラムの先頭で2つの変数を定義してから、HTMLモードに入ることだけです。それらの変数のいずれかを使用する必要が生じたときはいつでも、PHPモードに戻り、エコー・ステートメントを発行して、変数の値を直接Webページ・テキストに書き込みます。

カテゴリー・メニュー

Category.txtファイルは、トピック名が各行に1つずつ列挙されている単純なリストです。たとえば、ファイルに次の3つの項目だけが入っている場合、

Main
Politics
Technology

3つのトピック・メニュー・ファイルMain.txt、Politics.txt、およびTechnology.txtが得られます。"Main" トピックを選択すると、次のようにドライバーが現れます。

Main
Politics
Technology

HTMLソース・コードは次のようになります。

<table border=1>
 <tr><td bgcolor="pink"><center>
  <b> Main </b></center></td></tr>
 <tr><td bgcolor="silver"><center>
  <b>
<a href="index.php3?topic=Politics">Politics</a> </b></center></td></tr> <tr><td bgcolor="silver"><center> <b>
<a href="index.php3?topic=Technology">Technology</a> </b></center></td></tr> </table>

ここに、PHPソース・コードからの関連した抜粋を示します。これはCategory.txtを上記のHTML断片の中にコンパイルするものです。最初に、Category.txtファイルを配列$cats の中に読み取ります。

<?php
   $cats = file("category.txt");
   $elems = count($cats);
?>

file 関数は単にファイルを配列にコピーします。したがって$cats[0] は "Main" に等しくなり、$cats[1] は "Politics" に等しくなり、$cats[2] は "Technology" に等しくなります。file 関数は、短いASCIIテキスト・ファイルのインポートには適していますが、非常に大きなファイルにはそれを使用しないでください。count 関数は配列内の要素の数をカウントするので、この例では、$elems は3に等しくなるはずです。

ここでは、その配列から上記のHTMLテーブルを作成する方法を示します。

リスト3: HTMLテーブルの作成
<table border=1>
<?php
   for ($i=0; $i<$elems; $i++) {
      $item = trim($cats[$i]);
      $ifile = ereg_replace(" ","",$item);
      $color = ($ifile == $topic) ? "pink" : "silver";
      $url = "index.php3?topic=$ifile";
      $anchor = " " . ($item != $topic ? "<a href=\"$url\">$item</a>" : "$item") . " ";
      echo(" <tr><td bgcolor=\"$color\"><center><b>$anchor</b></center></td></tr>\n");
   }
?>
</table>

このテーブルはHTMLモードで開始し、HTMLモードで終了しますが、中間の大部分はPHPモードです。この例を1行ずつ調べていきましょう。これはHTMLモードで始まっています (これはPHPの通常の開始モードです)。テーブルには幅が1の枠があります。

<table border=1>

ここで、PHPモードに切り替えます。

<?php

for ループは、0から、エレメント数‐1まで繰り返されます(<= の代りに < を使っているからです)。言い換えると、3つのエレメントがある場合、0/1/2について繰り返されます。

 for ($i=0; $i<$elems; $i++) {

trim 関数は、先行/後書きスペースとリターンを取り外します。これが必要な理由は、file 関数が、カテゴリー・ファイルの内容の読み取りに使用されるときに、各カテゴリー名の末尾にある後書き改行文字を残してしまうからです。そのため、これによって "Politics\n" を "Politics" に変換します。

 $item = trim($cats[$i]);

以下に示すのは、$item からスペースを除去して結果を$ifile に入れる、検索と置換の操作です。これによって、"The Arts" といったトピック名は "TheArts" になります。トピック名は引き数をWebページに渡す際の手段になり (index.php3?topic=TheArts)、トピック・ファイル名 (TheArts.txtなど) を指定する際の手段になります。スペースについて心配しなくてよいのであれば、ずっと簡単です。

 $ifile = ereg_replace(" ","",$item);

$color 割り当ては3項演算子の?: を使用します。(これにはCに似た構文test?truevalue:falsevalue があります。)これは、選択したトピックについては$color 変数をピンクに、その他についてはシルバーに割り当てます。

 $color = ($ifile == $topic) ? "pink" : "silver";

それぞれのメニュー項目にはURLが関連付けられています。それで、トピックが "Politics" であれば、URLはindex.php?topic=Politics になります。PHPでは、変数名の置換を引用符に入れて行います。それで、この式において、$ifile 変数の内容は、単に、引用符に入れた$ifile に実行時に置き換わります。多くの人は、この方法のほうが、連結演算子を使ったもう1つの方法 (引用符付きエレメントと変数名からストリングを明示的に導出する方法) よりも簡単であることに気付いています。

 $url = "index.php3?topic=$ifile";

ピリオド演算子はPHPでは連結を意味しています。繰り返しになりますが、?: 演算子を使って、この割り当て演算の内部に条件を組み込んでいます。現在の項目 (つまりPolitics) が、選択されたトピックではない場合、アンカーは<a href="index.php?topic=Politics>Politics</a> になります。選択されたトピックがPoliticsであれば、それは単にPolitics になります。どちらの場合にも、改行なしのスペースがアンカーを囲むことになります。

 $anchor = " " . ($item != $topic ? "<a href=\"$url\">$item</a>" : "$item") . " ";

以下のecho ステートメントによって、指定したストリングが出力ストリーム (すなわち、HTML Webページ・テキスト) に入れられます。したがって、このステートメントでテーブル行全体を挿入することができます。引用符付きの文字を挿入する場合は、ストリングの中で\" を使ってください。上記で計算された$color および$anchor 変数は、それぞれの参照の位置で自動的に置換を行います。

 echo(" <tr><td bgcolor=\"$color\"><center><b>$anchor</b></center></td></tr>\n");

for ループを次のように終わります。

 }

PHPモードから再びHTMLモードに戻ります。

?>

カテゴリー・メニューについてのHTMLテーブルを終了します。

</table>

これで完成です。

ストーリーの表示

ストーリーを選択したら、ストーリー・ファイルからストーリー・テキストをダンプして、Webページに入れる必要があります。(オーサリング・モジュールauthor.php3は、適切なHTML対応のフォーマットでストーリーを用意します。)これは単純なプロセスです。以下のコード断片では、ストーリー番号が変数$story に入っていると想定します。$story が33に等しい場合、ストーリー・ファイル名はs33.txtになります。

 $storyfile = fopen("s$story.txt","r");
 fpassthru($storyfile);

上記の例では、fopen 関数はファイルを開き、ハンドルをファイルに戻します。次いでそれは割り当て演算子によって、変数$storyfile に入れられます。fpassthru 関数はファイルの内容を現行の出力装置 (出力HTMLファイル) にコピーし、自動的にファイルを閉じてくれます。


次に行うこと

この記事の第1回では、単純なPHP Webzineアプリケーションの最初の部分を提示しました。幾つかの小さなコード例を詳しく説明しました。(アプリケーションのこの部分はほんの2Kほどのコードなので、多くの大型の コード例を選択することはできませんでした。)これでもPHPのパワーの感触は得られましたが、まだまだ続きがあります。

第2回も第1回とだいたい同じ長さです。ストーリーのメニューのプレゼンテーションが読者にどのように見えるかを示すことにより、デリバリー・モジュールの解説を完結させる予定です。次に、執筆者がストーリーをサブミットできるようにするオーサリング・モジュールを取り上げる予定です。オーサリング・モジュールはかなり大きなものですが、同様に詳細に取り上げるのではなく、デリバリー・モジュールとは異なる興味深い概念に限って、解説が必要になるでしょう。

参考文献

  • Index.php3 は、Webzineドライバーの完全なリストを記載しています。
  • Author.php3 は、アプリケーション概説で説明されているオーサリング・ページの完全なリストを記載しています。
  • PHP.net は、PHP言語の公式ホーム・ページです。ここでは、最新バージョンのPHPを無償でダウンロードすることができ、また、PHPの開発状況をチェックすることができます。さらに、FAQ、マニュアル、その他の大量の参考文献があります。
  • PHPbuilder.com は開発者向けのサイトです。ここには、大量の記事とコード・サンプル、ジョブ広告、およびPHP資料へのリンクがあります。
  • Webmonkey's PHP Section には、初歩のレベルからのPHPに関する数多くの記事があります。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=237594
ArticleTitle=実例でわかるPHP: 第1回
publish-date=12012000