perlを使用しています。

 友達といっしょにジフを作っています。しかし、どちらの絵がユーザーに気に入ってもらえるか評価したいのですがその方法としてクリックした時のポイント制にしたいと思っています。 
 画像をクリックをした時点でDBに1クリックしたことをperlで作成するためにどのようなことをやればいいのか教えていただけないでしょうか?
 サンプル等があれば教えてください。お願いします。

A 回答 (2件)

#!/usr/bin/perl



use CGI;
$q = new CGI;

if ($q->param) {
open(FH, "+<report.txt");
@report=split/,/,<FH>;
seek(FH,0,0);
truncate(FH,0);
$report[$q->param("num")]++;
print FH join(',',@report);
close FH;
}
print<<HTML;
Content-Type: text/html

<a href='$0?num=0'><img src='0.GIF'></a><BR>
<a href='$0?num=1'><img src='1.GIF'></a><BR>
HTML

exit;



好きな名前を付けてアップ
report.txtは結果が入る一種のカウンタ。

あとは、自力でやらんとな。
    • good
    • 0

HTML から、CGI へリンクを張ればよいのでは・・・・?



例えば、

あなたはどっちが好き?
<a href="poll.cgi?num=1"><img src="1.GIF"></a><br>
<a href="poll.cgi?num=2"><img src="2.GIF"></a>

の様にして、poll.cgi で環境変数を GET してデータベースに加えれば
OK でしょう。
この URL に ? 以降を加える方法は、こういった場合に便利ですから、
覚えておくと何かと便利ですよ。

?[フィールド名]=[値]&[フィールド名]=[値]&......
の様にできます。

そうした場合、

$buffer = $ENV{'QUERY_STRING'};
@pairs = split(/&/,$buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$name} = $value;
}

これで、$form{'num'} でどちらの画像がクリックされたか取得できます。
(1 か 2 か)
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Qperl/cgiでjpeg画像のクリック座標をcgiパラメータに渡すには

perl/cgiで表示したjpegの画像のクリックした点の座標位置を次にジャンプするページにcgiパラメータとして渡したいのですがどのようにすれば良いでしょうか?画像全体を<input type="button" src="画像ファイル" name="$test" value="返答">のようにすればよいのかもしれませんが、座標をパラメータ渡しする方法がわかりません。perl/cgiだけでは無理であれば、javascriptでcgiに渡すためのヒントでも構わないのですが。。。
ご存知の方がいたらご教示ください。

Aベストアンサー

「画像ボタン」という手も。
<form ~>
<input type=image name="AAA" height=100 width=100 src="xxx.gif">
</form>

参考URL:http://tohoho.wakusei.ne.jp/html/input.htm

QPerlのCGIでフォームのテキスト配列をPerlで取得するには?

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが配列になった場合、
#<input type="text" name ="namae">
#<input type="text" name ="namae">
#<input type="text" name ="namae">
# のような場合、3件取得する場合

exit;

__END__

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが...続きを読む

Aベストアンサー

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
------------------------------------------------

例) CGI.pmを使う場合 --------------------------------
use CGI;

$query = new CGI; # 新しいCGIオブジェクトの作成
@hoge = $query->param('hoge'); # パラメータhogeの内容の受け取り
------------------------------------------------

参考URL:http://www.futomi.com/lecture/form/cgilib.html#3.2,http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm#FETCHING_THE_VAL

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
---------------------------------------...続きを読む

QPerlの初歩の初歩の初歩(#!/usr/local/bin/perlについて)

いつもお世話になっています。
Perlを勉強し始めて1か月たっていない人間です。
調べてもよく分からず、気持ち悪いので
どうか教えてください。

Perlで記述するとき1行目にperlへのパスを書きますが
プロバイダでのパスは「#!/usr/local/bin/perl」です。
私のPC環境では「#!d:/perl/bin/perl」になります。

ある日、PC環境で動作検証するとき
間違ってプロバイダのパスのほうを記述してしまいました。
しかし、それでもPC上で動作しました。

なぜパスが違うのに動作するのでしょうか?

なお、わけの分からないまま
「Perlへのパスを通す」というのを昔
やったことがあります。関係がありますか?

ある場合、それをすると
「#!d:/perl/bin/perl」の「d:/perl/」の部分が
「/usr/local/」と同になるということなのでしょうか?

Aベストアンサー

httpdの種類や設定によっては1行目のパスを無視して動作させることが出来ます。
例えばAnHTTPDは最初からcgiの拡張子とperlを関連付けて使う仕様だった気がします。
Apache1.3(Win)もWindowsのOSでcgi拡張子とPerl.exeの関連付けがしてあれば動作させることが出来ます。

QFlashQ&A(サンプル作品集)の憲ちゃん様作成のCGIについて

FlashQ&A(サンプル作品集)の憲ちゃん様の
http://hfm-kenchan.com/Lesson/log_qa/D0703261.htmの
Flash連動のフォームメールを使わせて頂いているのですが、
webform_flas01.cgiに、自動返信機能を追加したいと思っています。

sub sendmail {
~~省略~~}
をもう一つコピーして、片方の宛先と差出人の部分を逆にしたら、今度は送られてくる方のメールが届かなくなりました。

どなたかCGIに詳しい方是非教えて頂けないでしょうか?

使用環境はWindoesXP SP2 Flash8です。よろしくお願いします。

Aベストアンサー

以下で多分平気だと思います。

sub sendmail {

if (!(open(OUT,"| $sendmail -t"))) { &error('エラー'); }

print OUT "X-Mailer: WebFORM v4.0 by ​www.rescue.ne.jp​\n";
print OUT "X-HTTP_REFERER: $ref\n";
print OUT "Errors-To: $mailto\n";
print OUT "To: $mailto\n";
print OUT "From: $email\n";
&jis("Subject: $subject"); print OUT "$msg\n";
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n\n";

&jis("--- ここから ---"); print OUT "$msg\n\n";

$count = @DATA_N;
foreach (0..$count-1) {

if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n\n$DATA_V[$_]\n"); print OUT "$msg\n"; }
else { &jis("$DATA_N[$_] = $DATA_V[$_]"); print OUT "$msg\n"; }
}

&jis("--- ここまで ---"); print OUT "\n$msg\n\n";

$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }

print OUT "\n";
print OUT "----------------------------------------\n";
print OUT "送信日時   : $date_now\n";
# print OUT "Server-Name : $ENV{'SERVER_NAME'}\n";
# print OUT "Server-Protocol : $ENV{'SERVER_PROTOCOL'}\n";
# print OUT "Server-Port : $ENV{'SERVER_PORT'}\n";
# print OUT "Gateway-Interface : $ENV{'GATEWAY_INTERFACE'}\n";
# print OUT "Request-Method : $ENV{'REQUEST_METHOD'}\n";
# print OUT "Script-Name : $ENV{'SCRIPT_NAME'}\n";
# print OUT "HTTP-Referer : $ref\n";
print OUT "HTTP-User-Agent : $ENV{'HTTP_USER_AGENT'}\n";
print OUT "Remote-host : $host\n";
print OUT "Remote-Addr : $ENV{'REMOTE_ADDR'}\n";
print OUT "----------------------------------------\n";
print OUT "\n";

close(OUT);


# 二通目の送信処理
if (!(open(OUT,"| $sendmail -t"))) { &error('エラー'); }

print OUT "X-Mailer: WebFORM v4.0 by ​www.rescue.ne.jp​\n";
print OUT "X-HTTP_REFERER: $ref\n";
print OUT "Errors-To: $mailto\n";
print OUT "To: $email\n";
print OUT "From: $mailto\n";
&jis("Subject: $subject");
print OUT "$msg\n";
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n\n";

&jis("--- ここから ---");
print OUT "$msg\n\n";

$count = @DATA_N;
foreach (0..$count-1) {

if ($DATA_V[$_] =~ /\n/) { &jis("$DATA_N[$_] =\n\n$DATA_V[$_]\n"); print OUT "$msg\n"; }
else { &jis("$DATA_N[$_] = $DATA_V[$_]"); print OUT "$msg\n"; }
}

&jis("--- ここまで ---"); print OUT "\n$msg\n\n";

$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }

print OUT "\n";
print OUT "----------------------------------------\n";
print OUT "送信日時   : $date_now\n";
# print OUT "Server-Name : $ENV{'SERVER_NAME'}\n";
# print OUT "Server-Protocol : $ENV{'SERVER_PROTOCOL'}\n";
# print OUT "Server-Port : $ENV{'SERVER_PORT'}\n";
# print OUT "Gateway-Interface : $ENV{'GATEWAY_INTERFACE'}\n";
# print OUT "Request-Method : $ENV{'REQUEST_METHOD'}\n";
# print OUT "Script-Name : $ENV{'SCRIPT_NAME'}\n";
# print OUT "HTTP-Referer : $ref\n";
print OUT "HTTP-User-Agent : $ENV{'HTTP_USER_AGENT'}\n";
print OUT "Remote-host : $host\n";
print OUT "Remote-Addr : $ENV{'REMOTE_ADDR'}\n";
print OUT "----------------------------------------\n";
print OUT "\n";

close(OUT);


print "Content-type: text/plain\n\n";
print 'Check=ok';

exit;
}

以下で多分平気だと思います。

sub sendmail {

if (!(open(OUT,"| $sendmail -t"))) { &error('エラー'); }

print OUT "X-Mailer: WebFORM v4.0 by ​www.rescue.ne.jp​\n";
print OUT "X-HTTP_REFERER: $ref\n";
print OUT "Errors-To: $mailto\n";
print OUT "To: $mailto\n";
print OUT "From: $email\n";
&jis("Subject: $subject"); print OUT "$msg\n";
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n\n";

&jis("--...続きを読む

QPerlとPHP・・・・

初歩的な質問で申し訳ないのですが
これからプログラムをはじめようとおもっているのですがPerlとPHPどっちから手をつけるべきだと思われますか?最終的にはmySQLなどでデータベースを構築したいと思っています・・・

Aベストアンサー

実際、それほどの差があるものでは無いですね。

・ライブラリに関しては、perl の方が一日の長があります。
XML 関連のライブリや、DBI などのデータベースライブラリ、グラフィック関連のライブラリ
その数は、眩暈がします。

参考URL:http://http://search.cpan.org/

・環境が枯れているというのであれば、perl です。使われたいる実績も長いです。

・使いやすさであれば php です、html にコードを入れることができて、かなり簡単です。
(しかし、お手軽な分、分かりにくくもなりやすいです。)

・実行速度は、mod_perlを使うと、perl の方が速いかと思います。
(mod_perl は、php のようにperl を使うことができるapache のモジュールです。)

・perl は、非常に短いコードを書くために様々な省略ができますが、非常に分かり難いコードを書きやすくもあります。

・テキストの操作は、perl の方が楽に感じます。

自分で、環境を作るのであれば、php の方が楽かな。

参考URL:http://y-kit.jp/saba/xp/phpsetup.htm

実際、それほどの差があるものでは無いですね。

・ライブラリに関しては、perl の方が一日の長があります。
XML 関連のライブリや、DBI などのデータベースライブラリ、グラフィック関連のライブラリ
その数は、眩暈がします。

参考URL:http://http://search.cpan.org/

・環境が枯れているというのであれば、perl です。使われたいる実績も長いです。

・使いやすさであれば php です、html にコードを入れることができて、かなり簡単です。
(しかし、お手軽な分、分かりにくくもなりやす...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報