三流君ASPで遊ぶ、失敗する

[三流君] Top ken3.orgへ
[ASP解説] ASPの解説TOP
[ASP記事 バックナンバー] 番号順のバックナンバー
[SOHO/在宅プログラマー/派遣] 派遣のお話ほか
[...サイトマップ(総合案内へ)]




分類別ガイド
ADOで[ADO Mdb接続] ,[ADO Excel接続] ,[ADO CSV接続]

[ASP Form データのやりとりPOSTとGET]
[ASPでTextFile操作]
[ASPでVBScriptを使う]
[その他サンプル]

バックナンバー No.35 〜 No.39


No.35 2003/01/23
パスワードの入力画面
[ページTOPへ戻る]
<パスワードの入力画面>

こんにちは、Ken3です。

今回は、
パスワードの入力画面
について簡単に書いてみたいと思います。

/*
 * 1.意外と簡単なパスワード入力フォーム
*/

バックナンバーのまとめで、
どんなシステムにも、ユーザーから受け取った値を処理する仕組みがあります。
HTMLのフォームから入力された値を送ってもらい、ASPでも処理します。
なんて、偉そうに書いてたけど、
ASP、ASPと騒いでいても、
HTMLフォームタグのタグで入力されたデータを
受け取って処理しているだけです。

パスワード:<INPUT TYPE="password" NAME="pass" SIZE="12">

なんて、1行、入力のための処理を作成すればOKです。
ポイントは、TYPE="password"です。

ユーザーIDとパスワードを入力させるフォームを
下記のような感じで作りました。
<html>
<head>
<title>パスワードの入力テスト</title>
</head>
<body>
<h2>パスワードの入力テスト</h2>
<br>
<FORM ACTION="test035-1.asp" METHOD="POST">
USER ID:<INPUT TYPE="text" NAME="userid" SIZE="20"><br>
パスワード:<INPUT TYPE="password" NAME="pass" SIZE="20"><br>
<INPUT TYPE="submit" VALUE="ログイン">
<INPUT TYPE="reset"  VALUE="クリア">
</FORM>

</body>
</html>

http://www.ken3.org/cgi-bin/test/test035-1.html で確認できます。

/*
 * 2.受け取りも普通通り
*/

データの受け取りも、普通に、
Request.Form("userid")
Request.Form("pass")
で受け取れます。
簡単なチェックをIf文でしてみました。

<%@LANGUAGE=VBScript%>
<html>
<head>
<title>パスワードのチェック</title>
</head>
<body>
<h2>パスワードのチェック</h2>
test035-1.asp<br>
ID=<%=Request.Form("userid")%><br>
PASS=<%=Request.Form("pass")%><br>
を受け取りました。<br>
<%  'ID=guest Pass=ken3 だったら、OKにする
  If Request.Form("userid") = "guest" And Request.Form("pass") = "ken3" Then
     Response.Write "<h2>パスワードOK、ようこそ</h2>"
  Else
     Response.Write "<font color='red'>パスワードが違います</font>"
  End If
%>

<HR>
終了です。なんか変だけど<br>

</body>
</html>

http://www.ken3.org/cgi-bin/test/test035-1.html
で、ID:guest Pass:ken3 でテストして下さい。
*また、違うパスワードを入れたりして、エラーを確認して下さい。

/*
 * 3.METHOD="GET" で送った時のメリット、デメリット
*/

フォームの送信で、もう一つのパターン、
FORM ACTION="xxxxx.asp" METHOD="GET"
があったよね、
パスワード入力をGET対応にするには、

***************************
HTML 入力側 test035-2.html
***************************
<html>
<head>
<title>パスワードの入力テスト METHOD=GETで送る</title>
</head>
<body>
<h2>パスワードの入力テスト METHOD=GETで送る</h2>
<br>
<FORM ACTION="test035-2.asp" METHOD="GET">
USER ID:<INPUT TYPE="text" NAME="userid" SIZE="20"><br>
パスワード:<INPUT TYPE="password" NAME="pass" SIZE="20"><br>
<INPUT TYPE="submit" VALUE="ログイン">
<INPUT TYPE="reset"  VALUE="クリア">
</FORM>

</body>
</html>

