★ 

インデックス

 ★
★ 

プログラムの説明

 ★

CGIスクリプトの配布とプログラミングの説明

 RSS XML
  • 玄関口
  • 占い診断
  • 萌え辞典
  • オタク遊戯
  • ネット小説
  • NEW秋華
  • CGIDL
  • CGI解説
--☆INFORMATION☆--
2017年6月6日【火】20時29分41秒
【(*´ω`*)】CGIの更新は現在無期限休止中です‥‥
2014年11月6日【木】13時47分00秒
【(*´ω`*)】確率収束診断スクリプト作りました!
2013年12月24日【火】17時47分50秒
【(*´∇`*)】最近ちょっとプログララマーに戻ってます♪
2013年11月4日【月】19時41分23秒
【(´・ω・`)】現在新しいCGIの作成は行っていません。
2013年1月7日【月】16時12分36秒
【(*´ω`*)】サイトをリニューアルしました。他も徐々に変更中です‥‥
--☆HOTLINK NOW☆--
【Kindle】電子書籍販売★秋華★
【楽天kobo】電子書籍販売★秋華★
【パブー】電子書籍販売★秋華★
CGI無料レンタルサーバ紹介
秋華エントランス

CGIスクリプト基本 [データの受け取り]

さて、前回データファイルからのデータの読み込み、書き込みを行い、HTMLではできない事をしました。
次は更に、CGIならではの事をします。
それが、外部からのデータの受け取りです。
たとえば掲示板は、誰かが書き込みを行い、そのデータを受け取り、処理して、表示します。
検索エンジンも、検索キーワードを送信されたのを受け取り、データベースと照合して、必要なデータだけを表示するというものです。
データの受け取りが可能になれば、送信はHTMLのフォームからできますので、掲示板も検索エンジンも、作る事が可能になります。
それではまず、その送信側のフォームの記述をみてみましょう。

<form method="post" action="index.cgi">
<input type=text name="cname" size="40"><br>
<textarea name="chat" rows="14" cols="50"></textarea><br>
<input type="submit" value="送信">
</form>

上記はHTMLの送信フォームの記述です。
知ってる人は分かると思いますが、1行目が、フォームの始まりと、データの受け渡し方法、そして対象を設定しています。
2行目が、名前を書く場所を設定、3行目が記事を書く場所を設定、4行目が送信ボタン、5行目がフォームの終わりを宣言しています。
此処で気になるのが、1行目の、method="post" という記述で、データの受け渡し方法です。
私は最初、これの意味がわからなくて書籍で調べたのですが、それでもはっきりと意味がわかりませんでした。
それで実際に色々試しているうちに、その答えがわかりました。
まず説明すると、post の部分は、get に置き変える事もできます。
データの送信方法は2種類あるって事です。
それの違いが、しばらくわかりませんでしたが、簡単に言うと、送信データの痕跡が残るのが、get で、痕跡を残さないのが、post であると言えます。
サーチエンジンで基本的に使われているのが、get で、掲示板で使われているのが、post です。
簡単に言うと、処理が終了した時点で、URLの最後に、データを残すのが、get で、URLアドレスだけなのが、post です。
サーチエンジンで検索した後、URLの後に、色々な変な文字が並んでいるのを見た事があると思います。
あれを残さないようにするには、post にする事で、残さないようにできます。
しかしサーチエンジンのページは、もしも post で検索していたら、どのページが表示されていても、URLは同じ事になります。
実はその後の文字列が、URLそのものの役割を果たしているとも言えます。
あくまで送信されたデータなのですが、そのデータを受け取った場合に表示するページは同じわけですから。
もっと分かりやすく言うと、診断ページ等を利用した事がないでしょうか?
10の質問に、はい か いいえ で答えることで、あなたの性格を診断するとか、そんな感じのページです。
ランダム要素がなければ、全て はい で答えたならば、得られる結果は同じですし、全て いいえ でも、別の決まった結果がえられるでしょう。
その結果ページへのリンクを友達に見せたいと思った時、もしこのページのスクリプトが、post 送信だったら、結果ページへのリンクは、普通得られません。
その時のアドレスをコピーしたならば、おそらくそれは、トップページへのリンクアドレスとなるでしょう。
でも get なら、そのアドレスが、送信データ付のアドレスではありますが、得る事ができて便利なのです。
なら何故、全て get で送信しないのか。
それには、そのスクリプトによって、色々理由はあります。
たとえば、URLの後につけるデータを、パスワードとして使っていたりする場合もあったり、掲示板でそのアドレスにアクセスすれば、書き込みを繰り返す事になったりします。
実際使っていけば、もっと色々な状況で、色々なメリットデメリットが見つかると思うので、後はこれから徐々に試してください。
とにかく、ログインや、書き込みを行う処理がある場合は、post、データ引き出すだけの処理は、get の方が親切かも、くらいに思えば良いと思います。
それでは、先ほど書いたフォームで送られてきたデータを受け取るソースを以下に書きます。

if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }

ぶっちゃけコレは、もう決まった記述ですので、深く考える必要はないです。
と言うか、私も最初こそ理解しましたが、今は何も考えず使っており、説明できません。(笑)
あえて少し説明するなら、1行目は・・・
もし、method が post でデータを送られてきたなら、変数 $buffer に、そのデータを入れる。
そして2行目が・・・
そうでない場合は、$buffer に、そのデータを入れる。(記述の違いは見ればわかると思いますが、別の方法で行われています。)
これで、post で送られてきたデータも、get で送られてきたデータも、$buffer の中に入れる事ができます。
どちらかだけを受信したい場合は、post の場合は・・・

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

get の場合は・・・

$buffer = $ENV{'QUERY_STRING'};

だけを記述しておけば大丈夫です。
とにかくこれで、フォームからのデータを受け取る事ができました。
それでは次回は、送信されてきたデータの中身を知り、処理する事ができればと思います。
【<┃】 【┃┃】 【┃>】
このエントリーをはてなブックマークに追加
ドクダミ
Ver.5.00 CGIフリー配布サイト