login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Statistieken > JStats 1.0

JStats 1.0

Auteur: Richard - 13 augustus 2006 - 14:34 - Gekeurd door: Maarten - Hits: 6362 - Aantal punten: 4.40 (5 stemmen)




Alle uitleg staat in het script zelf, ook de benodigde MySQL query om de tabel op te zetten.

Het is een redelijk basic statistieken systeem, dat unieke bezoekers bijhoudt op IP, OS en browser. Ook hits worden natuurlijk geteld.

Ik heb een simpele statistieken-tabel class bijgevoegd, maar deze is niet bedoeld als bruikbaar ding. Het is alleen als voorbeeld voor hoe je dat kunt weergeven.

(Het zijn 2 verschillende bestanden, het eerste bestand kun je noemen zoals je wilt, maar het 2e moet agent.inc.php heten, of je moet de naam in het script zelf veranderen)

Code:
  1. <?php
  2. /**
  3.  * Simpel statistieken systeem.
  4.  *
  5.  * De echte detectie wordt gedaan door de code vanaf detect_os_browser
  6.  * tot aan $table = new table; Als je dus de detectie zelf in een include
  7.  * wilt zetten, heb je die code nodig.
  8.  *
  9.  * Voor het weergeven is de andere code nodig, je kunt als je wilt
  10.  * de mysql queries makkelijk aanpassen.
  11.  *
  12.  * Benodigde MySQL query:
  13.  *
  14.  * CREATE TABLE QS_stats (
  15.  * date_visit date NOT NULL default '0000-00-00',
  16.  * ip int(4) unsigned NOT NULL default '0',
  17.  * hits int(3) unsigned NOT NULL default '0',
  18.  * browser varchar(255) NOT NULL default '',
  19.  * os varchar(255) NOT NULL default '',
  20.  * user_agent varchar(255) NOT NULL default ''
  21.  * ) TYPE=MyISAM;
  22.  *
  23.  * @author JeXuS <jexus@jexus.net>
  24.  * @package JStats
  25.  */
  26.  
  27. // error reporting omhoog
  28.  
  29. // conectie met de mysql server maken
  30. mysql_connect ('', '', '');
  31. // database selecteren
  32.  
  33. /**
  34.  * Statistieken tabel class
  35.  *
  36.  * LET OP: dit is niet bedoeld als echt te gebruiken class
  37.  * ik had geen zin om moeilijk te gaan doen;)
  38.  *
  39.  * @author JeXuS <jexus@jexus.net>
  40.  * @package stats
  41.  */
  42. class stats_table
  43. {
  44. /**
  45.   * De data uit de tabel
  46.   *
  47.   * @var array
  48.   */
  49. var $table = array ();
  50.  
  51. /**
  52. * Voeg data toe aan de tabel
  53. *
  54. * @param string $title
  55. * @param mixed $data
  56. */
  57. function add_data ($title = '', $data = '')
  58. {
  59. // check of er misschien een spacer wordt toegevoegd
  60. if ($title == '' && $data == '')
  61. {
  62. // als dit zo is, voegen we een 0 toe
  63. $this->table[] = 0;
  64. }
  65. else
  66. {
  67. // anders voegen we de data gewoon toe
  68. $this->table[$title] = $data;
  69. }
  70. }
  71.  
  72. /**
  73. * Output de tabel
  74. *
  75. * $need_css moet true zijn als je CSS erbij wilt hebben
  76. *
  77. * @param boolean $need_css
  78. */
  79. function output ($need_css = true)
  80. {
  81. // initialisatie
  82. $text = '';
  83.  
  84. // indien we CSS willen
  85. if ($need_css)
  86. {
  87. // voegen we deze toe
  88. $text .= '<style type="text/css"> body, table, tr, td, th { font: 11px Verdana, Arial; } th { font-weight: bold; } td { width: 50%; } td.value { text-align: right; } </style>' . "\n";
  89. }
  90.  
  91. // begin met de tabel
  92. $text .= '<table cellpadding="0" cellspacing="2">' . "\n";
  93. // loop door de data heen
  94. foreach ($this->table as $title => $data)
  95. {
  96. // indien we een spacer vinden
  97. if ($data === 0)
  98. {
  99. // een lege rij toevoegen
  100. $text .= ' <tr><td colspan="2">&nbsp;</td></tr>' . "\n";
  101. }
  102. // indien het geen array is
  103. elseif (!is_array ($data))
  104. {
  105. // het is enkele data, gewoon toevoegen
  106. $text .= ' <tr><td>' . $title . '</td><td class="value"><i>' . $data . '</i></td></tr>' . "\n";
  107. }
  108. // anders ...
  109. else
  110. {
  111. // header toevoegen
  112. $text .= ' <tr><th colspan="2">' . $title . '</th></tr>' . "\n";
  113. foreach ($data as $k => $v)
  114. {
  115. // data toevoegen
  116. $text .= ' <tr><td>' . $k . '</td><td class="value"><i>' . $v . '</i></td></tr>' . "\n";
  117. }
  118. }
  119. }
  120.  
  121. //tabel afsluiten
  122. $text .= '</table>';
  123. // en outputten
  124. echo $text;
  125. }
  126. }
  127.  
  128. /**
  129.  * Detectie van OS en browser
  130.  *
  131.  * @return array
  132.  */
  133. function detect_os_browser ()
  134. {
  135. // include het bestand
  136. require 'agent.inc.php';
  137. // we gebruiken de user agent
  138. $agent = &$_SERVER['HTTP_USER_AGENT'];
  139.  
  140. // dit returnen we standaard
  141. $return = array ('Unknown', 'Unknown');
  142.  
  143. // loop door de mogelijk OS's
  144. foreach ($os as $key => $name)
  145. {
  146. // als we matchen
  147. if (preg_match ('/' . $key . '/i', $agent))
  148. {
  149. // voeren we het in de return
  150. $return[0] = $name;
  151. // en stoppen we de loop
  152. break;
  153. }
  154. }
  155.  
  156. // in $m komt het versienummer te staan
  157. $m = array ();
  158. // indien we MS IE matchen, en geen van de andere, hebben we Internet Explorer
  159. // te pakken
  160. if (preg_match ('~msie[/\sa-z]*([\d.]*)~i', $agent, $m) && !preg_match ('/webtv|omniweb|opera/i', $agent))
  161. {
  162. $return[1] = 'MS Internet Explorer ' . $m[1];
  163. }
  164. // als we netscape matchen, idem...
  165. elseif (preg_match ('/netscape.?\/([\d.]*)/i', $agent, $m))
  166. {
  167. $return[1] = 'Netscape ' . $m[1];
  168. }
  169. // en hetzelfde voor mozilla (ook netscape)
  170. elseif (preg_match ('/mozilla[\/\sa-z]*([\d.]*)/i', $agent, $m) && !preg_match ('/gecko|compatible|opera|galeon|safari/i', $agent))
  171. {
  172. $return[1] = 'Netscape ' . $m[1];
  173. }
  174. // anders (voor de andere browsers)
  175. else
  176. {
  177. // loopen...
  178. foreach ($browsers as $key => $name)
  179. {
  180. // als we de browser matchen
  181. if (preg_match ('/' . $key . '.?\/([\d.]*)/i', $agent, $m))
  182. {
  183. // voegen we het in de return
  184. $return[1] = $name . ' ' . $m[1];
  185. // en stoppen we de loop
  186. break;
  187. }
  188. }
  189. }
  190.  
  191. // ten slotte returnen we;)
  192. return $return;
  193. }
  194.  
  195. // vind de OS en BROWSER
  196. list ($os, $browser) = detect_os_browser ();
  197.  
  198. // update de tabel voor de huidige bezoeker
  199. $sql = "UPDATE QS_stats SET hits = hits + 1 WHERE date_visit = CURDATE() AND ip = INET_ATON('%s') AND browser = '%s' AND os = '%s'";
  200. // maak het extra veilig met mysql_real_escape_string
  201. $sql = sprintf (
  202. $sql,
  203. mysql_real_escape_string ($_SERVER['REMOTE_ADDR']),
  204. );
  205. // voer de query uit
  206. mysql_query ($sql) or die (mysql_error ());
  207. // als we niks hebben geupdate...
  208. {
  209. // moeten we de bezoeker in het systeem invoeren
  210. $sql = "INSERT INTO QS_stats (date_visit, ip, hits, browser, os) VALUES(CURDATE(), INET_ATON('%s'), 1, '%s', '%s')";
  211. $sql = sprintf (
  212. $sql,
  213. mysql_real_escape_string ($_SERVER['REMOTE_ADDR']),
  214. );
  215. mysql_query ($sql);
  216. }
  217.  
  218. // initialiseer de stats_table class
  219. $table = new stats_table;
  220.  
  221. /** VANDAAG */
  222.  
  223. // haal het aantaal unieke bezoekers van vandaag op (uniek op IP, OS en BROWSER)
  224. $result = mysql_result (mysql_query ('SELECT COUNT(DISTINCT ip, os, browser) FROM QS_stats WHERE date_visit = CURDATE()'), 0);
  225. $table->add_data ('Unieke bezoekers deze dag', $result);
  226.  
  227. // haal het aantal hits op van vandaag
  228. $result = mysql_result (mysql_query ('SELECT SUM(hits) FROM QS_stats WHERE date_visit = CURDATE()'), 0);
  229. $table->add_data ('Hits deze dag', $result);
  230.  
  231. // voeg een lege rij toe
  232. $table->add_data ();
  233.  
  234. /** TOTAAL */
  235.  
  236. // totaal unieke bezoekers
  237. $totalunique = mysql_result (mysql_query ('SELECT COUNT(DISTINCT ip, os, browser) FROM QS_stats'), 0);
  238. $table->add_data ('Unieke bezoekers totaal', $totalunique);
  239.  
  240. // totaal aantal hits
  241. $totalhits = mysql_result (mysql_query ('SELECT SUM(hits) FROM QS_stats'), 0);
  242. $table->add_data ('Hits totaal', $totalhits);
  243.  
  244. // en weer een lege rij
  245. $table->add_data ();
  246.  
  247. /** DEZE MAAND */
  248.  
  249. // unieke bezoekers deze maand
  250. $result = mysql_result (mysql_query ('SELECT COUNT(DISTINCT ip, os, browser) FROM QS_stats WHERE date_visit BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE()'), 0);
  251. $table->add_data ('Unieke bezoekers deze week', $result);
  252.  
  253. // en weer hits deze maand
  254. $totalhits = mysql_result (mysql_query ('SELECT SUM(hits) FROM QS_stats WHERE date_visit BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE()'), 0);
  255. $table->add_data ('Hits deze week', $totalhits);
  256.  
  257. // lege rij
  258. $table->add_data ();
  259.  
  260. /** OPERATING SYSTEMS */
  261.  
  262. // Nu halen we OS's op, per unieke gebruiker telt een OS 1 keer
  263. $sql = 'SELECT COUNT(DISTINCT ip, browser, os) AS total, os FROM QS_stats GROUP BY os ORDER BY total DESC, LENGTH(os) DESC';
  264. $result = mysql_query ($sql) or die (mysql_error ());
  265. $rows = array ();
  266. while ($row = mysql_fetch_row ($result))
  267. {
  268. $rows[$row[1]] = number_format ($row[0] / $totalunique * 100, 2) . '%';
  269. }
  270.  
  271. // voer de OS's in
  272. $table->add_data ('Operating systems', $rows);
  273. // en een lege rij
  274. $table->add_data ();
  275.  
  276. /** BROWSER */
  277.  
  278. // hier geldt hetzelfde als voor OS's
  279. $sql = 'SELECT COUNT(DISTINCT ip, browser, os) AS total, browser FROM QS_stats GROUP BY browser ORDER BY total DESC, LENGTH(browser) DESC';
  280. $result = mysql_query ($sql) or die (mysql_error ());
  281. $rows = array ();
  282. while ($row = mysql_fetch_row ($result))
  283. {
  284. $rows[$row[1]] = number_format ($row[0] / $totalunique * 100, 2) . '%';
  285. }
  286.  
  287. $table->add_data ('Browsers', $rows);
  288.  
  289. // en hier outputten we;)
  290. $table->output ();


