このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

別のページのフォームデータを受け取って、自動入力させるには?

発言者:アッシュ
( Date Monday, February 05, 2001 11:30:45 )


MacOS Web共有を使って運営するWebサーバ上で・・・
テキストフォームに入力されたデータを、別のページのテキストフォームに
自動入力させるにはどうしたらいいのでしょうか?

具体的には以下のような事を実現したいと思っています。
説明がうまく出来ないので、画面イメージで説明させてください。


idcheck.html
┌────────────────────────────────┐
│                                │
│  希望するユーザーidを入力して下さい              │
│ ┌────────────────┐              │
│ │testid             │              │
│ └────────────────┘              │
│       ┏━━━━┓                     │
│       ┃チェック┃←ボタン                   │
│       ┗━━━━┛                     │
└────────────────────────────────┘
・id_data.datに記述されているユーザー名と重複しないか
 idcheck.cgiにて判定。
・重複していなければidcheck.cgiが出力した以下の画面を表示


idcheck.cgiの出力したhtml画面
┌────────────────────────────────┐
│                                │
│ ご希望のユーザーid[testid]は利用可能です           │
│ 登録情報入力の画面へ進んでください。              │
│                                │
│        ┏━━┓                       │
│        ┃次へ┃                      │
│        ┗━━┛                       │
└────────────────────────────────┘
・JavaScriptリンクボタン[次へ]でregist.htmlへ


regist.html
┌────────────────────────────────┐
│           ユーザー登録フォーム           │
│                                 │
│      ┌────────────────┐         │
│ ユーザーID│testid             │         │
│      └────────────────┘         │
│      ┌────────────────┐         │
│ パスワード│                │         │
│      └────────────────┘         │
│        ┌────────────────┐       │
│ メールアドレス│                │       │
│        └────────────────┘       │
│                                 │
│         ┏━━┓                     │
│         ┃登録┃                       │
│         ┗━━┛                     │
└────────────────────────────────┘
・このページの読み込みが終わった段階で、”ユーザーID”フィールドに
 最初のページで入力された”testid”が自動的に入力されることを実現
 したいのです。

JavaScriptの
<HEAD onLoad="関数">・・・や
parent.display.document.フォーム名.NAME.value  = ""
によるフォームへの文字の入力などは調べて分かったのですが
別のページ(idxheck.html)のフォームデータを受け取る方法が
分かりません。

クッキーを使えば良いのかな? とも思ったのですが、使い方が分からず
断念・・・という状況です。

つたない説明で恐縮ですが、解決方法のヒントでも結構ですので
ご教示ください。お願いいたします。

田中求之 さんからのコメント
( Monday, February 05, 2001 12:22:45 )

JavaScript については私は知らないので、もしかしたら他の方法があるのかも
知れませんが、

>・このページの読み込みが終わった段階で、”ユーザーID”フィールドに
> 最初のページで入力された”testid”が自動的に入力されることを実現
> したいのです。

このような場合、一番手っ取り早い方法は、ページ自体を CGI で生成する
(あるいは SSI を使う)というものでしょう。idcheck.cgi で登録用の
ページを生成して、ユーザーに表示するというのが簡単だと思うのですが、
それでは何かまずいことがあるのでしょうか?

アッシュ さんからのコメント
( Monday, February 05, 2001 14:15:14 )

田中先生、レスありがとうございます。

CGIでページを生成するのが確かに一番簡単だと思います。
ただ、以下の疑問点が不明だという理由から、あえてhtmlのファイルにした
ということになります。

1.実際のregist.htmlのフォームは十数項目あり、それをテーブルで整形
  しているためそこそこデータ量が多い。それをMacPerl CGIで生成させる
  のは負荷が大きいのではないか? と思ったこと。
2.idcheck.cgiで「ID重複チェック」と「ユーザー情報登録」を実行させた
  場合、誰か一人がCGIを使用している間、他の人が登録又はチェックが
  出来なくなるのでは? と思ったこと。

1に関しては、htmlファイルを使うのに比べ、MacPerl CGIでhtmlを生成する
のが どの程度処理を遅くするのかが不明なのですが、少なくともCGIでhtml
を生成する分だけは遅くなるのかな・・・と思いまして。
2については、ほとんど憶測です。勘違いしているとしたら大変恥ずかしい
のですが・・・つまり、同時にCGIが実行されることを想定してCGI Scriptを
分けておいた方が良いのかな〜?と思ったわけです。

やはり「出来る方法でヤル!」というのが良いのでしょうか?(^_^;)
この場合は、idcheck.cgiでregist.htmlのデータも生成させてしまうという
方法ですね。

藤川 さんからのコメント
( Monday, February 05, 2001 17:35:59 )

アッシュ さん こんにちは。

>クッキーを使えば良いのかな? とも思ったのですが、使い方が分からず
>断念・・・という状況です。

