[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.037 訪問者のログをMDBで管理

訪問者のログをMDBで管理


本文(発行内容)


<訪問者のログを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を追加して降順(逆順)を解説。

フィードバック

ASP系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.037を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

三流君の主なリンク先

[アクセスランキング] [サイトマップ] [リンク先・相互リンク先など]
ASPで遊ぶ、失敗する 掲示板 バックナンバー 登録と解除
三流プログラマー 業務の愚痴 掲示板 バックナンバー 登録と解除
VBAで楽しくプログラミング 掲示板 バックナンバー 登録と解除
コンビニのオモテとウラ話 掲示板 バックナンバー 登録と解除
www.ken3.org(サイト内)から Google を利用して、

Ken3の日記(weblog) -- [広告・副収入系] [プログラマー業務の愚痴] [VBA系の話題] [ASP系の話題] [コンビニ系ネタ] [その他]

その他 宣伝広告