CGI基礎知識   (戻る)

CGI(Common Gateway Interface)は、Webブラウザからの入力を受け取って、Webサーバー内のCGIプログラムを動かし、その結果をブラウザ画面に反映したり、メールとして送り出したりといった処理ができます

CGIプログラムの言語としてはPerl(パール)やC言語等がありますがPerlの方がよく使われるようです。
理由としては、Webサーバーとして利用されるコンピュータにUNIXが多く、Cと共に広く普及していることや
Perlがテキスト(文字列)の加工に強いからと言われます。

CGIの呼び出し方法...ホームページからどうすればCGIに動作がうつるのかいくつか説明します

(1)フォームによる呼び出し
   最もポピュラーな方法でいろいろなところで使われています。画面からの入力で処理されるのはたいてい
   このフォームによる方法です。FORMタグのACTIONオプションにCGIプログラムのURLを
   指定し、送信ボタンをクリックすることにより呼び出され処理をするものです。
   利用例としては、訪問者リストや掲示板、入力データによるメールを送ったり、または検索結果を返し
   たりするサーチエンジンなど様々です。

右のボタンをクリックするとフォームによりCGIが呼び出されます --> 


(2)CGIへリンクを張って呼び出し
   AタグのHREFオプションでCGIプログラムのURLへ直接リンクを張り、その箇所をクリックする
   ことによりCGIを呼び出すことができます。

   ここをクリックするとリンクにより、CGIが呼び出されます

(3)IMGタグによる呼び出し
   CGIからのHTMLの出力と同様に、IMGタグによって読み込まれ出力される画像ファイルにも
   Content-type:image/gif というヘッダが付きます。このヘッダを出力する前に目的の処理を入れること
   ができます。

   私はこの方法を良く使います、例えば 訪問カウンタやアクセスログ等のようにページを表示した際に
   自動的に処理をさせる時です。

   CGIおもちゃ箱のトップページにも上記の処理が入っています、 ここをクリックすると説明が見られます。

(4)FRAMEタグによる呼び出し
   フレームを使えば、その画面が呼び出されたとき複数の画面を表示する機能を利用してCGIを起動する
   ことができます。試しに ここをクリックすると以下の流れでCGIが起動します。
   1.index2.htmlという画面が呼び出され
   2.その画面は、左右100対0(つまり、実際は左1画面のみで右画面はダミー)のフレーム定義で
   3.その左画面の FRAMESET SRC=に起動させるCGIを設定してあり、これによりこのCGIからの
     画面が表示されます。
   つまり、最初に表示させるindex.htmlにこのようなフレームを使えばCGIでの画面を最初に出すことが
   可能となり、例えば時刻によってメッセージを変えたりすることができるでしょう。

(5)METAタグによる呼び出し
   METAタグに対応しているブラウザであればindex.htmlにCGIを組み込むことができます。
   例えば、<META HTTP-EQUIV="Refresh" content="0; URL=header.cgi"> とすればindex.htmlを読み
   込むと同時にheader.cgiを読み実行します。

Perl(パール)を勉強するには

私は、CGIの本(参考文献参照)の付録のJperlというPerlインタプリタを利用しています、このソフトはベクターデザイン社のホームページから入手することもできます。
ここでのPerlはすべてこのJperlを使ってコンパイルしたり、テストしたりしました。そしてエラーがなくなったら漢字コードと改行コードをunix用に変換しサーバーに送りました。
余談ですが、私はN88−BASICとCOBOLを知っていますが、Perlを最初見たときかわっているなぁと感じました。第一に変数をa$ではなく$aとしたり文字変数と数字変数が同じ書き方だったり
配列も先に定義することなく、いきなり使えてBASICより随分と適当だと思いました。しかしこのいいかげんさがデータをダイナミックに処理して、またスピーディに検索することができる言語だとだんだん
わかってきました、私も初心者ですが皆様といっしょに勉強したいと思っています。


お役に立てるかわかりませんが、これまでCGIを作ってきて感じたことをまとめました。

自分勝手な思いこみや間違ったこともあるかもしれませんが予めご了承ください。

・perl言語はおもしろいな(コボルやBASICと比較して)
 たったこれだけで処理してくれるの?というコマンドや構文がいくつもあります。
 例えば、ファイルからデータを読み込むのに全レコードを一発で配列にセットできたり
 文字列の分割や置換が簡単にできること、連想配列や配列のキー自体をソートできたり
 変数名自体を加工し使うことができること、配列の操作が簡単で順序の逆転も1命令で
 できたりと様々です。

・CGIスクリプトのイメージがつかめたのは ?

 最後はHTMLで出力する形とわかったとき。つまりHTMLを出力せずサーバー側で
 処理後そのまま終わってしまえばパソコンに実行が戻らず、処理が続かないですから。
 というか、コボルでもBASICでも対話型処理は必ず入力待ちに戻るのでなるほど
 CGIも同じだと感じたときです。
 ということで、とにかく最後はHTMLを出力する形にすれば動くでしょう。

・漢字コードの変換(デコード)で困ったこと?

 HTMLからのデコードはeucで変換し、CGIスクリプトからのデータは
 sjisで変換します(windows95の場合)ということがわかっても...
 私のCGIで1つのスクリプトで入力したデータを表示させ確認してからファイルに
 記録するCGIでは文字化けをおこします。確認表示なしでファイルに記録するCGI
 では文字化けをおこしません。良い方法がありましたら教えてください。

・1つのスクリプトでの処理のポイントは?

 (1)最後にHTMLを出力する処理をサブルーチン化して、各formからの
    統一したNAME=で決められたデータ名をifで処理分けする

 (2)1つの画面にformはいくつあっても良い、例えば 『追加』『訂正』『削除』
    というボタンを作り
    『追加』...name="action" value="tuika"
    『訂正』...name="action" value="teisei" 
    『削除』...name="action" value="sakujo" とする
     ボタンをクリックすると
     <form method="post" action="'.$reload.'">によりスクリプトが再ロードします
     それで、スクリプトのはじめで
     if ($in{'action'} eq 'tuika') { &tuika; }
     elsif ($in{'action'} eq 'teisei') { &teisei; }
     elsif ($in{'action'} eq 'sakujo') { &sakujo; }
     とすれば指定された処理が選択されます。
     というように、最初は1画面全体が1つのformの単位かと思いましたがこれにより
     いろいろな処理をさせることができるようになりました。

 (3)CGIでは再ロードした後はそれまでのデータ(変数や配列)は自動的には使えません
    hiddenパラメータや?により、意識して次にデータを渡しますから前の処理のデータが
    使えると思って処理すると間違いのもとになります。
    ここでのコツは、渡すデータが多いとき変数名を個々に付けると1つ1つhiddenパラメータ
    を設定しなければなりませんが、変数名に数字をつければfor文等で連続にできます。
    たとえば、data1.data2.data3.....99とすると
    for ($no=1; $no <= 99 ; $no++) {
    print '<input type=hidden name="data'.$no.'" value="'.$in{'data'.$no}.'">'."\n";
    } とできます。

・TABLEタグは便利だな
 (1)最初、カレンダーを作ったときTABLEタグなしで日付を並べましたが
    曜日の漢字と日付の数字の文字サイズが合わずどうしてもズレてしまいました。
    他のカレンダーからヒントを得てTABLEタグを使ったらOKでした
    という訳でここのカレンダーにはTABLEタグなしで処理しようとしたなごり
    が残っています。

 (2)formのsubmitボタンもTABLEタグ(BORDERなし)で横に並べることができます。

・最後に、プログラマー的な感想で済みませんがCGIの勉強を進めるうちにこれは一般の
 ホストと端末との関係と同じだなぁと思いました。今ではCGIという言葉は意識せずperlはコボルと同じ、
 HTMLは画面出力言語みたいなものと解釈しています。(NECのACOS2使用の方なら画面出力での
 COBOLとVISの関係と同じと思いませんか...と勝手に言う)
   ですから、今までコンピュータ屋さんがホストコンピュータとかサーバーとか言っていま
 したがCGIを覚えれば誰でもがプロバイダのコンピュータを自分のパソコンの上位コン
 ピュータとして利用することができるようになります。
 ここで大切なことは『無意味なCGIは迷惑』です、ルールを守れない人はやらないこと。

99.6.12