△▲ WebProg 初心者の質問 Part13 ▼▽
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/02/09(木) 16:05:29ID:???質問したいけど、どうしたら良いか分からない。
そんなときは、ここに書き込んでください。
板の住人や、その他が、けなしながら、厳しく教えてくれるかも。
質問する前に、まずはここを読んでね。
【注意事項】
・質問する前にGoogleで検索してみましょう
http://www.google.co.jp/
・環境(ソフトウェアのバージョンなど)は、必ず書いてください。できるだけ詳しく。
後から情報を書き足す、いわゆる情報の小出しは極力避けてください。
・何がしたくて、何ができて何ができないのかを書きましょう
・マルチポスト(複数のスレッドで質問する行為)は絶対に禁止です。
・過去ログは必ず読みましょう。あなたと同じ質問をしてる人がいるかも知れません。
2ch 総合ガイド
http://www.2ch.net/guide/
お願い。
適切な、板、スレ、を発見した場合、誘導してあげましょう。
スレの性質上 age 進行でお願いします。
関連情報は
>>2-3
0017nobodyさん
2006/02/11(土) 13:54:30ID:???0019nobodyさん
2006/02/11(土) 17:23:09ID:SAxLq4wUHTMLのFORMから名前とパスワードを入力してもらい、PHPでデータベースに登録するコードを作りました。
データベース側で名前とパスワードのデータの種類で妥当なものはvarcharでよろしいのでしょうか?
0021nobodyさん
2006/02/12(日) 01:46:38ID:+pADw+zg0022nobodyさん
2006/02/12(日) 15:10:32ID:???0023nobodyさん
2006/02/12(日) 15:36:46ID:???【CGI】こんなCGI探してますver.19
http://pc8.2ch.net/test/read.cgi/hp/1134255607/l50
ただし、もっと具体的な機能の説明をすること
0025sage
2006/02/13(月) 13:18:13ID:???HTMLからチェックボックスで「&gyou=2&gyou=6&gyou=12」等、行数を
POSTしたのをCGIで受け取って、受け取った行数目をCSVで出力し
ダウンロード(表示)するスクリプトを作ろうとしてますが、
複数行ならともかく一行引き抜くのもできてません。。
CSVはヤマトのB2用に作っているので先頭に行番などを書き込んでおくこともできません。
流れ的にはfor文で指定行までループしてwhileでCSVをループ、ifで一致した行を読み込む
なんて意味不明なことしか思いつきませんが、それすらまともに動きません。
ヒントなど是非教えてください。よろしくお願いします。
0026nobodyさん
2006/02/13(月) 15:07:12ID:???> 流れ的にはfor文で指定行までループしてwhileでCSVをループ、ifで一致した行を読み込む
「for文で指定行までループして」のところが余計だから訳解らなくなってるんだと思う。
whileで現在の行数を数えながらループして、
指定の行番号と一致したら必要な処理をする、で良いんジャマイカ
後、具体的なアドバイスを受けたいなら言語指定汁
0027sage
2006/02/13(月) 15:14:23ID:???言語Perlです。forとwhileとifが鍵っぽくて
あれこれやってみたのですがPOSTされた何個かの行数目を
ひとつのCSVにまとめて出力するなんていう書き方がまったくわからず。。
かれこれ1週間ぐらい色んなところ探し回って見つけられておりません。。
0028nobodyさん
2006/02/13(月) 18:06:24ID:???cgi-libならマルチプルは対応してる
某偉大なるK○NTさんのは未対応かもしれん
cgi-libを使ってるなら
my(@selected) = split(/\0/, $in{'gyou'});
で分解すればいいです
0029sage
2006/02/13(月) 18:40:23ID:???特にどちらのスクリプトも使用せず、自前で作ってます。
が、受け取った何個かの行数を分解したあと
どうやって自動的に「その行数目」を連続で抜き出すのかがわかりません。。
お礼出せますので是非お手伝いしていただけたら幸いです。。
0030nobodyさん
2006/02/13(月) 21:37:53ID:???複数の値との比較ができないのかな?それとも行番号が入ってる特殊変数 $. を知らないのかな?
とりあえず @want_line_nums = (2, 6, 12); といった情報は既に取得できてるとして、
ファイルを舐めるwhileループの中で for(@want_line_nums){ if( $. == $_ ){...}_} と2重ループさせても構わないし、
全ての行番号をキーにしたハッシュを作っておいてループ中に if( exists $target{ $. } ){...} と判断してもいいし、
csvの中身を配列に格納しておいて添え字で選択してもいい。
0031sage
2006/02/14(火) 15:02:40ID:???今から作ってみます。それと、特殊変数$.の存在を知りませんでした。。
暗黙の変数以外にも色々とあるのですね。。知識不足でした。
早速やってきます!また報告にきます。皆さんのお助け、本当に感謝です。
0032nobodyさん
2006/02/14(火) 16:02:45ID:d9pRn32tCGIを公開してない、プロバイダーでサーバーサイドプログラムを走らす事ってむりなんでしょうか?
0033sage
2006/02/14(火) 16:14:18ID:???ほぼとかそういうレベルじゃなく、完璧期待通りのものができました!
本当に有難う御座いました。まさに30タンが言ってくれた
特殊変数$.が役に立ち、無事できましたT△T
他にも26タン、28タンも助言有難う御座いました。
30タンに直接お礼したいけどIDもトリもないから直接できないのが残念だけど
このスレのみんなにも感謝の意をこめて、ちょっとだけクォリティ高いことしてきます。
今まで一回しかしたことないや^^;ではまたあとで報告にきます。
0034sage
2006/02/14(火) 17:01:16ID:???お礼を兼ねてますのでお許しを。。
自分は犬が好きなのでそこらへんに寄付という形でお礼をさせていただきました。
ttp://www.h-guidedog.org/
http://m.pic.to/50dxv 振込写真
今日はあえてお金持って来てなかったのを忘れてたので
2170円の中から2000円+手数料60円という形で寄付してきました。
ちゃんと通信欄にここのスレ名書いてきましたよ(w
それではほんとに有難う御座いました!
0036nobodyさん
2006/02/16(木) 00:12:48ID:hjkq5viFhttp://www.fujirockfestival.com/05/
どうやらJavascriptではないようです。
0037nobodyさん
2006/02/16(木) 00:23:21ID:???<div id="header" style="background:url(/a_images/banar/headerimg28.jpg) top center no-repeat;">
の部分かな、アクセスごとに変わるから、CGIで動的に吐いてるみたいね。
でもこの程度なら、鯖負担も考えてJavaScriptでしてください。
003836
2006/02/16(木) 00:36:29ID:???はい、まさにその部分です。
JavaScriptはJavaScriptを切ってる人には無効になるので、
ぜひCGIで実行したいです。
よろしくお願い致します。
0039nobodyさん
2006/02/16(木) 02:13:21ID:???opendir(DIR, "topimg/");
@files = grep { /^\./ && /\.jpg$/ } readdir(DIR);
close(DIR);
$imgcnt = @files;
$imgnum = int(rand($imgcnt));
$imgtag = "<img src=\"$topimg/$files[$imgnum]\">";
004038
2006/02/16(木) 02:17:46ID:???ディレクトリを開く
頭文字がドットで始まっておらず最後が jpg で終わるファイルを @files へ格納 (※ .. は1つ上のディレクトリ、. はそのディレクトリを表す)
ディレクトリを閉じる
見つかったファイルの総数を得る (例として50個)
使用する画像番号を得る(randで0〜49までの数字を得て、intで小数点を切り落す)
HTML のタグを作成
004136
2006/02/16(木) 03:18:10ID:???index.htmlファイルにその画像を読み込みする場合はどうすればよろしいですか?
仮にtopimageフォルダを作りその中に>>39をコピペでindex.cgi(パーミッションは?)を作って
ひとつ上の階層のindex.htmlファイルにそのランダム画像を呼び出したいのですが。
ど素人で申し訳ないです。
0042nobodyさん
2006/02/16(木) 04:10:45ID:???借りている鯖がindex.cgi、index.phpでいけるなら、そのまま利用するか、
index.htmlのインラインフレームでcgiを呼ぶか、
index.shtmlで呼ぶか。
004338
2006/02/16(木) 04:57:23ID:???index.cgi で
open(IN, "index.html");
read(IN, $htmlfile, (-s IN));
close(IN);
$htmlfile =~ s/##TOPIMG##/$imgtag/;
print "content-type: text/html\n\n";
print $htmlfile;
004438
2006/02/16(木) 05:03:00ID:???◆ topimg.cgi
opendir(DIR, "topimg/");
@files = grep { /^\./ && /\.jpg$/ } readdir(DIR);
close(DIR);
$imgcnt = @files;
$imgnum = int(rand($imgcnt));
open(IN, "topimg/$files[$imgnum]");
read(IN, $jpegdata, (-s IN));
close(IN);
binmode(STDOUT);
print "content-type: image/jpeg\n\n";
print $jpegdata;
◆ index.html
<img src="topimg.cgi">
詳細なディレクトリ構造がわからんので、使う際は自分の環境に合わせて変更してください
0045nobodyさん
2006/02/16(木) 05:54:53ID:???004636
2006/02/16(木) 15:48:27ID:???メモ帳にて>>44のtopimg.cgiのopnedir以降の部分をコピペ
↓
topimg.cgiと名前を付けて、index.htmlファイルと同じ階層にアップロード
↓
index.html階層にtopimgフォルダを作成し、そこにjpgファイルをアップ
↓
最後にindex.htmlに<img src="topimg.cgi">を貼り付け
したのですが、うまくいきません。
どこか間違っていますか?
004738
2006/02/16(木) 16:13:59ID:???004836
2006/02/16(木) 16:44:55ID:???英単語の組み合わせのhtml,cssならわかるのですが、特殊な記号などがある言語はとても苦手です。
それぞれの記号の意味などもぐぐってみたのですが、さっぱりでした・・・
よろしくお願いします。
0049nobodyさん
2006/02/16(木) 16:51:38ID:???これ以上は金を払うべきだと思う漏れがいる。
そもそもCGIが使える鯖なのかと。。。
あと、>>44の書いたtopimg.cgiには
#!/usr/local/bin/perl
↑のような最初の一行が省略されている。
自分の環境に合わせたものを書きなさい。
0050nobodyさん
2006/02/16(木) 17:57:09ID:???「家庭教師の2ちゃんねる」で起業したら儲かりそうですね。
0051nobodyさん
2006/02/16(木) 18:09:50ID:???いま自分の会社のcgiを作っています(リライトですが)。
もとのcgiが、web上で問い合わせ情報を記入してもらって、それをリストに落としていくperl
のプログラムで、それに確認画面と、確認メール発送の機能をつけようとしています。
cgiでhtmlを記載して確認画面(「この内容でOK?」みたいなの)はできました。
OKの場合、ボタン押してもらって、もとのcgiのプロセスに戻りたいんですが、戻れません
print '<form action=(このcgiのアドレス) method=post>';
print "<center><b>以下の内容で間違いがないか、ご確認下さい。</b><br>";
print "<center><b>宜しければ下の「送信する」を、訂正があれば「前画面に戻って編集」を、押してください。</b><br>";
print "<table width=80% border=1>";
・・・中略・・・
print "<tr><td width=12%>備考(通信欄)</td><td width=68%> $bikou</td></tr>";
print "</table>";
print '<center><input type="button" value="-送信する-" onClick="return"> <input type="button" value="<< -前画面に戻って編集-" onClick="history.back()"></center>';
print '</form>';
}
最後のところを<input type="submit" value="-送信する-">としてもダメです。
どなたか知恵を貸してください。
長文スミマセヌ
005351
2006/02/16(木) 18:54:18ID:???早速のレス有難うございます。
未熟者で内容がよく理解できておりませんが、
>51の内容はcgiの中のサブルーチンになっていて、cgiの途中でsubにとんで>51を表示したあと
もとのcgiに戻りたいんですが、上手く動かないんです。
Location を調べましたが、そういう機能のものなんでしょうか?
005551
2006/02/16(木) 19:26:39ID:???たびたび申し訳ありません
素人ですいませんが、
Lcationでcgiの何行目指定で飛ばすのは、どうやって書けばよいのでしょうか?
0056nobodyさん
2006/02/16(木) 19:39:58ID:???せっかくLocationというキーワードをもらったんだから
ぐぐって調べるくらいしなよ
0057nobodyさん
2006/02/16(木) 21:26:32ID:???ハッシュを利用した集計について質問です。
@list = (10.10.20.13.15.20.30);
というリストがあったとして、10はn個、20はn個という風に集計するとします。
持っている本では
foreach $cnt(@list){
$shukei{$cnt}++}
で、リスト内の数値をキーとして集計する、と書いてあります。
実際にその通りにやると集計できたのですが
キーとしてハッシュへ格納するのに++を使う理由がどうしてもわかりません。
仕組みはすっとばしてそういうものだと覚えるべきなのでしょうか。
0058nobodyさん
2006/02/16(木) 21:42:38ID:???$shukei{$cnt}++ じゃなくて
$shukei{$cnt} = $shukei{$cnt} + 1 なら納得できるのか?
0059nobodyさん
2006/02/16(木) 21:49:12ID:???いえ、なんで+ 1するのかがわからないんです。
というか、
$shukei{$cnt}は、
%shukei = ($cnt =>n,)という風に捉えているのですが
ここからして間違ってるんでしょうか?
006057
2006/02/16(木) 22:10:40ID:???もしかして
$shukei{$cnt} = undef値(=0)
ということでしょうか。
つまり
$shukei{$cnt}++
↓
$shukei{$cnt} =0+1=1
ということであってますか?
0061nobodyさん
2006/02/16(木) 22:29:10ID:???そうそう、無いキーは自動的に作られる。
んで無い値を数値として扱ったら0とみなされる。
文字列として扱ったら""ね。
「扱う」ってのは数値用と文字列用どっちの演算子を使うかってことね。
006257
2006/02/16(木) 22:40:59ID:???ありがとうございます。だいぶスッキリしてきました!
あともう一つなんですが、>>57のやり方で集計すると、
$shukei{ 10 } = 2;
$shukei{ 20 } = 2;
$shukei{ 30 } = 1;
というハッシュの式になるじゃないですか。
これって何の処理をしなくても
%shukei = (10 => 2, 20 =>2, 30=>1);
という具合に、勝手にリスト化されるもんなんでしょうか。
たびたびすいませんが、ご教授よろしくおねがいします。
0063nobodyさん
NGNG0064nobodyさん
NGNG0065nobodyさん
2006/02/17(金) 00:20:21ID:???$QUERY=preg_replace("/(\.+\/*|member\/)/","",$QUERY);
if($QUERY=='') $QUERY='index';
$fp=fopen(($fname='page/'.$QUERY.'.dat'),'r') or
header("Location: http://example.com/404");
という処理をして、ファイルが存在しない場合は404に飛ばすようにしたんだが、ローカルで実行してみるとレスポンスが非常に長い上CPU負荷が100%近くまでなってしまいました。
処理の結果としてはきちんと404に飛んでるんですが、XREAなどで実行するとタイムアウトされてしまうほどの長さです。
この処理の問題についてご教授お願いします。
006665
2006/02/17(金) 00:34:47ID:lUAE0Mm/0067nobodyさん
2006/02/17(金) 00:37:41ID:???セキュリティ面から考えると不安なのですが、方法はないのでしょうか?
006867
2006/02/17(金) 00:38:33ID:???○他に方法はないのでしょうか?
でした
006951
2006/02/17(金) 01:37:58ID:???ちんたらしてたら日がくれちゃうでしょ!!
なにやってんだよっ!はやくしてくれよ!!
007051
2006/02/17(金) 02:06:00ID:???なんか偽者がw >69は僕じゃないですから
助言してくださった方有難うございます。いまだ解決には至りませんが(泣
0071nobodyさん
2006/02/17(金) 02:31:13ID:yKdX52Ncハッシュはリストとは違うものだからリスト化される、というのがそもそも間違っている。
確かにハッシュの中身をリストとして表現することは可能だし、
ソースに書くときはそういう風に書くけれど、あくまでそれは構文上の話。
ハッシュはその名のとおりデータ構造にハッシュというのを使っている。
これは検索汁。簡単に言えば0~99の数があったとすると1の位が0..9の十個に分類して、
検索に掛かる時間1/10にする、みたいなアルゴリズム。
実際にはこの辺はもっとばらつきが少なくなるような方法を使うけどね。
>>65
exitなりdieなりしてないからそのまま処理を進めてしまっているのが原因じゃ?
あと、それ対策不十分。memmember//という場合を考えてみよう。
まずいのが入っていたらreplaceじゃなくてエラー扱いするべき。$QUERY='index';してしまうとか。
>>67
CGIモードでかつSuEXEC上で動かすしかない。
CGI使えてSuEXECが入ってないということは無いと思うが、
CGI版のphpが入ってなかったりCGI自体使えないサーバだったりしたら、
権限がApacheサーバのものになっちゃってるから残念だけど無理。
0073nobodyさん
2006/02/17(金) 12:01:12ID:Zrn4G6r2例えば10個のファイルをUPしたい場合、10回は参照しないといけないのでしょうか?
0075nobodyさん
2006/02/17(金) 12:36:54ID:Zrn4G6r2写真を一気に10個とか指定できると楽なのですが。
0076nobodyさん
2006/02/17(金) 12:37:11ID:???0077nobodyさん
2006/02/17(金) 12:53:06ID:Zrn4G6r2ajaxな感じで簡単にUPするとか。うーん
0078nobodyさん
2006/02/17(金) 15:47:52ID:???ローカルのファイルをどうこうできると、ピンポイントで特定のファイルを
こっそりアップロードする物ができちゃうんで、かなり制限がかかってる
複数選択ができないのは別の理由かもしれんが
008065
2006/02/17(金) 16:57:53ID:???よくよく考えればロケーションヘッダはブラウザが実行するものでした。
サーバー側で吐かせても処理は続きますからね。
不正文字列の置換処理じゃマズイとは思っていたのですが、memberは未実装なので放置していました。
Traversalは出来ないにしろ、抜け穴が明確になったため先ほど変更しました。
回答どうもありがとうございました。
0081nobodyさん
2006/02/17(金) 17:37:13ID:???それかFlashでも出来たはず
0083nobodyさん
2006/02/17(金) 17:52:59ID:???に ち ゃ ん ね る っ て す ご い ね
0084nobodyさん
2006/02/17(金) 22:54:10ID:CB9LbJEFのように"<>"で区切られたdatファイルをよく見るのですが、
<>ごとに読み取って変数に格納するにはどのような操作をすればよいのでしょうか?
0086nobodyさん
2006/02/18(土) 05:19:30ID:???0087nobodyさん
2006/02/19(日) 13:02:33ID:qZLcstMn1. test.cgiにアクセス
2. test.cgi内で、あるURLにアクセスしてローカルに保存
例: www.yahoo.co.jp/index.html → yahoo.txt
3. test.cgiでyahoo.txtを読み込み、必要な情報をhtmlでprint
perlは多少分かるのでローカルにさえ持ってこれればと思ってます
保存する箇所の簡単な仕組みをお願いします
0090nobodyさん
2006/02/19(日) 19:47:24ID:6/Fk1U6bコントロールパネル -> 管理ツール -> サービス
「ローカルコンピュータのMySQLサービスを開始できません。エラー1058:指定されたサービスは無効であるか、または有効なデバイスが関連付けられていないため、開始できません。」
0091nobodyさん
2006/02/19(日) 19:52:22ID:???それだけだとスレ違い。
データベース板へどうぞ
0092nobodyさん
2006/02/19(日) 20:01:07ID:6/Fk1U6b0093nobodyさん
2006/02/19(日) 22:58:35ID:???0094nobodyさん
2006/02/20(月) 05:54:21ID:???兎に角人に聞く性分であったりするならPerl
ってところか
0095nobodyさん
2006/02/20(月) 07:31:46ID:???チョット作って使い捨てならPHP。とにかく手っ取り早く作りたい人向け。
規模が大きめなものを作るのならJavaか.NET(C#)。個人や趣味プログラマには不要かも。
0096nobodyさん
2006/02/20(月) 09:19:24ID:QuT/2iwf情報ありがとうございます。調べてみます。
0097nobodyさん
2006/02/20(月) 09:27:09ID:???Flashが一番敷居が低いと思う
金銭的敷居ならVBでActiveXってとこだと思う
0098nobodyさん
2006/02/20(月) 12:54:29ID:???0099nobodyさん
2006/02/20(月) 16:55:02ID:???0100nobodyさん
2006/02/21(火) 12:39:55ID:???&A(x,y,z);
&B(x,y,z);
とやって、サブルーチンAには値が渡せるんですが、
サブルーチンBにはわたりません。
いろいろ調べましたが(本とかネットとか)、ちょっと分かりません。
理由として何が考えられるでしょうか?
あとサブルーチンに
sub A{
・・・
exit;
}
とか書くと、なんかまずいんでしょうか?
0101nobodyさん
2006/02/21(火) 13:33:58ID:???0102nobodyさん
2006/02/21(火) 13:49:07ID:???レス有難うございます
subAとsubBにそれぞれ下記のようなことを書いて表示しました
同時には出せないようなので、1度にどちらかだけですが
print <<EOM;
Content-type: text/html
<html><head><title>kakunin</title></head><body>
<form action=http://www.***.cgi method=POST>
<center><b>ありがとうございました。</b><br>
<table width=80% border=1>
<tr><td width=12%>住所</td><td width=68%> 〒$post $jusyo</td></tr>
<tr><td width=12%>電話番号</td><td width=68%> $tel</td></tr>
<tr><td width=12%>FAX番号</td><td width=68%> $fax</td></tr>
<tr><td width=12%>メールアドレス</td><td width=68%> $mad</td></tr>
<tr><td width=12%>備考(通信欄)</td><td width=68%> $bikou</td></tr>
</table>
<br>
<input type=HIDDEN name="conf" value="1">
<center><input type="submit" value="-送信する-"></center>
<center><input type="button" value="<< -前画面に戻って編集-" onClick="history.back()"></center>
</form>
</body>
</html>
EOM
0103nobodyさん
2006/02/21(火) 13:55:33ID:???sub B{
my($x, $y, $z)= @_; # こうやって、渡された値を受け取るんだよ
}
0104nobodyさん
2006/02/21(火) 14:14:54ID:???0105100=102
2006/02/21(火) 14:58:53ID:???それは書いてあります
>>104
sub A{
・・・
exit;
}
を
sub A{
・・・
return;
}
ということでしょうか?パクリ元のcgiにexitとあったのでそのままにしてたんですが?
0106nobodyさん
2006/02/21(火) 15:15:32ID:???0107nobodyさん
2006/02/21(火) 16:23:52ID:???つーかexitの意味ぐらい推測できないのか?
まだえいごをべんきょうしたことのない消防なのかな?
0108nobodyさん
2006/02/21(火) 17:01:53ID:???0113nobodyさん
2006/02/21(火) 21:06:56ID:???0114nobodyさん
2006/02/21(火) 22:17:13ID:???というスクリプトを作っているのですが
以下のスクリプトではなぜだか元の行も新しいファイルに書き込まれ、
しかもsplitしてるのに書き込み時、$a1a等にデータが入りません。
下記スクリプトで不具合箇所があれば是非教えてください。お願いいたします。
ロック処理、エラー表示サブルーチンなどは省いてあります。
log.cgi
-----------
1,test,0
2,test,0
3,test,0
-----------
$logfile_all = "./log.cgi";
@new=();
open(IN,"$logfile_all") || &error("error");
while (<IN>) {
($a1a,$a2a,$a3a) = split(/,/);
if ($in{'no'} == $a1a) {
$_="$a1a,$a2a,1,\n";
}
push(@new,$_);
}
close(IN);
open(OUT,">$logfile_all") || &error("error");
print OUT @new;
close(OUT);
0115nobodyさん
2006/02/21(火) 23:39:16ID:???0116nobodyさん
2006/02/22(水) 00:13:18ID:???レス有難う御座います。
仰るとおり偽の場合の処理、今後加えたいと思います。
現状ではあくまで動作確認の段階なので偽になるはずがないのです。。
どうしてもわからないです。。ううむ。。
■ このスレッドは過去ログ倉庫に格納されています