☆ショッピングカートのCGIを作りたい!Perlで☆
知り合いにWEBショップ作ってくれと頼まれたのは良いけど、 フリーのショッピングカートCGIは設置は簡単でも、商品の登録 とかが手作業だったりで使い勝手が悪いです。 で、短絡的に「自分で作ってみようか」と思っているのですが・・・・ Perlも、いやプログラミングさえ未経験。「必ずわかるCGI」と その他の入門書で何とか「掲示板」の仕組みがようやく理解できました。 やっぱ、無謀ですかねぇ・・・・・・ >>224 原理主義者で無ければ全部MIME::Base64しちまえば良いだろう。 これで困るMUAある? 日本語コードって難しいですね・・・・ 本とか読むと”EUCで書く”って書いてあり、フォームから取得したデータを &jcode::convert(*form, 'euc');でデコード、でsendmailに送る時は &jcode'convert(*name, 'jis');って書いてあるんですが、それでやると 表示が文字化けしたり、送られたメールが文字化けしたり・・・・ でいろいろ試した結果、スクリプトをsjisで保存、フォームでコードは &jcode::convert(*form, 'sjis');メールはjisでデコードしたら今のところ うまく行ってます。ちなみにw2k+IE6での検証です。あとはWinのNNと MACでIE&NNを試してみないと・・・・ うんこすけーぷ4.xのヤロウ、たまにエンコード間違えやがるから、 確実にjis/sjis/eucを判定できる文字を各フォームに突っ込んどいて、 jcode.plかなんかで判定、convertんとき元コード指定せんと、テストで 上手く行ってても稼動させてしばらく経ったらクレームがなんて事が。 # 昔はまったな、これで。 charsetもHTTPヘッダ、METAで両方吐き出しとけ。念には念だ。 >>226 gooとかhotmailとかの有名どころも アカウント取って検証した方がいいよ。 以前 goo ではまったことがある。 スイマセン。どうしてもxrea.comで動かないんです・・・・・ 他のところで垢とって試してみます。 困ったらとにかくへろぅわぅうど! #!/usr/bin/perl #サーバにあわせりゅ print "Content-type:text/plain \n\nHelloWorld."; exit; をウプだ。 これが動かないなら設置/設定方法が悪いかCGIが使えないかどっちかだな。 flockやsymlink、スクリプト本体より上のディレクトリにアクセスしてる 場合なんかもサーバによっては引っかかるぞ。 >>232 1のマメなレスと、微妙なジサクジエンによるものであろう。 >>234 なんか>>1 が叩かれても逆切れせず、氏ったかもしないで真摯にガンバッテイルから、 漏れはいくつか応援出したじょ。 #なんか自分がPerlいじりだしたころを思い出すんだよな、このスレ。 先の鯖でどうしても動かないのですが、ご協力いただいた方へのお礼も含めて とりあえずソースだけでもウプして晒してみます。 コメントだらけの汚いソースですが2週間前にCGIに手をつけた素人という事で 見逃してください・・・・ ttp://cgitest.s7.xrea.com/cart.txt まだエラー処理とかは全然してません。とりあえず動いたというレベルです。 今他の鯖の垢申請中なので動けばまたウプします。 ちなみに自作自演はしてません。てかこんな自作自演できるくらいなこんな苦労しなくていいのに・・・・・(w さまになってきたジャン。 なんかスゲー懐かしい感じだyo 文字コードEUCで送ったら動きました ttp://cgitest.s7.xrea.com/cgi-bin/shop4.htm ただやっぱりブラウザで頻繁に文字化けするし、sendmailで送られる データはバヶバケなんですよね はてさて、何にあわせるのが一番楽なのか・・・・ EUC統一がよさそうなんですが、そうするとブラウザが頻繁にエンコードミスるようなんですが うちのIEのせいでしょうか?それともやっぱりブラウザ出力部はS-JISにしといたほうがいいですか? >>239 <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> だからじゃないの? 少し休め。 CGIが吐き出すHTML、<html>〜<head>〜</head>〜</html>が丸々抜けてんぞ。 shop4.htmはMETAの指定がShift_JISなのにファイル自体はEUC-JPだしな。 よくやったよ。フィニッシュに向けて、まずは寝れ。 ☆ チン マチクタビレタ〜 マチクタビレタ〜 ☆ チン 〃 Λ_Λ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ ___\(\・∀・) < >>1 ねぇねぇまだなの?早く早く〜 \_/⊂ ⊂_ ) \_____________ / ̄ ̄ ̄ ̄ ̄ ̄ /| | ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | 長野りんご. |/ おおー、よくやったなー。お見事。 ちゃんとサブルーチンに分けてあるし。 見やすいし。 別に汚いソースじゃないじゃん。いいんじゃないの? >sub sub_add{ > $ctime=time();#クッキーID作成用要素(時間) > $cid=$$+$ctime;#クッキー用ID 厳密には、クッキー用のIDが足し算だとイカンと思うが・・。 プロセスIDは一回転して戻ってくるから。 Windows だと、プロセスIDはランダムに割り当てられるし。 お褒めの言葉ありがたい限りです。ホントここに来て見てよかったですありがとうございます。 で、文字コードなんですが・・・ 一般的にはスクリプト自体はEUCで書けとものの本には書いてありますよね? ただ、HTML表示はS-JISが一般的(だと思うのですが) たとえばスクリプトをeucで書いて(保存して)フォームからのデータは jcode.pl使ってEUCにコンバートで、スクリプト内のHTML表示部だけMETAタグでs-jis 指定してやればブラウザはちゃんと解釈してくれるんでしょうか? CGIというよりWEB作成の基礎の気もするんですが、今まではDW使ってて 文字コードって意識した事無かったもので・・・・・ 前に書いた通り全てS-JISで統一すれば楽なんですけど、スクリプトがeucじゃないと 動かない鯖にいきなりあたっちゃったもんで・・・・・ あと、この鯖、(てかeucでスクリプト書くと)sendmailで送られたメールが どうしようもなく文字化けするんですよね・・・・ちゃんとコンバートはかけてる はずなんですが。 >>245 $$で得られるIDが3桁みたいだったので重複する可能性も考えtime()とあわせてみたんですが ダメですかね?1秒以内に$$が重複する可能性は無いと思いまして・・・ アクセス数の極端に多い(同時に買物をスタートする可能性が高い)場合は問題になりそうですが・・・・ >>246 内部でEUC処理するなら、出力もEUCで良いんじゃないの。 METAタグと、出力ヘッダの両方でEUCに指定した方がいいよ。 あと、メール本文はJIS出力でいいけど subjectはそれだけじゃダメでちゅ。バケまちゅ。 プロセスIDは、65535 までいくよ。 + って、文字列くっつけるんだっけ? 忘れちゃった。 $cid = "$ctime$$"; とかにしとく方がいいかと思ったんだけど。 あとcgi なら、同時アクセスでも、別のプロセスを立ち上げるから、 同時に買い物をスタートされても平気。 お!キレイにかけてるじゃん 俺のスクリプトよりもキレイだぞ; しかしCGI.pm使ってないの見るの久しぶりなんでなんとも懐かしいにおいがする のう。。。 あ、そうか・・・・数字の足し算だと確かに重複の可能性がありますね・・・ 修正させてもらいます。 で、やっぱりメールの本文の文字化けが解消しない・・・・ スクリプトとHTML出力はEUCで統一したんですが。 @sendml=メールの本文; &jcode'convert(*sendml, 'jis'); じゃダメなんですかね? @sendmlはファイルから読み出して格納してます。 ファイル自体は開いて見るとeucになってるみたいなんですが。 ソースよく見てないんだけど、 @sendmlってことは、配列なんでしょ。 jcodeなら各要素ごとにやらなだめでしょ。 なるほど・・・だとすればファイルに書き込む段階で各要素(変数) をjisでコンバートして最後に一気に読み込んで送信すれば良いんですかね? readparseが見当たらないが、ブラウザから受け取ったデータの汚染チェックはしているかな? たとえばcookieに予想していない文字列突っ込まれたときとか メールの文字化けの件、ほぼ解決しました。ご指導いただいた方ありがとうございました。 >>253 ReadParseってフォームからのデータの取得にしか使ってないんですが、 他にも何か使い方があるんでしょうか?なんやら重要そうな内容みたいですが・・・ ソース見たんですが、ReadParseのあと フォーム要素のハッシュに対してもjcodeで一括変換しようとしてるでしょ。 テストしてうまく行ってるのかもしれないけど、 jcodeは効いてないんじゃないかな。 例えばcookieに"../xxxx%00"とか仕込まれて、汚染チェックをしていないと cartファイルが../xxxxになってしまう。 ブラウザから渡されたデータは全て信用できないものと仮定して汚染チェックを行わなければいけない。 それをReadParseの中でやっているのなら問題はないが、汎用ルーチンのようなのでやっていない可能性大。 お、直ってんジャン、CGIの吐くタグ。 まだ余計な<center>が<body>の前にひとつついてくるが。 EUC統一ついでにHTMLファイルもEUCに統一しちゃうと、フォームから入力される 文字コードはEUCと決め打ちできるから、入力段(&ReadParseのあと)でのコード 変換は要らなくなるぞ。 いま化けるのは>>255 さんの言うとおり、商品ページがSJISで、jcode.plが SJIS->EUCを変換し切れてないからだろう。 (ひょっとするとメールの件もここの変換ミスが一枚絡んでいるかもね) &ReadParse( *form); foreach $key(keys %form){ jcode::convert(\$form{$key}, 'euc'); #現在内部処理をEUC統一したそうなんで } とかのほうがベターだろう。(生書きだから検証してないけど) いろいろありがとうございます。shop.cgiに関しては少しずつ煮詰めていきたいと思います。 さて、これを始めるきっかけにもなった商品用ページ作成用CGIの作成に取り掛かろうと 思ってるのですが、その方法についてお知恵拝借いたしたく。 作りたい商品ページの形式としては今ウプしてあるようなかたちです。 画像ファイルのアップロード等勉強しなくちゃいけないことは山ほどあるのですが、手順として どういうものがあるのか。 今考えてるのは、テーブル一個分の項目(1商品分)を一行としたdatファイルに保存しておいて それにタグを挿入してHTMLファイルを作るというものです。新規商品を追加する時や削除 する時はそのdatファイルを呼び出して編集・削除・追加を行いHTMLファイルを丸々上書きという 方法です。HTMLファイルを直接いじるのはタグなどが邪魔して非常にめんどくさそうなので、 HTMLファイルをいじるのではなく、datファイルを編集してそのたびにHTMLを書き直すほうが 楽かなぁと思ったので・・・・ HTMLを作らずにdatファイルからcgiで表示も考えたのですが、鯖の負荷等考えるとHTML生成しちゃった 方が良い気もしたので。 あとページごとのデザイン等の一括変更とかの機能にはCSS使うしかないですかね・・ 編集、削除が出来る掲示板で、管理者以外カキコ禁止にすれば、あと一ひねりだろう。 画像は専用ディレクトリを作って、ファイルリストをgetして、 BBSの書き込みフォームのページかなんかにWidth/height指定してfilenameと 画像をサムネイル表示。 書き込みフォーム自体にはプルダウンメニュー(select/option)か何かを動的に 生成して、書き込み情報に加えるとかすればOK 画像ウプは説明が長くなるから、まあ「form multipart」あたりでグーグル逝け。 デザイン一括変更は雛型式(デザインを外部ファイルで指定)のBBSを (拾ってく|作)ればいいんでないかい? なるほど、掲示板を応用すれば良いんですね。商品ページは複数ページ作りたいんで、 ・多板作成が可能 ・板毎のデザイン変更が可能 ・書き込み内容編集が可能 ・画像アップロード可 って掲示板探してそれを参考にしてみよう。 ・・・・って思って、画像以外は2ch型改造のAhhanBBSがよさそう なんでソース見てみたら複雑すぎてわけわかめ(鬱 もうちょっと簡単そうなの探してみよう。 というわけでCGI INDEXとCGI ZOOで旅してきます。 ttp://cgitest.s7.xrea.com/cart.txt これみれなくなってるぞ?! けした? おれもソースみてみたいからみせてくれ>>1 なんかだいぶできてきたみたいだね! >>261 スイマセン消してました。 またアップしますのでしばらくお待ちください。 ちょっと仕事がつまり気味で、停滞中・・・・・ >>263 さんスンマソンしばらくお待ちください スイマセン、ちょっと仕事が立て込んでて・・・・ 尻取りスレにでも使っといてください ちと進行が遅くなってるのが残念だけど、無謀者氏とレベルが 近しいので、実用的な読み物としてヲチしてます …ま、目先の仕事優先は仕方なし…かな? >>267 あんたさ、折角なんとかマトナなスレになりつつあったのに、 尻取りスレにでも、は無いだろう。 一体どういう神経してるんだよ。 それじゃ、始めるぞ。 「パール」 >271 まったくだプンプン。 早く帰ってくるのみんな待ってるのに。 「ルビー」 おいおい、本当に>>1 は呆れた奴だなー 「ビール」 >274 しりとり侍かよ! フォッフォ 「ビール」 仕事が忙しいのは仕方ないとして、 ttp://cgitest.s7.xrea.com/cart.txt これの再アップだけでもして欲しい・・・ なぁ、>>1 よ 俺も君と同じようにPerl馬鹿だった。 でもさっきPHPの本を軽く読んでみた。 馬鹿にならんくらい簡単だぞ、これくらいできるようになった君ならあっという間に 完成できるかもしれない。 PHP4をお勧めするよ、マジで。 こんなにセッション管理が楽だとは思わなかったよ。 >>276 お待たせしました。ウプ完了です。 最初のに送料計算用のスクリプトを加えようとしてるんですが、今のところ機能 してません。しばらくいじってなかったらすっかり忘れてるし(w >>271-275 ご協力ありがとうございます。てか、一瞬で終わってるな・・・・ >277 PHPは最初の方でも勧めてくれた方がいたような・・・・ とりあえず現状最もデファクトスタンダードに近いと思われるという事で Perlから始めて見ました。まぁ、こんなタラタラやってるうちにPHP全盛って事に なったりは・・・・しませんよね? というわけでまたボチボチ続きを始めますのでよろしくお願いします・・・(何をだ?) 送料の自動計算と「〜円以上送料無料」のの機能を追加してみました。 未だに微妙に文字化けするのがチョイ鬱・・・・ 文字コードをフォームのHTMLも含めて見直してみます。 >>279 HTTPヘッダのところでも指定した方が良いよ >278 そうだね、現状ではサーバを製作者側で指定できない限りはPHPはまだ使えないね。 シカーシPHPも4になってほぼ機能的に出尽くした感があるし、ぼつぼつ標準設置の レン鯖増えてきたし、WebアプリののRADとして、Perlとはすみわけしながら普及 しそうな勢いがあるな。 ところで設置URIは、上記と同じ ttp://cgitest.s7.xrea.com/cgi-bin/shop4.htm でいいのかえ?最終確認画面で文字化けしちょるようだが なかなかのデザインだのう。 はよ完成して動くことを祈る。 Mac/iCab2.71で見ると、購入ボタンの次の画面でunknown Content-Type: が出よりますな。 CGI中のHTMLヘッダで文字コードを指定する場合って、たとえばeucにしたいのなら "content-type: text/html;charset=EUC-JP\n\n"; で良いんでしょうか?ここで言われたので、ぐぐるで検索掛けてみたら 上のような書き方がちらほらあったので。ただ「文字コード、charset」とかで検索すると ほとんどが<META>タグの記述方法になってるので、いまいちこれでいいのが自信が無い・・・ いまさらながら気が付いたんですが、どの本読んでもhtmlヘッダ に関しては "content-type: text/html\n\n" を書けとしか書いてないんですよね。散々文字コードの事は書いてあってjcode使って コンバートしろとかは書いてあるのに・・・・ スイマセンsage忘れ・・ 間に合いませんでした。 >>285 あってる。 ただ、;のあとに半角スペース入れた方がいいのかな 意味あるのかは知らないけど、みんなやってるということで print "Content-type: text/html; charset=euc-jp\n\n"; でもmetaにも書いてくれると親切だ。 ありがとうございます。ヘッダとMETA両方にしつこいくらいに書きます(w しかし、なんで入門書にこれが書いて無いんですかね? 文字コードの自動判定なんてまともに出来ないヴァカブラウザがゴロゴロしていて 純粋なHTMLはS-JISで書くのが一般的(?)なのに・・・ いくらフォームデータエンコードしても、CGI内のHTML表示部分で ちゃんと指定しとかなきゃ行ったり来たりしてる間にブラウザも迷うっちゅねん! と思うのですが・・・・ ところで、皆さんはCGI内のHTML部にMETAとか<HTML></HTML>書くときに 何処に書いたらいいかわからなくなる事無いですか? 一箇所で完結すれば良いんですがHTML出力を前半と後半をサブルーチンで 分けたり、使いまわしたりする時に、</html>は何処に入れるんだ? とかここは<html>はいるのか?みたいに >>288 そうだよ両方書くんでちゅ。 それが当たり前でちゅ。 ていうかここで2回も書いたんでちゅ。 ヘッダ出力とフッタ(は要らんかもしれんが)を サブルーチンとかモジュール化したら? CGI.pmでもヘッダ出力できるけど、 日本語の場合、文字コードの指定が必要だから ジブソで用意しました。 >>289 うろ覚えだけど、最近の CGI.pmなら 文字コードやContent-Typeとかも 指定できた気がする えらいぞ!短期間でよくここまで! 後は289のいうとうりモジュール化することを進めるよ! あとでつかいまわしができるよ! CGI.pmでヘッダ出力できるよ。 #!/usr/bin/perl use CGI; $query = new CGI; print $query->header(-charset=>'Shift_JIS'); おいらは最初にヘッダを出力しちゃってそれぞれの出力終了時にフッダの サブルーチンに飛ばしてる。 >>289 >ていうかここで2回も書いたんでちゅ。 そうでしたね。いや、読んではいたんですが、どうしても>>285 の方法が はっきり自信持てなかったもんで・・・・ >CGI.pm その辺の事は今後順次勉強していきたいと思います。とりあえずはできるだけ 自分で書くというのも勉強になりますので・・・ >モジュール化 プログラム経験が無いのでモジュールと言うものの概念がいまいちワカランのですが 「良く使うものをサブルーチンにして、それを別ファイルに纏めておく」と言うことで 良いんでしょうか? >>291 ほんとにここでスレ立ててよかったです。本とかWEB情報だけじゃこの短期間ではとてもじゃ 無いけどここまで出来なかったと思います。 調子に乗って「ド素人のド素人のためのCGI入門」のHPでも立ち上げようかな・・とか思ったりしてます(w ここまでやってきて思ったのは「初心者用」とか「入門」といううたい文句の本やWEBの説明も 所詮(失礼ですが)プログラマーの方が書いてるので、「ド素人が如何に無知か」という事がいまいち 理解されて無いようなので・・・ >>292 print $query->end_html これで終れる >「良く使うものをサブルーチンにして、それを別ファイルに纏めておく」 >と言うことで良いんでしょうか? サブルーチンをファイルにしてメインからrequireするあたりがモジュール化の第一歩。 そこから名前空間の概念覚えて、別ファイルのほうpackage宣言してみて、って 少しづつ覚えていけばいいと思うよ。(その先がまだ長いんだけれど‥‥) いきなり.pmモジュールなんていうとワケわかんなくなるからね。 で、商品ページの方はどうよ? >>295 なるほど、そんな単純なものではなさそうですね>モジュール >商品ページ いかんせん仕事の都合で間があいちゃったんで全然出来てません。設計書を作ってる 最中だったんですが、今読み返してみるとようワカラン(w もう一度1からやり直しです。最初はフォームからHTML生成しちゃおうと思ったんですが、 在庫数をカウントしたいので、cgiからdatファイルから読み出してHTML表示させるしか無さそう・・・ HTMLにHiddenで入れようとも思ったのですが、商品が減る度にHTML書き直させなきゃならなそうだし。 ただ、全てをCGIにやらせると鯖の負荷も高くなりますよね?どうしたものか・・・・ >296 open (READ,$filename); @data = <READ>; close (READ); #@dataに対して必要な処理 open (WRITE,">$filename"); print WRITE @data; close (WRITE); 式でやると、.datの件数が増えると負荷もかかるしメモリも喰う。 これは鯖屋さんに嫌われる。(警告が来たり、いきなり垢止められたりする) open (READ,$filename); open (WRITE,">$tempfile"); while($line = <READ>){ #$lineに対して必要な処理 print WRITE $line; }; close (WRITE); close (READ); rename ($tempfile, filename); 式でやるなら、1セッション中に(検索と在庫デクリメント程度であれば) 複数回処理かけても大した負荷(プロセス時間)にはならないし、メモリも 喰わない。この方式で数百〜1万件(行)程度の処理しつつHTMLを吐かせる CGIを一般の複数件のレン鯖に置いているけれど、苦情は来たことがないぞ。 この場合、.datはTABまたはSPACE区切りテキストがいいな。 一般配布のCGIにはカンマ区切りが多いけど、UNIX育ちのPerlのsplitは/\t/ や/\s+/に対し最適化されているから、行数が大きくなったときの処理時間の 差は結構馬鹿にならない。 カンマ区切りだと例外処理がウザい(書き込み時にデータにカンマがないか チェックするか、Excelなcsvにすべくクオート処理せねばならん。後者の場 合、単純にsplit出来なくなる)しね。 プチECとしてはデータ内に半角スペースも含まれるだろうから、TAB区切りが 一番いいだろう。 えーとパスワード認証してるCGIに直接アクセスするにはどうしたら? フォームが <input type="password" name="pass" size="10"> <input type="hidden" name="mode" value="login" > になっていて、 &ReadParse(*form); $pass=abc; $fpass=$form{'pass'}; if ($fpass eq $pass){ #−−−メニュ画面ーーーーー# } ってなってるんですが、後の(他の)処理の中でその処理終了後 メニューに飛ばしたいんです。hogehoge.cgiになんかくっつけて呼び出す(?pass=とか?) ような感じになるんじゃないか?というところまではたどり着いたんですが・・・・・ すいません。書き方悪かったですね・・・・流れとしては フォーム(HTML)からパスワード入力>menu画面(menu.cgi)>データ入力 >データ入力後refreshでもう一度menu画面に戻る。 てのをやりたいんですが、戻り先をmenu.cgiにするのにパスワード を渡す方法をがわからないんです。そもそもFORMのinputで渡すような項目を Formを使わずに渡す方法ってどんなのがあるんでしょう? >>300 方法としてアドレスに埋め込む(リフレッシュ先のアドレスに仕込む) hoge.com/menu.cgi?id=hoge&pass=hoge HIDDENを使う データ入力の度に <INPUT HIDDEN NAME=id VALUE=hoge><INPUT HIDDEN NAME=pass VALUE=hoge> これを必ず仕込んでおく なお、どちらの方法でもmenu画面で逐次パラメータを取得して次に渡す必要がある 的外れの返答かな? 自己訂正 当然ながらHIDDENを使うときはFORMタグを必要としますからね。 ありがとうございます。その辺を知りたかったんです。 つまり、通常フォームから <input type="password" name="pass" size="10"> <input type="hidden" name="mode" value="login" > と言う内容をsubmitボタンを押すことにより送信するんですが、 その内容をフォームを使わずに渡す方法を知りたかったんです。 >>301 の説明だと menu.cgi?mode=login?pass=123 とかで良いんですかね? でスクリプト中で$loginpass=123とか指定しておけば、cgi内から上記のように リンクかける場合は menu.cgi?mode=login?pass=$loginpass としておけば大丈夫って事ですよね? とりあえずやってみます。 >>303 そのとおり。 あと老婆心ながらHTMLのタグを書くときに""(クオーテーション)はいらない。 ""がいるのはスペースが含まれる場合のみ。 ""を省略するだけで結構処理スピードがあがるよ。 ありがとうございました>教えてくださった皆様・ うまくいきました。 ちなみにこれと同じ方法を使ってFORM内の Submitボタンを画像とかに置き換える事は可能なんでしょうか? ボタンの変わりに画像貼ってそれのリンク先をmenu.cgi?neme=submit ってやるとsubmitボタンとして動作します? 皆様いつもありがとうございます。 商品ページ作成部分が若干出来たのでウプしました。 ttp://cgitest.s7.xrea.com/cgi-bin/admin.htm から入れます。パスワードは「123」です。 今のところ、商品カテゴリーの作成と商品の追加しか動きません。 カテゴリーを追加した後に商品を追加する事になります。既存のカテゴリーは 「商品群1」と「商品群2」です。 商品群1の内容は ttp://cgitest.s7.xrea.com/cgi-bin/main.cgi?mode=show&fname=test で 商品群2の内容は ttp://cgitest.s7.xrea.com/cgi-bin/main.cgi?mode=show&fname=test2 で見られます。 カテゴリーを新規作成の際のファイル名は拡張子無しで。新しく作ったカテゴリーの 内容を見るときは ttp://cgitest.s7.xrea.com/cgi-bin/main.cgi?mode=show&fname=”作成時につけたファイル名” できるはずです。 あ、今現在新規商品作成時に指定したオプション項目は反映されません。 「,」で区切って入力してもらって、そこからセレクトボックス生成させる のを今作ってます。 うーん、せっかく上手くいっているところに水を差すようだが、 URIでパスワード指定やっちゃうと、認証もクソもないぜ。 URIがバレた時点でソッコーで改ざんされっぞ。 googleツールバーの高機能版では閲覧中のURI自動通知されちまうしな。 「登録しました」のページに「メニューに戻る」ボタンをつけて、 hidden渡しじゃだめなんかい? どうしてもrefreshでやりたいなら、refererとってCGIと認証ページからの アクセスのみ許可するとかやってやんねーと。 >>311 確かにそれは思ったんですけど、一応pass入れたあとの管理者用画面だから 大丈夫かな・・・と考えてたんですが・・・・・ hiddenで入れてもソース見ればそのままpassが見えちゃうわけですし・・・・ >>312 postで(formから)passが入ってこないときadmin.cgiがエラーメッセージ吐いて 終了するようにすりゃいいんだよ。したら、URIがバレても簡単にはアクセスでき ないだろ? #!/usr/bin/perl require 'cgi-lib.pl'; my $method=$ENV{REQUEST_METHOD}; $pass='123'; &ReadParse(*form); if ($form{'pass'} ne $pass or $method ne 'post'){ #passミスマッチとGET拒否 print "Content-type: text/plain\n\nForbidden."; exit; } #──以下処理。formを吐く場合は必ず #<input type=hidden name=pass value=$pass>を仕込む GET全拒否しちまってるけど、たとえば、こうよ。 >hiddenで入れてもソース見ればそのままpassが見えちゃうわけですし・・・・ 上みたいな処置しときゃadmin.cgiにマトモにソースを吐かせるのに絶対にpostで pass渡さなきゃいけねーから、過信は禁物だがpassを知らない限りソースも見れん ワケよ。admin.htmにはpass書くわけじゃねーんだしさ。 #漏れはCGI.pm詳しくないんだが、CGI.pmでpostとgetの読み分けは出来んのかなあ。 #詳しい奴フォロータノム 後、>>311 でも書いたがrefererとって ttp://cgitest.s7.xrea.com/cgi-bin/admin.cgi ttp://cgitest.s7.xrea.com/cgi-bin/admin.htm 以外からのアクセスは弾いちまえばいいんだよ。 ちょっと機能追加 登録済み商品の修正が出来るようになりました。 >商品登録テストしてくれて人 今のところ、文字置換やエラー処理全然いれて無いので、コメントのところで 改行入れるたり、新規ページ作成時に、ファイル名入れないと、データボロボロになります(汗 明日(今日か・・)必要フォーム項目未記入時のエラー処理と、改行その他、文字列の 置換処理を出来るようにします。 >>311 =313 なるほど・・・・と入っても、いまいち管理用画面でのその辺のセキュリティの必要性が 理解できて無いんですが・・・・・ どっちにrefererとって弾く事だけはやっておいた方がよさそうですね。 ところで、今回、新規データ入力時に @data=($no,$hoge,$mona,$gik) $line=join("\t",@data); open(FH,$file); @logdata=<FH>; close(FH); open(WRITE,">$file"); print WRITE $line; print WRITE @logdata; close(WRITE); として、新しいものが上に来るようにしました。 で商品修正時にココの前で教えてもらった方法2の応用で @newdata=($no,$hoge,$mona,$gik); $line=join("\t",@data); open(IN,"$file"); open(TMP,">$temp"); print TMP "$line; while(<IN>){ my @cell = split/\t/; if($cell[0] ne "$no"){ print TMP; } } rename($temp,$file) ってやってるんですが、この方法だと、修正したファイルがデータの一番上(一行目)に 来ちゃうんですよね(そういう風にしてるんですが) これって、たとえば4行目のデータだったら、また同じ所にかき戻す方法ってどうやれば良いんですか? if($cell[0] ne "$no"){ print TMP; の後に if($cell[0] eq "$no"){ printTMP $line; でうまくいかなかったです。書く位置がまずかったんでしょうか? $noは数値だよね? なら、 while(<IN>){ my @cell = split/\t/; $_ = $line if $cell[0] == $no; print TMP; } で数値評価したらどうかな? なんとなくだけど、$cell[0]か$noに空白とか含まれてそうだったんで。 >>316 うまくいきました。ありがとうございます<IN> で変数が$_に入ってるってのがすっかり頭から飛んでました・・ ところで、正規表現なんですが、たとえば$priceに半角数字以外(「,」とか)が入ってた場合に エラーを表示させるのって if ($price eq ~/\D/){ print "価格はカンマ無しの半角数字で入力してください"; } で良いんですよね? >>317 全然違う。検索は $scalor =~ /$hoge/; だぞ。 if ($price =~ /\D/) { print "価格はカンマ無しの半角数字で入力してください"; } まあがんばれ。 ↑の通りに書いてみたら,半角数字も弾かれちゃいました・・・・・ そうだと思うんですが・・・・ だから $price=~/\D/; だと「$priceに数字以外のものが含まれていれば」 って事になりますよね? のはずなんですが・・・・弾かれちゃうんですよ・・・ もう一度ソース見直してみます。 ってかさ、数字以外は取り除けばいいんでない? そっちの方がユーザーライクだと思うが。 $price =~ tr/0-9//cd; read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる