ゼミII実習


ゼミIIで使用しているテキストがあります

動的Webページ作成(その5)PHPプログラミング(その4)


前回作ったファイルを使って復習をしてください。

練習1.Apache Webサーバを起動してください。そして前回作ったページ(できればPHPのファイル)を使って、クライアント(インターネットエクスプローラ)からそのページをlocalhostを指定して見る事ができるようにしてください。

1.PHPプログラミング(その3)

前回の練習について考えてみましょう。結局次のように配列groupにデータを用意すればグループ名を正しく出力することができます。表の大きさはtdタグの属性widthを使って調整しています。

<html>
<head>
<title>
ワールドカップ2006参加国一覧
</title>
</head>
<body>
<?php
$kuni=array('ドイツ' => 'thumb_nail/ger_tn.png',
            'コスタリカ' => 'thumb_nail/crc_tn.png',
            'ポーランド' => 'thumb_nail/pol_tn.png',
            'エクアドル' => 'thumb_nail/ecu_tn.png',
            'イングランド' => 'thumb_nail/eng_tn.png',
            'パラグアイ' => 'thumb_nail/par_tn.png',
            'トリニダードトバゴ' => 'thumb_nail/tri_tn.png',
            'スウェーデン' => 'thumb_nail/swe_tn.png',
            'アルゼンチン' => 'thumb_nail/arg_tn.png',
            'コートジボワール' => 'thumb_nail/civ_tn.png',
            'セルビア・モンテネグロ' => 'thumb_nail/scg_tn.png',
            'オランダ' => 'thumb_nail/ned_tn.png',
            'メキシコ' => 'thumb_nail/mex_tn.png',
            'イラン' => 'thumb_nail/irn_tn.png',
            'アンゴラ' => 'thumb_nail/ang_tn.png',
            'ポルトガル' => 'thumb_nail/por_tn.png',
            'イタリア' => 'thumb_nail/ita_tn.png',
            'ガーナ' => 'thumb_nail/gha_tn.png',
            'アメリカ' => 'thumb_nail/usa_tn.png',
            'チェコ' => 'thumb_nail/cze_tn.png',
            'ブラジル' => 'thumb_nail/bra_tn.png',
            'クロアチア' => 'thumb_nail/cro_tn.png',
            'オーストラリア' => 'thumb_nail/aus_tn.png',
            '日本' => 'thumb_nail/jpn_tn.png',
            'フランス' => 'thumb_nail/fra_tn.png',
            'スイス' => 'thumb_nail/sui_tn.png',
            '韓国' => 'thumb_nail/kor_tn.png',
            'トーゴ' => 'thumb_nail/tog_tn.png',
            'スペイン' => 'thumb_nail/esp_tn.png',
            'ウクライナ' => 'thumb_nail/ukr_tn.png',
            'チュニジア' => 'thumb_nail/tun_tn.png',
            'サウジアラビア' => 'thumb_nail/ksa_tn.png'
);
$group=array('A','B','C','D','E','F','G','H');
print '<h1>ワールドカップ2006参加国一覧</h1>';
print '<hr>';
$count=0;
$gp=reset($group);
foreach($kuni as $key => $value){
  if($count%4==0){
    print "<h3>グループ$gp</h3>";
    print '<table border="1">';
    $gp=next($group);
  }
  print '<tr>';
  print "<td width=\"60\"><img src=\"$value\" alt=\"$value\"></td>
           <td width=\"130\">$key</td>";
  print '</tr>';
  if($count%4==3){
    print '</table>';
  }
  $count=$count+1;
}
?>
</body>
</html>

配列groupは次のようなデータを用意しています。

$group=array('A','B','C','D','E','F','G','H');

今回は=>の記号を使ってキーと値を関連付けていません、値だけを並べたものとなっています。

$gp=reset($group);

このように関数resetを配列$groupに使用すると変数$gpに配列$groupの先頭の値が入ります。それからif文の中で次のようにしています。

    $gp=next($group);

関数nextを配列$groupに使用すると変数$gpに配列$groupの次の値が入ります。関数nextを使って配列の次の値を得ることができます。

参考までに関数prev、関数endは配列に使用するとそれぞれ、前の値、最後の値を得ることができます。

さて、このプログラムを眺めてみると配列のデータを記述する部分とデータを使用して表に出力する部分に分かれています。

データはページの性質によって追加、修正の入ることが多くなる部分です。データはプログラムと別に分けて管理しましょう。このようにすることで、データの内容が違っても似た形式のデータを扱うためのプログラムを設計し再利用することもできそうです。

データを管理するにあたり、テキストエディタで管理することもできます。しかし、実習室にはExcelという優秀な表計算ソフトがあるわけですからこれを使って管理してみたいと思います。

Excelを起動し、ワ−クシートでA列にグループ名、B列に国名、C列に国旗のファイル名を入力してください。

