○.datから情報を取り出し、○.htmlへ表示

このQ&Aのポイント
  • CGI初心者が「リンクラリー」というフリー配布のCGIを使用しています。
  • 「user_alcheck.html」と「user_linkck.html」の2つのファイルについて質問があります。
  • 「user_alcheck.html」と「user_linkck.html」に「サイトバナー/<!--SITEBANNER-->($sitebanner)」を表示させたいです。
回答を見る
  • ベストアンサー

○.datから情報を取り出し、○.htmlへ表示

お世話になります。 CGIはフリー配布のものを触る程度の初心者で、足りないことを申し上げてしまうと思いますが教えていただけますと嬉しいです。 今、「リンクラリー」というフリー配布のCGIをさわっています。 CGI配布元様:http://exdreams.net/room/contents/e_lrarry.html 登録されたリンク先の情報「rsite.dat」から情報を読み込んで書き出すページがいくつか一括ファイルに格納されているのですが、その中の「user_alcheck.html」と「user_linkck.html」の2つのファイルにつきましての質問です。 件2つのファイルには「サイト名/<!--SITENAME-->($sitename)」がすでに書き込み・表示される仕様になっているのですが、そこにプラスして「サイトバナー/<!--SITEBANNER-->($sitebanner)」も同時に表示されるようにしたいです。 「larry.cgi」の175行目あたりに、 #************************************** sub linkcheck{ #リンク元チェック (略) $sitename = $y3[5]; if ($ref ne $y3[9]){ &html_checkindi("rarry_linkck.html","id","ref","sitename"); } &getcookie if ($uid eq "") || ($upass eq ""); if (($uid eq "") || ($upass eq "") || (!-e "./user/$uid.dat")){ &html_checkindi("user_rgnize.html","act","ref","id"); } open (IO,"+<./user/$uid.dat"); eval{flock(IO,2)}; @y2=split(/<>/,<IO>,5); if (crypt($upass,$y2[3]) ne $y2[3]){ close(IO); &html_checkindi("user_rgnize.html","act","ref","id"); } if ("<>$y2[4]" =~ /<>$id<>/ig){ close(IO); &html_checkindi("user_alcheck.html","sitename"); } $y2[4].=$id."<>"; truncate(IO,0); seek(IO,0,0); print IO $nowtime."<>$y2[1]<>$y2[2]<>$y2[3]<>$y2[4]"; close (IO); print "Set-Cookie:id=$uid; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; print "Set-Cookie:pass=$upass; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; &html_checkindi("user_linkck.html","sitename"); } #************************************** という箇所があるのを見つけたのでここをいじれば何とかなるのかな。。までは素人ながらに分かり、似たようなQ&Aを探して挑戦してみたのですが撃沈でした。 参考になるサイトや、もしヒントなどいただけましたら嬉しいです。 よろしくお願いいたします。

  • CGI
  • 回答数1
  • ありがとう数15

質問者が選んだベストアンサー

  • ベストアンサー
  • ariman_
  • ベストアンサー率45% (27/59)
回答No.1

簡単に動作確認をしていますが、改造は、自己責任でお願いします。 動作がおかしいと思ったら、元に戻してください。 > という箇所があるのを見つけたのでここをいじれば何とかなるのかな ご質問に記述されている箇所の修正のみで出来ると思います。 larry.cgiの222行目付近と232行目付近にある &html_checkindi("user_alcheck.html","sitename"); と &html_checkindi("user_linkck.html","sitename"); のそれぞれ "sitename" の後に ,"banner" を追加して下さい。 &html_checkindi("user_linkck.html","sitename","banner"); このように。 204行目付近にある $sitename = $y3[5]; の前の行に、以下のどちらかを記述します。 ([サイトバナーの登録がない時]の対処方法の選択) ・仮バナーを表示する $banner = $y3[7] ? qq|<img src="$y3[7]">| : qq|<img src="仮バナーのアドレスを記述">|; ・仮バナーは表示しない $banner = $y3[7] ? qq|<img src="$y3[7]">| : ''; --------- そして、user_alcheck.htmlとuser_linkck.htmlをテキストエディタで開き <!--BANNER--> を好きな場所に記述してください。 これで多分、大丈夫だと思います。

okpokapoka
質問者

お礼

