Below is a rather long set of code that will enable you to collect user Stats, and save this information to a database.
The Database:
This is a script generation for a MYSQL database table, however can be adapted for others.
CREATE TABLE IF NOT EXISTS 'site_statistics` (
`visitorid` int(20) NOT NULL AUTO_INCREMENT,
`timedata` varchar(100) DEFAULT NULL,
`datedata` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`referer` longtext,
`StartPage` longtext,
`Browser` varchar(250) DEFAULT NULL,
`Browser_Version` varchar(100) DEFAULT NULL,
`Screen_Width` varchar(100) DEFAULT NULL,
`Screen_Height` varchar(100) DEFAULT NULL,
`Screen_Available_Width` varchar(100) DEFAULT NULL,
`Screen_Available_Height` varchar(100) DEFAULT NULL,
`ColorDepth` varchar(100) DEFAULT NULL,
`User_OS` varchar(100) DEFAULT NULL,
`User_OS_Version` varchar(100) DEFAULT NULL,
`VisitorIP` varchar(100) DEFAULT NULL,
`pageviews` varchar(100) DEFAULT NULL,
PRIMARY KEY (`visitorid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
This database table stores all the User's Statistics.
Stats.cfm:
Best use of this script is to include it at the top of your CFM pages, before any of the header contents get called:
<html>
<cfinclude template="stats.cfm">
...
The Stats.cfm Code:
I've commented it out well, so hopefully detailed explanations of the script will be answered through the comments.
<!---\\This File Loads All Site Statistical Data//--->
<!---\\We're Going to start Building The Session Tracking//--->
<!---\\Get todays date//--->
<cfset webos_stats.TodaysDate = Now()>
<!---<cfset TodaysDate = #dateformat(TodaysDate, "yyyy-mm-dd")#>--->
<cfset CurrentTime = Now()>
<cfset webos_stats.CurrentTime = #timeformat(CurrentTime, "HH:mm:ss")#>
<!---\\Get the visitor IP//---->
<cfset webos_stats.VisitorIP = '#REMOTE_ADDR#'>
<!---\\If it's blocked then check the remoth Host and see if there is an IP address//--->
<cfif webos_stats.VisitorIP IS '>
<cfset webos_stats.VisitorIP = '#REMOTE_HOST#'>
</cfif>
<!---\\Get the page requested: This is the page/url they entered the site at//--->
<cfset webos_stats.StartPage = '#CGI.PATH_INFO#?#CGI.QUERY_STRING#'>
<!---\\Get the referring page info//--->
<cfset webos_stats.Referer = '#CGI.HTTP_REFERER#'>
<!---\\We're going to Get User's Screen Resolution//--->
<CFIF (isDefined("cookie.VARIABLESPRESENT")) and (#cookie.VARIABLESPRESENT# Eq "True")>
<!--- Set the Browser Variables into Local CF Variables --->
<CFSET webos_stats.ScreenResHeight = cookie.ScreenResHeight>
<CFSET webos_stats.ScreenResWidth = cookie.ScreenResWidth>
<CFSET webos_stats.ScreenResColorDepth = cookie.ScreenResColorDepth>
<CFSET webos_stats.ScreenResAvailableHeight = cookie.ScreenResAvailableHeight>
<CFSET webos_stats.ScreenResAvailableWidth = cookie.ScreenResAvailableWidth>
<CFCOOKIE NAME="VARIABLESPRESENT" VALUE="False" EXPIRES="12/31/1970">
<CFELSE>
<!--- Insert the JavaScript into the HTML Head --->
<CFHTMLHEAD TEXT="
<script language=""JavaScript"">
//-- First we need some basic information about the client's browser.
var browserName = navigator.appName
var browserVersion = navigator.appVersion
var browserVersionNum = parseFloat(browserVersion)
var agt=navigator.userAgent
//-- Assign initial values for browser settings to global variables.
var availheight=""unknown""
var availwidth=""unknown""
var colordepth=""unknown""
var height=""unknown""
var width=""unknown""
//-- If browser is version 4 or better we can take a deeper look.
if (browserVersionNum >= 4) {
var availheight=screen.availHeight
var availwidth=screen.availWidth
var colordepth=screen.colorDepth + ""+bit""
var height=screen.height
var width=screen.width
}
function SetCookie (name, value) {
var argv = SetCookie.arguments;
var argc = SetCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
document.cookie = name + ""="" + escape (value) +
((expires == null) ? """" : (""; expires="" +
expires.toGMTString())) +
((path == null) ? """" : (""; path="" + path)) +
((domain == null) ? """" : (""; domain="" + domain)) +
((secure == true) ? ""; secure"" : """");
}
</script>
">
<!--- Use the Client JavaScript variables and redirect to the same page --->
<cfif not isdefined('cgi.query string') or isdefined('cgi.query_string') and cgi.querY_string eq "">
<script language="JavaScript">
window.location = "<CFOUTPUT>#cgi.Script_Name#</CFOUTPUT>";
SetCookie("ScreenResHeight", height);
SetCookie("ScreenResWidth", width);
SetCookie("ScreenResColorDepth", colordepth)
SetCookie("ScreenResAvailableHeight", availheight)
SetCookie("ScreenResAvailableWidth", availwidth)
SetCookie("VARIABLESPRESENT","True")
</script>
<cfelseif isdefined('cgi.QUERY_STRING') and cgi.QUERY_STRING neq "">
<script language="JavaScript">
window.location = "<CFOUTPUT>#cgi.Script_Name#?#cgi.QUERY_STRING#</CFOUTPUT>";
SetCookie("ScreenResHeight", height);
SetCookie("ScreenResWidth", width);
SetCookie("ScreenResColorDepth", colordepth)
SetCookie("ScreenResAvailableHeight", availheight)
SetCookie("ScreenResAvailableWidth", availwidth)
SetCookie("VARIABLESPRESENT","True")
</script>
</CFIF>
<!--- Since the redirect happens Client side the rest of the web page needs to be aborted --->
<CFABORT>
</CFIF>
<!---\\ Now We'll Get User's Browser //--->
<cfscript>
function browserDetect() {
// Default User Agent to the CGI browser string
var UserAgent=CGI.HTTP_USER_AGENT;
// Regex to parse out version numbers
var VerNo="/?v?_? ?v?[\(?]?([A-Z0-9]*\.){0,9}[A-Z0-9\-.]*(?=[^A-Z0-9])";
// List of browser names
var BrowserList="";
// Identified browser info
var BrowserName="";
var BrowserVer="";
// Working variables
var Browser="";
var tmp="";
var tmp2="";
var x=0;
// If a value was passed to the function, use it as the User Agent
if (ArrayLen(Arguments) EQ 1) UserAgent=Arguments[1];
// Allow regex to match on EOL and instring
UserAgent=UserAgent & " ";
// Browser List (Allows regex - see BlackBerry for example)
BrowserList="1X|Amaya|Ubuntu APT-HTTP|AmigaVoyager|Android|Arachne|Amiga-AWeb|Arora|Bison|Bluefish|Browsex|Camino|Check&Get|Chimera|Chrome|Contiki|cURL|Democracy|" &
"Dillo|DocZilla|edbrowse|ELinks|Emacs-W3|Epiphany|Galeon|Minefield|Firebird|Phoenix|Flock|IceApe|IceWeasel|IceCat|Gnuzilla|" &
"Google|Google-Sitemaps|HTTPClient|HP Web PrintSmart|IBrowse|iCab|ICE Browser|Kazehakase|KKman|K-Meleon|Konqueror|Links|Lobo|Lynx|Mosaic|SeaMonkey|" &
"muCommander|NetPositive|Navigator|NetSurf|OmniWeb|Acorn Browse|Oregano|Prism|retawq|Shiira Safari|Shiretoko|Sleipnir|Songbird|Strata|Sylera|" &
"ThunderBrowse|W3CLineMode|WebCapture|WebTV|w3m|Wget|Xenu_Link_Sleuth|Oregano|xChaos_Arachne|WDG_Validator|W3C_Validator|" &
"Jigsaw|PLAYSTATION 3|PlayStation Portable|IPD|" &
"AvantGo|DoCoMo|UP.Browser|Vodafone|J-PHONE|PDXGW|ASTEL|EudoraWeb|Minimo|PLink|NetFront|Xiino|";
// Mobile strings
BrowserList=BrowserList & "iPhone|Vodafone|J-PHONE|DDIPocket|EudoraWeb|Minimo|PLink|Plucker|NetFront|PIE|Xiino|" &
"Opera Mini|IEMobile|portalmmm|OpVer|MobileExplorer|Blazer|MobileExplorer|Opera Mobi|BlackBerry\d*[A-Za-z]?|" &
"PPC|PalmOS|Smartphone|Netscape|Opera|Safari|Firefox|MSIE|HP iPAQ|LGE|MOT-[A-Z0-9\-]*|Nokia|";
// No browser version given
BrowserList=BrowserList & "AlphaServer|Charon|Fetch|Hv3|IIgs|Mothra|Netmath|OffByOne|pango-text|Avant Browser|midori|Smart Bro|Swiftfox";
// Identify browser and version
Browser=REMatchNoCase("(#BrowserList#)/?#VerNo#",UserAgent);
if (ArrayLen(Browser) GT 0) {
if (ArrayLen(Browser) GT 1) {
// If multiple browsers detected, delete the common "spoofed" browsers
if (Browser[1] EQ "MSIE 6.0" AND Browser[2] EQ "MSIE 7.0") ArrayDeleteAt(Browser,1);
if (Browser[1] EQ "MSIE 7.0" AND Browser[2] EQ "MSIE 6.0") ArrayDeleteAt(Browser,2);
tmp2=Browser[ArrayLen(Browser)];
for (x=ArrayLen(Browser); x GTE 1; x=x-1) {
tmp=Rematchnocase("[A-Za-z0-9.]*",Browser[x]);
if (ListFindNoCase("Navigator,Netscape,Opera,Safari,Firefox,MSIE,PalmOS,PPC",tmp[1]) GT 0) ArrayDeleteAt(Browser,x);
}
if (ArrayLen(Browser) EQ 0) Browser[1]=tmp2;
}
// Seperate out browser name and version number
tmp=Rematchnocase("[A-Za-z0-9. _\-&]*",Browser[1]);
Browser=tmp[1];
if (ArrayLen(tmp) EQ 2) BrowserVer=tmp[2];
// Handle "Version" in browser string
tmp=REMatchNoCase("Version/?#VerNo#",UserAgent);
if (ArrayLen(tmp) EQ 1) {
tmp=Rematchnocase("[A-Za-z0-9.]*",tmp[1]);
BrowserVer=tmp[2];
}
// Handle multiple BlackBerry browser strings
if (Left(Browser,10) EQ "BlackBerry") Browser="BlackBerry";
// Return result
return Browser & " " & BrowserVer;
}
// Unable to identify browser
return "Unknown";
}
</cfscript>
<cfset webos_stats.browser= #browserDetect()#>
<!---\\End Getting Browser Type//--->
<!---\\Now We're going to get the user's Operating System, Version and Version Number//--->
<cfset webos_stats.os = "">
<cfif (HTTP_USER_AGENT CONTAINS "Windows NT 4.0") OR (HTTP_USER_AGENT CONTAINS "WinNT4.0")>
<cfset webos_stats.os="Windows NT 4">
<cfelseif HTTP_USER_AGENT CONTAINS "95">
<cfset webos_stats.os="Windows 95">
<cfelseif HTTP_USER_AGENT CONTAINS "98">
<cfset webos_stats.os="Windows 98">
<cfelseif HTTP_USER_AGENT CONTAINS "9x">
<cfset webos_stats.os="Windows ME">
<cfelseif (HTTP_USER_AGENT CONTAINS "Windows 2000") OR ((HTTP_USER_AGENT CONTAINS "Windows NT 5.0") AND NOT (browser.ISNAVIGATOR AND browser.MAJORVERSION LTE 4))>
<cfset webos_stats.os="Windows 2000">
<cfelseif (HTTP_USER_AGENT CONTAINS "Windows NT 5.0") AND (browser.ISNAVIGATOR) AND (browser.MAJORVERSION LTE 4)>
<cfset webos_stats.os="Windows XP">
<cfelseif HTTP_USER_AGENT CONTAINS "Windows NT 5.1">
<cfset webos_stats.os="Windows XP">
<cfelseif HTTP_USER_AGENT CONTAINS "Windows XP">
<cfset webos_stats.os="Windows XP">
<cfelseif HTTP_USER_AGENT CONTAINS "Windows NT 5.2">
<cfset webos_stats.os="Windows 2003">
<cfelseif HTTP_USER_AGENT CONTAINS "Windows CE">
<cfset webos_stats.os="Windows CE">
<cfelseif HTTP_USER_AGENT CONTAINS "Windows NT 6.0">
<cfset webos_stats.os="Windows Vista">
<cfelseif HTTP_USER_AGENT CONTAINS "Windows Vista">
<cfset webos_stats.os="Windows Vista">
<cfelseif HTTP_USER_AGENT CONTAINS "Windows NT 6.1">
<cfset webos_stats.os="Windows 7">
<cfelseif HTTP_USER_AGENT CONTAINS "Windows 7">
<cfset webos_stats.os="Windows 7">
<cfelseif HTTP_USER_AGENT CONTAINS "Linux">
<cfset webos_stats.os="Linux">
<cfelseif HTTP_USER_AGENT CONTAINS "Unix">
<cfset webos_stats.os="Unix">
<cfelseif HTTP_USER_AGENT CONTAINS "SunOS">
<cfset webos_stats.os="SunOS">
<cfelseif HTTP_USER_AGENT CONTAINS "HP-UX">
<cfset webos_stats.os="HP-UX">
<cfelseif HTTP_USER_AGENT CONTAINS "MAC OS X">
<cfset webos_stats.os="Mac OS X">
<cfelseif HTTP_USER_AGENT CONTAINS "apple" OR HTTP_USER_AGENT CONTAINS "mac">
<cfset webos_stats.os="Mac OS">
<cfelseif HTTP_USER_AGENT CONTAINS "AmigaOS">
<cfset webos_stats.os="AmigaOS">
<cfelseif HTTP_USER_AGENT CONTAINS "FreeBSD">
<cfset webos_stats.os="FreeBSD">
<cfelseif HTTP_USER_AGENT CONTAINS "OS2">
<cfset webos_stats.os="OS2">
<cfelseif HTTP_USER_AGENT CONTAINS "WebTV">
<cfset webos_stats.os="WebTV">
<cfelse>
<cfset webos_stats.os="">
</cfif>
<!---\\End Getting User's Operating System//--->
<!---\\Stats Debugging//--->
<!---<cfdump label="WebOS User Stats" expand="yes" var="#webos_stats#">
<cfabort>--->
<!---\\End Stats Debugging//--->
<cfif NOT ISDEFINED('session.webos_visitor')>
<!---\\It is now time to save this data for Research and reporting//--->
<!---\\Visitor is new so insert a new record//--->
<cfquery name="getLastID" datasource="#webos.datasrc#" username="#webos.db_user#" password="#webos.db_pass#">
Insert into site_statistics (referer, startpage, browser, screen_width, screen_height, screen_available_width, screen_available_height, colordepth, user_os, visitorip) VALUES ('#webos_stats.referer#', '#webos_stats.startpage#', '#webos_stats.browser#', '#webos_stats.ScreenResWidth#', '#webos_stats.ScreenResHeight#', '#webos_stats.ScreenResAvailableWidth#', '#webos_stats.ScreenResAvailableHeight#', '#webos_stats.ScreenResColorDepth#', '#webos_stats.os#', '#webos_stats.visitorip#')
</cfquery>
<!---\\Get the VisitorID from the record just entered above//--->
<cfquery name="getLastID" datasource="#webos.datasrc#" username="#webos.db_user#" password="#webos.db_pass#">
SELECT MAX(VisitorID) as lastID FROM site_statistics
</cfquery>
<!---\\Now Create a session//--->
<cflock scope="Session" timeout="60" type="exclusive">
<cfset session.webos_visitor = '#getLastID.LastID#'>
</cflock>
</cfif>