|The advertising on my site is served entirely in-house, by code freely available for you to use. This article will step you through the code.|
The banners are all stored in a database table, but I don't access the database to serve the ads. Instead, at the beginning of every day the site automatically loads the ads for that day into Application variables. How the "BrandNewDay" trigger works is discussed in a related article about tracking IP addresses.
Loading the days ads
|// get current advertising banners
DBInitConnection ( );
DBGetRecords ( 'SELECT BannerID,BannerDescr,BannerURL FROM Banners WHERE ClicksLeft > 0' );
Firstly, ads "qualify" to be shown that day if there are any purchased clickthroughs still available (for details on how I sell per clickthrough, not impression, read this). That's done with the SQL "WHERE ClicksLeft > 0".
|var sBanners = new Array;
var nBannerIDs = new Array;
var nBanners = 0;
// loop through banners
while ( !oRecordSet.EOF )
var nBannerID = oRecordSet ( 0 ) - 0;
var sBannerDescr = '' + oRecordSet ( 1 );
var sBannerURL = '' + oRecordSet ( 2 );
// small image to track impressions first
var sBanner = '<img src="BannerCounter.asp?ID=' + nBannerID + '" border=0 width=1 height=1>';
The resulting recordset is looped through, and banner ID, description and URL extracted. To track the ad impressions, a link to a small 1x1 "image" is created, with BannerCounter.asp as the target. More about that file later.
|// add URL (patched through our counter)
sBanner += '<a href="BannerCounter.asp?ID=' + nBannerID + '&CYAredir=' + Server.URLEncode ( sBannerURL ) + '" target="CYAExternal">'
Next, the URL that will be called when the banner id clicked is assembled. The advertisers original URL, in the variable sBannerURL, is passed as a parameter into (again) BannerCounter.asp. Because I want to pass the URL into another file I have to first encode it. This replaces any special characters such as /?& into their hexadecimal equivalents.
|// add image
sBanner += '<img src="images/ads/' + sBannerDescr + '.gif" border=0 width=468 height=60></a>';
The last of the HTML, the image of the actual banner, is added to the sBanner variable...
| // store banner IDs for later use
nBannerIDs [ nBanners ] = nBannerID;
sBanners [ nBanners++ ] = sBanner + '<p>';
oRecordSet.moveNext ( );
...and the data stored into the temporary array. The loop continues with the next record in the recordset.
|// now set data into Application variables
Application.Lock ( );
Application ( 'TotalBanners' ) = nBanners;
for ( var i=0; i<nBanners; i++)
Application ( 'Banner' + i ) = sBanners [ i ];
Application.Unlock ( );
Outside the loop, after all the records have been processed and stored in the array, I finally move the data into Application variables, locking the Application first. The array was used just to make this lock/unlock section as short as possible.
Part 2: Serving the banners...