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

CGIだけど、なんか質問ある? Part 6

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/07/06 13:41ID:Mpxtn4bk
CGIの運用に関する質問スレッドです。

※CGIは特定の言語に依存するものではありません。

※Perlのコーディングに関する質問は専用スレがありますのでそちらでお願いします。
  ↓
  Perl 初心者コーナー Part13
  http://pc.2ch.net/test/read.cgi/php/1022731565/l50

過去ログ・関連スレッドは >>2
0151nobodyさん02/07/18 01:18ID:PSEaDSiM
>>150
ですよね。(^^;
このCGIスクリプトでは、ほとんどエラーメッセージがで
ないんです。「スクリプトに use CGI qw(:standard); を付
ければ」というのを頂いたのですが、このスクリプトには
既にこれが記入されていました。

十分なエラーメッセージを出す方法がわかれば、と思うん
ですが、、
0152nobodyさん02/07/18 02:20ID:BBLbgize
>>151

use CGI::Carp qw( fatalsToBrowser );

を入れてみたら?
エラーをブラウザに表示してくれるよ。
0153nobodyさん02/07/18 02:28ID:???
http://pc3.2ch.net/test/read.cgi/tech/1017736187/281-
同じ質問に同じ解答をしてそれに対し同じような返事がきてまた同(略
本気でデジャヴかとおもたよ
◆JAPH9PWA さん〜よく頑張ってますね(はぁと
0154nobodyさん02/07/18 09:38ID:PSEaDSiM
>>151
use CGI::Carp qw( fatalsToBrowser );は既に入っていて、
そのエラーメッセージは下の1行だけです。

(dbmopen) ./diff
0155nobodyさん02/07/18 16:42ID:???
haruno.fam.cx/~sawatari/text_perlbbs.html
のページで下の文を参考にしたのですが、標準入力の値がうまく取れませんでした。

if ($ENV{'REQUEST_METHOD'} eq "post"){
read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
}

で、$ENV{'REQUEST_METHOD'}をprintで見たらPOSTが入っていました。
で、($ENV{'REQUEST_METHOD'} eq "POST")にしたらうまくいきました。
上の例文は間違っているんでしょうか?
0156nobodyさん02/07/18 16:45ID:???
Perlでは大文字小文字区別すること忘れてないか?
0157fusianasan02/07/18 16:46ID:???
>>155
ネタにしても、もちっとレベルの高いやつを書こうね!
0158nobodyさん02/07/18 16:46ID:yrmBF5Vl
>>155
>メソッドは当然postで。(XHTMLでは大文字は禁止)
と書いてありますが。
0159nobodyさん02/07/18 16:46ID:???
ネタだったか、釣られてしまったよ。
0160nobodyさん02/07/18 16:47ID:???
(゚д゚)ハァ?
なんでそこでXHTMLが出てくるんだ?
0161nobodyさん02/07/18 16:53ID:???
XHTML で <form method="post"... ってやっても、
UA は大文字でリクエスト出すと思うけど。

POST /~gikogiko/cgi-bin/bbs.cgi HTTP/1.1

みたいな感じで。
0162 ◆JAPH9PWA 02/07/18 16:54ID:???
>>155
request-methodの大文字小文字は環境依存な気がする。
lc($ENV{REQUEST_METHOD}) eq "post" とでもするべき。

ていうか、そのページなんか変じゃないか?

> メソッドは当然postで。(XHTMLでは大文字は禁止)

もしかして属性の値も小文字じゃなきゃいけないと思っているのだろうか…。
俺の読み間違い?謎。
その他の説明も質が悪いよ。
そんなページを参考にしてると変な癖がつくから、もっとまともなものを参考にした方がいいよ。
0163 ◆JAPH9PWA 02/07/18 16:56ID:???
レス遅すぎだね。ショボーン
0164nobodyさん02/07/18 16:56ID:???
>XHTMLでは大文字は禁止。
確かに同意だが、それは要素の話。属性値は関係ない。
そのページのpostが間違ってる。POSTと書くべき。
016515502/07/18 17:18ID:???
ネタじゃないです。
いろいろレスが付くと本当にどれが本当なのかわからなくなっちゃいます。
どうかお願いします。
$ENV{'REQUEST_METHOD'} が返す値はpostの時は、
post ですか? POST ですか?
決まっていないですか?
決まっていないとしたら>>162さんのlc(小文字に変換)のやり方をやればいいんですよね?
0166nobodyさん02/07/18 17:21ID:???
>>165
Toupper
0167nobodyさん02/07/18 17:21ID:???
>>165
/POST/i;
0168nobodyさん02/07/18 17:40ID:???
METHOD にpostなんて無い。
0169nobodyさん02/07/18 17:42ID:???
>>168
同意。
0170nobodyさん02/07/18 17:44ID:???
>>168-169
(・∀・)ジサクジエンでした。
0171nobodyさん02/07/18 17:50ID:???
>>168
同意。
0172nobodyさん02/07/18 17:52ID:???
>>168=>>172
(・∀・)ジサクジエンでした。
0173nobodyさん02/07/18 18:24ID:???
http://haruno.fam.cx/~sawatari/text_perlbbs.html?http://pc.2ch.net/test/read.cgi/php/1025930486/l20

REFERER残し晒し
0174nobodyさん02/07/18 19:17ID:???
methodにpostは無いんですか?getはあるんですか?
意味がわからないです。
0175nobodyさん02/07/18 19:50ID:???
get なんてのも無い。
GET ならある
0176nobodyさん02/07/18 22:46ID:???
つまり大文字、POSTとGETしか無いって事ですね?

if ($ENV{'REQUEST_METHOD'} eq "post"){
read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
}
じゃこれは間違いなんですよね?
0177nobodyさん02/07/18 22:48ID:???
間違いです。
0178nobodyさん02/07/18 22:50ID:???
if (uc($ENV{'REQUEST_METHOD'}) eq 'POST'){
\tread(STDIN, $str, $ENV{'CONTENT_LENGTH'});
}
一件落着。
0179nobodyさん02/07/21 15:08ID:oVSm9VL9
個人情報などをCGIを使って、「登録」→「掲載」するときに
テキスト入力をする場所を80個くらい作り、
それらすべてに書き込み&送信しても不具合とかはないですよね?
不安定になるとか、負荷が過度にかかるとか。
複数の人の登録をまとめて行おうと思うのですが。
0180 02/07/21 15:32ID:???
言うことナス!
0181nobodyさん02/07/21 15:47ID:???
>>179
そら、ふざけた負荷がかかる。
って言うかインターフェース悪すぎ。
0182nobodyさん02/07/21 16:11ID:???
>>175
REQUEST_METHODの値は小文字になることもあるって聞いたけど。
だから俺は標準関数のstrcmpは使わないで大文字小文字を区別しないstrcmpを自作して使っている。
0183nobodyさん02/07/21 16:14ID:???
>>182
//i
018418202/07/21 16:14ID:???
>>183
何それ?(^_^;)
0185nobodyさん02/07/21 16:17ID:???
/get/i
018618202/07/21 16:19ID:???
>>185
REQUEST_METHODの中の文字を全てtoupperで大文字にしてからstrcmpにかけろということ?
環境変数の値は変えたくないんだけど・・・
0187nobodyさん02/07/21 16:21ID:???
お前らCGI語るならPerl位常識の範囲で知っておいてください・・・。
0188nobodyさん02/07/21 16:21ID:???
>>186
>環境変数の値は変えたくないんだけど・・・
違う変数用意すればいいじゃん。
おいおい・・・。
018918202/07/21 16:23ID:???
>>187
Perlか・・・・知らないな。

>>188
それだけのために配列を用意するのも面倒。
0190nobodyさん02/07/21 16:24ID:???
>>189
じゃあ死ぬ。
0191nobodyさん02/07/21 16:25ID:???
参照するだけなのにコピーを取る奴って・・・
0192nobodyさん02/07/21 16:26ID:???
>>191
じゃあどうやるのと。
自作strcmpなんて大げさなことするのがベストとは思わない。
0193nobodyさん02/07/21 16:29ID:???
>>192
strcmpなんて書いても7行程度だろ。しかも様々な局面で再利用できるし。
0194nobodyさん02/07/21 16:32ID:???
strcasecmp とか stricmp を知らないのか?
0195nobodyさん02/07/21 16:32ID:???
char buf[10];
int i;

strcpy(buf,getenv("REQUEST_METHOD"));
for(i=0;buf[i];buf[i]=toupper(buf[i])) ;
if(strcmp(buf,"GET")) printf("GET以外\n");
else printf("GET\n");

ここまでするの・・・
0196nobodyさん02/07/21 16:33ID:???
>>194
標準関数じゃない。
0197nobodyさん02/07/21 19:37ID:???
むしろ、stricmpもstrcasecmpも実装されていない環境を教えてほしい。
なおむしろ、CGIで渡される環境変数REQUEST_METHODが、小文字になる
環境を教えてほしい。
考えられるのはクライアントが"Get"等でアクセスしたのがそのまま通されるか、
HTTPDがCGIで環境変数を渡すときに勝手に改変するか。
メソッドはRFC上はcase-sensitiveなので、クライアントがGetやget等で
リクエストしてもエラーを返すべき。それをしないHTTPDはタコ。
無論、メソッドを勝手に改変するHTTPDもタコ。

そんなHTTPDある?
0198nobodyさん02/07/21 20:49ID:???
>むしろ、stricmpもstrcasecmpも実装されていない環境を教えてほしい。
strチンポくらい自分で掻け
>なおむしろ、CGIで渡される環境変数REQUEST_METHODが、小文字になる
意味不明、死ね
>HTTPDがCGIで環境変数を渡すときに勝手に改変するか。
んな訳ないだろ
>リクエストしてもエラーを返すべき。それをしないHTTPDはタコ。
shallだろ、mustじゃねー  やっぱり死ね
>無論、メソッドを勝手に改変するHTTPDもタコ。
妄想ですか?

shallの解釈位自分でやれ
実際問題、Getを飛ばしてくるアンポンタンなクライアントは
存在する、それだけ。

0199nobodyさん02/07/21 20:55ID:???
>>198
>>なおむしろ、CGIで渡される環境変数REQUEST_METHODが、小文字になる
>意味不明、死ね
CGI素人なら黙ってな。

>>HTTPDがCGIで環境変数を渡すときに勝手に改変するか。
>んな訳ないだろ
あるが?HTTPDが環境変数を設定する以上、無いという方が難しい。

夏休みって嫌い。
020019702/07/21 21:15ID:???
えと、>>196で標準関数じゃ無いとあったので、それが使わない原因なのかと
思ったんだけど、ちがうのか。っていうか、自分のプログラムでstricmpな
環境では単純にプリプロで#define strcasecmp stricmpとしている物があるの
で、それで済まない環境があるなら知りたいという意味で聞いたのだけど。

あと、HTTPDに関しても非サポートリストに加えたかったので聞いただけ
なんだけどな。
蛇足ながら、shall じゃ無くて SHOULDね。
0201nobodyさん02/07/21 21:22ID:???
夏が来た。夏が来た。
0202nobodyさん02/07/21 21:42ID:???
>>199
ほー、じゃあGetとリクエストしてGETになる様なHTTPDとやらを
挙げてもらおうかCGIのプロさんよ
0203nobodyさん02/07/21 21:44ID:???
>>202
俺の作ったxllHTTPD。そこ以外はRFC完全準拠だ。
0204nobodyさん02/07/21 21:46ID:???
>>203
あっそ、妄想のプロですか
0205nobodyさん02/07/21 21:49ID:???
>>202
Get とリクエストするのは RFC に従ってない。
0206nobodyさん02/07/21 21:49ID:???
>>205
そこ以外は
0207nobodyさん02/07/21 21:51ID:???
>>205
で、その「従ってない」リクエストをした時にどう動くかと聞いている
JAROに訴えるか?
0208nobodyさん02/07/21 21:53ID:???
何もやらないんじゃない?
そんなリクエストメソッドはないんだから。
0209nobodyさん02/07/21 21:57ID:???
ヲイヲイ
>ないんじゃない?
とは何だCGIのプロさんよ
自分でクライアント書いてGetでその辺のサーバに
リクエストしてみろよ
そんな偏屈サーバに当ったらここに書き込んでくれ
021019702/07/21 22:02ID:???
え、っと、、GetをCGIに通すHTTPDを教えてくださいな・・・

ミンナコワイヨウ…
0211nobodyさん02/07/21 22:08ID:???
>>210  ほぼ全てのHTTPDじゃ無い?
0212nobodyさん02/07/21 22:18ID:???
yahoo.co.jp に
Get / HTTP1.1
HOST: yahoo.co.jp
した結果

HTTP/1.1 400 Bad Request
Date: Sun, 21 Jul 2002 13:17:35 GMT
Connection: close
Content-Type: text/html
0213nobodyさん02/07/21 22:22ID:???
>>212
ヘッダの要素足りてないよ。
0214nobodyさん02/07/21 22:29ID:???
>>212
ムヒョ! MethodNotImplemented返ってきた
あれえおかしいなあ、Getもいけてた筈なんだけどなあ
もしかして、俺間違えまくりチョー-厨房って感じ?
偉そうにしてゴミンナサイ  
今すぐ首括って死にます (チョー死んでお詫び
0215nobodyさん02/07/21 22:29ID:???
すまんかった。

Get / HTTP/1.1
Host: www.yahoo.co.jp


HTTP/1.1 501 Method Not Implemented
Date: Sun, 21 Jul 2002 13:28:12 GMT
Allow: TRACE
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
021619702/07/21 22:54ID:???
まじ?天然だったのかよ。。。もうちょっと弄らせてよ〜ん。
楽しんでたのにぃ。

ちなみに、Netscape-Enterpriseやら、Microsoft-IISにGetで投げると
404が帰ってきます。なぜ404かと問いつめたいですが・・・
この辺のサーバでCGIな所は見つけるの面倒なので探しませんでしたが
たぶん同じでしょう、IISのASPなところも404でした。
んで、GoogleのGWSだけは、200で普通に返してきます。
もしかしたら外部からの特殊クライアントに配慮してるのかも。

なんにしろ、逝ってらっしゃい〜
0217コギャル&中高生02/07/21 23:12ID:8IhQDrIi
http://go.iclub.to/ddiooc/
     
     i/j/ez/対応です

お役立ちリンク集
必ず役立ちます

 サイト管理者お役立ち集
    1日4000HIT以上
↓
http://kado7.ug.to/wowo/
      
     i/j/ez/対応
    
   コギャルとH出来るサイトはここ
ヌキヌキ部屋へ直行便

         ↓
   http://kado7.ug.to/wowo/-a.htm
    
       i/j/ez/対応
0218nobodyさん02/07/21 23:53ID:???
素直に引いたな…
0219nobodyさん02/07/22 06:49ID:1nREPLNC
質問です。
teacup掲示板の無料タイプなんですが、これにアクセス解析を別途に
付ける事は可能なんでしょうか?
いや、自分が付けたいわけじゃなくて、訪問先のサイトにそういう事が
出来るんだったら、しょっちゅう見に逝ってるのが知られるとハズカシーなあ
と思ったのですが。
0220sage02/07/22 07:03ID:rjydbpOU
>>219

掲示板のタイトルなんかがhtmlで記述出来るなら可能だろうよ
掲示板自体に解析機能が付いてたっておかしくないし
0221nobodyさん02/07/22 11:03ID:???
textareaから渡された文字列の改行コードを<BR>に変換したいのですが
これで合っていますか?

$hoge =~ s/\r\n/\x3cBR\x3e/gm;
$hoge =~ s/\n/\x3cBR\x3e/gm;
$hoge =~ s/\r/\x3cBR\x3e/gm;
022222102/07/22 11:03ID:???
一応windowsで、テストしたら出来ました。
022322102/07/22 11:10ID:???
$hoge =~ s/\r\n/<br>/g;
$hoge =~ s/\r/<br>/g;
$hoge =~ s/\n/<br>/g;

もう一つ見つけました。ほとんど同じですが。
スマートとかスマートじゃないとかあるんでしょうか。
0224nobodyさん02/07/22 11:19ID:StGZBnhO
$hoge =~ s/\n\r|\r|\n/<br>/g;
見た目にはこっちのがスマートだけど>>223のが微妙に速い。
自分にとってメリットの多い方使えば?
0225\r\nが逆02/07/22 11:28ID:???
>>224
$hoge =~ s/\r\n|\r|\n/<br>/g;
022622102/07/22 11:34ID:???
ありがとうごぜいました。
022721902/07/22 13:23ID:???
>>220
そうですか、
/bbsで終わっていたアドレスなんですが
場合によっては付けられるんですね、有り難うございました。
0228nobodyさん02/07/22 15:59ID:???
掲示板らしきものを自分で作っているのすが、
log.txtにデータを保存しています。
で、log.txtのパーミッションは666です。
よくCGI配布サイトでログファイルは666にしろと書いてあるのでそのまま真似ました。
ファイルの書き込みは成功しました。
ファイルをFTPでダウンロードして確認するとちゃんとデータがあります。
だけど、ブラウザで直接log.txtを見るとまる見えになっていました。
log.txtには当然パスワードとか大切な情報もあるので自分以外の第三者には見られたくありません。
パーミッションがなんかいけないのかと思い、622にしてみました。
するとブラウザでは403エラーが出て見えなくなりました。
ファイルの書き込みテストをしても正常に動作しました。
これでいいんでしょうか。何か間違っているとこがあれば教えてください。
0229nobodyさん02/07/22 16:24ID:???
ブラウザからアクセスできない場所に置く。
これ、最低限の常識。
0230nobodyさん02/07/22 16:28ID:???
>>228
ファイル名をlog.cgiにする。
023122802/07/23 09:59ID:???
えと、あの、パーミッションの設定はどうですか?ダメですか?
0232nobodyさん02/07/23 10:02ID:???
>>231
サーバによるけどnobodyから見えなくすればcgi(を実行する権限)からも見えなくなる。
0233nobodyさん02/07/23 10:49ID:???
>229
プロバ鯖だとそれができない場合もあるだろ。
そうしたくてもできないとか。
0234nobodyさん02/07/23 11:05ID:???
<form action="./aaa.cgi" method="post">

<input type="radio" name="check" value="1"></input>
<input type="radio" name="check" value="2"></input>

<input type="button" name="mode" value=""></input>   #削除モードに行くボタンにしたい
<input type="button" name="mode" value=""></input>   #修正モードに行くボタンにしたい

</form>
ラジオボタンを選んでもらって実行する対象を選びます。
次に対象を削除するか修正するかのモードを選んで次の画面へ進みます。
下のモードを選ぶ部分のボタンをどうすればいいかわかりません。
<button type="submit" name="mode" value="sakuzyo">削除</button>
<button type="submit" name="mode" value="syuusei">修正</button>

というのを試したんですけど、<button>タグに囲まれた「修正」という値が返ってきてしまいました。
削除ボタンを教えても修正が入っていました。
0235 02/07/23 12:11ID:???
>>231
622とはまた変わったのにしたな。
読み書きともCGIからなら600にできるように直したら?
0236nobodyさん02/07/23 12:22ID:HNBPTziw
SSIからCGIを呼び出すときにデータをつけるとうまくいきません。

たとえば
<!--#exec cmd="./cgi-bin/read.cgi?hoge"-->
だと何もかえってこない(多分CGIが実行されない)

また
<!--#exec cgi="./cgi-bin/read.cgi?hoge"-->
だと[an error occurred while processing this directive]に
なります。

ちなみにCGI単体ではうまく動いています。
もちろんSSIのときは"Content-type: text/html\n\n"をけしてます。

また、データを与えないタイプのCGIは上の方法(cmd=)でうまくいきます。

SSIからCGIにデータをあたえて呼び出すのって無理なんですか?
0237.02/07/23 12:29ID:???
>>234
返ってくる値は「修正」ではなく「syuusei」でしょ?
nameが同じだから後に書いてあるほうが有効になってるだけ。
別々の名前にすればいい。
023823402/07/23 12:42ID:???
>>237
いえ、それが漢字の「修正」が入っているのです。
確かめるとわかると思うのですが、nameを別のにしたら
あとでパラメーター受け取る時modeで読めなくなってしまいますよ。
0239nobodyさん02/07/23 12:51ID:HNBPTziw
<input type="submit" name="mode" value="削除">
<input type="submit" name="mode" value="修正">
にすれば
mode="削除"とmode="修正"がはいるよ

buttonはべつに押したとき値が入るってわけでもなかった気がするな。

どうしてもsyuuseiがいいなら知らん。
0240nobodyさん02/07/23 13:13ID:YKQaMhWj
>>234
<input type="submit" name="del" value="削除">
<input type="submit" name="edit" value="修正">

でdelがdefinedなら削除、editがdefinedなら修正でいいんじゃないの?
0241 02/07/23 14:04ID:???
>>238
mode一つで両方処理させようとするならnameは同じで
valueを別々に。>>239みたいに。
別ルーチンなら>>240みたいに。
024223402/07/23 16:40ID:???
239のやり方で出来ました。
formの中にsubmitが二つあるのに違和感があったのと、
submitのvalueの値がそのままパラメータになるのに気づきませんでした。
ありがとうございました。
0243nobodyさん02/07/23 16:56ID:???
>>236
<!--#exec cmd="./cgi-bin/read.cgi hoge"-->
試してみるなり。
0244nobodyさん02/07/24 16:09ID:???
#!/usr/bin/perl
$|=1;
print <<_HEADER_;
HTTP/1.0 200 OK
Server: NPH-Script
Connection: close
Content-Type: text/html

_HEADER_
$count=0;
while(1) {
sleep(1);
$count++;
print("$count<hr>\n");
}

こんなスクリプト書いて実験してるんだけどNN4.x/Mozilla/NN6/Operaでは
予想通りに約1秒ずつカウントしてくれるんだけどIEだと何も出ないんです。
何が悪いのか教えてください。
0245nobodyさん02/07/24 18:09ID:F9mOipAg
板違いだったらすみません。
自分の利用しているプロバイダのサーバにCGIを置き、
テスト書き込み等動作確認をしました。
その際のテスト書き込みを消したいと思うのですが、
記事を削除するしかないでしょうか?
削除しても記事に削除されたものを含んだ通し番号がついているので、
テスト書き込みをする前の何も書き込みのない状態に戻したいのですが…。
どこかのサイトでファイルを再度アップロードすればいいというような文章を
読んだ気がしたのでプロバイダにやってもらったのですが、消えませんでした。
私が使うCGIはKENTさんのCGIを改造したものをとあるサイトから
ダウンロードしたもので、もともとのスクリプトをテンプレート対応にするため
複数のファイルに分けています。
現在プロバイダにはそのCGIを動かすための2つのファイルを
アップロードしていて、その2つともを再度アップロードしてもらったのですが、
それではだめなのでしょうか?
質問の書き方が悪かったらすみません。
0246nobodyさん02/07/24 18:10ID:???
>>245
バカなんだから自分でできる以上のことはしない。
024724502/07/25 03:23ID:sjq0OBfO
>>246さん
すみません、確かにバカでした…。
CGIの根本がまだ判っていないので…言い訳ですけどね。
>>246さんのレスがちょっと悔しかったので(w それ以上のことがしたくなり、
何とかテスト書き込みをすべて消すことが出来ました(勿論記事削除ではないですよ)。
お世話になりました〜。
0248nobodyさん02/07/25 05:30ID:???
>>244
想像だけど、標準出力閉じないと
セッション貼りっぱなしになるんじゃ無いの?
他のブラウザで上手く行くのが凄いと思う
0249nobodyさん02/07/25 06:31ID:???
>>248
>標準出力閉じないと
閉じていいのか?あれ。
0250nobodyさん02/07/25 10:48ID:???
俺はさっさとclose(STDOUT);してから重い処理してる。
0251nobodyさん02/07/25 11:18ID:???
掲示板を自分で作成しています。

投稿データの削除処理についてなんですけど、データは一個ずつ1行に入っています。
で、削除する対象を判別した後は、data.txtからdata2.txtに1行づつコピーしていって
削除する対象の行になったらその時だけ飛ばして、最後の行まで到達する。
で、data.txtを削除。data2.txtをdata.txtにリネーム。
このやり方しか知らないのですがこれでもいいですか?
他にやり方ありますか?
■ このスレッドは過去ログ倉庫に格納されています