WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:セレクトのオプションvalueにリンクを自動的に挿入する

Ma-kun [WriteDate : Wed Nov 29 12:10:42 2000]

久しぶりに投稿します。
今回は、訪問者リストに登録した人の名前が一覧表になり、そこにリンクを張りたいのですが、普通の表ではなくセレクトを用いたいのです。
名前とIDを取得して、(cgiを利用)
<select>
<option value="id.htm">名前
<option value="id.htm">名前2
</select>
と、自動的に付け足していくことはできるのでしょうか?説明が相変わらず下手で申し訳ありません。
できるのであれば、どのように書くとできるのか教えてください。

Nobu3 [WriteDate : Wed Nov 29 12:41:04 2000]

cgiに使ってる言語はPerlでいいんでしょうか?

仮にPerlとして、

$users{id} = '名前'
の状態でハッシュがあるとするなら
print "<select>\n";
foreach(sort keys %users){
  print qq(<option value="$_.htm">$users{$_}\n);
}
print "</select>\n";

こういう事ですか?


ちゃいぱ [WriteDate : Wed Nov 29 12:43:24 2000]

>自動的に付け足していくことはできるのでしょうか
サーバ側(パール)で処理したいのでしょうか、それとも、ブラウザ側でしょうか?
ブラウザ側だと、やはり(いつもすいません!)、Mugiさんの出番です! ^^;

ちゃいぱ [WriteDate : Wed Nov 29 12:45:42 2000]

おーぅ!、かぶった!
サーバ側だと、Nobu3さんの出番でした!

Nobu3さん、いつもすいません!

Ma-kun [WriteDate : Fri Dec 1 13:00:52 2000]

返事が遅くなって申し訳ありません。
言語はperlです。
>サーバ側(パール)で処理したいのでしょうか、それとも、ブラウザ側でしょうか?
とありますが、どちらのほうがサーバー的に負担は軽いのでしょうか?もしよろしければ、どちらのほうも教えていただけると嬉しいです。
あと、Nobu3さんに聞きますが、このとき、名前と、IDを保存するときは、
どのように、書き込めばいいのでしょうか?質問ばかりでごめんなさい。


Nobu3 [MAIL] [URL] [WriteDate : Fri Dec 1 13:14:51 2000]

訪問者リストを自動で作成(更新)するならサーバー側でしかできません。たぶん。
訪問者リストを自分で作成(更新)するならどちらでもできますが、
ブラウザ側(JavaScriptなど)の方がサーバー的に負担が軽いでしょう。たぶん。

きちんと読めるなら、書き込む方法はどうでもいいです。
読み書きをセットで考えてください。
一応、一つだけ例をあげておきます。

$id   = 'ID';
$name = '名前';
open(OUT, ">> userdata.dat");
print OUT, "$id\t$name\n";
close(OUT);

こういう書き込み方法だと、読み取るときは

open(IN, "userdata.dat");
while(IN){
  chomp;
  my($id, $name) = split(/\t/);
  $users{$id} = $name;
}
close(IN);

こうなります。
実際に使うときは、排他処理やエラーの処理も書いたほうがいいです。


Ma-kun [WriteDate : Fri Dec 1 17:15:45 2000]

Nobu3どうもありがとうございました。
スッゴク親切で、かつ的確なアドバイス嬉しく思います。
あとは、
>実際に使うときは、排他処理やエラーの処理も書いたほうがいいです。
とあるように、細かいところを頑張ってやっていこうと思います。
あと、もう1つ聞いてもいいですか?
順番にリスが出来上がっていきますよね。で、例えば1ヶ月ごとに
リセットしようと思ったら、どうすればいいのでしょうか?
ある程度は分かるんですが、今回のようにセレクトのオプションバリューで
やったときの対処の仕方がわからないです。
また、よろしかったら教えてもらえますか?



Nobu3 [WriteDate : Fri Dec 1 17:51:11 2000]

リセットというのが何をするのかよくわかりませんが、
もし、データを消すという事なら、
データをためているファイルを空っぽにすればいいです。

初期データを用意する場合は、データをためているファイルの中身を
初期データに置換えてやればいいです。


andi [WriteDate : Fri Dec 1 17:52:27 2000]

> 1ヶ月ごとにリセット

データファイルの更新日と今回アクセス日時を比較して
異なっていればリセットというのが現実的ではないでしょうか。

