この人頭いいなと思ったエピソード

こんにちは。サイトを作っているperl初心者です。

TOPページからログインして、メイン画面を表示させたいのですが、つまづいてます。

使用している言語はperl5、データベースはmysql4です。
今「TOPページのcgiのログインフォームからデータを取り、mysqlに接続してデータベースのデータ(id、パスワード)を検索し、
一致するデータがあれば仮にテーブルにして表示させる」ところまではできています。
このテーブルを表示せずに、メイン画面を表示させるためにはどうすればよいのでしょうか?

くだらない質問でしょうが、よろしければ回答を。
よろしくお願いします。

A 回答 (14件中1~10件)

え?


そこまでできているんなら、
その仮のテーブルをメイン画面に差し替えれば言いだけではないのですか?

もし何かに躓いているときは具体的な質問をしましょう。

この回答への補足

回答ありがとうございます。

失礼しました。えっとですね、topページ、mysql接続ページ、mainページという風に
それぞれ別のファイル(プログラム)になっているんですね。で、TOPページ→Mysql接続ページ→mainページって
流れでジャンプしたいんですけど、Mysql接続ページ→mainページの部分ができていない状態なんです。
今はMysql接続ページ内で、HTMLでテーブル表示させているんですけど、ここをどのように書き換えればいいのでしょうか?
とりあえず、Mainページの本文がサブルーチンの形で書かれているので、
&○○○;と記述してみましたがだめでした。

具体的になっていますでしょうか?

補足日時:2005/12/19 18:16
    • good
    • 0
この回答へのお礼

一番最初の回答ありがとうございました。

お礼日時:2005/12/22 23:38

???


その
>>Mysql接続ページ
って必要?
処理が終われば「mainページ」でいいのでは?
(^^ゞ

この回答への補足

回答ありがとうございます。

うーんと、初心者なのでよくわからなくて本を見ながら、TOPページとは別にページ作ったんですけど・・・
TOPページのフォームからactionでとばしてます。
つまりMysqlに接続するプログラムはTOPには記述していないってことなんですが・・・
これって、TOPかmainのどっちかに、このMysql接続ページの内容を組み込めばいいってことでしょうか?

よくわかってなくてすみません(>_<;)

補足日時:2005/12/19 18:58
    • good
    • 0

TOPページ(入力)


 ↓
submit
 ↓
CGIプログラム(パラメーター受け取り)
 ↓
DB接続&認証処理
 ↓OK  ↓NG ←ここまではプログラム
メイン  TOP

では???
(^^ゞ

この回答への補足

今私のプログラムでは、
TOPページ(入力):TOPぺーじ
 ↓
submit     :TOPページ
 ↓
CGIプログラム(パラメーター受け取り):Mysql接続ページ
 ↓
DB接続&認証処理          :Mysql接続ページ
 ↓OK  ↓NG ←ここまではプログラム
 ↓  エラー表示         :Mysql接続ページ
メイン(ここができていないんですけど・・・)
となっています。
ごめんなさい、意味がわからないでしょうか?(^^;)

補足日時:2005/12/19 19:25
    • good
    • 0

他の方も指摘していますが、テーブルを表示するルーチンではなく、そのまま認証OKになったら


メインのコンテンツを出力するように仕向ければいいと思います。

ANo.1の補足質問で書かれていることから、mysql認証プログラムが通った後、
メインコンテンツ表示プログラムに制御を移したい、ということだと思うのですが
合っていますでしょうか。

とすると、mysql認証プログラムとメインコンテンツ表示プログラムは別のものであるわけですから、
いきなりmysql認証プログラム上で別のファイルのサブルーチンを呼んでも呼べないと思います。

もしやるのであれば、mysql認証プログラムで認証OKになった後、
<META http-equiv="Refresh" content="0; URL=*メインページURL*">などと出力すれば解決できる気がします。

が、これだとメインページのURLが判ってしまうとmysql認証を通らなくてもいけるようになってしまいますから、
mysql認証OKの段階でCookieを食わせるとかで認証完了済みかどうかのステータスを保持させ、
以後のコンテンツでこのCookieを確認して未認証状態なら強制的に認証をさせ構造を作る必要が出てくるものと思います。

どのようなサイト構成をお考えかが判らないので何とも言えないのですが、
単にメインページの表示だけ認証が必要なのであれば、mysql認証プログラム内にメインコンテンツを
出力するようなルーチンを書いてしまえば楽になるように思います。


やられようとしていることに合致しているかどうかちょっと自信ないのですが…参考になれば幸いです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>mysql認証プログラム内にメインコンテンツを
>出力するようなルーチンを書いてしまえば楽になるように思いま>す。
そうなんですよ、それがやりたいんですができないんですよね~これが(^^;)
Cookieの使い方も良くわからないので調べてみます。ありがとうございます。

お礼日時:2005/12/20 17:23

MySQL接続ページって何???


それもひとつのHTMLですか?
それは接続と認証のルーチンを持っているわけではなく、単にDBの取得結果を表示しているだけのHTMLですよね?
なので、それがいらないです・・・。
実際にDBにconnectして、TOP画面で入力されたパラメーターでDB検索して、IDとパスワードが存在するかどうかをチェックしているのはCGIでしょ?
今は取得するまでがプログラムで、認証結果いかんにかかわらず結果表示画面のHTMLに行ってるんですよね?
そこに、あった時となかった時の振り分けを書いて、それぞれ違うページ(HTML)に行くように変更すればいいのでは?
という事が言いたかったのですが・・・。
(^^ゞ

この回答への補足

どうも私は言葉で説明する事がうまくないようです。
すみません(^^;)以下にMysql接続ページなるものの内容を載せます。
間違いがあればまたご指摘よろしくお願いします。

#!/usr/local/bin/perl

use CGI qw(:standard);
use DBI;

$dbn = "DBI:mysql:sample1:localhost";
$user = "*****";
$pw = "*****";

$i_id = param("s_id"); #パラメータ取得
$i_pw = param("s_pw"); #   〃

print ※header情報省略

$dbh = DBI->connect($dbn,$user,$pw); #データベースハンドル生成
$dbh->do("SET NAMES sjis");

$sth = $dbh->prepare("select * from list where id =" .$i_id);
#ステートメントハンドルの生成

if($sth->execute() == 0) {
print "<font color=blue>idがまちがっていませんか?<br>データがありません!</font>";
#実行後、結果が0ならエラー表示
} else {
@row = $sth->fetchrow_array(); #そうじゃなければ、データを取り出して格納
if ($row[1] ne $i_pw) {
print "<font color=red>pwがまちがっていませんか?<br>データがありません!</font>";
#パスワードが合致しなければエラー表示
} else {
※元々テーブルで検索結果を表示していました。この部分が知りたいんですが・・・
}
}

$sth->finish();
$dbh->disconnect();

print ※footer情報省略
exit;

補足日時:2005/12/20 17:40
    • good
    • 0

>>※元々テーブルで検索結果を表示していました。


>>この部分が知りたいんですが・・・
ここにメイン画面を書けばいいのでは???
タグを書くのが面倒なら、メイン画面のHTMLを作っておいて、
print "Location: xxxx.html\n\n";
とかなんとか、書いてしまえばいい・・・。
(^^ゞ

この回答への補足

これサンプルソース使っていて、main画面はすでにあるのですが、それもcgiで書かれているんですよ~(^^;)
print "Location: xxxx.html\n\n";のhtmlの部分をcgiに直してもできますかね?

補足日時:2005/12/20 19:11
    • good
    • 0
この回答へのお礼

すみません、一言お礼が言いたくて古い回答のお礼フォームに
書いてます。

おかげさまで解決いたしました。ご迷惑おかけしました。
認証時のエラーメッセージが原因だったので、サブルーチンで飛ばしました。

助かりました。ありがとうございました。

お礼日時:2005/12/23 00:15

だったら、すでにあるメイン画面の


print
って書いてあるあたりをゴッソリコピーして、
print "Location: xxxx.html\n\n";
の部分に書けばいいのでは?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

なんかmainページには複雑なプログラムが書かれていて、
ご指摘のようにはいかないようです。

すみません。。。

お礼日時:2005/12/21 16:50

なんか少し判った気がします。


認証を通過した後、別のプログラムを呼びたいということなんですね。

であれば、直接的にプログラムを呼ぶのではなく、taka451213さんの言われるようにLocationヘッダでリダイレクトをすればいいでしょう。
あるいは究極的には認証構造自体をメインのプログラムに組み込んでしまい、2段階でやらずに1本のプログラムでできるようにしてしまうか、ですね。

CGIの場合、外部のプログラムに制御自体を丸ごと渡すというのは色々やばそうな気がしますので、統合するか、分ける必要があるならリダイレクトして別のファイルを読み直させる方法しかないでしょう。
(LocationにはCGIを指定しても大丈夫です)

ただし、リダイレクトをした場合はANo.4でも挙げましたが、飛び先のURLが判ってしまえば認証は完全に不要になってしまいます。
もしそれでも認証したかどうかを確認するならば、飛び先側のプログラムで認証済みか否かを知るための仕組が別途必要です。
それはCookieなのかPOSTやGETによるものなのかはサイトの構築方法次第となるので、ここでは言いようがありませんが…。

この回答への補足

回答ありがとうございます。そうなんです、別プログラムを呼びたいんです。

taka451213さんのおっしゃったようにprint文でやってみましたが、
文がまちがっているのかできませんでした(>_<;)
一応このように記述したのですが・・・
→print "Location:<A href=\"./index.cgi>\n\n";
このまま文が表示されるだけなんです。

初心者で何をいじっていいのやら全くわかってなくてすみません。
何が間違ってますかねぇ??

補足日時:2005/12/21 16:57
    • good
    • 0

index.cgi


に飛ばしたいのなら、
print "Location: /index.cgi"."\n\n";
でしょ???
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

指摘されたように書き直してみましたが、できないみたいです(T_T)
うぅ・・・

お礼日時:2005/12/21 17:25

> 一応このように記述したのですが・・・


> →print "Location:<A href=\"./index.cgi>\n\n";
> このまま文が表示されるだけなんです。

HTMLとして出力するのではなく、HTTPヘッダとして出力する必要があります。
上記のprintをする前に既にヘッダ部分の出力をしていませんか?
恐らくContent-type等のヘッダ情報を出力するルーチンが認証プログラムにあるはずですので、そこの改造が必要です。

また、あくまでHTTPヘッダですから、HTMLでの記述ではなく、

print "Location: /index.cgi\n\n";

といった表現になります。

なお、HTTPヘッダの出力セクションにおいて空行を用意してしまう(print "ヘッダ\n\n";と\nで2回改行する等)と、
その時点でヘッダは終了と認識されます。ご注意ください。

mysqlの認証というより、これはCGIでの出力やHTTPの仕組み&流儀にかかってくる部分ですので、
まずはCGIの作り方について詳しく調べられるとよいと思います。がんばってください。

この回答への補足

回答ありがとうございます。
実はheader文省略としたところに以下のような記述がしてあります。

print <<header;
Content-Type:text/html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html";charset=Shift_JIS">
<title>★○○○★</title>
</head>
<body bgdolor="#ffffff" text="#000000">
header

この部分がおかしいのでしょうか?

補足日時:2005/12/21 17:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!