トップページ⇒php
1001コメント310KB

CGIだけどなんか質問ある Pert 5.01

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/03/03 12:49ID:673UxTI5
print"くだらない質問はここにかけや!";

018575とか02/03/06 02:03ID:???
結局、>>183の前者の方に変更しました。
表示部は必ず実行する、コメントするならしてから表示部を実行する。という感じ。
0186お腹さん@名無しいっぱい。02/03/06 02:14ID:???
だいたい ifブロック構造はまとまってきた?
018775とか02/03/06 02:18ID:???
はい。おかげさまで見やすくなりました。
0188お腹さん@名無しいっぱい。02/03/06 02:21ID:???
次は、URLデコード部分でR!
なぜか知らんがPOSTおよびGET送信を分けて書いてあるのでアル。
018975とか02/03/06 02:23ID:???
はい。だめですか
0190お腹さん@名無しいっぱい。02/03/06 02:26ID:???
分けて書く特別な意味があるならそうすべきだし、特に意味がなければまとめて
書くほうがよりコンパクトで分かりやすいソースにあるってなもんだ!!
019175とか02/03/06 02:37ID:???
どうやったら一つにできるのか考え中です..
0192お腹さん@名無しいっぱい。02/03/06 02:39ID:???
以下の1行でPOSTだろうがGETだろうが 変数 $_ にぶち込んだことになると思うが。

read(STDIN, $_, $ENV{'CONTENT_LENGTH'}) unless $_= $ENV{'QUERY_STRING'};
019375とか02/03/06 02:44ID:???
つまり、$QUERY{'〜'}と$FORM{'〜'}の二つに分けないで、
一つの配列に両方入れるということですか?
0194お腹さん@名無しいっぱい。02/03/06 02:46ID:???
ああ、それってわけてたんだァ。わけないとまずいことでも?
019575とか02/03/06 02:50ID:???
いえ、配列の添え字も重複してないんで、分けなくていいっちゃーいいかも、です。
ところで、192は意味がわかりません。unless、それ以外は..。
0196お腹さん@名無しいっぱい。02/03/06 02:51ID:???
POST送信の場合、$ENV{'QUERY_STRING'} に値がセットされることは
ないと思うが、これって思い違いカナ?
0197お腹さん@名無しいっぱい。02/03/06 02:56ID:???
192 で変数 $_ に「aaa=%a0%2e&bbb=esc」みたいなのが取得できたからつぎは&
で分割したそれぞれを更に=で分割してデコードをぶちかますから大枠は以下の
ようになるハズでアール。(チョット文字コード変換は置いといて)

for ( split('&') ){
nbsp; nbsp;($name, $_)= split('=');
nbsp; nbsp;tr/+/ /; s/%(..)/chr(hex($1))/eg; # URLデコード
nbsp; nbsp;$in{$name}= $_; # 値のセット
}
019875とか02/03/06 02:56ID:???
別ページからのリンクや、BBS内での過去レスへのリンクのURLに?mode=light&page=3
とかって入るんです。
0199お腹さん@名無しいっぱい。02/03/06 02:58ID:???
197はチョットインデントミス

for ( split('&') ){
   ($name, $_)= split('=');
   tr/+/ /; s/%(..)/chr(hex($1))/eg; # URLデコード
   $in{$name}= $_; # 値のセット
}
0200nobodyさん02/03/06 03:00ID:???
>196
<form action="hoge.cgi?foo" method="POST">
とかすると同時に送れたと思う。
0201お腹さん@名無しいっぱい。02/03/06 03:02ID:???
>200
なるホードネー! それじゃー新たな必殺技を考えるからしばしお待ちを...
0202お腹さん@名無しいっぱい。02/03/06 03:07ID:???
これでPOSTおよびGETの値を取得できるかナ!