私が思うに、いずれにせよ最初に書き込まれたデータを
どこかに一時的に保持させなければならないので、やはりCookieが適当に思えます。
理由としては
1.この部分に関してはサーバに負荷がかからない
2.cgiの書き込み用tmpファイルを使った場合、
tmpファイルをロックするような処理をしないと
複数人が同時使用したとき問題が起きる可能性があるからです。

cookieは最初とっつきが悪いのですが
コアになる部分は割と決まり切った構文なので
覚えられると結構便利ですよ。ぜひトライしてみてください。

簡単ですが以下にサンプルを書きますので試してみてください。

-------------------------------------------------
idcheck.html
-------------------------------------------------
<HTML>
<HEAD>
<SCRIPT Language="JavaScript"><!--
        
function Kakikomi() //書き込み処理サブルーチン
{
setCookie("testid",document.form1.field1.value);
}
 
//以下変更不要 書き込み処理-------------------------------------------

 function setCookie(key,val){
 var expiresDate=new Date();
 tmp=key+"="+escape(val)+";";
 document.cookie=tmp;
 }

// --></SCRIPT>
</HEAD>
<BODY BGCOLOR="#FFFFFF" VLINK="#0000FF">
<P><FORM ACTION="" METHOD=POST name=form1>
<P><INPUT TYPE=text NAME=field1 VALUE="" SIZE=30><INPUT TYPE=button NAME="" VALUE="書き込み" onclick="Kakikomi();">
</FORM>
</BODY>
</HTML>

-------------------------------------------------
regist.html
-------------------------------------------------

<HTML>
<HEAD>
<SCRIPT Language="JavaScript"><!--
        
 function Init() //読み込み処理
        { 
        var c_testid = getCookie("testid");
        if(c_testid == "" || c_testid == "testid"){
                document.form1.field1.value = "";
                }
        else{ 
                document.form1.field1.value = c_testid ;
                }
        }

 //以下変更不要----------------------------------------------
 
 function getCookie(key){//クッキー取得
 tmp=document.cookie+"; ";
 tmp1=tmp.indexOf(key,0);
   if(tmp1 !=-1){
   tmp = tmp.substring(tmp1,tmp.length);
   start = tmp.indexOf("=",0)+1;
   end = tmp.indexOf(";",start);
   return(unescape(tmp.substring(start,end)));
   }
  return("");
 }

// --></SCRIPT>
</HEAD>
<BODY BGCOLOR="#FFFFFF" VLINK="#0000FF" onload="Init();">
<P><FORM ACTION="" METHOD=POST name=form1>
<P><INPUT TYPE=text NAME=field1 VALUE="" SIZE=30>
</FORM>
</BODY>
</HTML>

アッシュ さんからのコメント
( Monday, February 05, 2001 22:52:58 )

藤川さん、こんばんは。

で、で、出来ましたっっ!! ありがとうございますーーー!!!(^-^)
JavaScript解説の本を読んで、GetCookieとSetCookieがあるのは知っていた
のですが、どう実装して良いのか分からずに断念していたところでした。
藤川さんの書いてくださったサンプル、スゴクわかりやすかったです。

> setCookie("testid",document.form1.field1.value);

cookieは、KEYとVALUEでセットになって保存される。…読み出すときはKEYを
参照して…と、まずこの初っぱなが具体的にどうやればいいのか分からなかった
のですが、上のサンプルを見て理解しました。(と言っても変更不要部分まで
完全に理解したわけではないのですが…)
でも、本当にありがとうございました。


> 2.cgiの書き込み用tmpファイルを使った場合、
> tmpファイルをロックするような処理をしないと
> 複数人が同時使用したとき問題が起きる可能性があるからです。

上のスレッドでも書きましたが、これも僕がイマイチわかっていない点の一つです。
UNIXであれば "&file_lock;" でファイルをロック出来るのだと理解しているの
ですが(←自信なし)Macではどうすればいいのだろう・・・と。

MacPerl CGIでは、複数のユーザーが同時にCGIを実行できないので、
ファイルロックはいらないのかな? というような、全く根拠のない想像の世界
にいる状況です。
でもこの疑問に関しては、過去ログに答えがありそうな気がするので、まず探し
てみたいと思います。

藤川 さんからのコメント
( Tuesday, February 06, 2001 09:26:09 )

>で、で、出来ましたっっ!! ありがとうございますーーー!!!(^-^)

よかったですね。お役に立てて嬉しいです。

アッシュ さんからのコメント
( Wednesday, February 07, 2001 14:24:19 )

しつこく質問をして恐縮ですが・・・

> 2.cgiの書き込み用tmpファイルを使った場合、
> tmpファイルをロックするような処理をしないと
> 複数人が同時使用したとき問題が起きる可能性があるからです。

について(というか…MacPerlでファイルロックするには?)を別スレッドで
質問させていただいています。
タイトルは、まんま「MacPerlでファイルロックするには?」です。

もしなにか分かりましたら、お教えいただけると助かります。
よろしくお願いいたします。