ScriptBasic講座
[日時を記録しよう!]








1.日時の記録
日時はtimeで取得可能です。
timeは1970年1月1日からの通算秒(UNIXタイムスタンプ)を返します。








2.プログラム
-bbs15.bas-
#!/usr/bin/scriba

import cgi.bas

'commentが送信されているか?
IF cgi::POSTParam("comment") <> undef Then CALL kakikomi

'読み込みを表示
CALL yomikomi

'プログラムはここまで
END

'読み込み部分
SUB yomikomi
        print "Content-Type: text/html; charset=euc-jp\n\n"

        print """
        <html><body>
        <form action="bbs15.bas" method="POST">
        お名前:<input type="text" name="onamae" size=20><br>
        Email:<input type="text" name="email" size=20><br>
        ▼コメント<br>
        <textarea name="comment" rows=4 cols=40></textarea><br>
        URL:<input type="text" name="url" value="http://" size=50><br>
        <input type="submit" value="送信">
        </form>
        """
                '読み込み部分(ファイルが存在する場合)
                IF FILEEXISTS("bbslog4.txt") Then
                                open "bbslog4.txt" for input as 1
                                        
                                        i=0

                                        '最後までループ
                                        while NOT(EOF(1))
                                                '配列data[i]に代入
                                                line input #1,data[i]
                                                i=i+1
                                        wend
                                close 1
                                
                                
                                'ループ開始
                                for a=i-1 to 0 STEP -1
                                        '配列data[a]を取り出し
                                        IF len(data[a])>0 Then
                                                        '分割:<>で分割
                                                        split data[a] by "<>" to onamae,comdata,email,url,date

                                                        'emailが書き込まれているか?
                                                        IF email <> "" Then 
                                                                print "お名前:<a href=\"mailto:",email,"\">",onamae,"</a>"
                                                        ELSE
                                                                print "お名前:",onamae
                                                        END IF


                                                        print "<br>",comdata,"<br>"

                                                        'urlがhttp://以外なら
                                                        IF url<>"http://" Then print "<a href=\"",url,"\">",url,"</a>"

                                                        print "<hr>"
                                        END IF
                                next



                ELSE
                                print "ファイルがありません"
                END IF


        print "</html></body>"

END SUB

'書き込み部分
SUB kakikomi
        '変数に代入
        comment=cgi::POSTParam("comment")
        onamae=cgi::POSTParam("onamae")
        email=cgi::POSTParam("email")
        url=cgi::POSTParam("url")

        'HTMLタグの置換
        comment=REPLACE(comment,"<","&lt;")
        comment=REPLACE(comment,">","&gt;")

        onamae=REPLACE(onamae,"<","&lt;")
        onamae=REPLACE(onamae,">","&gt;")
        email=REPLACE(email,"<","&lt;")
        email=REPLACE(email,">","&gt;")
        url=REPLACE(url,"<","&lt;")
        url=REPLACE(url,">","&gt;")

        '入力検査部分
        IF onamae="" then CALL errormes("お名前が記入されていません")
        IF comment="" then CALL errormes("コメントが記入されていません")

        '文字数検査
        IF len(comment)>1000 then CALL errormes("コメントが1000文字以下ではありません")
        IF len(onamae)>30 then CALL errormes("お名前が30文字以下ではありません")
        IF len(email)>64 then CALL errormes("Emailが64文字以下ではありません")
        IF len(url)>128 then CALL errormes("URLが128文字以下ではありません")

        '改行を<br>に
        comment=REPLACE(comment,"\r\n","<br>")
        comment=REPLACE(comment,"\r","<br>")
        comment=REPLACE(comment,"\n","<br>")

        '過去のデータをチェック
        IF FILEEXISTS("bbslog4.txt") Then

                        open "bbslog4.txt" for input as 1
                        '最後までループ
                        while NOT(EOF(1))

                                'checkに代入
                                line input #1,check

                                'checkが存在するか?
                                IF len(check)>0 Then
                                        '分割:<>で分割
                                        split check by "<>" to check_onamae,check_comdata,check_email,check_url
                                        IF comment=check_comdata then CALL errormes("過去に同じ内容の書き込みがあります")
                                END IF
                        wend
                        
                        close 1
        END IF



        '書き込み
        open "bbslog4.txt" for append as 1

        'ロック
        LOCK #1,write
        print #1,onamae,"<>",comment,"<>",email,"<>",url,"<>",time,"\n"

        'ロック解除
        LOCK #1,release
        close 1
        
        print "Location:http://127.0.0.1/cgi-bin/bbs15.bas\n\n"
        END
