一個基於ASP的標題廣告管理系統(三) - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- 一個基於ASP的標題廣告管理系統(三) (http://www.webasp.net/article/1/346.htm) |
| -- 作者:未知 -- 發佈日期: 2003-04-14 |
| 三、顯示廣告
這部分程序主要有如下四個目的:第一,參考各個廣告的顯示等級,隨機選擇本次顯示的廣告;第二,更新數據庫中該廣告的顯示次數;第三,輸出標題廣告的HTML代碼;第四,在數據庫歷史表中保存顯示和點擊歷史紀錄。 實現上述功能的腳本主要有兩個: ShowBanner.asp:確定本次調用要顯示的廣告,更新顯示次數記錄,生成標題廣告的HTML代碼。 Redirect.asp:重定向頁面。ShowBanner.asp生成的廣告HTML代碼將調用該腳本,由該腳本記錄點擊歷史數據、重定向到廣告客戶指定的頁面。 本文下載包中的ShowBanner.asp同時也是一個廣告顯示示例頁面,每次刷新該頁面可以顯示出不同的廣告。下面我們按照ShowBanner.asp的執行過程,介紹其中的關鍵步驟。 一 計算顯示等級總和 本系統採用的廣告選擇算法是:首先計算出當前所有可用廣告的顯示等級總和,然後根據這個和值生成一個隨機數,再根據這個隨機數來確定本次顯示的廣告。下面的代碼用於計算可用廣告的顯示等級總和: nTotalWeight = 0 strSql = "SELECT SUM( Weight ) As SumWeight FROM " + _ "Advertisement WHERE Status=1" rs.Open strSql, cn If not rs.EOF and not rs.BOF Then nTotalWeight = rs.Fields( "SumWeight" ) ' nTotalWeight有可能為空值 If IsNull( nTotalWeight ) Then nTotalWeight = 1 End If End If 在計算出nTotalWeight之後,我們可以根據該值生成一個隨機數,如下所示: Randomize nRandomNumber = Int( Rnd * nTotalWeight ) + 1 程序將從數據庫讀取可用廣告記錄(參見下面的代碼),累計已讀取記錄的weight總和,當這個新的總和超過這裡生成的隨機數時,就將當前記錄作為本次顯示的廣告。 二 分析可用廣告記錄 接下來的任務是執行一個查詢,提取所有可用廣告記錄。如前所述,在遍歷這些可用廣告記錄時,記錄已讀取記錄的weight值總和nWeightCount ,當nWeightCount 等於或大於前面生成的隨機數nRandomNumber時,程序就認為找到了本次要顯示的廣告。具體如下: strSql = "SELECT * FROM Advertisement WHERE Status=1" rs.Close rs.Open strSql, cn bDone = false ' 已讀取記錄的Weight值總和 nWeightCount = 0 ' 清除變量 strImageURL = "" strAltText = "" strLink = "" nImageWidth = 0 nImageHeight = 0 nWeight = 0 nAdID = 0 nAdvertiserID = 0 nViewLimit = 0 nImpressions = 0 While not rs.EOF and not rs.BOF and not bDone ' 將數據庫值賦給變量 ' 這種算法不利於效率,但簡化了控制結構 strImageURL = rs.Fields( "ImageURL" ) strAltText = rs.Fields( "AltText" ) strLink = rs.Fields( "Link" ) nImageWidth = rs.Fields( "ImageWidth" ) nImageHeight = rs.Fields( "ImageHeight" ) nWeight = rs.Fields( "Weight" ) nAdID = rs.Fields( "AdID" ) nAdvertiserID = rs.Fields( "AdvertiserID" ) nViewLimit = rs.Fields( "ViewLimit" ) nImpressions = rs.Fields( "Impressions" ) nWeightCount = nWeightCount + nWeight rs.MoveNext ' nWeightCount是否等於或大於隨機變量值 If nWeightCount >= nRandomNumber or rs.EOF Then bDone= true End If Wend 三 更新當前廣告的顯示次數 在確定本次要顯示的廣告之後,程序就可以更新該廣告記錄的Impressions字段。如果新的Impressions值超過了顯示次數限制(nViewLimit),還必需設置Status字段為0(即本廣告不可再顯示)。實現代碼如下: nStatus = 1 nImpressions = nImpressions + 1 If nImpressions >= nViewLimit Then nStatus = 0 End If strSql = "UPDATE Advertisement Set Status=" + _ CStr( nStatus ) + ", Impressions=" + _ CStr( nImpressions ) + " WHERE AdID=" + _ CStr( nAdID ) rs.Close rs.Open strSql, cn 四 生成HTML代碼 在完成上述準備工作之後,接下來就可以輸出顯示廣告的HTML代碼。所輸出的HTML代碼可以分成如下幾個部分: 重定向頁面 --> 目標URL --> 其他參數 --> 圖片標記 為什麼不是直接鏈接到廣告客戶指定的URL呢?這是因此,雖然這種方法更簡單,但我們希望能夠記錄廣告的點擊數量,在重定向頁面中我們就可以更新該廣告的ClickThroughs字段值。 在顯示廣告的HTML代碼中,重定向頁面本文假定為Redirect.asp,目標URL來自數據庫,其他參數主要是廣告編號、廣告客戶編號等,Redirect.asp利用這些參數記錄點擊歷史紀錄。具體實現如下: strHtmlCode = _ "<a href=Redirect.asp?" + _ "Link=" + strLink + _ "&AdvertisementID=" + CStr( nAdID ) + _ "&AdvertiserID=" + CStr( nAdvertiserID ) + Chr( 34 ) + _ " target=newFrame><" + Chr( 13 ) + Chr( 10 ) + _ "></A>" + Chr( 13 ) + Chr( 10 ) 這裡的strHtmlCode即為顯示廣告的HTML代碼。 五 記錄其他信息 為了給廣告客戶提供更多的信息,同時也為了便於進一步分析,除了記錄顯示次數之外,程序還在數據庫表中記錄其他一些信息(瀏覽本次廣告時,瀏覽者所在的IP地址以及瀏覽時間、廣告編號、廣告客戶編號),如下所示: strSql = "INSERT INTO BannerHistory " + _ "(AdvertiserID, AdID, IPAddress, Type) Values (" + _ CStr( nAdvertiserID ) + ", " + _ CStr( nAdID ) + ", '" + _ Request.ServerVariables( "REMOTE_HOST" ) + _ "', 1)" rs.Open strSql, cn 瀏覽的日期時間值在Access數據庫內設置,即設置字段默認值為Now()。 六 重定向頁面 本文提供一個簡單的重定向頁面Redirect.asp,其功能是記錄廣告點擊數量,然後生成歷史表BannerHistory中的記錄,最後重定向到目標URL,如下所示: ' 連接數據庫,創建記錄集對像rs,略... ' 增加廣告的點擊計數,如點擊計數超過限制值, ' 則設置Status為0 strSql = "UPDATE Advertisement " + _ "Set ClickThroughs=ClickThroughs+1, " + _ "status=iif(ClickThroughs>=ClicksLimit,0,1) " + _ " WHERE AdID=" + Request.QueryString( "AdvertisementID" ) rs.Open strSql, cn ' 生成廣告點擊歷史紀錄 strSql = "INSERT INTO BannerHistory " + _ "(AdvertiserID, AdID, IPAddress, Type) Values (" + _ Request.QueryString( "AdvertiserID" ) + ", " + _ Request.QueryString( "AdvertisementID" ) + ", '" + _ Request.ServerVariables( "REMOTE_HOST" ) + "', 2)" rs.Open strSql, cn ' 重定向到廣告客戶指定的頁面 Response.Redirect( Request.QueryString( "Link" ) ) Next Steps |
| webasp.net |