agent.inc.php
  1. <?php
  2. /**
  3.  * Deze lijsten komen uit AWStats
  4.  */
  5.  
  6. $browsers = array (
  7. 'icab' => 'iCab',
  8. 'go!zilla' => 'Go!Zilla',
  9. 'konqueror' => 'Konqueror',
  10. 'links' => 'Links',
  11. 'lynx' => 'Lynx',
  12. 'omniweb' => 'OmniWeb',
  13. 'opera' => 'Opera',
  14. 'msie 6\.0' => 'Microsoft Internet Explorer 6.0',
  15. 'apachebench' => 'ApacheBench',
  16. 'wget' => 'Wget',
  17. '22acidownload' => '22AciDownload',
  18. 'aol\\-iweng' => 'AOL-Iweng',
  19. 'amaya' => 'Amaya',
  20. 'amigavoyager' => 'AmigaVoyager',
  21. 'aweb' => 'AWeb',
  22. 'bpftp' => 'BPFTP',
  23. 'chimera' => 'Chimera',
  24. 'cyberdog' => 'Cyberdog',
  25. 'dillo' => 'Dillo',
  26. 'dreamcast' => 'Dreamcast',
  27. 'downloadagent' => 'DownloadAgent',
  28. 'ecatch' => 'eCatch',
  29. 'emailsiphon' => 'EmailSiphon',
  30. 'encompass' => 'Encompass',
  31. 'friendlyspider' => 'FriendlySpider',
  32. 'fresco' => 'ANT Fresco',
  33. 'galeon' => 'Galeon',
  34. 'getright' => 'GetRight',
  35. 'headdump' => 'HeadDump',
  36. 'hotjava' => 'Sun HotJava',
  37. 'ibrowse' => 'IBrowse',
  38. 'intergo' => 'InterGO',
  39. 'k-meleon' => 'K-Meleon',
  40. 'linemodebrowser' => 'W3C Line Mode Browser',
  41. 'lotus-notes' => 'Lotus Notes web client',
  42. 'macweb' => 'MacWeb',
  43. 'multizilla' => 'MultiZilla',
  44. 'ncsa_mosaic' => 'NCSA Mosaic',
  45. 'netpositive' => 'NetPositive',
  46. 'nutscrape' => 'Nutscrape',
  47. 'msfrontpageexpress' => 'MS FrontPage Express',
  48. 'phoenix' => 'Phoenix',
  49. 'firebird' => 'Mozilla Firebird',
  50. 'firefox' => 'Mozilla Firefox',
  51. 'safari' => 'Safari',
  52. 'tzgeturl' => 'TzGetURL',
  53. 'viking' => 'Viking',
  54. 'webfetcher' => 'WebFetcher',
  55. 'webexplorer' => 'IBM-WebExplorer',
  56. 'webmirror' => 'WebMirror',
  57. 'webvcr' => 'WebVCR',
  58. 'teleport' => 'TelePort Pro',
  59. 'webcapture' => 'Acrobat',
  60. 'webcopier' => 'WebCopier',
  61. 'real' => 'RealAudio or compatible (media player)',
  62. 'winamp' => 'WinAmp (media player)',
  63. 'windows-media-player' => 'Windows Media Player (media player)',
  64. 'audion' => 'Audion (media player)',
  65. 'freeamp' => 'FreeAmp (media player)',
  66. 'itunes' => 'Apple iTunes (media player)',
  67. 'jetaudio' => 'JetAudio (media player)',
  68. 'mint_audio' => 'Mint Audio (media player)',
  69. 'mpg123' => 'mpg123 (media player)',
  70. 'nsplayer' => 'NetShow Player (media player)',
  71. 'sonique' => 'Sonique (media player)',
  72. 'uplayer' => 'Ultra Player (media player)',
  73. 'xmms' => 'XMMS (media player)',
  74. 'xaudio' => 'Some XAudio Engine based MPEG player (media player)',
  75. 'alcatel' => 'Alcatel Browser (PDA/Phone browser)',
  76. 'ericsson' => 'Ericsson Browser (PDA/Phone browser)',
  77. 'mot-' => 'Motorola Browser (PDA/Phone browser)',
  78. 'nokia' => 'Nokia Browser (PDA/Phone browser)',
  79. 'panasonic' => 'Panasonic Browser (PDA/Phone browser)',
  80. 'philips' => 'Philips Browser (PDA/Phone browser)',
  81. 'sonyericsson' => 'Sony/Ericsson Browser (PDA/Phone browser)',
  82. 'mmef' => 'Microsoft Mobile Explorer (PDA/Phone browser)',
  83. 'mspie' => 'MS Pocket Internet Explorer (PDA/Phone browser)',
  84. 'wapalizer' => 'WAPalizer (PDA/Phone browser)',
  85. 'wapsilon' => 'WAPsilon (PDA/Phone browser)',
  86. 'webcollage' => 'WebCollage (PDA/Phone browser)',
  87. 'up\.' => 'UP.Browser (PDA/Phone browser)',
  88. 'docomo' => 'I-Mode phone (PDA/Phone browser)',
  89. 'portalmmm' => 'I-Mode phone (PDA/Phone browser)',
  90. 'webtv' => 'WebTV browser',
  91. 'csscheck' => 'WDG CSS Validator',
  92. 'w3m' => 'w3m',
  93. 'w3c_css_validator' => 'W3C CSS Validator',
  94. 'w3c_validator' => 'W3C HTML Validator',
  95. 'wdg_validator' => 'WDG HTML Validator',
  96. 'webzip' => 'WebZIP',
  97. 'staroffice' => 'StarOffice',
  98. 'mozilla' => 'Mozilla',
  99. 'libwww' => 'LibWWW',
  100. );
  101.  
  102. $os = array (
  103. 'windows nt 6\.0' => 'Windows Vista',
  104. 'windows nt 5\.2' => 'Windows 2003',
  105. 'windows nt 5\.2; WOW64' => 'Windows XP 64 bits',
  106. 'windows nt 5\.0' => 'Windows 2000',
  107. 'windows nt 5\.1' => 'Windows XP',
  108. 'winnt' => 'Windows NT',
  109. 'winnt 4\.0' => 'Windows NT',
  110. 'windows 98' => 'Windows 98',
  111. 'win98' => 'Windows 98',
  112. 'windows 95' => 'Windows 95',
  113. 'win95' => 'Windows 95',
  114. 'sunos' => 'Sun Solaris',
  115. 'freebsd' => 'FreeBSD',
  116. 'ppc' => 'Macintosh',
  117. 'mac os x' => 'Mac OS X',
  118. 'linux' => 'Linux',
  119. 'debian' => 'Debian',
  120. 'beos' => 'BeOS',
  121. 'winnt4\.0' => 'Windows NT 4.0',
  122. 'apachebench' => 'ApacheBench',
  123. 'aix' => 'AIX',
  124. 'irix' => 'Irix',
  125. 'osf' => 'DEC OSF',
  126. 'hp-ux' => 'HP-UX',
  127. 'netbsd' => 'NetBSD',
  128. 'bsdi' => 'BSDi',
  129. 'openbsd' => 'OpenBSD',
  130. 'gnu' => 'GNU/Linux',
  131. 'unix' => 'Unknown Unix system'
  132. );
Download code! Download code (.txt)

 Bekijk een voorbeeld van dit script!
 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (4)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.068s