read(STDIN, $_, $ENV{'CONTENT_LENGTH'});
$_.= "&$ENV{'QUERY_STRING'}";
020375とか02/03/06 03:08ID:???
おお、なるほど!それなら意味がわかりました!
0204お腹さん@名無しいっぱい。02/03/06 03:10ID:???
どうYO!これで1つのハッシュにまとめられそうな予感?
020575とか02/03/06 03:22ID:???
んー今のところうまく行ってないっす..
0206お腹さん@名無しいっぱい。02/03/06 03:27ID:???
わたしは日本語EUC文字コードでしかHTMLフォーム送信をしたことがないから
わからんケド、経験上EUCで送信したHTMLフォームから入力された値はEUCの
URLエンコードで返ってくるのでSJIS送信の場合は必ずSJISのURLエンコード
で返ってくるのかチョットまだ試したことがないから取得パラメータの文字コードの解析
は必要なのかどうか迷うところネー。
020775とか02/03/06 03:36ID:???
んーその前にEUC送信でつまづいてマス..
0208お腹さん@名無しいっぱい。02/03/06 03:39ID:???
URLデコードはできた?
この際、内部処理はすべてEUCで、HTML出力はすべてSJISにしては?
なにかできない理由あったッケ?
020975とか02/03/06 03:47ID:???
できました!!とりあえず、URLデコードとやらを簡潔にすることはできました。
全部SJISですか..。それが一番いいんですかね??文字化けしにくいですよね。
どっかの解説で、日本語使うならEUCだ!という知識を身に付けたので出力までEUCにしてただけです。
0210お腹さん@名無しいっぱい。02/03/06 03:50ID:???
確かにEUCを愛用しているわたしとしてはEUCがいちばん使いやすいし、
経験上文字化けしたことがないし、文字コード変換のプロセスも必要なくなるし、
いいことづくめだとは思っています。
021175とか02/03/06 03:58ID:???
そうですかー。僕の掲示板やたらと重いんで、sjis変換するの躊躇するんですが、
文字化けよりはいいかな。
ていうかEUCって文字化けしないんですか?
0212お腹さん@名無しいっぱい。02/03/06 04:02ID:???
EUC送信部分ってlightモードDA・YO・NE?
021375とか02/03/06 04:03ID:???
おっと、また問題発生!
さっきモードうんぬんを変更したせいで、
書き込み後のURLが?mode=commentのままになっている..
やっぱりLocationで飛ばしたほうがいいのかなあ。
021475とか02/03/06 04:04ID:???
lightモードとHeavyモードです(笑)
0215nobodyさん02/03/06 04:06ID:???
すみません。
foreach $line(@hoge_lines){
@超hoge=split(/<>/,$line);
&普通にhoge;
}
こういうのがありまして、
&普通にhogeというサブルーチンは
sub 普通にhoge{
名前:超hoge[0]
題名:超hoge[1]
}
となっているとします。
このルーチン内に別のログファイルの内容を読み込んでうまく組み込むにはどうすればよいのでしょうか?
0216お腹さん@名無しいっぱい。02/03/06 04:09ID:???
>213
GET送信ならURLに?name=value&.... がくっつく(Location: 等で飛ばさない限り)