END SUB


'errormesサブルーチン
SUB errormes(errmessage)
        'メッセージを出力
        print "Content-Type: text/html; charset=euc-jp\n\n"
        print "<html><body>",errmessage,"</body></html>"
        'ここでプログラム終了
        END
END SUB

注意:ログファイル名がbbslog3.txtからbbslog4.txtに変更しています。また、CGIファイル名はbbs15.basです。

書込み時のprintを以下のように変更しました。
print #1,onamae,"<>",comment,"<>",email,"<>",url,"<>",time,"<>","\n"
新たにtimeを記録しています。

また、timeの後ろに\nが付くようになりurlの後ろに\nが付かなくなりましたので、
表示部分のIF url<>"http://\n"IF url<>"http://"に変更しました
SPLITもdate,ip,uaを新たに追加しました。但し今回は表示はしていません。





5.書込み時刻を表示しよう、その前にFomatDate関数の説明

FormatDate("YEAR-0M-0D 0H:0M",time)

この関数は2006-01-10 01:45などというふうに現在の日付時刻を返します。
YEAR-0M-0D 0H:0Mの部分を変更する事で表示形式を変えられます。
YEAR 4桁の年 MON 3文字の月(英語) DD HH 時(24時間)
YY 2桁の年 MM 0D 頭に0をつけた2桁の日 0H 頭に0をつけた2桁の時(24時間)
0M 頭に0をつけた2桁の月 WDN 3文字の曜日名(英語) hh 時(12時間)
0h 頭に0をつけた2桁の時(12時間)
WEEKDAY-NAME 曜日名(英語) mm am amまたはpmと表示(pmと同じ)
*MONTH-NAME* 月名(英語) 0m 頭に0をつけた2桁の分 pm amまたpmと表示(amと同じ)

例えば 4桁の年/2桁の月/2桁の日を表示したい場合は YEAR/0M/0D と指定すれば良いのです。

▼参考リンク
日付の取得





6.プログラム
-bbs16.bas-
#!/usr/bin/scriba

import cgi.bas

'commentが送信されているか?
IF cgi::POSTParam("comment") <> undef Then CALL kakikomi

'読み込みを表示
CALL yomikomi

'プログラムはここまで
END

'読み込み部分
SUB yomikomi
        print "Content-Type: text/html; charset=euc-jp\n\n"

        print """
        <html><body>
        <form action="bbs16.bas" method="POST">
        お名前:<input type="text" name="onamae" size=20><br>
        Email:<input type="text" name="email" size=20><br>
        ▼コメント<br>
        <textarea name="comment" rows=4 cols=40></textarea><br>
        URL:<input type="text" name="url" value="http://" size=50><br>
        <input type="submit" value="送信">
        </form>
        """
                '読み込み部分(ファイルが存在する場合)
                IF FILEEXISTS("bbslog4.txt") Then
                                open "bbslog4.txt" for input as 1
                                        
                                        i=0

                                        '最後までループ
                                        while NOT(EOF(1))
                                                '配列data[i]に代入
                                                line input #1,data[i]
                                                i=i+1
                                        wend
                                close 1
                                
                                
                                'ループ開始
                                for a=i-1 to 0 STEP -1
                                        '配列data[a]を取り出し
                                        IF len(data[a])>0 Then
                                                        '分割:<>で分割
                                                        split data[a] by "<>" to onamae,comdata,email,url,date

                                                        'emailが書き込まれているか?
                                                        IF email <> "" Then 
                                                                print "お名前:<a href=\"mailto:",email,"\">",onamae,"</a>"
                                                        ELSE
                                                                print "お名前:",onamae
                                                        END IF


                                                        print "<br>",comdata,"<br>"

                                                        'urlがhttp://以外なら
                                                        IF url<>"http://" Then print "<a href=\"",url,"\">",url,"</a>"

                                                        print "<br>書き込み時刻:",FormatDate("YEAR-0M-0D 0H:0M",date)

                                                        print "<hr>"
                                        END IF
                                next



                ELSE
                                print "ファイルがありません"
                END IF


        print "</html></body>"

