プロが教えるわが家の防犯対策術!

■1.下記の1.cgiからURLに引数として

1.cgi?hoge=●●

で2.cgiにhogeの値を送ります。


2.cgiでhogeの値を受け取り、
テンプレートファイルを表示の際に下記のように、
ファイルのパスに取得したhogeを指定しようと思いますがうまく動作しません。
具体的な指示の仕方をご教示いただけないでしょうか?
宜しくお願いいたします。

my $hoge1 = '../../htdocs/●/●/●/';
my $hoge_2 = $hoge;
my $hoge_ok = '$hoge1/$hoge2';

$template = $hoge_ok;

A 回答 (5件)

サンプル(SHIFT_JIS)


_はタブに戻す
/cgi-gin
 |-- template.cgi
 |-- template/
    |-- 001.html
    |-- 002.html

hoge.com/cgi-gin/template.cgi/001.html

#!/usr/local/bin/perl
use strict;
my $templatePATH = './template';

if (open TEMPLATE,$templatePATH.$ENV{'PATH_INFO'}){
_print "Content-Type: text/html; charset=Shift_JIS\n\n";
_while(<TEMPLATE>){
__print ;
_}
}
else{
print "Content-Type: text/html; charset=Shift_JIS\n\n";
print "<html><head><title>error</title></head><body><h1>エラー</h1>\n<p>テンプレートを指定してください。</p>\n";
print "</body></html>\n";
}

__END__
    • good
    • 0
この回答へのお礼

ORUKA1951様

ご連絡遅くなりもうしわけございません。

ご丁寧にご教示いただきありがとうございました。

こちらの方法で試してみます。

お礼日時:2012/01/30 16:34

「テンプレートを読み込みません」というのはどう確かめたのでしょうか?



あと, とりあえず自分の作ったプログラムを冷静に見つめてください.

