Q: 如何統計某一篇文章的「瀏覽數」、「點閱數」、「點擊次數」? 怎麼做?
本文的完整解說,已經出版書籍,放在 ASP.NET專題實務 II,也就是「下集」
A: 請您先參考這兩篇文章,有了這些基礎,才能作下去。
第一,請您先看過這篇文章 ([ADO.NET] DataReader的標準範例 for ASP.NET 2.0 / 3.5 ),再來繼續下面的內容
第二,[習題] 補充本書第14章 的範例--自己撰寫ADO.NET程式 / 網站的首頁
本範例,是第二篇文章的補充。
'----自己寫的----
Imports System
Imports System.Web.Configuration
Imports System.Data
Imports System.Data.SqlClient
'----自己寫的----
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim my_hit_no As Integer = 0 '--點閱數
If IsNumeric(Request("id")) And Request("id") <> "" Then
Dim Conn As SqlConnection = New SqlConnection
Conn.ConnectionString = WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString
Dim dr As SqlDataReader = Nothing
Dim cmd As New SqlCommand("select * from test where id = @ID, Conn)
cmd.parameters.AddWithValue("@ID", Request(ïd")) '---- 參數寫法,避免SQL Injection攻擊
Try
Conn.Open() '---- 這時候才連結DB
dr = cmd.ExecuteReader() '---- 這時候執行SQL指令,取出資料
Dim myArticle As String = Nothing
'****************************************(start)
dr.Read()
Label1_title.Text = dr.Item("title").ToString()
Label2_summary.Text = dr.Item("summary").ToString()
Label3_test_time.Text = dr.Item("test_time").ToString()
'//////////// 文章分段 /////////////////////////////////////
myArticle = dr.Item("article").ToString()
Label4_article.Text = Replace(myArticle, vbCrLf, "<br>")
'////////////////////////////////////////////////////////////////
Label5_author.Text = dr.Item("author").ToString()
Label6_hit_no.Text = dr.Item("hit_no") '--點閱數
my_hit_no = CType(dr.Item("hit_no"), Integer) '--點閱數
'****************************************(end)
Catch ex As Exception '---- 如果程式有錯誤或是例外狀況,將執行這一段
Response.Write("Error Message---- " & ex.ToString())
Finally
If Not (dr Is Nothing) Then
cmd.Cancel() '----關閉DataReader之前,一定要先「取消」SqlCommand
dr.Close()
End If
'===============================================
'== 點閱 / 點擊次數加一
Dim cmd1 As New SqlCommand("update test set hit_no = @hit_no where id = @id", Conn)
cmd1.Parameter.AddWithValue("@hit_no", (my_hit_no + 1))
cmd1.Parameter.AddWithValue("@id", Request("id"))
cmd1.ExecuteNonQuery()
'===============================================
cmd1.Cancel()
If (Conn.State = ConnectionState.Open) Then
Conn.Close()
Conn.Dispose() '---- 一開始宣告有用到 New的,最後必須以 .Dispose()結束
End If
End Try
Else
Response.Write("Error...沒有這篇文章!")
Response.End() '--程式中斷,不再執行。您也可以改寫成 Return。看看畫面有何不同?
End If
End Sub
本文的完整解說,已經出版書籍,放在 ASP.NET專題實務 II,也就是「下集」
===========================================================================================
如果上面的 DataReader,您要使用「參數」來作,以避免初步的SQL Injection(資料隱碼)攻擊
請稍作修改如下:
'**** 重 點!*************************************************
'**** 改用 SqlCommand的 @參數來作
Dim cmd As New SqlCommand("select * from test where id = @id", Conn)
cmd.Parameters.Add("@id", SqlDbType.Int)
cmd.Parameters("@id").Value = CType(Request("id"), Integer)
'== 參考網址 http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqlcommand.parameters.aspx
'************************************************************
===========================================================================================
您有沒有發現,連續兩篇文章
我用同一個程式範本(範例 [ADO.NET] DataReader的標準範例 for ASP.NET 2.0 / 3.5 )
改啊改的,就能衍生出很多功能。
一點都不難啊
先不要急,底子打好了,
您的"能力"才能跟得上您的"想像力"
才不會什麼都寫不出來。
初學者會發現程式寫不出來,通常都是
- 資料表不會設計。
- 不懂 ADO.NET,只會拖拉「現有的控制項」來做。
- 手邊沒有範本可以改寫(你要我畫面一片空白,一個字一個字慢慢 Key in,我也沒這麼神。我只不過範例蒐集的比較多、比較會改)
下面兩個方法可以幫您脫離這個困境:
- 多看書、多看書、多看書
- 多練習、多練習、多練習
ASP.NET專題實務裡面的第 13/14兩章都有類似範例可以參考
希望對讀者有幫助。
留言列表