Ma-kun [WriteDate : Sat Dec 2 16:43:59 2000]

すみません。話が少し戻るのですが、Nobu3にお尋ねします。
前回
open(IN, "userdata.dat"); 
while(IN){ 
  chomp; 
  my($id, $name) = split(/\,/); 
  $users{$ID} = $name; 
}
close(IN); 

print "<SELECT>\n"; 
foreach(sort keys %users){ 
  print qq(<option value="$_.htm">$users{$_}\n); 

print "</SELECT>\n"; 
と教えてもらってたのですが、これは、このように、続きに
記述すればいいのですよね?
そうするとですね、動かないんですよ。ファイル名はこちらの
都合のいいように変えてあるのですが、上手くいきません。
ページが表示されないんですよ。これって、僕の記述の仕方が
悪いのでしょうか?
もう一度、この辺を教えてもらえますか?
あと、リセットしたいというのは、andiさんが言うように、
>データファイルの更新日と今回アクセス日時を比較して 
>異なっていればリセットというのが現実的ではないでしょうか。 
とあるのは、僕も共感なんでそうしたいと思いますが、リセット
した時に、空っぽではセレクトのテキストボックスが消えてしまう
のは、まずいので、リセットしたときに
"現在は登録がありません"とかにすることはできるのでしょうか?
よろしくお願いします。



andi [WriteDate : Sat Dec 2 17:21:53 2000]

if(-z 'userdata.dat'){
print "現在は登録がありません";
}else{
open(IN, "userdata.dat");  
while(IN){  
  chomp;  
  my($id, $name) = split(/\,/);  
  $users{$ID} = $name;  

close(IN);  

print "<SELECT>\n";  
foreach(sort keys %users){  
  print qq(<option value="$_.htm">$users{$_}\n);  
}  
print "</SELECT>\n";
}

でできるかな。

Nobu3 [WriteDate : Sat Dec 2 23:49:15 2000]

あ・・・

while(IN){
  ...
}



while(<IN>){
  ...
}

でしょうかね・・・(^^;;;


Nobu3 [WriteDate : Sat Dec 2 23:58:42 2000]

先ほどの間違いはかなり致命傷です。ごめんなさい。

あと、変数の大文字小文字は区別されたはずです。
$id と $ID は別なのでハッシュが形成されてないんじゃないかと。

Ma-kun [WriteDate : Mon Dec 4 16:00:14 2000]

Nobu3毎度ありがとうございます。
えーとですね、ここの部分が気になります。
>$id と $ID は別なのでハッシュが形成されてないんじゃないかと。 
どういうことなんでしょうか?ハッシュが形成されていないというのは?
あと、前回のソースをとりあえず書いたのですが、そこで疑問を感じました。
<select>は基本的に<form action="-----" method="post"></forom>
にはさまれていますよね。
で、この時のaction=""にはどのように記述すればよろしいのでしょうか?
<input type="submit">もつけないと駄目ですよね。
すみませんが、もう一度よろしくお願いします。

ちゃいぱ [WriteDate : Mon Dec 4 17:00:44 2000]

>>$id と $ID は別なのでハッシュが形成されてないんじゃないかと。
>どういうことなんでしょうか?
 :
my($id, $name) = split(/\,/);  
$users{$ID} = $name; 
 :
で、$idと$IDは別物ってことですね!

>action=""にはどのように記述すればよろしいのでしょうか
CGIのパス名/CGI名を記述します。  

Nobu3 [WriteDate : Mon Dec 4 17:05:06 2000]

$id = 'ほにゃらら';
print $ID;

最初の疑問はこれで解決するでしょう。たぶん。

actionには、そのcgiのファイル名を入れればいいです。
ファイル名というか、パスですか。
フォームを書くcgiと、受け取るcgiが同じなら
action="$ENV{SCRIPT_NAME}"
で、問題ないでしょう。

当然submitもつけなくてはいけません。

Ma-kun [WriteDate : Tue Dec 5 11:21:58 2000]

長い間戸惑いましたが、ついに動作するようになりました。
Nobu3さん,andiさん,ちゃいぱさんの方には本当に力に
なっていただき、ありがとうございました。
どうにかこうにか、触っていたら動くようになったので、
報告します。
どうもありがとうございました。
回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]