こんにちは。サイトを作っているperl初心者です。
TOPページからログインして、メイン画面を表示させたいのですが、つまづいてます。
使用している言語はperl5、データベースはmysql4です。
今「TOPページのcgiのログインフォームからデータを取り、mysqlに接続してデータベースのデータ(id、パスワード)を検索し、
一致するデータがあれば仮にテーブルにして表示させる」ところまではできています。
このテーブルを表示せずに、メイン画面を表示させるためにはどうすればよいのでしょうか?
くだらない質問でしょうが、よろしければ回答を。
よろしくお願いします。
No.1
- 回答日時:
え?
そこまでできているんなら、
その仮のテーブルをメイン画面に差し替えれば言いだけではないのですか?
もし何かに躓いているときは具体的な質問をしましょう。
この回答への補足
回答ありがとうございます。
失礼しました。えっとですね、topページ、mysql接続ページ、mainページという風に
それぞれ別のファイル(プログラム)になっているんですね。で、TOPページ→Mysql接続ページ→mainページって
流れでジャンプしたいんですけど、Mysql接続ページ→mainページの部分ができていない状態なんです。
今はMysql接続ページ内で、HTMLでテーブル表示させているんですけど、ここをどのように書き換えればいいのでしょうか?
とりあえず、Mainページの本文がサブルーチンの形で書かれているので、
&○○○;と記述してみましたがだめでした。
具体的になっていますでしょうか?
No.2
- 回答日時:
???
その
>>Mysql接続ページ
って必要?
処理が終われば「mainページ」でいいのでは?
(^^ゞ
この回答への補足
回答ありがとうございます。
うーんと、初心者なのでよくわからなくて本を見ながら、TOPページとは別にページ作ったんですけど・・・
TOPページのフォームからactionでとばしてます。
つまりMysqlに接続するプログラムはTOPには記述していないってことなんですが・・・
これって、TOPかmainのどっちかに、このMysql接続ページの内容を組み込めばいいってことでしょうか?
よくわかってなくてすみません(>_<;)
No.3
- 回答日時:
TOPページ(入力)
↓
submit
↓
CGIプログラム(パラメーター受け取り)
↓
DB接続&認証処理
↓OK ↓NG ←ここまではプログラム
メイン TOP
では???
(^^ゞ
この回答への補足
今私のプログラムでは、
TOPページ(入力):TOPぺーじ
↓
submit :TOPページ
↓
CGIプログラム(パラメーター受け取り):Mysql接続ページ
↓
DB接続&認証処理 :Mysql接続ページ
↓OK ↓NG ←ここまではプログラム
↓ エラー表示 :Mysql接続ページ
メイン(ここができていないんですけど・・・)
となっています。
ごめんなさい、意味がわからないでしょうか?(^^;)
No.4
- 回答日時:
他の方も指摘していますが、テーブルを表示するルーチンではなく、そのまま認証OKになったら
メインのコンテンツを出力するように仕向ければいいと思います。
ANo.1の補足質問で書かれていることから、mysql認証プログラムが通った後、
メインコンテンツ表示プログラムに制御を移したい、ということだと思うのですが
合っていますでしょうか。
とすると、mysql認証プログラムとメインコンテンツ表示プログラムは別のものであるわけですから、
いきなりmysql認証プログラム上で別のファイルのサブルーチンを呼んでも呼べないと思います。
もしやるのであれば、mysql認証プログラムで認証OKになった後、
<META http-equiv="Refresh" content="0; URL=*メインページURL*">などと出力すれば解決できる気がします。
が、これだとメインページのURLが判ってしまうとmysql認証を通らなくてもいけるようになってしまいますから、
mysql認証OKの段階でCookieを食わせるとかで認証完了済みかどうかのステータスを保持させ、
以後のコンテンツでこのCookieを確認して未認証状態なら強制的に認証をさせ構造を作る必要が出てくるものと思います。
どのようなサイト構成をお考えかが判らないので何とも言えないのですが、
単にメインページの表示だけ認証が必要なのであれば、mysql認証プログラム内にメインコンテンツを
出力するようなルーチンを書いてしまえば楽になるように思います。
やられようとしていることに合致しているかどうかちょっと自信ないのですが…参考になれば幸いです。
回答ありがとうございます。
>mysql認証プログラム内にメインコンテンツを
>出力するようなルーチンを書いてしまえば楽になるように思いま>す。
そうなんですよ、それがやりたいんですができないんですよね~これが(^^;)
Cookieの使い方も良くわからないので調べてみます。ありがとうございます。
No.5
- 回答日時:
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;
No.6
- 回答日時:
>>※元々テーブルで検索結果を表示していました。
>>この部分が知りたいんですが・・・
ここにメイン画面を書けばいいのでは???
タグを書くのが面倒なら、メイン画面のHTMLを作っておいて、
print "Location: xxxx.html\n\n";
とかなんとか、書いてしまえばいい・・・。
(^^ゞ
この回答への補足
これサンプルソース使っていて、main画面はすでにあるのですが、それもcgiで書かれているんですよ~(^^;)
print "Location: xxxx.html\n\n";のhtmlの部分をcgiに直してもできますかね?
すみません、一言お礼が言いたくて古い回答のお礼フォームに
書いてます。
おかげさまで解決いたしました。ご迷惑おかけしました。
認証時のエラーメッセージが原因だったので、サブルーチンで飛ばしました。
助かりました。ありがとうございました。
No.8
- 回答日時:
なんか少し判った気がします。
認証を通過した後、別のプログラムを呼びたいということなんですね。
であれば、直接的にプログラムを呼ぶのではなく、taka451213さんの言われるようにLocationヘッダでリダイレクトをすればいいでしょう。
あるいは究極的には認証構造自体をメインのプログラムに組み込んでしまい、2段階でやらずに1本のプログラムでできるようにしてしまうか、ですね。
CGIの場合、外部のプログラムに制御自体を丸ごと渡すというのは色々やばそうな気がしますので、統合するか、分ける必要があるならリダイレクトして別のファイルを読み直させる方法しかないでしょう。
(LocationにはCGIを指定しても大丈夫です)
ただし、リダイレクトをした場合はANo.4でも挙げましたが、飛び先のURLが判ってしまえば認証は完全に不要になってしまいます。
もしそれでも認証したかどうかを確認するならば、飛び先側のプログラムで認証済みか否かを知るための仕組が別途必要です。
それはCookieなのかPOSTやGETによるものなのかはサイトの構築方法次第となるので、ここでは言いようがありませんが…。
この回答への補足
回答ありがとうございます。そうなんです、別プログラムを呼びたいんです。
taka451213さんのおっしゃったようにprint文でやってみましたが、
文がまちがっているのかできませんでした(>_<;)
一応このように記述したのですが・・・
→print "Location:<A href=\"./index.cgi>\n\n";
このまま文が表示されるだけなんです。
初心者で何をいじっていいのやら全くわかってなくてすみません。
何が間違ってますかねぇ??
No.10
- 回答日時:
> 一応このように記述したのですが・・・
> →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
この部分がおかしいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メールをPDF化する際に、ヘッダ...
-
ftpでのネットワークバイトオー...
-
VBAでExcelのヘッダーに文字列+...
-
IrDA準拠のTX/RXヘッダとは
-
cookie が有効がどうか判断させ...
-
SpreadDesignerの列ヘッダ
-
HTTPリクエストにおいて送信で...
-
メールの文字化け(><)
-
月の第一週とは
-
毎○曜日って、使いますか?
-
週2回のペースって だいたい何...
-
エクセルで相対パスの書き方を...
-
エクセルで毎月第2週日の水曜日...
-
日付から曜日を求めたい
-
アンケートなどの1日1回の投...
-
BASE64でエンコードしてPOSTし...
-
CGIの中にinclude
-
平日朝の国道246線混雑状況につ...
-
よくある 『 第○(1・2・3・4・...
-
SFTP自動化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
リストコントロールの列幅を固...
-
VBAでExcelのヘッダーに文字列+...
-
perlでHTTP Request Headersの...
-
AccessVBAで「このフィールドに...
-
[C#]ListView一覧表示時の幅設...
-
SpreadDesignerの列ヘッダ
-
TCPヘッダのチェックサム算出方法
-
ftpでのネットワークバイトオー...
-
ヘッダのinclude順
-
perl5について
-
Content-type: text/htmlが表示...
-
関数ヘッダ?
-
Thunderbirdのフィルタについて
-
HTTP 200 OKの後のリダイレクト?
-
ルータでのMTU、MSS設定値の検...
-
HTTPヘッダの大きさ
-
タイトルが・・・
-
掲示板のcookieが消える?
-
基本認証の内部に自動でログイ...
-
file_get_contents でリダイレ...
おすすめ情報