お世話になります。 早速のご回答をありがとうございました。 丁寧なご説明にくわえ、動作確認までお手数をおかけしてすみません。 ご指示いただいた通り、構文の中に必要なものを記入して実行してみたところイメージ通りの表示が実現しました! &html_checkindi("user_linkck.html","sitename","banner");としなければならないポイントまでは何となく行き着いていたのですが動かず、ご回答をいただいて「なるほど!」と感動です。バナーをどうするのかの命令が全くできていなかったので何も反応がなかったのですね…。 とても勉強になりました。 この度はお世話になりました。本当にありがとうございました!

関連するQ&A

  • ヒットした行への上書き

    お世話になります。 今ブラウザゲームの編集しているのですが、一箇所動作が上手く行かない箇所がありご質問させて頂きました。 行いたい作業としては「前ページで受け取ったID(in{'id'})というデータの行がa.cgiにあった場合、編集して上書き保存」という作業です。 open(IN,"./data/a.cgi"); @UNIT_DATA = <IN>;     $uid = $in{'id'} ; close(IN); foreach(@UNIT_DATA){ ($uid,$lchara,$lname,$houshu,$comment,$nouryoku,$flg,$y_con,$times,$ninki)=split(/<>/); } ##flgが2の場合は以前に戦闘経験あり if($uid eq $mid && $flg eq 2){ $maxtotal=$mstr+$mvit+$mint+$mmen+$mdex+$magi; $flg = 0; $y_con = 0; }else{ ##雇用フラグ $flg = 0; ##派遣先国 $y_con = 0; ##能力値の計算 $maxtotal=$mstr+$mvit+$mint+$mmen+$mdex+$magi; ##回数を0にセット $times = 0; ##人気を0にセット $ninki = 0; } @UNIT_DATA = (); unshift(@UNIT_DATA2,"$mid<>$mchara<>$mname<>$in{'unit'}<>$in{'com'}<>$maxtotal<>$flg<>$y_con<>$times<>$ninki<>\n"); open(OUT,">./data/a.cgi") or &error('データを書き込むことができません。'); print OUT @UNIT_DATA; print OUT @UNIT_DATA2; close(OUT); 現在a.cgiには複数行別々のデータが入っているのですが、上記のプログラムを実行すると、実行した際のデータのみ保存され、他がすべて消えてしまいます。 これをその行だけ編集して上書きすることはできないでしょうか? 補足や分かりにくい点などあれば随時させて頂きますので何卒よろしくお願い申し上げます。

    • ベストアンサー
    • CGI
  • データを読み込んだ時・・・・

    すいません。初心者です。以下のようにデータを読み込んだとき、ifの条件部分 $form{'user'} eq $userid と、 $form{'kojimail'} eq $mail は、 ちゃんと判定してくれるのですが、 「$hantei eq $hanteiari」 は、判定しません. たぶん何かが違うんだと思いますが・・・・(>_<) 読み込んだデータ $hanteiari は、データベース内で、hanteiari と入力されています。何卒よろしく御願いします。 ★データベース情報 登録ID:名前:メールアドレス:性別:年齢:hanteiari:認証ID ★CGI #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*form); require 'jcode.pl'; &jcode'convert(*form, 'sjis'); open(ENQ, "<enquete.dat") || die "File 'enquete.dat' Open Error."; @dad= <ENQ>; $hanteiari= "hanteiari" foreach(@dad){ ($userid, $name, $mail, $sex, $age, $hantei, $kuuhaku )=split(/:/, $_); #ここです↓ if( $form{'user'} eq $userid && $form{'kojimail'} eq $mail && $hantei eq $hanteiari) {$ari =+10;} } if($ari< 5 ){ $atari =20;} close(ENQ);

    • ベストアンサー
    • CGI
  • フォームのアクションから引数をとる

    <form action="test.cgi?ref=5" method="post"> このような感じで、引数を送ります。 my $cgi = CGI::new(); my $ref = $cgi->param('ref'); if ($ref eq 0){ (省略) }elsif ($ref eq 5){ こんな感じでプログラムを書きました。 アドレスを見ても、ちゃんとref=5となっていますし、 普通に<a href="test.cgi?ref=1">などのリンクから飛べば、指定したifの処理に入ります。 しかし、 <form action="test.cgi?ref=5" method="post"> 上のフォームのsubmitから送ると、ref=5のifが判別されません。 どうすれば、判別してくれるのでしょうか? ご存知の方がいらっしゃいましたら、ご教授ください

    • ベストアンサー
    • CGI
  • ファイル表示・削除CGI

    ディレクトリ内の特定ファイルの表示と削除が出来るCGIを探しています。 「CGIScriptMarket」さんの「Web_Index」で出来るのですが、このままでは全部のファイル・下位ディレクトリを表示してしまうため使えません。改造が必要なのですが、良い方法が見つかりません。 表示したいのは「jpg」ファイルのみです。 そこで、消極的ですが、リスト振り分けを行っているであろう部分に(CGIの60行目当たり"foreach (@list) {"内に) (($_ eq '.') or ($_ eq '..') or /\.cgi$/ or /\.htaccess$/ or /\.pl$/ or /\.dat$/ or /\.db$/) and next; を追加しました。これで他のファイルは表示しなくなりましたが下位ディレクトリを表示してしまいます。 この方法ではなく、「jpgファイルだけを表示する」方法があるでしょうか? 素人的な文章だと if(@list eq .jpg){表示する…} これもおかしいですよね。eqだと"同じ"にならないとだめですよね。他にちゃんとした書き方があると思うのですが… さらに、保存される画像を誰が消しても言いというわけではないです。IDとPASSによって入場した場所にこのCGIを設置します。 画像はIDと日付という組み合わせで保存されます。(0001-031013.jpgのような形) そこで、ユーザーIDが入っている画像のみ表示するという機能も必要です。 仕方は上の方法とかぶるかもしれませんが、文字列の一部に含まれるものと比較する(この表現もおかしかったりして…)仕方も良くわかっていません。 以上2点ですが、説明不足かもしれません。何をしたいのかが良く伝わっていなければ補足お願いします。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 会員ページ SESSIONについて

    レンタルサーバはさくらインターネット、プランはプレミアムです。 PHPは5.2.171、MySQLは5.1です。 login.phpから各メンバーのIDとPWを入力してデータベース内ののデータと一致したら、main.phpにLocationでとぶようにしています。 2日前ほどからログインができなくなり、大変困っています。(それまでは問題なくログインができた。) 原因はわからないのですが、色々検証したところ、 login.phpでログインしたときにmain.phpでIDが取得できていないということがわかりました。 コードは下記のようになります。 login.php if ($uid != "" || $upass != "") { $link = mysql_connect($DB_HOST,$DB_USER,$DB_PASS); mysql_select_db($DB_NAME,$link); $uid = mysql_real_escape_string($uid, $link); $upass = mysql_real_escape_string($upass, $link); $userQuery = sprintf("SELECT count(*) as `cnt` FROM `member` WHERE `id`='%s' AND `password`='%s'",$uid,$upass); $userResult = mysql_query($userQuery, $link) or die(mysql_error()); if ($row = mysql_fetch_assoc($userResult)) { $count = $row['cnt']; if ($count == 1) { session_start(); $_SESSION['ok_flg'] = 1; $_SESSION['uid'] = $_REQUEST['id']; header("Location: main.php"); exit; } else { $msg = '<p class="error">ユーザーIDまたはパスワードが違います。</p>'."\n"; } } else { $msg = '<p class="error">ユーザーIDまたはパスワードが違います。</p>'."\n"; } } 省略部分が少しありますが、特に問題ないと思います。 main.php session_start(); if ($_SESSION['ok_flg'] != 1) { header("Location: /"); exit; } if (!isset($_SESSION['uid'])) { header("Location: /"); exit; } $uid = mysql_real_escape_string($_SESSION['uid'], $link); $userQuery = sprintf("SELECT * FROM `member` WHERE id='%s' ",$uid); $userResult = mysql_query($userQuery, $link) or die(mysql_error()); if ($row = mysql_fetch_assoc($userResult)) { $user_name = $row['user_name']; } echo $user_name; としています。 ここからが問題なのですが、 1.ログインするとSESSIONファイルが2つ発行されてしまう。  1つ目は空のファイル。2つ目がIDなどが記載されているファイル。 main.phpのsession_start()を取ると1つのみの発行。(IDなどが記載されている方。) 2.main.phpに切り替わったときに$_SESSION['ok_flg']と$_SESSION['uid']の値が取得できないためlogin.phpに戻される。 3.main.phpのsession_start()を取ればページは表示されるが、session_id()も$_SESSION['ok_flg']と$_SESSION['uid']の2つも取得できない。 3.main.phpでsession_start()を取れば他のページはsession_idは取得できるが$_SESSION['ok_flg']と$_SESSION['uid']が取得できない。 4.session_start()と併用で$_GETも使用しているページがあるが$_GETを使用しているページも2と同じ現象になる。 以上ですが、お分かりになる方がいらっしゃいましたら、教えていただけないでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • perlでURLに引数を入れるで表示する方法

    現在以下のURLで正常に表示しています。 http://hoge.jp/i.cgi?id=a これを http://hoge.jp/i.cgi?a で表示させたいと思うのですが、ウエブで調べましたら「METHOD=GETで渡す」方法が現在のやり方 で「コマンドライン引数で渡す」方法に変えたいのですが、perlの記述がいまいちわからず迷ってます。 プログラムはファイルを読み込んで if ("$idno" eq "$id") のこの$idの条件式でヒットさせているものになります。 変数記述等アドバイスいただけますと助かります。 うまく説明できずすみません。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 同名ID、同名画像ファイル名があったらエラー表示

    CGI勉強中です。既に同名の商品id_num及び画像ファイル名gazouが存在する場合、エラー表示する場合、コードの書き方がわかりません。 教えて下さい。 --------------------------------------------------------------- # 商品登録処理 sub goods_regist { if ( $in{'id'} eq '' ) { &error ('エラー','IDが未選択です'); } if ( $in{'id_num'} eq '' ) { &error ('エラー','商品個別番号が未入力です'); } if ( $in{'goods'} eq '' ) { &error ('エラー','商品名が未入力です'); } if ( $in{'tanka'} eq '' ) { &error ('エラー','商品単価が未入力です'); } if ( $in{'id_num'} eq '' ) { &error ('エラー','商品個別番号が未入力です'); } if ( $in{'ad_amount'} eq 'text' && $in{'ad_amount2'} eq '' ) { &error ('エラー','個数設定が不正です'); } if ( $in{'ad_amount'} eq 'list' && $in{'ad_amount3'} eq '' ) { &error ('エラー','個数設定が不正です'); } $goods_data = "$goods_dir/$in{'id'}.cgi"; open (DATA,"$goods_data") || &error('オープンエラー','商品データファイルが開けません。'); @LINES = <DATA>; close (DATA); $count = @LINES; if ( $count == 0 ) { $num = 1; } else { @lists = $LINES[-1]; $num = $lists[0]; $num = $num + 1; } &lock2; open (OUT,">>$goods_data") || &error('オープンエラー','メール設定ファイルが開けません。'); print OUT "$num\t$date_now\t$in{'id'}\t$in{'id_num'}\t$in{'goods'}\t$in{'tanka'}\t"; print OUT "$in{'ad_amount'}\t$in{'ad_amount2'}\t$in{'ad_amount3'}\t$in{'rem'}\t\n"; close (OUT); # 画像アップロード処理 ################ $filename = $in{'gazou'}; $gif = 1; $jpeg = 1; $macbin=0; foreach (@in) { if ($_ =~ /(.*)Content-type:(.*)\/(.*)/i) { $tail=$3; } if ($_ =~ /(.*)gazou=(.*)/i) { $fname=$2; } if ($_ =~ /application\/x-macbinary/i) { $macbin=1; } } $tail =~ s/\r//g; $tail =~ s/\n//g; $filename =~ s/\"//g; $flag=0; if ($image_up eq '0') { $flag=1; } if ($tail =~ /gif/i && $gif) { $tail=".gif"; $flag=1; } if ($tail =~ /jpeg/i && $jpeg) { $tail=".jpg"; $flag=1; } if (!$flag) { if ($fname =~ /.gif/i && $gif) { $tail=".gif"; $flag=1; } if (($fname =~ /.jpg/i && $jpeg) || ($fname =~ /.jpeg/i && $jpeg)) { $tail=".jpg"; $flag=1; } } if (!$flag) { &error("アップロードできないファイル形式です","lock"); } $upfile = $in{'gazou'};

  • CGI Perlでの認証について

    CGIにてログイン認証の処理を使用してみたく勉強がてら Perlにて作成しているのですが、どうもうまくいかない ので質問させてもらいます。 ID・パスワード保存用ファイルfile.datにあらかじめ 100<>p34z7 500<>332bdz といった感じで入力してまして、 ログインボタンを押したときに &login_chk($post{'id'},$post{'pwd'}); (URIデコード処理して$post{'id'},$post{'pwd'}を取得します) を実行して下記サブルーチンを呼び出します。 sub login_chk { my ($in_id, $in_pass) = @_; my ($id, $pass); my $data; if (!open (IN, "./file.dat")) { &Error("ファイルが開けません"); } while ($data = <IN>) { ($id, $pass) = split(/<>/, $data); if ($in_id eq $id){ last; } } close(IN); unless ($in_pass eq $pass) { &Error("正しいID・パスワードを入力してください"); } } ※現状ファイルロックの処理はしてません。  パスワードの暗号化もしてません。 で、IDに100、パスワードにp34z7と入力してログインしようとするのですが 「正しいID・パスワードを入力してください」とエラーが出てきます。 当然500のときも同じくエラーでした。 どこが問題なのでしょうか?昨日から考えてずっとわからないのでご回答よろしくお願いします。

    • ベストアンサー
    • Perl
  • A.cgiで認証チェックされてから、B.thmlが表示されるようにしたい。

    1/17付CGIについての質問の関連です。 質問はパスワード付forum.cgi(付録フリーCGI)で、forum.cgiを入室後、ID&PW情報をA.cgiに渡したまま、新しいHTMLウィンドウを立上げることでした。 この質問は、こちらの教えてGOOでご教授いただきました。ありがとうございます。 できたCGIでは、A.cgiでID&PWを入力しないでも、B.thmlが表示されてしまいます。 # ID/PW認証 # sub pass_check { local($time,$time2,$inpw,$flag,$id,$pw,$check); # 時間を取得 $time = 略; $timeout = 略; $password = '略'; $pwdfile = '略; #中略 if ($in{'id'} eq "") { &header; print "<table><tr><td>\n"; print "<td><form action=\"$script\" method=\"GET\"onsubmit=\"window.open('B.html,'new')\">\n"; print "<tr><th><UL><LI>すでにパスワード取得済みの方は・・・略 print "<tr><th>ログインID<th><input type=text name=id size=8></tr>\n"; #中略 print "<tr><th colspan=2><input type=submit value=' 認証する '></tr>\n"; #中略 if ($in{'pw'} eq "") { &error("パスワードの入力モレです"); } $flag=0; open(IN,"$pwdfile") || &error("Open Error : $pwdfile"); while (<IN>) { ($id, $pw) = split(/:/); if ($in{'id'} eq $id) { $flag=1; $pw=~s/\n//; last; } } close(IN); if (!$flag) {&error("該当のIDは見当たりません"); } $check = &decrypt("$in{'pw'}", "$pw"); if ($check ne "yes") { &error("パスワードが違います"); } # パスワードを第2暗号化 以下略 } 認証の送信をしたときに、エラー時エラーメッセージに飛ぶ(分岐する?)にはどういう記述にしたら良いでしょうか? 見にくいかもしれませんが、どんなヒントでも結構ですので宜しくお願いします。

    • 締切済み
    • CGI
  • 認証について

    下記、認証画面を作成しましたが、 「kokousr」DBに存在しないUSERID,USERPASSを入力しても、ログインできてしまいます。 存在しないUSERをログインさせないためには、どこを変更すればよろしいのでしょうか? よろしくお願いします。 <?php function chk_auth() { global $conn; global $uid; global $upass; if ($uid and $upass) { $sql = "SELECT * FROM kokousr where uid = '".cnv_sqlstr($uid)."'" ." and pass = '".cnv_sqlstr($upass)."'"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); $row = mysql_fetch_array($res, MYSQL_ASSOC); if (mysql_num_rows($res) >= 1) { return TRUE; } else { return FALSE; } } else { return FALSE; } } function gamen_log() { ?> <h2>ログイン画面</h2> <form method="post" action="./itiran.php"> <table border="1"> <tr> <td>ユーザID</td> <td><input type="text" name="uid"></td> </tr> <tr> <td>パスワード</td> <td><input type="password" name="upass"></td> </tr> </table> <input type="hidden" name="act" value="ent"> <input type="submit" name="sub" value="ログイン"> </form> <?php conndb(); if (!chk_auth()) { $act = "log"; } ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=x-sjis"> <title>ログイン</title> </head> <body> <?php gamen_log(); ?> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう