久しぶりにCGIと

ここのところPHPばかり勉強していたのだが、急にCGIプログラムに取り組むことに、。

前から気にはなっていたのですが。

ショッピングカートのCGIで配達希望日を選択するところがある。月と日をプルダウンから選択するものです。ある事情で、日付の指定は1週間以降からにすることにしたので、JavaScriptで配達希望日は×月×日以降を選んでください、と注意書きを書いていた。この表示により、たいていは1週間以降の日付をが選択してくれるのです。ところがプルダウンの選択は1週間以前の日付も選択できるのです。ある日、見落として、希望日に届かず、クレームとなりました。

このうえはCGIの改変しかないと思い、日時に関する関数などを調べて時間をとられました。

日時の関数はgmtime、localtime、timeの三種類で、現在時間を返してどう表現するかというものだけです。今回やりたいことは、年と月と日の数字が分かっている場合に現在時間と比較できる数字になってくれるかということです。

検索しているうち「PerlライブラリモジュールTime::Localにはtimegmサブルーチンが用意されていて、gmtimeの逆変換が可能です。」という表記が、さらに調べるとこのモジュールは、perlをインストールした時にlibフォルダーの中のtimeフォルダーに入っていることが分かりました。timeフォルダーごとテスト用のCGIが置いてあるフォルダーにコピーしました。

これで、指定した年、月、日の数字を指定すると、1970年1月1日からの秒数が返ってきます。これをtime関数から得られる現在時間の1970年1月1日からの秒数に1週間分の秒数を足して比較すればいいはず。

テスト用のCGIはこんなかんじです。

#!/usr/bin/perl

use Time::Local;
print “Content-type: text/html\n\n”;
print “<HTML><BODY>\n”;
$year = 2007;
$mon = 9;
$day = 20;
$hours= 23;
$min =0;
$sec=0;

$kibou = timelocal($sec, $min, $hours, $day, $mon - 1, $year);

$genzai= time;

$n=7;
$week=$n*60*60*24;
$ikou=$genzai+$week;

print “希望日”.$kibou.”<br>”;
print “現在日”.$genzai.”<br>”;
print “指定日以降です”.$ikou.”<br>”;

if($genzai){
if($kibou<$genzai){
print”error”;
}else
{
print”ok”;
}
}

print “</BODY></HTML>\n”; 

exit;

1、ショッピングCGIの送り先、支払い方法を入力した後の確認画面を出力するCGIを加工。

2、通常、名前などが未入力などのときにエラーを返すプログラムに、配達希望月と日が入力されていれば、配達希望日と現在時間に1週間分の秒数を足して比較して、配達希望日の秒数が少なければ、エラーメッセージを返す。

という方針を立てて改変しました。一応うまくいきました。しかし、課題は、12月の末から1月にかけての年の変わり目です。

1 件のコメント »

  1. nqopubrk said,

    4 月 21, 2008 @ 9:04 AM

    nqopubrk…

    nqopubrk (more…)

RSS feed for comments on this post · TrackBack URI

Leave a Comment