***********************
ASP 判断 test035-2.asp
***********************
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>パスワードのチェック Request.QueryString</title>
</head>
<body>
<h2>パスワードのチェック Request.QueryString</h2>
test035-2.asp<br>
ID=<%=Request.QueryString("userid")%><br>
PASS=<%=Request.QueryString("pass")%><br>
を受け取りました。<br>
<%  'ID=guest Pass=ken3 だったら、OKにする
  If Request.QueryString("userid") = "guest" _
       And Request.QueryString("pass") = "ken3" Then
     Response.Write "<h2>パスワードOK、ようこそ</h2>"
  Else
     Response.Write "<font color='red'>パスワードが違います</font>"
  End If
%>

<HR>
終了です。なんか変だけど<br>

</body>
</html>

http://www.ken3.org/cgi-bin/test/test035-2.html で確認できます。

変更点は、
~~~~~~~~~
<FORM ACTION="test035-2.asp" METHOD="GET">
とGETで送ってるのと、
受け取りが、
Request.QueryString("項目名")になっただけなんだけど。

プログラムの変更点は少ないのですが、
テストするとわかるのですが、
http://www.ken3.org/cgi-bin/test/test035-2.asp?userid=kenzou&pass=0000
みたいに、URLにパスワードが載ってます。

 ←サンプル画面

これをセキュリティ上のデメリットと取る見かたもあるけど、
メリットもあって、
パスワードのフォーム画面で入力しなくても、
ショートカットがわりで
http://www.ken3.org/cgi-bin/test/test035-2.asp?userid=guest&pass=ken3
としておけば、メールソフトなどからワンクリックでユーザー画面に入れる
なんてこともできます。

セキュリティと使い易さのバランスをとらないといけないけど、
GETで送るのも一つの手です。

/*
 * 4.終わりの挨拶
*/

簡単なパスワード入力の説明でした。
次回は、DBにユーザー登録して、IDとパスワードのチェックを
やってみたいとおもいます。

素朴な疑問あったら、気軽に、
メール、掲示板に書き込んでくださいね。
掲示板 : http://www.ken3.org/asp/bbs-asp.html

ASP、VBScript勉強中の三流プログラマーのKen3でした。

