PC館

イントラ実験室3の3

ここまでの流れ

Windows2000Server+IISで構築されているイントラネットサイトにデータベースを組み込むためにやるべき事は?

ブラウザからアクセスするためには

ブラウザからアクセスするためにはいろんな方法があるとは思うが,今までの「実験室 イントラ編1」の流れからするとPerl/CGIを使わなけりゃならないな。そのために,追加のPerlモジュールをインストールしよう。

必要なのは,DBIモジュールとDBD-mysqlモジュールだ。コマンドプロンプトで「ppm」と入力してppmモード(?)に入ったら,

c:¥>ppm
ppm>

DBIモジュールのインストールだ。

ppm>install dbi

で,勝手にインターネットに接続されて(常時接続の場合?),インストールしてくれるぞ。DBD-mysqlモジュールも同様にすればOKだ。

ブラウザからアクセスできるページを作ってみよう

じゃぁ,最低限のデータ(キーワード)入力によって各種データが表示されるようにしてみよう...ってことで,簡単なものを作ってみよう。 え〜と,年とラウンドNo.を指定してレース結果を出力させるには....

<html>
<body>
<form id="result" method="POST" action="/scripts/result.cgi">
<p>レース結果を知りたい</p>
<table>
<tr><td>Year</td><td>:<input type="text" name="year" maxlength="4" size="5"></td></tr>
<tr><td>Round</td><td>:<input type="text" name="rnd" maxlength="2" size="3"></td></tr>
<tr><td colspan="2"><input type="submit" value="実行"></td></tr>
</table>
</form>
</body>
</html>

まずはこんなhtmlファイルを作ってみよう。これを実行すると

レース結果を知りたい

Year
Round

と表示される。これにデータを入力して「実行」してみよう(ちなみにこのページ上で実行しても何も起こらない...はずだ)
...動作させるためには「result.cgi」ってのを作っておかないといけないわな,やっぱ。

このページは,「こんなこともできる」ってことの備忘録なので,自分で読めば思い出せるようなソース上のテクニックは,あえて(...だって,洗練されたソースコードじゃないから解説するなんてとんでもない(^^; ...)書くことはしないが,一応,キーとなるSQL文のところだけは色分けして見やすくしてみよう。

下のソースコードを「result.cgi」として「scripts」フォルダに保存だ。

#!c:/perl/bin/perl

use CGI;
use DBI;

my $form=CGI->new;
$d0=$form->param(year);
$d1=$form->param(rnd);

$dbh=DBI->connect("DBI:mysql:database=formula1");
$sql="
select p1_id,cir_name,cir_cntry from (pack1 inner join circuit on p1_cir=cir_id)
 where p1_year=$d0 and rnd=$d1
";
$sth = $dbh->prepare($sql);
$sth->execute;
$rows1= $sth->rows;
if ($rows1>0) {
    @a=$sth->fetchrow_array;
    $p1_id    =$a[0];
    $cir_name =$a[1];
    $cir_cntry=$a[2];
}

print "Content-type:text/html\n\n";
print <<"END";
<html>
<body>
$d0 Rnd.$d1 $cir_cntry GP($cir_name)
<table border="1" style="text-align:center;">
<tr>
<td>Result</td><td>Driver</td><td>Team</td><td>Engine</td><td>Tyre</td><td>Point</td>
</tr>
END

$sql="
select d_name,t_name,e_name,tyre,case when point is null then '0' else point end from
 ((((select * from race where r_event=$p1_id) as temp1
     inner join pack2 on r_seat=p2_id)
        inner join driver on p2_dri=d_id)
   left join
     (select point,pt_rslt from point where pt_year= $d0) as temp2
   on result=pt_rslt)
 inner join
 (((select * from const where con_year=$d0) as temp3
     inner join team on con_team=t_id)
         inner join engine on con_en=e_id)
 on p2_con=con_id
 order by result
";

$sth = $dbh->prepare($sql);
$sth->execute;

$rows2= $sth->rows;
for ($i=0; $i<$rows2; $i++) {
    @a=$sth->fetchrow_array;
    $pos=$i+1;
    print "<tr><td>$pos</td><td>$a[0]</td><td>$a[1]</td><td>$a[2]</td><td>$a[3]</td><td>$a[4]</td></tr>\n";
}
$sth->finish;
$dbh->disconnect;

print <<"END";
</table>
</td></tr>
</body>
</html>
END

さあ,これでOK。2004年第1戦のレースリザルトを検索だ...その結果はこいつ

もう一つおまけに

もう一つおまけに,各シーズン別のドラーバーズポイントランキング順に並べるSQLを記載しておこう。スクリプト全体はかなり長いので,キーとなるSQL文だけにしておく...要望があれば載せるけどね...
変数$d0には開催年が入力されているとして,以下のSQL文で,獲得ポイント順にドライバー名,チーム名,エンジン名等を抽出だ。

select r_seat,d_name,t_name,e_name,tyre,sum(point) as total,max(point) as pos from
  (select * from race inner join
    (select * from (((pack2 inner join driver on p2_dri=d_id) inner join const on p2_con=con_id)
      inner join team on con_team=t_id) inner join engine on con_en=e_id
    ) as temp1

    on r_seat=p2_id where r_event in (select p1_id from pack1 where p1_year=$d0)
  ) as temp2
 left join (select * from point where pt_year=$d0) as temp3 on result=pt_rslt
 group by r_seat order by total desc,pos desc

この結果の「r_seat」を変数$seat[$i]に代入して,以下のSQLを実行だ。

select point from (select * from pack1 where p1_year=$d0) as temp1
 left join
 (select * from
    (((race left join (select * from point where pt_year=$d0) as temp2 on result=pt_rslt)
         inner join pack2 on r_seat=p2_id)
            inner join driver on p2_dri=d_id)
     where r_seat=$seat[$i]
 ) as temp3
 on p1_id=r_event
 order by rnd

...ふう...ようやくこれで各ドライバーを獲得ポイント順に並べた上で,各レース毎の獲得ポイントを抽出した表が作れるぞ。この検索結果は,こちらをみてくれい。