パスワードごとに、違うファイルを表示できるプログラムを組みたいです。具体的に書くと、
クイズで答えがわかると、秘密のページに行けるようにしたいです。
himitu.php?id=1234 → パスワード(5678) →kotae.php?id=1234&pass=5678
himitu.php?id=abcd → パスワード(efgh) →kotae.php?id=abcd&pass=efgh
みたいな感じです。
プログラムは、phpとは限らないです。CGIとかでもOKです。
みたいな、感じです。参考になるページ、文献、ヒントなど、ございましたら。ご教授ください。
データで
id,password,page_url
という項目を
データベースか別データファイル、もしくは
コード上に直接配列でもたせ、
認証に成功すれば、指定のページで
header("Location:".ページを指定している変数);
という感じで飛ばすのが
一番簡単ではないでしょうか?
同様に
クイズNo,回答,ジャンプ先ページURL
というデータ構成で、
処理すれば、同様の処理ができるのではないでしょうか?
具体的に書くのであれば、
if($_POST[クイズNo] == 回答){
header("Location:".ジャンプ先ページ);
}
クイズが複数項目になる場合は
もう少し違った書き方になるとは思いますが
基本的には、この方法でいけるのではないでしょうか?
項目名はマルチバイトで書いてますが
適時読み替えてもらえればいいと思います。
簡単なものでよければJavaScriptで。
http://allabout.co.jp/computer/hpcreate/closeup/CU20041220A/...
http://www5e.biglobe.ne.jp/~access_r/hp/javascript/js_023.ht...
ありがとうございました。書き忘れたのですが、携帯電話用で作りたいので、JavaScriptだと。。。ごめんなさい。先に書いておけば良かったです。
以前、似たような(?)質問がありました。
参考になるURLがいくつか紹介されているようですので、一度確認してみてはいかがでしょうか。
以前の質問では携帯は条件になかったので、そのあたりは考慮されていないと思いますが、使えるものもあると思います。
詳細は確認していませんが、お急ぎのようでしたので回答いたしました。
参考になると幸いです。
http://nifberry.727.net/test/hatena188.htm
サンプルを作ってみたので参考にしてみてください
これはクイズ形式で質問と答えが合っていたら、画像を表示するものです
CGIのソース
#!/usr/local/bin/perl
@ID=('adfc','gerd','vvva','f4dx');
@PASS=('5','174','3','4');
#正しいパスワードの時に表示するファイル
@SCFILE=('sample1.dat','sample2.dat','sample3.dat','sample4.dat');
#間違ったパスワードの時に表示するファイル
$FLFILE='sample0.dat';
$mthd=$ENV{'REQUEST_METHOD'};
local($qu,@in,$key,$val);
if($mthd eq 'GET'){
$qu=$ENV{'QUERY_STRING'};
}
elsif($mthd eq 'POST'){
read(STDIN,$qu,$ENV{'CONTENT_LENGTH'});
}
#環境変数設定
*query = decode();
print qq(Content-type: image/gif¥n¥n);
#答えがあってるか確認
for($i=0;$i<4;$i++){
if( $query{'id'} eq $ID[$i] ){
if( $query{'answer'} eq $PASS[$i] ){
$FLFILE = $SCFILE[$i];
}
}
}
#画像を表示
open(FILE, $FLFILE);
@que = <FILE>;
foreach $ax (@que){
print qq($ax);
}
close(FILE);
exit;
sub decode
{
#変数の分離
local(@query)=split(/&/,$qu);
foreach(@query){
# "+"などを" "に置換
tr/+/ /;
tr/|/ /;
tr/¥¥/ /;
tr/;/ /;
tr/¥`/ /;
# キーと値に分離
($key,$val)=split(/=/);
$key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
$val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
# 改行コードを修正する。
$val=~s/¥r¥n/¥n/g;
$vin{$key}=$val;
}
return *vin;
}
答えの部分をパスワードにして、正解時にパスワード発行するようにすれば同じように実現できます
http://nifberry.727.net/test/hatena188a.htm
CGIのソース
#!/usr/local/bin/perl
@ID=('adfc','gerd','vvva','f4dx');
@ANSWER=('5','174','3','4');
@PASS=('rregebr34','1g37fg1','cior43','benrt1gb');
#正しいパスワードの時に表示するファイル
@SCFILE=('sample1.dat','sample2.dat','sample3.dat','sample4.dat');
#間違ったパスワードの時に表示するファイル
$FLFILE='sample0.dat';
$mthd=$ENV{'REQUEST_METHOD'};
local($qu,@in,$key,$val);
if($mthd eq 'GET'){
$qu=$ENV{'QUERY_STRING'};
}
elsif($mthd eq 'POST'){
read(STDIN,$qu,$ENV{'CONTENT_LENGTH'});
}
#環境変数設定
*query = decode();
if( $query{'mode'} eq 'question'){
$RESULT="教えてあげないよ";
for($i=0;$i<4;$i++){
if( $query{'id'} eq $ID[$i] ){
if( $query{'answer'} eq $ANSWER[$i] ){
$RESULT = "正解なのでIDとパスワードを教えてあげるよ<BR>ID:".$ID[$i]."<BR>PASS:".$PASS[$i];
}
}
}
print qq(Content-type: text/html¥n¥n);
print qq(<html><body>);
print $RESULT;
print qq(</body></html>);
}
else{
print qq(Content-type: image/gif¥n¥n);
#答えがあってるか確認
for($i=0;$i<4;$i++){
if( $query{'id'} eq $ID[$i] ){
if( $query{'pass'} eq $PASS[$i] ){
$FLFILE = $SCFILE[$i];
}
}
}
#画像を表示
open(FILE, $FLFILE);
@que = <FILE>;
foreach $ax (@que){
print qq($ax);
}
close(FILE);
}
exit;
sub decode
{
#変数の分離
local(@query)=split(/&/,$qu);
foreach(@query){
# "+"などを" "に置換
tr/+/ /;
tr/|/ /;
tr/¥¥/ /;
tr/;/ /;
tr/¥`/ /;
# キーと値に分離
($key,$val)=split(/=/);
$key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
$val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
# 改行コードを修正する。
$val=~s/¥r¥n/¥n/g;
$vin{$key}=$val;
}
return *vin;
}
うわーー。わざわざ、作ってもらって、ありがとうございます。考えていた内容にかなーり近いので、とっても助かってまーす。クイズの問題が大量にあるので、
@ID
@PASS
@SCFILE
を、別ファイルから読み込めれば、完璧なんです。でも、どうもありがとうございます~~~~。
> @ID
> @PASS
> @SCFILE
> を、別ファイルから読み込めれば、完璧なんです
これは、ちょっとした応用で出来ます
配列なのでそのままファイルから読み込んで、改行だけ取り除いてあげればOKです
補足ですが image/gifのところを text/htmlにすれば
異なるHTMLを表示したり jpegにすることでJPEGファイルを指定したりできます
http://nifberry.727.net/test/hatena188a.htm
(hatena188b.cgiにリンクしています)
【CGIソース】
#!/usr/local/bin/perl
# コメントアウト
# @ID=('adfc','gerd','vvva','f4dx');
open(FILE, 'id188.bin');
@ID = <FILE>;
close(FILE);
# コメントアウト
# @ANSWER=('5','174','3','4');
open(FILE, 'ans188.bin');
@ANSWER = <FILE>;
close(FILE);
# コメントアウト
# @PASS=('rregebr34','1g37fg1','cior43','benrt1gb');
open(FILE, 'pass188.bin');
@PASS = <FILE>;
close(FILE);
#正しいパスワードの時に表示するファイル
# コメントアウト
# @SCFILE=('sample1.dat','sample2.dat','sample3.dat','sample4.dat');
open(FILE, 'image188.bin');
@SCFILE = <FILE>;
close(FILE);
# 改行の除去
for($i=0;$PASS[$i];$i++){
@ID[$i]=~s/[¥r¥n]//g;
@ANS[$i]=~s/[¥r¥n]//g;
@PASS[$i]=~s/[¥r¥n]//g;
@SCFILE[$i]=~s/[¥r¥n]//g;
}
#間違ったパスワードの時に表示するファイル
$FLFILE='sample0.dat';
$mthd=$ENV{'REQUEST_METHOD'};
local($qu,@in,$key,$val);
if($mthd eq 'GET'){
$qu=$ENV{'QUERY_STRING'};
}
elsif($mthd eq 'POST'){
read(STDIN,$qu,$ENV{'CONTENT_LENGTH'});
}
#環境変数設定
*query = decode();
if( $query{'mode'} eq 'question'){
$RESULT="教えてあげないよ";
for($i=0;$i<4;$i++){
if( $query{'id'} eq $ID[$i] ){
if( $query{'answer'} eq $ANSWER[$i] ){
$RESULT = "正解なのでIDとパスワードを教えてあげるよ<BR>ID:".$ID[$i]."<BR>PASS:".$PASS[$i];
}
}
}
print qq(Content-type: text/html¥n¥n);
print qq(<html><body>);
print $RESULT;
print qq(</body></html>);
}
else{
print qq(Content-type: image/gif¥n¥n);
#答えがあってるか確認
for($i=0;$i<4;$i++){
if( $query{'id'} eq $ID[$i] ){
if( $query{'pass'} eq $PASS[$i] ){
$FLFILE = $SCFILE[$i];
}
}
}
#画像を表示
open(FILE, $FLFILE);
@que = <FILE>;
foreach $ax (@que){
print qq($ax);
}
close(FILE);
}
exit;
sub decode
{
#変数の分離
local(@query)=split(/&/,$qu);
foreach(@query){
# "+"などを" "に置換
tr/+/ /;
tr/|/ /;
tr/¥¥/ /;
tr/;/ /;
tr/¥`/ /;
# キーと値に分離
($key,$val)=split(/=/);
$key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
$val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
# 改行コードを修正する。
$val=~s/¥r¥n/¥n/g;
$vin{$key}=$val;
}
return *vin;
}
感謝。感謝。感謝。
ほんとに、親切にありがとうございますーーーー。
先ほど、やってみたら、完璧に動きました。
ちなみに、このパスワードを日本語にしたら通らなかったんですが、やっぱ携帯だとだめなんですかね?
> ちなみに、このパスワードを日本語にしたら通らなかったんですが、やっぱ携帯だとだめなんですかね?
http://nifberry.727.net/test/hatena188b.htm
文字コードに原因があるのかもしれません(パスワードファイルがSJISで入力HTMLがUNICODEやEUCの場合はコード変換してやらなくてはいけないかも)
こちらのソースはSHIFT_JISに統一しているので問題ないですよね
あと、ファイルではなく直接PERLで代入する時に「ソ」や「表」などSJISで半角の「¥」を含むコードを入れる場合は注意が必要です
問題数にあわせて forループの数をいちいち変えないように$qmax変数を追加し、$ANSWERが一箇所 $ANSになっていたのを修正しました
これで3回目の回答で、最後なので不具合があったら、トラックバックします
CGIのソース
#!/usr/local/bin/perl
# コメントアウト
# @ID=('adfc','gerd','vvva','f4dx','ng3jnkb','nebZnoBa');
open(FILE, 'id188.bin');
@ID = <FILE>;
close(FILE);
# コメントアウト
# @ANSWER=('5','174','3','4','ひんしゅく','ソ¥レラミシファ');
open(FILE, 'ans188.bin');
@ANSWER = <FILE>;
close(FILE);
# コメントアウト
# @PASS=('rregebr34','1g37fg1','cior43','benrt1gb','efub3arAge','特殊表¥記');
open(FILE, 'pass188.bin');
@PASS = <FILE>;
close(FILE);
#正しいパスワードの時に表示するファイル
# コメントアウト
# @SCFILE=('sample1.dat','sample2.dat','sample3.dat','sample4.dat','sample5.dat','sample6.dat');
open(FILE, 'image188.bin');
@SCFILE = <FILE>;
close(FILE);
#問題の最大数を$qmaxに代入
for($qmax=0;$PASS[$qmax];$qmax++){
@ID[$qmax]=~s/[¥r¥n]//g;
@ANSWER[$qmax]=~s/[¥r¥n]//g;
@PASS[$qmax]=~s/[¥r¥n]//g;
@SCFILE[$qmax]=~s/[¥r¥n]//g;
}
#間違ったパスワードの時に表示するファイル
$FLFILE='sample0.dat';
$mthd=$ENV{'REQUEST_METHOD'};
local($qu,@in,$key,$val);
if($mthd eq 'GET'){
$qu=$ENV{'QUERY_STRING'};
}
elsif($mthd eq 'POST'){
read(STDIN,$qu,$ENV{'CONTENT_LENGTH'});
}
#環境変数設定
*query = decode();
if( $query{'mode'} eq 'question'){
$RESULT="教えてあげないよ";
for($i=0;$i<$qmax;$i++){
if( $query{'id'} eq $ID[$i] ){
if( $query{'answer'} eq $ANSWER[$i] ){
$RESULT = "正解なのでIDとパスワードを教えてあげるよ<BR>ID:".$ID[$i]."<BR>PASS:".$PASS[$i];
}
}
}
print qq(Content-type: text/html¥n¥n);
print qq(<html><HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; CHARSET=Shift_JIS"></HEAD><body>);
print $RESULT;
print qq(</body></html>);
}
else{
print qq(Content-type: image/gif¥n¥n);
#答えがあってるか確認
for($i=0;$i<$qmax;$i++){
if( $query{'id'} eq $ID[$i] ){
if( $query{'pass'} eq $PASS[$i] ){
$FLFILE = $SCFILE[$i];
}
}
}
#画像を表示
open(FILE, $FLFILE);
@que = <FILE>;
foreach $ax (@que){
print qq($ax);
}
close(FILE);
}
exit;
sub decode
{
#変数の分離
local(@query)=split(/&/,$qu);
foreach(@query){
# "+"などを" "に置換
# セキュリティ用
tr/+/ /;
tr/|/ /;
tr/¥¥/ /;
tr/;/ /;
tr/¥`/ /;
# キーと値に分離
($key,$val)=split(/=/);
$key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
$val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c",hex($1))/ge;
# 改行コードを修正する。
$val=~s/¥r¥n/¥n/g;
$vin{$key}=$val;
}
return *vin;
}
うわー。ありがとうございましたーーーー
出来ましたーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ありがとうございました。早速、実践してみたいと思います。ちょっと、仕事で急いでるので、フリーのスクリプトがあればいいんですが、、