END SUB

'書き込み部分
SUB kakikomi
        '変数に代入
        comment=cgi::POSTParam("comment")
        onamae=cgi::POSTParam("onamae")
        email=cgi::POSTParam("email")
        url=cgi::POSTParam("url")

        'HTMLタグの置換
        comment=REPLACE(comment,"<","&lt;")
        comment=REPLACE(comment,">","&gt;")

        onamae=REPLACE(onamae,"<","&lt;")
        onamae=REPLACE(onamae,">","&gt;")
        email=REPLACE(email,"<","&lt;")
        email=REPLACE(email,">","&gt;")
        url=REPLACE(url,"<","&lt;")
        url=REPLACE(url,">","&gt;")

        '入力検査部分
        IF onamae="" then CALL errormes("お名前が記入されていません")
        IF comment="" then CALL errormes("コメントが記入されていません")

        '文字数検査
        IF len(comment)>1000 then CALL errormes("コメントが1000文字以下ではありません")
        IF len(onamae)>30 then CALL errormes("お名前が30文字以下ではありません")
        IF len(email)>64 then CALL errormes("Emailが64文字以下ではありません")
        IF len(url)>128 then CALL errormes("URLが128文字以下ではありません")

        '改行を<br>に
        comment=REPLACE(comment,"\r\n","<br>")
        comment=REPLACE(comment,"\r","<br>")
        comment=REPLACE(comment,"\n","<br>")

        '過去のデータをチェック
        IF FILEEXISTS("bbslog4.txt") Then

                        open "bbslog4.txt" for input as 1
                        '最後までループ
                        while NOT(EOF(1))

                                'checkに代入
                                line input #1,check

                                'checkが存在するか?
                                IF len(check)>0 Then
                                        '分割:<>で分割
                                        split check by "<>" to check_onamae,check_comdata,check_email,check_url
                                        IF comment=check_comdata then CALL errormes("過去に同じ内容の書き込みがあります")
                                END IF
                        wend
                        
                        close 1
        END IF



        '書き込み
        open "bbslog4.txt" for append as 1

        'ロック
        LOCK #1,write
        print #1,onamae,"<>",comment,"<>",email,"<>",url,"<>",time,"\n"

        'ロック解除
        LOCK #1,release
        close 1
        
        print "Location:http://127.0.0.1/cgi-bin/bbs16.bas\n\n"
        END
END SUB


'errormesサブルーチン
SUB errormes(errmessage)
        'メッセージを出力
        print "Content-Type: text/html; charset=euc-jp\n\n"
        print "<html><body>",errmessage,"</body></html>"
        'ここでプログラム終了
        END
END SUB
CGIファイル名をbbs16.basに変更し、読み込み部分にprint "<br>書き込み時刻:",FormatDate("YEAR-0M-0D 0H:0M",date)を追加しました。
YEARは四桁の年,0Mは頭に0をつけた二桁の月,0Dは頭に0をつけた二桁の日, 0Hは頭に0をつけた二桁の時(24時間単位) 0Mは頭に0をつけた分です
引数2のdateはSPLITによって分割された変数です。

▼実行結果

戻る

ウメ研究所