データの受け渡しデータの受け渡し方(データ入力の方法)これまでは、時間によるメッセージの変化やカウンターといった、わりとサーバー側で一方的に作成される内容のプログラムを見てきました。いわゆる出力というものです。いろんなプログラムを作っていくときには利用者側でいろいろとコントロールしたいことも多くなってくると思います。掲示板に文字を書き込むこともそうですし、プルダウンメニューとかで指定した条件で検索をしたりです。このように、利用者側からサーバー(プログラム)に対して何か入力をさせるためには、どのようにしたらいいのでしょうか?主な方法としては、二通りあります。GETを使ってデータを送信ひとつは「GET」という方法です。このGETという方法は、ブラウザから普通にHTMLの文書を要求するときと同じ方法になります。同じ?とは、普通URLいわゆるアドレスで「http://ww......」と呼び出しますよね?この方法です。入力したいプログラムが「test.cgi」だとすると、その後ろに「test.cgi?happy」とすることで、プログラム自体に「?」以降の文字列を送り込むことができます。あちこちの掲示板やサーチエンジンのリンクボタンのURLを注意してみてください。「http://www.xxxxxx.com/bbs.cgi?mode=next&num=12....」というのを見たことはないですか?これがまさにそうなんです。QueryStringsの中身を参照すると、「?」以下の文字を読み出すことができる、という仕組みになっているようです。URL形式になるので、ここに日本語を書き込むと、文字化けしたようなデータに変換されて送信されます。サーチエンジンで検索したすぐあとのアドレスバーに「%82%A0%82%A2%82%DC%82%A2...」とかって表示されていて、「なんだろう?」とか思ったことはないですか。あれが、変換された日本語などの表示なんです。POSTを使ってデータを送信もうひとつ方法があります。「POST」と呼ばれる方法です。最初の回でブラウザはHTMLソース以外にヘッダーという情報を受け取っているという話をしたことを覚えているでしょうか?このような情報は受け取るときだけではなく、送信するときも同じように見えない情報としてサーバーに送信されています。この見えない場所にデータを埋め込んで送信する方法です。見えないのに、どうやって送信するかということですが、方法はすごく見慣れた方法で行います。いわゆるフォームというのを使ってします。method="">」というタグですね。ここの「method」のところに「method="post"」と送信方法を指定することで、POSTとしてフォームで入力された内容がサーバーに向けて送信されているのです。type="">......ここのインプットタグの内容がプログラムに入力される</form>じゃあ、「method=""」のところに「GET」って入れたらどうなるの?って思いませんか。ご推測のとおり、フォームの情報がURLになって送信されるのです。大手のサーチエンジンなどは、ほとんど「検索」ボタンのフォーム部分が「method="get"」となっているので、検索したあとは、アドレスのところに変な文字が表示されるんですよね。「POST」と「GET」、どちらの方法を使うべきかは、その目的にもよりますが、一般的に「POST」を使ったほうが安全性が高くなるといわれています。その理由は、「GET」で送られた内容はURLとして送信されるので、目に付きやすいし経由するサーバーのログに残る、「POST」は普通なら見えないような形で送信されるしログとしても残らないということらしいです。「GET」だと、ブラウザ(クライアント)側に履歴として残ったりすることもありますし、URLでプログラムに引数を渡すことが可能なので、いたずらされやすいという点もあると思います。「GET」にも別の利点があり(これは後述します。)、どちらを使うかは場合に応じてということですね。プログラムではどのように入力を実装するか?では、実際にどのようにデータを取り込むかを考えてみたいと思います。さきほどプログラムの「?」以下が送信されると書きましたが、実際フォームなどでどのようなデータが送信されているかをみてみるために、下のような簡単なプログラムを作って見ました。これで、フォームの各項目を入力して「Submit」ボタンを押したときに、どのようにデータが送信されているかがわかります。GETの場合1つ目(name1):2つ目(name2):3つ目(name3):1つ目(name1):2つ目(name2):3つ目(name3):よく見ると、「name1=abc&name2=cde&......」となっています。フォームの名前である項目名とその値がイコールでペアになって送信されているのがわかりますでしょうか?しかもそれぞれが&でつながっています。項目名1=値1&項目名2=値2&項目名3=値3よって、これらのデータを処理するためにはそれぞれの値をばらばらに切り直して、プログラムの中で使いやすいように加工する必要があります。全ての項目および値のペアは「&」で区切られていますので、まずこれをそれぞれのペアごとに分解する必要があります。バラバラにしたペアを変数として扱いやすいようにするために、それぞれの項目名を引数とするハッシュに取り込みます。(Perlでの常套手段です。)では、実際に外部からデータを入力(取り込む)するためのプログラムの解説をしたいと思います。