>214
Heavyモードってファイルには無いネー。これが隠し?
021775とか02/03/06 04:14ID:???
>213はちょっと検討中です。
heavyが隠し(笑)。こっちは重いだけでいまのところ問題なしです。
0218nobodyさん02/03/06 04:18ID:???
>215
@hoge_linesとログファイルの書式,
読み込んで組み込む時の上手い下手の定義とかを書いて。
0219お腹さん@名無しいっぱい。02/03/06 04:19ID:???
>215
ネタかと思ったが...
0220nobodyさん02/03/06 04:24ID:???
この板,最近煽りが多いからたまにはマジレスもしとかんと(w
0221お腹さん@名無しいっぱい。02/03/06 04:34ID:???
>220
そうダネ。この板、最近ムネオが多いネ!
022275とか02/03/06 04:38ID:???
結局、Locationで飛ばしました。
なんか、mode=commentとか全部postで送ったら、URLは簡潔だけど挙動がおかしいんです。
書き込み後、更新ボタンを押すと、重複して書き込まれてしまいます。
022321502/03/06 04:45ID:???
>>218
@hoge_linesは
$name,$title
で
ログファイルの書式は
名前<>題名<>
こんな風です。

上手いはとにかくできでどんな形でも組み込めればおいしい。
下手は組み込みを失敗している状態のことでSU!


0224お腹さん@名無しいっぱい。02/03/06 04:49ID:???
いい忘れてたケド、昨日のjoin関数で繋げる部分は以下のように変えテーナ!

print OUT join($SEPA,"$yy年$mm月$dd日","$jj時$ff分$bb秒",$in{'from'},
&nbps;       $in{'message'}),"\n";
0225お腹さん@名無しいっぱい。02/03/06 04:51ID:???
また、インデントしくじったーゼ!
224の &nbps; 部分はインデントミスさー
022675とか02/03/06 04:55ID:???
あーはいはい。すでにそのような感じに変えてありまっす。
あと、splitのほう、^Kは\^Kと書かないとだめでした。
ちなみに、なぜ^Kなんでしょう??
takakura^kenさんからの書き込みあったらマズイ!
0227お腹さん@名無しいっぱい。02/03/06 04:57ID:???
これもまた説明不足だったーネ。
これはコントロール文字のつもりだったので以下のように書き換えてみて、

$SEPA= "\x0b"; # セパレート文字(コントロール文字^K)
0228nobodyさん02/03/06 05:06ID:???
>>223
sub 普通にhoge{
 名前:超hoge[0]
 題名:超hoge[1]
 特別なhuga;
}
sub 特別なhuga{
 open LOGFILE, "logfile.dat";
 while (<LOGFILE>) {
  push @LOG, sub { {name=>$_[0],title=>$_[1]} }->(split /<>/);
 }
 close LOGFILE;
}
#$LOG[0]->{name}
022975とか02/03/06 05:09ID:???
なるほど、そうでしたか。なんか特殊なものなんだろうなあと思って調べたんですが、
^Kという文字列は僕のしょぼい検索に引っかかりませんでした..。
無知でお恥ずかしいです..
0230お腹さん@名無しいっぱい。02/03/06 05:12ID:???
まあ、フリーのCGIなどではセパレート文字に <> などというものを使って
る人がおおいけど、これだと2バイトになってしまうから、敢えて1バイトの
コントロール文字を使うという心意気みたいなもので、テキストデータを処理
する際の手筋ダーネ!
023175とか02/03/06 05:19ID:???
なるほどです。
ところで、昨日教わったやり方だとデータファイルに<br>が入ってましたが、
これを例にならって^Rという勝手な区切り文字に変えてしまったんですが、
\x0bと同時に使って区別できる区切り文字ってありますか?
0232お腹さん@名無しいっぱい。02/03/06 05:22ID:???
そうネー。\x1b なんかはお手ごろかと。
\x1b ESC文字(コントロール文字^[)
023375とか02/03/06 05:31ID:???
あ、それは\eのことですよね!僕のしょぼい検索にもひっかかりました。
ありがとうございます。

さて、そろそろ寝ます..最近、仕事中にしか寝てないんです(!)
2夜に渡って大変お世話になりました。どうもありがとうございました。
とりあえず明日全部sjis変換を試してみます..。
023422302/03/06 05:48ID:???
ちょっと形を変えて組み込めたんですが、
logfile.datの方から読み込んだ名前の数をカウントして
もう一つの方から読み込んだ名前の横に表示しようとすると、
1に対する文句の数 2
2に対する文句の数 3
3に対する文句の数 5
と1に対する文句の数にそのまま+されていってしまいます。

これはどうやれば解決できるのでしょうか?


023522302/03/06 05:50ID:???
と1に対する文句の数にそのまま+されていってしまいます。×
と1に対する文句の数にそのまま+されていってしまいます。文句の数がね○
0236nobodyさん02/03/06 05:57ID:???
>234
sub 特別なhuga{
 @LOG = ();
〜以下略〜
0237nobodyさん02/03/06 07:01ID:CkyOD57T
>>236
もっと詳しく書いてやれYO!
0238nobodyさん02/03/06 10:32ID:CkyOD57T
早くしろよ。
0239ぷうすけ02/03/06 11:05ID:qVBo2uea
mkdirに関する質問です。よろしくお願いします。

  $ret=mkdir($fname,0777);

 perlのcgiプログラム内にて、ディレクトリを上記の方法で作成して、その
中にデータファイルを作成する、というようなことをやろうとしています。
Webブラウザからのアクセスにより、上記の文は実行され、ディレクトリは作
成されます。$retには成功の1が返っていますが、実際のパーミッションは
755となっています。これは、サーバの設定のせいなのでしょうか?または、
なにかプログラム的に対策が取れますか?なお、cgiの置いてあるディレクト
リのパーミッションは777になっています。
0240nobodyさん02/03/06 13:41ID:???
>>239
多分サーバーの設定だろう。
詳しくは俺もよく知らんが、perldoc -f umask が参考になるかもしれない。

等と適当な事を逝ってみる。
0241nobodyさん02/03/06 14:34ID:???
タブ区切りテキストの read.txt を読み、
ユーザーの入力を格納した %hoge と %foo で5,6列目を上書きし、
write.txtに保存したいです。
以下のように配列 @temp を一時利用したコードを書いたところ、
\tでjoinしたにも関わらず、タブ文字でなく「\t」を区切り文字に連結されました。
つまり、
print "@temp[0]\\t@temp[1]\\t@temp[2]\\t 〜 @temp[8]\\t\\n";
を実行した時と同じ結果になりました。
望む結果を得るにはどうしたらいいのでしょうか?

$counter=0;
open READ, "read.txt";
open WRITE, "+>write.txt";
while ($input = <READ>){
$counter++;
@temp = split (/\t/,$input);
@temp[5] = $hoge{$counter};
@temp[6] = $foo{$counter};
print WRITE join('\t',@temp) ;
}
close READ;
close WRITE;
0242nobodyさん02/03/06 14:42ID:???
>241
'\t'
"\t"
この二つの違いはわかるかい?
024324202/03/06 14:50ID:???
いや、わかんないです。
てかそれだけヒントをもらえれば自分で調べます。
0244nobodyさん02/03/06 14:56ID:???
>243
君は241だろ。(w
まぁ、がんばれ。
頑張って無理だったらここを見ろ。
ttp://tohoho.wakusei.ne.jp/wwwperl1.htm#String
ttp://tohoho.wakusei.ne.jp/wwwperl1.htm#Esc
024524302/03/06 18:46ID:???
はぅん。こりゃ失敬。&さんくす。
024675とか02/03/07 00:36ID:???
YO-YOのお方、今日もいるかな?文字化けの件、解決しました!!
&jcode::convert(\$value,"euc","","z");
これが動作してませんでした。第3引数がダメなようですが、何故でしょう??
それから、sjis用対策をいろいろ教わりましたが、例えば、発言者名が全部半角カナだと
getcodeの返り値がundefなので文字化け対策の部分は全部素通りしてたのでした。
実際携帯から書き込む人は何故か名前を全部半角カナで書く人が多いし、
本文も全部半角カナで書かれても困るので、フォームから漢字一文字をこっそり送って
その漢字コードに全部合わせることにしました。
若干不明な点を残しつつも文字化けにおびえる日々からは開放されました..。
0247nobodyさん02/03/07 06:17ID:WTUe3Qf1
age
0248ぷうすけ02/03/07 17:26ID:+Mtxnc4D
  <form action='./hoge.cgi' method='GET'>
  <input type=password name='pass' size=8 maxlength=8>
  <input type=submit name='button' value='認証'>
  <input type=hidden name='data' value='hoge'>
  </form>

perlのCGIにて、このようなHTMLを出力して、パスワードを
入力させようとしています。テストはWin2000 + IE5.5です。
パスワード用のテキストボックスにパスワードを入力して、
「認証」ボタンをマウスでクリックすると、正しく3つの要素が
QUERYとして送信されます。しかし、キーボードでEnterを押したり、
スペースバーでボタンを押したような場合、
name='button' value='認証'
の情報が、まったく送信されません。どうしてこのようなことに
なるのでしょうか?

最後に、ありがとうございました。>240さん
助かりました。

0249nobodyさん02/03/07 17:31ID:???
>248
認証を押してないから。
0250ぷうすけ02/03/07 18:08ID:+Mtxnc4D
>249
押したYO!!
0251nobodyさん02/03/07 18:19ID:???
マウスボタンから指紋を検出してます。
0252nobodyさん02/03/07 20:08ID:???
>248
submitタイプにname属性はありません。
つーか、パスワードをGETで送るな。
0253nobodyさん02/03/07 20:33ID:???
>>252
あるが?
0254nobodyさん02/03/07 20:35ID:???
>>252
>submitタイプにname属性はありません。
付けちゃいかんって事は無かったと思うが。
0255nobodyさん02/03/07 20:48ID:???
>248
俺はWin2k+IE5.5SP2でちゃんと送れる。
マウスクリック、スペースキー、エンターキー全て正常に送れた。
0256nobodyさん02/03/07 21:01ID:???
なんかこの板、おそろしく人いないんですけど。
0257nobodyさん02/03/07 23:26ID:???
んな、いまさら・・・・
0258nobodyさん02/03/07 23:51ID:???
>>248
やってみたらテキストフィールドでのEnterだけ入らなかった。
スペースでもEnterでも、ボタンを押せば送られる、という事かな。
ついでに、<input type="button" name="button" value="認証"> だと何やっても送られなかった。
仕様なのかな。
025925802/03/07 23:53ID:???
<input type="button" name="button" value="認証" onClick="forms[0].submit()">
でした。
0260nobodyさん02/03/08 00:57ID:???
普通に鯖においてあるcgiの中身は何とかして見れないもんですかね?
0261nobodyさん02/03/08 01:13ID:???
>260
板違い
0262nobodyさん02/03/08 09:05ID:???
フォームから読み込んだ"文字列"を”%95%B6%8E%9A%97%F1”のように変換するにはどうすればいいのでしょうか?
0263nobodyさん02/03/08 09:20ID:???
>>262
受け取った時点で既にそうなってないか???
0264相撲車02/03/08 09:39ID:ol/NmE/5
telnetで自分のプロバの自分のいつも使ってるメール鯖にアクセスしてメール送る
CGIをperlで書いて、実験には成功したけど、これ設置したら不正アクセス禁止法に
触れますか?
取り合えず、プロバの契約内容には言及してなかったんだけど。
0265nobodyさん02/03/08 09:43ID:???
>>264
法律勉強しな。

一応それはsendmailで第三者中継させるのと大して変わらないね。

後、一般に自分のSMTPのアカウント晒して大丈夫なのか?と。
0266相撲車02/03/08 09:44ID:ol/NmE/5
↑のような方法をとったのは、自宅鯖だけどDNSがMXレコード登録できないやつ
だったため。大目に見て欲しいのですが、どうなんでしょうか…。
0267nobodyさん02/03/08 09:46ID:???
>>266
BIND使ってください。
026826202/03/08 09:47ID:???
なんかよくわからんが
~ s/(\W)/'%' . unpack('H2', $1)/eg;
ってやったらうまくいきました
0269相撲車02/03/08 09:53ID:???
>>265さん
即レスありがとうございます。

法律の概要には目を通してみましたが、サービスの範囲内の利用と思えた
ので使用してみました。法律本文を見ないとダメなんですかね?

mail from:プロバの自分のメアド

と書いておけばいいんでしょうか?
ちなみに、smtpサーバはなぜか認証要りませんでした。そして、メールは
自鯖へアクセスしてきた人がメンバー登録したときのパスワード送信用と
いう利用目的なので、設置したとしても利用者は内容を編集できないです。
そんなのでも危ないでしょうか?
0270相撲車02/03/08 10:01ID:???
>>267
BINDっていうものの存在を知らなかったので、調べてみます!
やっぱり相談してみるもんですね〜。ありがとうございます。(T_T)
0271nobodyさん02/03/08 10:56ID:inegq+pM
ファイル全体を@LINESに格納したて、こねくり回した場合、
現在の@LINESに格納されている文字列全体が何バイトなのかを
知る方法ってないものでしょうか?
0272nobodyさん02/03/08 11:08ID:???
>271
好きな方法を使えや。
1.
$size = length join "", @LINE;

2.
$size = 0;
$size += length for @LINE;
0273相撲車02/03/08 19:39ID:ol/NmE/5
BINDの設定のし方がよくわからんです…。一応webmin使ってるんですが、言葉の
意味がわからず、ネット中を転々…。
どこか有効な解説サイトご存知の方、教えてはくださらぬか?
DNSの役割はわかるけど、細かい用語が意味不明という程度の知識です。無いに
等しいです。
0274nobodyさん02/03/08 20:50ID:JBnFAxe6
Basic認証を1000人単位で行いたいので、一件ずつ登録するわけには
いかないのですが、UserIDとPassをcsv or tabで管理するので、
それを一括で登録するだけのcgiってありますか?
0275nobodyさん02/03/08 22:39ID:???
>>273
はぁ、吉外に葉物だな。
そういうことはインターネットの仕組みを仕組みを理解してからやれ。
0276相撲車02/03/08 23:39ID:XJfzC2SF
>>275
忠告どうもです。
でも、仕組み理解っていってもキリが無いと思うのですが、どの程度把握しておけ
ばいいのですか?普段全く使っていない頭をどうにか使いたいのですが。

昨晩から、ずっと悩んでいた問題は結局MXレコード記録してくれないDNSに登録して
いてもAレコード参照してくれるということで解決したっぽいです。そして現在Postfis
が動かないという問題に直面。
まぁ、オレみたいな厨は家庭内LANで実験でもしてからWANに繋げろ、ということで。
0277相撲車02/03/08 23:42ID:???
sageるべきでした。sorr...
0278nobodyさん02/03/09 14:09ID:qqwIDSpw
perlパスのはじめの「#!」は消していいんですか?
0279nobodyさん02/03/09 15:22ID:???
>>278
何を根拠に?

WindowsNTとか#!を解釈しないサーバならいいけどさ。
0280 ◆VJMxnfn. 02/03/09 17:36ID:???
これからPerlを勉強したいと思うのですが初心者にお勧めの書籍を教えて下さい。
配布しているCGIのデザインを変えたり、とかはあるんですが最初から作ったことが無いのです。
とりあえず掲示板やアクセスカウンタなどを作りたいのですが・・

KENTと作ろうPerlでCGI はどうでしょうか?
0281nobodyさん02/03/09 17:56ID:???
>>280
アンチKENTなので不許可。
すぐわかるPerl
0282    02/03/09 19:02ID:???
>>280 本なんか買わないで、ここで学びなはれ。
0283nobodyさん02/03/09 19:03ID:???
>>282
いいえ、本は基本の宝庫です。
0284初心者02/03/09 19:43ID:q9DQVSy0
Perlの質問です。
HTMLのinput type="text"
name="data0","data1","data2",..."dataX"までの入力データを
ループで処理したいのですが
$iがループするとして

$ran = "data$i";
$length = (length($in{"$ran"}));

$lengthが文字数をとってくれないのですが、おかしいところありますか。
0285nobodyさん02/03/09 20:11ID:???
>>284
$length = length($in{"$ran"});


ところで、$ranの内容は?
当然それくらいデバッグしてんだろ?
■ このスレッドは過去ログ倉庫に格納されています