----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
[No.04 フォームから値を受け取りたい]
( http://www.ken3.org/backno/backno_asp01.html#4 を参照)
では、
フォームを作成し、モードPOSTで送信
受け取りの基本は簡単で、
Request.Form("フォームの項目名")
で受け取りました。

[No.08 URLに付けたパラメータを参照(クエリ情報)]
( http://www.ken3.org/backno/backno_asp02.html#8 を参照)
では、
URLに付けた情報 test007-2.asp?ID=123 ?の後ろがパラメーターを取出す
Request.QueryString("項目名")をやりました。
満足 http://www.ken3.org/cgi-bin/test/test008-2.asp?A=1
普通 http://www.ken3.org/cgi-bin/test/test008-2.asp?A=2
不満 http://www.ken3.org/cgi-bin/test/test008-2.asp?A=3
などのよくみかけるパターンを少し解説しました。

さらに続けて、
[No.09 URLに付けたパラメータを参照(クエリ情報)]
( http://www.ken3.org/backno/backno_asp02.html#9 を参照)
では、
フォームのMETHOD="GET"で送ると、
フォームの値をURLに載せて、ASPが呼ばれてることを説明しました。

[No.22 隠し項目type="hidden"を使ってみた]
( http://www.ken3.org/backno/backno_asp05.html#22 を参照)
では、
画面に表示されない隠し項目の使い方を解説しました。
固定のパラメーターなどを隠して(表示しないで)渡す時に必要です。

No.36 2003/03/16
Server.CreateObject("basp21pro") ASPからメール送信
[ページTOPへ戻る]

<Server.CreateObject("basp21pro") ASPからメール送信>

こんにちは、Ken3です。 ご無沙汰です、 今回は、 ASPからメールを送る処理で、有名なbasp21を使ってみたいと思います。 /* * 1.メール送りたいんだけど....basp21って何だ? */ 商品の問合せとの自動返信とかで、 処理完了後にメールを送りたい、なんて用途ありますよね。 そんな時、Perlなとでは有名なのは、Sendmailを使用かなぁ。 ASPでメール送信を探すと、必ずと言っていいほど出てくるのが、 basp21を使えば簡単、そんな話を見かけます。 でもなぁ、 私が使っているのレンタルサーバーだしなぁ、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 使えないだろう、、と思っていたら、 basp21proって製品版がセットアップされてて、 最近メール送信で使えるようになったみたい。 BASP21 Pro アプリケーションガイド http://www.b21soft.co.jp/basp21/basp21pappl.html Ken3が使っているレンタルサーバーの紹介 http://www.ken3.org/asp/server.html ASP で Access MDB / SQL Server が使用可能、 BASP21でメールが送信可能。 Server.CreateObject("basp21pro") が使えます。 /* * 2.簡単?こんなんで送れるの、、、 */ サンプル見てポイントは下記のような感じです。 'メールの送信先、件名を設定します。 mailto = "*****@ken3.org" subj = "未承諾広告※" 'メール本文の組み立てを行います。 m_honbun = Now & "に作成" & chr(13) & chr(10) _ & "テストです" & chr(13) & chr(10) _ & "OKですか?" chr(13) & chr(10) 'メールを送信します。 Set bobj = Server.CreateObject("basp21pro") 'オブジェクトの作成 bobj.Env = "IUSR_MACHINE:" & Request.ServerVariables("REMOTE_ADDR") bobj.mailfrom = "gomi@ken3.org" '送信元のメールアドレス rc = bobj.sendmail(mailto,subj,m_honbun) '設定後、送信メソッド実行 'rcを見て、エラー処理を行う /* * 3.問合せフォームのサンプル */ 宣伝ばかりだと怒られそうなので、問合せフォームのサンプルを作成します。 http://www.ken3.org/cgi-bin/test/test036-1.asp で実行可能です。 -- test036-1.asp <%@LANGUAGE=VBScript%> <% 'メール送信処理をまとめる
Sub SENDMAIL(mailto, subj, honbun) 'メールの送信 '送信データアリかチェックする If Len(mailto) = 0 Then Exit Sub If Len(subj) = 0 Then Exit Sub If Len(honbun) = 0 Then Exit Sub 'メール本文の組み立てを行います。 後ろにテスト文章を追加 m_honbun = honbun & chr(13) & chr(10) _ & "----------------" & chr(13) & chr(10) _ & "テスト送信です" & chr(13) & chr(10) 'メールを送信します。 Set bobj = Server.CreateObject("basp21pro") 'オブジェクトの作成 bobj.Env = "IUSR_MACHINE:" & Request.ServerVariables("REMOTE_ADDR") bobj.mailfrom = "gomi@ken3.org" '送信元のメールアドレス rc = bobj.sendmail(mailto,subj,m_honbun) '設定後、送信メソッド実行 Response.Write "<HR>" Response.Write mailto & " へメールを送りました。<BR>" Response.Write "送信終了リターン値は" & rc & "でした。" Response.Write "<HR>" End Sub
%>
<html> <head> <title>Server.CreateObject("basp21pro") ASPからメール送信</title> </head> <body> <h2>Server.CreateObject("basp21pro") ASPからメール送信</h2> test036-1.asp<br> <br> <% '頭で、入力パラメーターDATAがあるかチェックする If IsEmpty(Request.Form("MTO")) = True Then 'そのまま下のHTMLフォームを実行 %> <h3>メール送信テスト</h3> <FORM ACTION="test036-1.asp" METHOD="POST"> <b>メールアドレス:</b> <INPUT TYPE="text" SIZE="26" NAME="MTO" VALUE="*****@ken3.org"><BR> *送信先メールアドレスを入れてください。<br> <b>件名:</b> <INPUT TYPE="text" SIZE="40" NAME="SUBJECT" VALUE="XXXXについて"><BR> *好きな入れてください。<br> <b>内容</b><br> <TEXTAREA NAME="HONBUN" ROWS=10 COLS=40>内容</TEXTAREA><br> *↑質問内容を入れてください。<br> <INPUT TYPE="submit" VALUE="問合せメール送信"> <INPUT TYPE="reset" VALUE="クリア"> </FORM> <% Else 'データが入力されていたら、メールを送信する Call SENDMAIL( Request.Form("MTO"), _ Request.Form("SUBJECT"), _ Request.Form("HONBUN") ) End If %> <hr> 終了です。<br> <% Call OUT_SRC("basp21") 'ソースの表示関数を呼ぶ %> </body> </html> BASP21 Pro アプリケーションガイド http://www.b21soft.co.jp/basp21/basp21pappl.html をみると他にもいろいろな関数が載ってます。 Ken3が使っているレンタルサーバーの紹介 http://www.ken3.org/asp/server.html ASP で Access MDB / SQL Server が使用可能、 BASP21でメールが送信可能。 Server.CreateObject("basp21pro") が使えます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* * 4.終わりの挨拶 */ なんとか、メール送信ができました。 http://www.ken3.org/cgi-bin/test/test036-1.asp で自分のアドレス入れて、遊んでください。 *質問入力フォーム設置しないとなぁ。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.04 フォームから値を受け取りたい] ( http://www.ken3.org/backno/backno_asp01.html#4 を参照) では、 フォームを作成し、モードPOSTで送信 受け取りの基本は簡単で、 Request.Form("フォームの項目名") で受け取りました。

No.37 2003/03/17
訪問者のログをMDBで管理
[ページTOPへ戻る]
<訪問者のログを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を追加して降順(逆順)を解説。

No.38 2003/03/18
SQL GROUP BY句 で グループ化する
[ページTOPへ戻る]
<SQL GROUP BY句 で グループ化する>
こんにちは、三流プログラマーのKen3です。

今回は、
やはり気になる訪問者、訪問者のログをMDBで管理
の続きで、収集したログ情報をグループ化して集計してみたいと思います。

何かの参考となれば幸いです。

/*
 * 1.集計元データの説明
*/
前回の、[No.37 訪問者のログをMDBで管理]
( http://www.ken3.org/backno/backno_asp08.html#37 を参照)
で、
IPアドレスURLをAccess MDBへ保存しました。

cnt.mdb
テーブル名:log
IP
URL
referrer
WriteTime
と項目りデータを保存しました。

テストで、最近訪問した人のデータ30件を表示は、
http://www.ken3.org/cgi-bin/test/test037-1.asp
で
訪問者の足跡が表示されます。

/*
 * 2.SQL GROUP BY句 で グループ化する
*/

データを収集したら、今度は、そのデータをまとめたいですよね。
そんな時便利なのが
SQL文の GROUP BY句です。

使い方は簡単で
Select 項目名
 From テーブル名
  GROUP BY グループ化する項目名です。

http://www.ken3.org/cgi-bin/test/test038-1.asp
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>SQL GROUP BY句 で グループ化する</title>
</head>
<body>
<h2>SQL GROUP BY句 で グループ化する</h2>
test038-1.asp<br>
<hr>
<b>cnt.mdb から訪問されたURLをグループ化して表示します。</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からURLを指定
  'GROUP BY URL で グループ化する
  Set rs = db.Execute("Select URL From log GROUP BY URL")

  'データの表示をテーブルで行う
  Response.Write "<TABLE Border='1'>"

  '見出しをバカっぽく、そのまま書き込む
  Response.Write "<TR>"
  Response.Write "<TD>No.</TD>"
  Response.Write "<TD>URL</TD>"
  Response.Write "</TR>"

  'EOFまでループ
  nCNT = 1
  Do While rs.EOF = False   '.EOFがFalseの間
    Response.Write "<TR>"   '内容を表示する
    Response.Write "<TD>" & nCNT & "</TD>"

    Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "' Target='_blank'>"
    Response.Write rs.Fields.Item("URL") & "</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>
<A HREF="test037-1.asp">cnt.mdb 最近訪問した人のデータ30件を表示</A><br>
<br>
<% Call OUT_SRC("GROUP BY") 'ソースの表示関数を呼ぶ %>

</body>
</html>

ポイントは、
~~~~~~~~~~
  'お約束のレコードセットの作成 テーブル名logからURLを指定
  'GROUP BY URL で グループ化する
  Set rs = db.Execute("Select URL From log GROUP BY URL")
のSQL文です。
Select URL   取出すのは項目URL
 From log    テーブルはlogテーブル
  GROUP BY URL まとめるのはURLの値でまとめる
って感じです。

で、グループ化されたレコードセットが作成されるので、
あとは、中身を取出して表示しただけです。
http://www.ken3.org/cgi-bin/test/test038-1.asp
実行すると、私のHP思ったよりページ数多い(笑)
本人も少しびっくり。

No. URL 
1 http://www.ken3.org/ 
2 http://www.ken3.org/24h/add24h.html 
3 http://www.ken3.org/asp/add-asp.html 
4 http://www.ken3.org/asp/iis-help.html 
5 http://www.ken3.org/asp/iis-win2000pro.html 
  ・
 ・
 ・
190 http://www.ken3.org/vba/iwind.html 
191 http://www.ken3.org/vba/object.html 
192 http://www.ken3.org/vba/select.html 

/*
 * 3.SQL GROUP BY句 で グループ化 Count(項目名)でレコード数を集計する
*/

さてと、ダラダラとURLが表示されました。
ほしい集計データとして、各URLの訪問数を出したいですよね。
そんな時使用するのが、
集計関数のCOUNT関数です。

使い方、これも簡単で、

Select URL , Count(URL) AS XXX  取出すのは項目URLと集計値のXXX
 From log    テーブルはlogテーブル
  GROUP BY URL まとめるのはURLの値でまとめる

http://www.ken3.org/cgi-bin/test/test038-2.asp
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>SQL GROUP BY句 で グループ化 Count関数で集計する</title>
</head>
<body>
<h2>SQL GROUP BY句 で グループ化 Count関数で集計する</h2>
test038-2.asp<br>
<hr>
<b>cnt.mdb から訪問されたURLをグループ化して集計します。</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

  'お約束のレコードセットの作成 テーブル名URLを指定
  'GROUP BY URL で グループ化する
  Set rs = db.Execute("Select URL, Count(URL) As URLCNT From log GROUP BY URL")

  'データの表示をテーブルで行う
  Response.Write "<TABLE Border='1'>"

  '見出しをバカっぽく、そのまま書き込む
  Response.Write "<TR>"
  Response.Write "<TD>No.</TD>"
  Response.Write "<TD>URL</TD>"
  Response.Write "<TD>訪問者</TD>"
  Response.Write "</TR>"

  'EOFまでループ
  nCNT = 1
  Do While rs.EOF = False   '.EOFがFalseの間
    Response.Write "<TR>"   '内容を表示する
    Response.Write "<TD>" & nCNT & "</TD>"

    Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "' Target='_blank'>"
    Response.Write rs.Fields.Item("URL") & "</A></TD>"

    Response.Write "<TD ALIGN=RIGHT>" & rs.Fields.Item("URLCNT") & "人</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>
<A HREF="test037-1.asp">cnt.mdb 最近訪問した人のデータ30件を表示</A><br>
<br>

</body>
</html>

ポイントは、
~~~~~~~~~~
'GROUP BY URL で グループ化する
Set rs = db.Execute("Select URL, Count(URL) As URLCNT From log GROUP BY URL")
ここで、URLの数をCount関数で集計しURLCNTと項目を作ってます。

あとは、
    Response.Write "<TD ALIGN=RIGHT>" & rs.Fields.Item("URLCNT") & "人</TD>"
と普通に使用してます。

http://www.ken3.org/cgi-bin/test/test038-2.asp
を実行すると、
No. URL 訪問者 
1 http://www.ken3.org/ 56人 
2 http://www.ken3.org/24h/add24h.html 8人 
3 http://www.ken3.org/asp/add-asp.html 13人 
4 http://www.ken3.org/asp/iis-help.html 24人 
  ・
 ・
 ・
と表示されます。

/*
 * 4.終わりの挨拶
*/

SQL文でいろいろと処理ができます。
いろいろな切り口から、集計してみたいと思います。

素朴な疑問あったら、気軽に、
メール、掲示板に書き込んでくださいね。
掲示板 : 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を追加して降順(逆順)を解説。

[No.37 訪問者のログをMDBで管理]
( http://www.ken3.org/backno/backno_asp08.html#37 を参照)
では、
IPアドレスURLをAccess MDBへ保存しました。

No.39 2003/03/20
SQL GROUP BY句 で グループ化 集計結果を並べ替えする
[ページTOPへ戻る]
<SQL GROUP BY句 で グループ化 集計結果を並べ替えする>
こんにちは、三流プログラマーのKen3です。

前回、グループ化して集計を取りました。
今回は、その集計結果で並べ替えをします。
*少しハマりました。笑ってください。。。

何かの参考となれば幸いです。

/* * 1.SQLがうまく作成できずにハマる(笑) */

前回の、[No.38 SQL GROUP BY句 で グループ化する] ( http://www.ken3.org/backno/backno_asp08.html#38 を参照) で、 cnt.mdb (Access DB) テーブル名:log IP URL referrer WriteTime からURLでグループ化して、訪問者数をカウントしました。 SQL GROUP BY句 で グループ化 Count(項目名)でレコード数を集計する http://www.ken3.org/cgi-bin/test/test038-2.asp 無事、URL単位でデータが集計されました。 No. URL 訪問者 1 http://www.ken3.org 2人 2 http://www.ken3.org/ 148人 3 http://www.ken3.org/24h/add24h.html 13人 4 http://www.ken3.org/asp/add-asp.html 46人  ・  ・ 230 http://www.ken3.org/vba/excel-help.html 32人 231 http://www.ken3.org/vba/iwind.html 28人 232 http://www.ken3.org/vba/object.html 96人 とURLの順に表示されました。 これを訪問者の多い順に並べ直したいと思い、 並べ替えだろ、そんなのORDER BYでOKだから、 'GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY URLCNT DESC" と、 ORDER BY URLCNT DESC Count(URL) As URLCNTで作成した項目を使いました。 あれ?動作しない、、、なぜだろう、、、 ~~~~~~~~~~~~~~~~~~~~~ いろいろとやるが思うように進まなかった。

/* * 2.集計関数をそのまま書くとOKです。 */

答えはかんたんでした。 ~~~~~~~~~~~~~~~~~~~~~ strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" と、 ORDER BY Count(URL) DESC を指定したら動作しました。 ~~~~~~~~~~~~~~~~~~~~~~~~ う〜ん、、まぁいっか。 http://www.ken3.org/cgi-bin/test/test039-1.asp でテストできます。 <%@LANGUAGE=VBScript%> <html> <head> <title>GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え</title> </head> <body> <h2>GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え</h2> test039-1.asp<br> <hr> <b>cnt.mdb から訪問されたURLをグループ化して集計、降順に表示</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 'お約束のレコードセットの作成 テーブル名URLを指定 'GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" Set rs = db.Execute(strSQL) 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>No.</TD>" Response.Write "<TD>URL</TD>" Response.Write "<TD>訪問者</TD>" Response.Write "</TR>" 'EOFまでループ nCNT = 1 Do While rs.EOF = False '.EOFがFalseの間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & nCNT & "</TD>" Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "' Target='_blank'>" Response.Write rs.Fields.Item("URL") & "</A></TD>" Response.Write "<TD ALIGN=RIGHT>" & rs.Fields.Item("URLCNT") & "人</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> <A HREF="test037-1.asp">cnt.mdb 最近訪問した人のデータ30件を表示</A><br> <br> </body> </html>

/* * 3.Date関数の値を使用して、当日分をグループ化集計 */

さてと、全体から訪問者の多い順に表示することができました。 次は、当日に来た来場者の数を表示してみたいと思います。 Date関数で現在の日付を取出して、それを条件にしてみたいと思います。 strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "WHERE WriteTime >= #" & Date & "# " '日付は#で囲う strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" 現在のシステム日付をDate関数で受け取り、 SQL文のWhere句で指定します。 ポイントは、日付型なので##で囲むことです。 http://www.ken3.org/cgi-bin/test/test039-2.asp でテストできます、確認して見て下さい。*ページの人気も含めて(笑) <%@LANGUAGE=VBScript%> <html> <head> <title>Date関数の値を使用して、当日分をグループ化集計</title> </head> <body> <h2>Date関数の値を使用して、当日分をグループ化集計</h2> test039-2.asp<br> <hr> <b>cnt.mdb から訪問されたURLをグループ化して集計、降順に表示</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 'お約束のレコードセットの作成 テーブル名URLを指定 'GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "WHERE WriteTime >= #" & Date & "# " '日付は#で囲う strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" Set rs = db.Execute(strSQL) Response.Write "発行したSQL文は[<b>" & strSQL & "</b>]です。<br><br>" 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>No.</TD>" Response.Write "<TD>URL</TD>" Response.Write "<TD>訪問者</TD>" Response.Write "</TR>" 'EOFまでループ nCNT = 1 Do While rs.EOF = False '.EOFがFalseの間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & nCNT & "</TD>" Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "' Target='_blank'>" Response.Write rs.Fields.Item("URL") & "</A></TD>" Response.Write "<TD ALIGN=RIGHT>" & rs.Fields.Item("URLCNT") & "人</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> <A HREF="test037-1.asp">cnt.mdb 最近訪問した人のデータ30件を表示</A><br> <br> </body> </html>

/* * 4.終わりの挨拶 */

SQL文でいろいろと処理ができます。 いろいろな切り口から、集計してみたいと思います。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : 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を追加して降順(逆順)を解説。 [No.37 訪問者のログをMDBで管理] ( http://www.ken3.org/backno/backno_asp08.html#37 を参照) では、 IPアドレスURLをAccess MDBへ保存しました。 [No.38 SQL GROUP BY句 で グループ化する] ( http://www.ken3.org/backno/backno_asp08.html#38 を参照) では、 URLでグループ化して、集計関数Count(項目名)で集計しました。



ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。

ニガテな環境設定系など
[Win2003 Server に IIS を Setup]・・・ポイントの無い、ほぼ一本道解説だけど。
[IIS 仮想ディレクトの作成とASP動作TEST]・・・Web拡張でASPを有効にしただけです。

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]