ScriptBasic講座
[入力項目の追加]



1.名前入力欄を作ってみよう!
名前入力欄を作ってみましょう。これで少しは掲示板らしくなると思います。


-bbs6.bas-
#!/usr/bin/scriba

import cgi.bas

'commentが送信されているか?
IF cgi::POSTParam("comment") <> undef Then
        
        '変数に代入
        comment=cgi::POSTParam("comment")
        onamae=cgi::POSTParam("onamae")

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

        '改行を<br>に
        comment=REPLACE(comment,"\r\n","<br>")
        comment=REPLACE(comment,"\r","<br>")
        comment=REPLACE(comment,"\n","<br>")
        
        '書き込み
        open "bbslog2.txt" for append as 1

        'ロック
        LOCK #1,write

        print #1,onamae,"<>",comment,"\n"
        
        'ロック解除
        LOCK #1,release
        close 1
END IF

print "Content-Type: text/html; charset=euc-jp\n\n"

print """
<html><body>
<form action="bbs6.bas" method="POST">
お名前:<input type="text" name="onamae" size=20><br>
<textarea name="comment" rows=4 cols=40></textarea><br>
<input type="submit" value="送信">
</form>
"""

'読み込み部分(ファイルが存在する場合)
IF FILEEXISTS("bbslog2.txt") Then
        open "bbslog2.txt" for input as 1

        '最後までループ
        while NOT(EOF(1))
                'dataに代入
                line input #1,data

                'dataが存在するか?
                IF len(data)>0 Then
                        '分割:<>で分割
                        split data by "<>" to onamae,comdata
                        
                        '出力
                        print "お名前:",onamae,"<br>",comdata,"<hr>"

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

print "</html></body>"


▼実行結果(サンプル)


実行してみて、色々と書き込んでみてください。
さて、プログラムの解説です。

IF cgi::POSTParam("comment") <> undef Thenでcommentが送信されているか調べます。
もしも送信されている場合、onamae=cgi::POSTParam("onamae")で変数onamaeに、名前入力欄のデータを代入しています。

onamae=REPLACE(onamae,"<","&lt;")
onamae=REPLACE(onamae,">","&gt;")
で変数onamaeの<と>をエスケープしています。こうすることによりHTMLタグが入力されても
通常の文字として扱われ、HTMLタグとして扱われません。

print #1,onamae,"<>",comment,"\n"で書き込んでいます。onamaeとcommentを<>で区切っています。
<や>の文字はテキストフォームに入力してもエスケープされるようになっているので、区切りを間違えてしまう事はありません。
また、掲示板のログファイル名をbbslog.txtからbbslog2.txtに変更しました。

ここまでが書込み部分の変更です。表示部分の変更は以下の通りです。

フォームの送信先をbbs6.basに変更し、お名前:<input type="text" name="onamae" size=20><br>
お名前の入力欄を追加しました。

読み込み部分にあるsplit data by "<>" to onamae,comdataでdataを<>でonamaeとcomdataに分割しています。
splitは文字列を区切り文字で分割する命令です。今回の区切り文字は<>です。

split 文字列 by 区切り文字 to 変数1,変数2 [,変数3〜〜]

print "お名前:",onamae,"<br>",comdata,"<hr>"で出力して終わりです。

▼参考リンク
文字列を加工しよう





2.Email入力欄とURL入力欄の追加
掲示板にお名前欄以外に欲しいのはEmail入力欄とURL入力欄でしょう。
ここではその二つを追加してみます。

-bbs7.bas-
#!/usr/bin/scriba

import cgi.bas

'commentが送信されているか?
IF cgi::POSTParam("comment") <> undef Then
        
        '変数に代入
        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;")

        '改行を<br>に
        comment=REPLACE(comment,"\r\n","<br>")
        comment=REPLACE(comment,"\r","<br>")
        comment=REPLACE(comment,"\n","<br>")
        
        '書き込み
        open "bbslog3.txt" for append as 1

        'ロック
        LOCK #1,write

        print #1,onamae,"<>",comment,"<>",email,"<>",url,"\n"
        
        'ロック解除
        LOCK #1,release
        close 1
END IF

print "Content-Type: text/html; charset=euc-jp\n\n"

print """
<html><body>
<form action="bbs7.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("bbslog3.txt") Then
        open "bbslog3.txt" for input as 1

        '最後までループ
        while NOT(EOF(1))
                'dataに代入
                line input #1,data

                'dataが存在するか?
                IF len(data)>0 Then
                        '分割:<>で分割
                        split data by "<>" to onamae,comdata,email,url
                        
                        
                        
                        '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://\n" Then print "<a href=\"",url,"\">",url,"</a>"
                        
                        print "<hr>"

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

print "</html></body>"




プログラムが長くなってきましたが、ほとんどの部分は以前と同じです。
変更した部分はわずかですので、長さに圧倒されず頑張りましょう!
こんなものは気持ちのもち具合で変わります。「うわぁ〜長い」と思わず
「うわぁ〜!こんな長いプログラム、自分でもわかるんだ!」と誇りにして下さい。
余談はさておき、プログラムを解説しましょう。

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

この四行で<と>をエスケープ処理しHTMLタグが入力されても通常の文字として扱われるようにしています

例によって<form>の送信先をbbs7.basに変更しています。
また、emailとurlの入力欄を作りました。url入力欄はvalue="http://"で初期表示文字をhttp://にしています。

残るは掲示板ログファイルをbbslog3.txtに変更したことと、表示部分の変更だけです。
表示部分のIF email <> "" Thenでemailが書かれているか調べています。 <>は一致する時、偽を返します。
つまり、emailが書かれていると真を表示するわけで、then以降のprint "お名前:<a href=\"mailto:",email,"\">",onamae,"</a>"
を実行します。<a>タグのhrefに"mailto:メールアドレス"を指定するとブラウザで指定したメールソフトを起動させることが出来ます。
メールアドレスが書かれていない場合はELSE以降を実行し、名前のみを表示します。

IF url<>"http://\n" Then print "<a href=\"",url,"\">",url,"</a>"はURLがhttp://\n以外の場合、真を返します。
urlの初期値はhttp://ですが、書込みの際、onamae,"<>",comment,"<>",email,"<>",url,"\n"と記事を区切る為、\nを最後
に追加します。http://のまま送信されたときはhttp://\nとして記録されてしまうわけです。
というわけで、urlを変更した場合のみthen以降を実行します。<a>タグのhrefにURLを指定することで
URLへのリンクが可能です。URLが変更されておらずhttp://の場合は偽となりますので何も表示しません。

戻る

ウメ研究所