<訪問者のログをMDBで管理> こんにちは、三流プログラマーのKen3です。 今回は、 やはり気になる訪問者、訪問者のログをMDBで管理 です。(なんのこっちゃ?) 何かの参考となれば幸いです。 /* * 1.<img src="xxxx.asp">で起動できるなんて、、、 */ 私、恥ずかしながら、最近気が付いたのですが、 <img src="xxxx.asp"> とやると、ASPの処理を起動することができます。 当たり前だよね、カウンター処理で画像を表示したりしてるもんね。 それを利用して、各ページに <img src="/cgi-bin/count/count.asp"> と入れ、画像を返さないんだけどログを保存してみました。 /* * 2.javascriptのwindow.document.referrer;を使用 */ あれ、 Request.ServerVariables("HTTP_REFERER") の値が自分のHPだぁ。 *<img src= >のタグを埋め込んだページです。 あと、 Request.ServerVariables("SCRIPT_NAME") の値、/cgi-bin/count/count.aspだぁ(笑) これじゃ、なんの集計かわからないよ。。。 自分のHPがどこから呼ばれているか、知りたいしなぁ。 何かいい方法ないかなぁ、、、 javascriptで戻るボタンで window.document.referrer を使ったサンプルがあったので、これを流用して、 呼び出し時のHTMLで、javascriptを使用して、 どこから呼ばれたかをパラメーターで渡すことにしました。 <script language=javascript> var Referrer=window.document.referrer; if (window.navigator.appName=='Netscape'){ if(parseInt(window.navigator.appVersion)> 4 ){ document.write ("<img src='/cgi-bin/count/cnta.asp?Referrer="+Referrer+"> '");} }else{ document.write ("<img src='/cgi-bin/count/cnta.asp?Referrer="+Referrer+"'style=\"display\:none\"> ");} </script> /* * 3.MDBファイルを作成して、ログを記録 */ cnt.mdb テーブル名:log IP URL referrer WriteTime と項目を作りました。 あとは、呼ばれたらSQLのINSERT INTO文でデータを追加します。 <%@ LANGUAGE=VBScript %> <% WTIME = Now '現在時刻の代入 IP = Request.ServerVariables("REMOTE_ADDR") URL = Request.ServerVariables("HTTP_REFERER") referrer = Mid(Request.ServerVariables("QUERY_STRING"), 10) 'パラメーターのセット 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") '.Provider?プロバイダー?通信会社?じゃなくって 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("cnt.mdb") 'やっとデータベースを開ける db.open 'SQL文を作る If Len(referrer) = 0 Then strSQL = "INSERT INTO log (IP, URL, WriteTime) VALUES (" strSQL = strSQL & "'" & IP & "'" 'IP strSQL = strSQL & ",'" & URL & "'" 'URL strSQL = strSQL & ", #" & WTIME & "# )" '現在時刻、日付型は#で囲む Else strSQL = "INSERT INTO log (IP, URL, referrer, WriteTime) VALUES (" strSQL = strSQL & "'" & IP & "'" 'IP strSQL = strSQL & ",'" & URL & "'" 'URL strSQL = strSQL & ",'" & referrer & "'" 'referrer strSQL = strSQL & ", #" & WTIME & "# )" '現在時刻、日付型は#で囲む End If 'SQL文を発行 db.Execute(strSQL) 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing %> で、なんとか、保存することができました。 ポイントは、 URL = Request.ServerVariables("HTTP_REFERER") これで<img src= >を呼んだページ、つまりカウントしたいページを取りだし、 呼ばれたページはパラメーターに付いてくるので、 referrer = Mid(Request.ServerVariables("QUERY_STRING"), 10) 'パラメーターのセット で取出してます。 /* * 4.保存したらそれを表示したいよね */ テストで、最近訪問した人のデータ30件を表示してみます。 http://www.ken3.org/cgi-bin/test/test037-1.asp で 訪問者の足跡が表示されます。 test037-1.asp <%@LANGUAGE=VBScript%> <html> <head> <title>SQL ORDER BY で WriteTimeを DESC で降順に並べ替える</title> </head> <body> <h2>SQL ORDER BY で WriteTimeを DESC で降順に並べ替える</h2> test037-1.asp<br> <hr> <b>ログファイルから最新のデータを表示します。</b><br> <hr> <% 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") '.Provider?プロバイダー?通信会社?じゃなくって 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("cnt.mdb") 'やっとデータベースを開ける db.open 'お約束のレコードセットの作成 テーブル名logから全項目(*)を指定 'ORDER BY WriteTime DESC で書き込み時刻の降順にする Set rs = db.Execute("Select * From log ORDER BY WriteTime DESC") 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>NO.</TD>" Response.Write "<TD>日付</TD>" Response.Write "<TD>来てもらった場所</TD>" Response.Write "<TD>リンク元</TD>" Response.Write "</TR>" 'EOFまでループ or データ30件まで nCNT = 1 Do While rs.EOF = False And nCNT <= 30 '.EOFがFalseで30以下の間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & nCNT & "</TD>" Response.Write "<TD>" & rs.Fields.Item("WriteTime") & "</TD>" Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "' Target='_blank'>" Response.Write rs.Fields.Item("URL") & "</A></TD>" Response.Write "<TD><A HREF='" & rs.Fields.Item("referrer") & "' Target='_blank'>" Response.Write Left(rs.Fields.Item("referrer"), 30) & "</A>...</TD>" Response.Write "</TR>" & Chr(13) & Chr(10) '次のレコードにポインタを移動する rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop Response.Write "</TABLE>" 'テーブルは終わりです '開いていたレコードセットを閉じる rs.Close 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing %> <hr> 終了です。<br> <% Call OUT_SRC("ORDER BY") 'ソースの表示関数を呼ぶ %> </body> </html> /* * 5.終わりの挨拶 */ なんとか、ログの収集ができました。 あとは、集計処理ですね。 http://www.ken3.org/cgi-bin/test/test037-1.asp で 訪問者の足跡が表示されます。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.27 SQL INSERT INTO文でデータの追加] ( http://www.ken3.org/backno/backno_asp06.html#27 を参照) では、 SQLのINSERT INTO文を使って、データをDBに追加。 [No.28 SQL ORDER BYでデータの並べ替え] ( http://www.ken3.org/backno/backno_asp06.html#28 を参照) では、 SQLのORDER BYを使ってデータの並べ替え、 DESCを追加して降順(逆順)を解説。
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。
次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません
広告:
DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く
VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]