* Copyright (c) 2001 Platon Software Development Group * All rights reserved. * * See README file for more informations about this software. * See COPYING file for license informations. * * Download the latest version from * http://www.platon.sk/projects/phpWebLogAnalyzer/ */ /* * 01/07/2001 - created * 18/07/2001 - added support for ident protocol (thanks to libident) * 04/08/2001 - completely rewritten with multiple tables handling * 20/09/2001 - code style improvements * - import into CVS * 02/10/2001 - added support for remote address resolving * - new version of libident used * - added support for proxy servers logging * 19/11/2001 - session_id column added * - sessions implemented * - various bugfixes and SQL improvements */ /* * Before doing anything else read config file. */ include("config.inc.php"); /* * Ident library */ include_once("libident/libident.php"); /* * phpWebLogAnalyzer global variabiles */ $phpWebLogAnalyzer_db_handle = 0; unset($phpWebLogAnalyzer_db_handle); /* * phpWebLogAnalyzer_open_db_connection() * * Opens database connection. */ function phpWebLogAnalyzer_open_db_connection() { global $phpWebLogAnalyzer_db_handle; global $phpWebLogAnalyzer_MYSQL_HOST; global $phpWebLogAnalyzer_MYSQL_PORT; global $phpWebLogAnalyzer_MYSQL_USERNAME; global $phpWebLogAnalyzer_MYSQL_PASSWORD; global $phpWebLogAnalyzer_MYSQL_DATABASE; $phpWebLogAnalyzer_db_handle = @mysql_connect( "$phpWebLogAnalyzer_MYSQL_HOST:$phpWebLogAnalyzer_MYSQL_PORT", $phpWebLogAnalyzer_MYSQL_USERNAME, $phpWebLogAnalyzer_MYSQL_PASSWORD); if ($phpWebLogAnalyzer_db_handle == false) return false; if (@mysql_select_db($phpWebLogAnalyzer_MYSQL_DATABASE, $phpWebLogAnalyzer_db_handle) == false) return false; return $phpWebLogAnalyzer_db_handle; } /* * phpWebLogAnalyzer_close_db_connection() * * Closes database connection. */ function phpWebLogAnalyzer_close_db_connection() { global $phpWebLogAnalyzer_db_handle; $phpWebLogAnalyzer_db_handle = @mysql_close($phpWebLogAnalyzer_db_handle); return $phpWebLogAnalyzer_db_handle; // true if OK, false if failed } /* * phpWebLogAnalyzer_check_db_handle() * * Check if database handle is still opened. */ function phpWebLogAnalyzer_check_db_handle() { global $phpWebLogAnalyzer_db_handle; if (! isset($phpWebLogAnalyzer_db_handle)) { phpWebLogAnalyzer_open_db_connection() or phpWebLogAnalyzer_error("database server connection error"); } } /* * phpWebLogAnalyzer_register_access() * * Register access. Insert one record to accesses table. * Also insert records into another tables if it is neccessary. */ function phpWebLogAnalyzer_register_access($value = 0) { global $phpWebLogAnalyzer_db_handle; global $phpWebLogAnalyzer_MYSQL_DATABASE; global $phpWebLogAnalyzer_LOG_TABLE; phpWebLogAnalyzer_check_db_handle(); global $REQUEST_METHOD; global $QUERY_STRING; global $PATH_INFO; global $PATH_TRANSLATED; global $CONTENT_TYPE; global $CONTENT_LENGTH; global $SCRIPT_NAME; global $SERVER_NAME; global $SERVER_PORT; global $SERVER_SOFTWARE; global $SERVER_PROTOCOL; global $SERVER_ADMIN; global $SERVER_SIGNATURE; global $GATEWAY_INTERFACE; global $REMOTE_HOST; global $REMOTE_ADDR; global $REMOTE_PORT; global $AUTH_TYPE; global $REMOTE_USER; global $REMOTE_IDENT; global $DOCUMENT_ROOT; global $HTTP_ACCEPT; global $HTTP_ACCEPT_CHARSET; global $HTTP_ACCEPT_ENCODING; global $HTTP_ACCEPT_LANGUAGE; global $HTTP_CONNECTION; global $HTTP_HOST; global $HTTP_REFERER; global $HTTP_USER_AGENT; global $SCRIPT_FILENAME; global $REQUEST_URI; $ip_addr = ''; $hostname = ''; $proxy_ip_addr = ''; $proxy_hostname = ''; $ident_user = ''; $ident_ostype = ''; /* * IP address & proxy server getting. */ if (getenv('HTTP_X_FORWARDED_FOR') != '') { $ip_addr = getenv('HTTP_X_FORWARDED_FOR'); $proxy_ip_addr = getenv('REMOTE_ADDR'); } else { $ip_addr = getenv('REMOTE_ADDR'); } /* * Host name resolving. */ $hostname = @gethostbyaddr($ip_addr); if (! strcmp($hostname, $ip_addr)) $hostname = ''; if ($proxy_ip_addr) { $proxy_hostname = @gethostbyaddr($proxy_ip_addr); if (! strcmp($proxy_hostname, $proxy_ip_addr)) $proxy_hostname = ''; } /* * Ident protocol stuff */ $ident = new Net_Ident($ip_addr, $REMOTE_PORT, $SERVER_PORT); if ($ident->status() == 1) { // print "Ident query failed: " . $ident->error() . ".
\n"; } else { $ident_user = $ident->user(); $ident_ostype = $ident->osType(); } $record = array ( // * - not in PHP manual 'id' => 0, // 0 - auto_increment 'value_id' => phpWebLogAnalyzer_get_id( 'weblog_values', $value), 'request_method_id' => phpWebLogAnalyzer_get_id( 'weblog_request_methods', $REQUEST_METHOD), 'query_string_id' => phpWebLogAnalyzer_get_id( 'weblog_query_strings', $QUERY_STRING), 'path_info_id' => phpWebLogAnalyzer_get_id( 'weblog_path_infos', $PATH_INFO), // * 'path_translated_id' => phpWebLogAnalyzer_get_id( 'weblog_paths_translated', $PATH_TRANSLATED), 'content_type_id' => phpWebLogAnalyzer_get_id( 'weblog_content_types', $CONTENT_TYPE), // * 'content_length' => $CONTENT_LENGTH, // * 'script_name_id' => phpWebLogAnalyzer_get_id( 'weblog_script_names', $SCRIPT_NAME), 'server_name_id' => phpWebLogAnalyzer_get_id( 'weblog_server_names', $SERVER_NAME), 'server_port' => $SERVER_PORT, // * 'server_software_id' => phpWebLogAnalyzer_get_id( 'weblog_server_softwares', $SERVER_SOFTWARE), 'server_protocol_id' => phpWebLogAnalyzer_get_id( 'weblog_server_protocols', $SERVER_PROTOCOL), 'server_admin_id' => phpWebLogAnalyzer_get_id( 'weblog_server_admins', $SERVER_ADMIN), 'server_signature_id' => phpWebLogAnalyzer_get_id( 'weblog_server_signatures', $SERVER_SIGNATURE), 'gateway_interface_id' => phpWebLogAnalyzer_get_id( 'weblog_gateway_interfaces', $GATEWAY_INTERFACE), 'remote_host_id' => phpWebLogAnalyzer_get_id( 'weblog_remote_hosts', $hostname), // * 'proxy_addr_id' => phpWebLogAnalyzer_get_id( 'weblog_remote_addrs', $proxy_ip_addr), 'proxy_host_id' => phpWebLogAnalyzer_get_id( 'weblog_remote_hosts', $proxy_hostname), // * 'remote_addr_id' => ($remote_addr_id = phpWebLogAnalyzer_get_id( 'weblog_remote_addrs', $ip_addr)), 'remote_host_id' => phpWebLogAnalyzer_get_id( 'weblog_remote_hosts', $hostname), // * 'remote_port' => $REMOTE_PORT, 'auth_type_id' => phpWebLogAnalyzer_get_id( 'weblog_auth_types', $AUTH_TYPE), // * 'remote_user_id' => phpWebLogAnalyzer_get_id( 'weblog_remote_users', $REMOTE_USER), // * 'remote_ident_id' => phpWebLogAnalyzer_get_id( 'weblog_remote_idents', $REMOTE_IDENT), // * 'document_root_id' => phpWebLogAnalyzer_get_id( 'weblog_document_roots', $DOCUMENT_ROOT), 'http_accept_id' => phpWebLogAnalyzer_get_id( 'weblog_http_accepts', $HTTP_ACCEPT), 'http_accept_charset_id' => phpWebLogAnalyzer_get_id( 'weblog_http_accept_charsets', $HTTP_ACCEPT_CHARSET), 'http_accept_encoding_id' => phpWebLogAnalyzer_get_id( 'weblog_http_accept_encodings', $HTTP_ACCEPT_ENCODING), 'http_accept_language_id' => phpWebLogAnalyzer_get_id( 'weblog_http_accept_languages', $HTTP_ACCEPT_LANGUAGE), 'http_connection_id' => phpWebLogAnalyzer_get_id( 'weblog_http_connections', $HTTP_CONNECTION), 'http_host_id' => phpWebLogAnalyzer_get_id( 'weblog_http_hosts', $HTTP_HOST), 'http_referer_id' => phpWebLogAnalyzer_get_id( 'weblog_http_referers', $HTTP_REFERER), 'http_user_agent_id' => ($http_user_agent_id = phpWebLogAnalyzer_get_id( 'weblog_http_user_agents', $HTTP_USER_AGENT)), 'script_filename_id' => phpWebLogAnalyzer_get_id( 'weblog_script_filenames', $SCRIPT_FILENAME), 'request_uri_id' => phpWebLogAnalyzer_get_id( 'weblog_request_uris', $REQUEST_URI), 'ident_username_id' => phpWebLogAnalyzer_get_id( 'weblog_ident_usernames', $ident_user), 'ident_ostype_id' => phpWebLogAnalyzer_get_id( 'weblog_ident_ostypes', $ident_ostype), 'session_id' => phpWebLogAnalyzer_get_session_id( $remote_addr_id, $http_user_agent_id) ); $keys = ''; $vals = ''; $count = 0; foreach ($record as $key => $val) { $count++; $sep = ($count < count($record) ? ", " : ""); $keys .= $key . $sep; $vals .= ($val ? "'$val'" : "NULL") . $sep; } $query = "insert into $phpWebLogAnalyzer_LOG_TABLE" ." ( datetime, $keys ) values ( sysdate(), $vals )"; //print "$query
\n"; $result = @mysql_query($query, $phpWebLogAnalyzer_db_handle) or phpWebLogAnalyzer_db_error(); return; } /* * phpWebLogAnalyzer_get_id() * * Return ID of $value in $table. * If $value is not in table, record will be inserted. */ function phpWebLogAnalyzer_get_id($table, $value) { /* * If you want to have 0 or "" in you database as valid values, * uncomment this and comment the next line. Otherwise 0 and "" values * will be counted as NULL. */ // if (!isset($value) || !isset($table)) return 0; if (!$value || !$table) return 0; global $phpWebLogAnalyzer_db_handle; phpWebLogAnalyzer_check_db_handle(); $query = "select id from $table" ." where value = substring('" . addslashes($value) . "', 1, 255)" ." limit 1"; $result = @mysql_query($query, $phpWebLogAnalyzer_db_handle) or phpWebLogAnalyzer_db_error(); if ($row = @mysql_fetch_array($result)) return $row[0]; $query = "insert into $table (id, value)" ." values (0, '" . addslashes($value) . "')"; $result = @mysql_query($query, $phpWebLogAnalyzer_db_handle) or phpWebLogAnalyzer_db_error(); $query = "select last_insert_id()"; $result = @mysql_query($query, $phpWebLogAnalyzer_db_handle) or phpWebLogAnalyzer_db_error(); if ($row = @mysql_fetch_array($result)) return $row[0]; return 0; } /* * phpWebLogAnalyzer_get_session_id() * * Returns session_id according to $remote_addr_id and $http_user_agent_id * and session timeout defined in config.inc.php file. */ function phpWebLogAnalyzer_get_session_id( $remote_addr_id, $http_user_agent_id) { global $phpWebLogAnalyzer_SESSION_TIMEOUT; global $phpWebLogAnalyzer_db_handle; phpWebLogAnalyzer_check_db_handle(); $query = "select" ." id, session_id," ." unix_timestamp(now()) - unix_timestamp(datetime) as diff_sec" ." from weblog_accesses" ." where remote_addr_id = '$remote_addr_id'" ." and http_user_agent_id = '$http_user_agent_id'" ." order by datetime desc" ." limit 1"; $result = @mysql_query($query, $phpWebLogAnalyzer_db_handle) or phpWebLogAnalyzer_db_error(); if (($row = @mysql_fetch_array($result, MYSQL_ASSOC)) && ($row[diff_sec] < $phpWebLogAnalyzer_SESSION_TIMEOUT) && ($row[session_id])) { return $row[session_id]; } //echo "if: ". $row[diff_sec] . " < " // . $phpWebLogAnalyzer_SESSION_TIMEOUT . "
"; $query = "select max(session_id) + 1 as new_session_id" ." from weblog_accesses"; $result = @mysql_query($query, $phpWebLogAnalyzer_db_handle) or phpWebLogAnalyzer_db_error(); if (($row = @mysql_fetch_array($result, MYSQL_ASSOC)) && ($row[new_session_id])) { return $row[new_session_id]; } return 1; } /* * phpWebLogAnalyzer_get_sessions_count() * */ function phpWebLogAnalyzer_get_sessions_count($ar = '') { global $phpWebLogAnalyzer_db_handle; phpWebLogAnalyzer_check_db_handle(); $list_tables = ''; $list_where = ''; if (is_array($ar)) { $names = array( 'id' => array( 'column' => 'id_id'), 'datetime' => array( 'column' => 'datetime_id'), 'value' => array( 'column' => 'value_id', 'table' => 'weblog_values'), 'request_method' => array( 'column' => 'request_method_id', 'table' => 'weblog_request_methods'), 'query_string' => array( 'column' => 'query_string_id', 'table' => 'weblog_query_strings'), 'path_info' => array( 'column' => 'path_info_id', 'table' => 'weblog_path_infos'), 'path_translated' => array( 'column' => 'path_translated_id', 'table' => 'weblog_paths_translated'), 'content_type' => array( 'column' => 'content_type_id', 'table' => 'weblog_content_types'), 'content_length' => array( 'column' => 'content_length'), 'script_name' => array( 'column' => 'script_name_id', 'table' => 'weblog_script_names'), 'server_name' => array( 'column' => 'server_name_id', 'table' => 'weblog_server_names'), 'server_port' => array( 'column' => 'server_port'), 'server_software' => array( 'column' => 'server_software_id', 'table' => 'weblog_server_softwares'), 'server_protocol' => array( 'column' => 'server_protocol_id', 'table' => 'weblog_server_protocols'), 'gateway_interface' => array( 'column' => 'gateway_interface_id', 'table' => 'weblog_gateway_interfaces'), 'proxy_addr' => array( 'column' => 'proxy_addr_id', 'table' => 'weblog_remote_addrs'), 'proxy_host' => array( 'column' => 'proxy_host_id', 'table' => 'weblog_remote_hosts'), 'remote_addr' => array( 'column' => 'remote_addr_id', 'table' => 'weblog_remote_addrs'), 'remote_host' => array( 'column' => 'remote_host_id', 'table' => 'weblog_remote_hosts'), 'remote_port' => array( 'column' => 'remote_port_id'), 'auth_type' => array( 'column' => 'auth_type_id', 'table' => 'weblog_auth_types'), 'remote_user' => array( 'column' => 'remote_user_id', 'table' => 'weblog_remote_users'), 'remote_ident' => array( 'column' => 'remote_ident_id', 'table' => 'weblog_remote_idents'), 'document_root' => array( 'column' => 'document_root_id', 'table' => 'weblog_document_roots'), 'http_accept' => array( 'column' => 'http_accept_id', 'table' => 'weblog_http_accepts'), 'http_accept_charset' => array( 'column' => 'http_accept_charset_id', 'table' => 'weblog_http_accept_charsets'), 'http_accept_encoding' => array( 'column' => 'http_accept_encoding_id', 'table' => 'weblog_http_accept_encodings'), 'http_accept_language' => array( 'column' => 'http_accept_language_id', 'table' => 'weblog_http_accept_languages'), 'http_connection' => array( 'column' => 'http_connection_id', 'table' => 'weblog_http_connections'), 'http_host' => array( 'column' => 'http_host_id', 'table' => 'weblog_http_hosts'), 'http_referer' => array( 'column' => 'http_referer_id', 'table' => 'weblog_http_referers'), 'http_user_agent' => array( 'column' => 'http_user_agent_id', 'table' => 'weblog_http_user_agents'), 'script_filename' => array( 'column' => 'script_filename_id', 'table' => 'weblog_script_filenames'), 'server_admin' => array( 'column' => 'server_admin_id', 'table' => 'weblog_server_admins'), 'server_signature' => array( 'column' => 'server_signature_id', 'table' => 'weblog_server_signatures'), 'request_uri' => array( 'column' => 'request_uri_id', 'table' => 'weblog_request_uris'), 'ident_username' => array( 'column' => 'ident_username_id', 'table' => 'weblog_ident_usernames'), 'ident_ostype' => array( 'column' => 'ident_ostype_id', 'table' => 'weblog_ident_ostypes'), 'session' => array( 'column' => 'session_id', 'table' => 'weblog_sessions'), ); global $phpWebLogAnalyzer_LOG_TABLE; $count = 0; foreach ($ar as $key => $val) { $count++; if (isset($names[$key][table])) { $list_where .= "$phpWebLogAnalyzer_LOG_TABLE." . $names[$key][column] . " = " . $names[$key][table] . ".id and " . $names[$key][table] . ".value like '$val'"; $list_tables .= $names[$key][table]; if ($count < count($ar)) $list_tables .= ', '; } else { $list_where .= $names[$key] . " = '$val'"; } if ($count < count($ar)) $list_where .= ' and '; } } $query = "select" ." count(distinct session_id) as sessions_count" ." from weblog_accesses"; if (strlen($list_tables) > 0) $query .= ", " . $list_tables; if (strlen($list_where) > 0) $query .= " where " . $list_where; //echo "

$query


"; $result = @mysql_query($query, $phpWebLogAnalyzer_db_handle) or phpWebLogAnalyzer_db_error(); if ($row = @mysql_fetch_array($result, MYSQL_ASSOC)) return $row[sessions_count]; return false; } /* * phpWebLogAnalyzer_db_error() * * Database error handling function. */ function phpWebLogAnalyzer_db_error() { return phpWebLogAnalyzer_error("error during work with database server"); } /* * phpWebLogAnalyzer_error() * * Error handling function. */ function phpWebLogAnalyzer_error($message = "Unknown error") { die ("phpWebLogAnalyzer fatal failure: " . $message . "
Please contact webmaster or system administrator" . " of this page with this problem.
"); return false; } ?>