sub templateselect {
my $template = "";
if ($hoge eq 'abc'){
$template = "../../hoge/hoge/hoge.htm";
}
else{
$template = "../hoge/hoge/$path_2/";
}
my $template = templateselect;

の部分は明らかにおかしいでしょ?
    • good
    • 0

?以降の文字列(URLエンコードしたもの)は、CGIからは$ENV{'QUERY_STRING'}として利用できます。


 多分されたいことは、要求されたPATHから、動的にページを作成するために、テンプレートを読み込んで、テンプレートを開き必要なデータを追記してページとして表示させようとされているのかな?

いずれにしても、文字列の連結は
my $PATH = '/data/template/';
・・・
$PATH = $PATH.$hoge;#文字列連結演算子(.)
でよいです。
その後、open Template とかで開けばよい。


なお、サーバーに何らかの値を渡す方法として、
QUERY_STRING・・・?以降(#があればその前まで)の因数を渡す。name=value
    GET    URLエンコードして渡す(される)
標準入力・・・・・要求ヘッダに続いて、文字列で渡す
    POST
PATH_INFO・・・・・パスとして渡す
    /news/20120126.html
などがあります。
 この様な場合、PATH_INFOとして渡すほうが処理は楽になると思います。そのまま利用できますからね。

 たとえば/news/today/20120126.htmlを要求されると、hoge.com/news/today/20120126.htmlを作成して表示させるとか・・・
my $PATH = '/data/template/';
$PATH = $PATH.$ENV{'PATH_INFO'};

★Enviroment Variable and FORM,COOKIE ( http://hpcgi1.nifty.com/Iruka/ENV_FORM.cgi/sdzgq … )
とか・・
    • good
    • 0

シングルクオートとダブルクオートの違いを理解すべし.

この回答への補足

Tacosan様

ご回答いただきありがとうございました。

ダブルクオート内の変数は展開されて代入されますが、
シングルクオート内の変数はただの文字列扱いになるのですね。

教えていただいた方法で、訂正を試して見ます。
ありがとうございます。

補足日時:2012/01/25 15:45
    • good
    • 0
この回答へのお礼

Tacosan様

ダブルクオーテーションの設定にて、
変数を足してパスを取得することができましたが、
設定できたパスは正しいのですが、テンプレートを読み込みません。

テンプレートのパーミッションも問題はないです。
これは別要因でしょうか?

ディレクトリパスとして認識させるには、
変数を変換する必要があるのでしょうか?

下記、該当箇所になります。
宜しくお願いいたします。

$path_2 = "$hoge";

$errNum = chkFormInput();
fixTags();

sub templateselect {
my $template = "";
if ($hoge eq 'abc'){
$template = "../../hoge/hoge/hoge.htm";
}
else{
$template = "../hoge/hoge/$path_2/";
}
my $template = templateselect;

お礼日時:2012/01/25 18:04

> my $hoge1 = '../../htdocs/●/●/●/';


> my $hoge_2 = $hoge;
> my $hoge_ok = '$hoge1/$hoge2';

$hoge_ok には $hoge1 と $hoge2 の値を連結して代入したいのかな?
ならば、
my $hoge_ok = $hoge1 + $hoge2;では?
さらに、なぜ $hoge を代入する $hoge_2 にアンダースコアがあるのかな?


引数どうこう以前に、$hoge_ok に値を直接代入して動くのかな?
$hoge1 のディレクトリトラバーサルは大丈夫?

この回答への補足

bin-chanさん


ご回答いただき誠にありがとうございました。

>さらに、なぜ $hoge を代入する $hoge_2 にアンダースコアがあるのかな?
こちらは1との差別化のために入れておりまして、

特に意味はないのですが、アンダースコアがあることによって、
なにか障害が発生する可能性がございますでしょうか?

>$hoge1 のディレクトリトラバーサルは大丈夫?

こちらは、通常のテンプレートを読み込ます際に
問題なく表示されており、ディレクトリの相対パスの問題はないようです。

教えていただいた方法で確認をとりましたが、
cgiから送られた値が反映されずそのまま
$hoge_2と表示されてしまいました。

現状1.cgiから渡された$hoge の情報は取得できています。
if文での動きも確認できます。

Elseの場合パスに「$hogeの値」が渡らず
$hogeという文字のまま動いてしまいます。

値自体を渡す方法をご教授ください。

下記、該当perlになります。
ご指摘のほどよろしくお願いいたします。


#!/usr/bin/perl
use CGI;
require 'jcode.pl';
my $query= new CGI;
my @html = ();

my $hoge = $query->param('hoge');

my $errNum= 0;
my $errMsg= '';

my $e_hoge= 0;
my $t_hoge= '';

$errNum = chkFormInput();
fixTags();

sub templateselect {
my $template = "";
if ($hoge eq 'abc'){
$template = '../htdocs/hoge/ok.html';
}else{
$template = '../htdocs/hoge/$hoge/index.html';
}
my $template = templateselect;

sub showHTML {
foreach (@html){ print; }
}

#html表示選択
open HTML, $template or err("$templateが開けません");
print "Content-type: text/html; charset=Shift_JIS\n\n";
@html = <HTML>;
close HTML;


replaceTags();
showHTML();
exit();

sub chkFormInput {
my $errNum = 0;
}

sub fixTags {
if ($e_hoge){
$t_hoge = "<input type=\"hidden\" size=\"20\"";
}else{$t_hoge = "$hoge<input type=\"hidden\"";
}$t_hoge .= "name=\"hoge\" value=\"$hoge\">\n";


return 1;
}

sub replaceTags {
foreach (@html){
s/<CGI:error message>/$errMsg/i;
s/<CGI:error num>/$errNum/i;
s/<CGI:hoge>/$t_hoge/i;

}
return 1;
}

sub err {
print $query->header;
print "<html><head><head><body>\n";
print $_[0];
print "\n</body></html>\n";
exit();
}

補足日時:2012/01/25 11:13
    • good
    • 0
この回答へのお礼

bin-chan様

先日はご教授いただきありがとうございました。

教えていただいた方法で、
$path_1 = "$pdfno";
$path_2 = "$pdfno2";

$path_ok = "$path_1 + $path_2";
としたところ、文字列の間に+が表示されてしまいました。
文字列と数列がいまいち理解できていないせいかもしれません。

お礼日時:2012/01/25 18:07

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