A ドイツ ger_tn.png
A コスタリカ crc_tn.png
A ポーランド pol_tn.png
A エクアドル ecu_tn.png
B イングランド eng_tn.png
B パラグアイ par_tn.png
B トリニダードトバゴ tri_tn.png
B スウェーデン swe_tn.png
C アルゼンチン arg_tn.png
C コートジボワール civ_tn.png
C セルビア・モンテネグロ scg_tn.png
C オランダ ned_tn.png
D メキシコ mex_tn.png
D イラン irn_tn.png
D アンゴラ ang_tn.png
D ポルトガル por_tn.png
E イタリア ita_tn.png
E ガーナ gha_tn.png
E アメリカ usa_tn.png
E チェコ cze_tn.png
F ブラジル bra_tn.png
F クロアチア cro_tn.png
F オーストラリア aus_tn.png
F 日本 jpn_tn.png
G フランス fra_tn.png
G スイス sui_tn.png
G 韓国 kor_tn.png
G トーゴ tog_tn.png
H スペイン esp_tn.png
H ウクライナ ukr_tn.png
H チュニジア tun_tn.png
H サウジアラビア ksa_tn.png'

それから、このデータをCSV形式のファイルとして出力します。ファイル名をkunihata.csvとして保存してください。

このファイルはApacheのhtdocsフォルダに新たにwcupdataフォルダを作り、そこに移しておいてください。

とりあえず、このCSV形式のファイルからデータを読み込むプログラムについて考えてみましょう。プログラムは以下のようになります。index.phpとしてください。

<html>
<head>
<title>
ワールドカップ2006参加国一覧
</title>
</head>
<body>
<?php
print '<h1>ワールドカップ2006参加国一覧</h1>';
print '<hr>';
define("DATA","./wcupdata/kunihata.csv");
$fp = fopen(DATA, "r") or die("Cannot open this file!\n");
while(($line = fgets($fp))){
  print $line;
}
fclose($fp);
?>
</body>
</html>

それでは、試してみてください。整理されていませんが必要なデータは表示されたでしょうか。

プログラム自体はとてもすっきりしています。変更した次の部分について見てみましょう。

define("DATA","./wcupdata/kunihata.csv");
$fp = fopen(DATA, "r") or die("Cannot open this file!\n");
while($line = fgets($fp)){
  print $line;
}
fclose($fp);

まず、ファイルで使用するための定数をdefine文を使って定義しています。DATAという名前に対し、フォルダの場所を指定しています。.はプログラムが入っているのと同じフォルダを指しています。/はフォルダおよびファイルの関係を示す区切りです。

この文では定数DATAにindex.phpと同じフォルダにあるwcupdataというフォルダの中のkunihata.csvまでの順番を定義しなさいということになります。この順番をパスと呼んでいます。また、define文で使用される定数名やそれに与える値は””で区切ったデータを与えています。文字列でデータを与える場合には””で囲んでおきましょう。

ですから先ほど作ったフォルダの中のkunihata.csvを示しています。

次にファイルの読み込みは次の操作のようになります。

ファイルを開く(ファイルを使用するための準備をする)
ファイルに対し読み書きを行う
ファイルを閉じる(ファイル使用後の処理を行う)

まずファイルを開く操作は次の文で行っています。

$fp = fopen(DATA, "r") or die("Cannot open this file!\n");

fopen関数を使用しています。先ほど定義したDATAのパスにあるファイルを開きます。or die以下は処理に失敗した時のコメントを表示します。

ファイルを開いたらそれをハンドルと呼ばれる変数に格納します。ハンドルは開いたファイルに関する情報を持っていると考えてください。以降、このハンドルを使用してプログラムでファイルを扱っていきます。

次にwhile文があります。

while(条件){
  プログラム
}

のように書きます。条件が正しい間、{ }で囲まれたプログラムを繰り返します。

上記のプログラムでは条件のところに次のように書いています。

$line = fgets($fp)

まず=の右側でfgets関数を使用しています。そして引数にハンドルを使用しています。このように書くことでfgets関数はファイルから一行読み込みます。そしてファイルの終わりを示すEOFを検出した時にはFALSEを返します。これは条件が正しくないことを示しています。ですからファイルの終わりに至るまで繰り返し一行ずつ読み込まれていきます。

=の左側でfgets関数が返す値を変数$lineに格納しています。そして{ }では次のように書かれています。

  print $line;

ただ、変数$lineを表示しているだけです。ファイル中の改行文字も含まれていますが、HTMLとして表示される場合にはその効果は現れません。

最後にハンドルを使用してfclose関数を使って、ファイルを閉じています。

練習2.このままでは見にくいので一行ごとに改行して表示するようにプログラムを書き換えなさい。

練習3.次の例を試しなさい。

<html>
<head>
<title>
ワールドカップ2006参加国一覧
</title>
</head>
<body>
<?php
print '<h1>ワールドカップ2006参加国一覧</h1>';
print '<hr>';
define("DATA","./wcupdata/kunihata.csv");
$fp = fopen(DATA, "r") or die("Cannot open this file!\n");
while($koumoku = fgetcsv($fp)){
  print $koumoku[0]."<br>";
}
fclose($fp);
?>
</body>
</html>

残りの国名、旗のパスも表示できるようにしなさい。

<ヒント>fgetcsv関数ではcsv形式のファイル、つまり,で区切ったデータで構成されたファイルを行単位で処理することができます。一行のデータは,により区切られ変数$koumokuに渡されます。一行は三つのデータがありましたが、左から$koumoku[0]、$koumoku[1]、$koumoku[2]に格納されていきます。

練習4.練習2の結果を使い表として表現しなさい。