/****************************************************************\ ****************************************************************** ****************************************************************** Class Database_mysql v0.2 ****************************************************************** ****************************************************************** \****************************************************************/ class Database { /****************************************************************\ PUBLIC PROPERTIES \****************************************************************/ var $host; var $user; var $pass; var $name; var $ERROR_DEBUG; var $ERROR_DISPLAY; var $ERROR_DIE; var $FATAL_ERROR_DIE; var $BENCH; /****************************************************************\ EOF PUBLIC PROPERTIES \****************************************************************/ /****************************************************************\ PRIVATE PROPERTIES \****************************************************************/ var $_link_identifier; var $_last_query_resource; var $_queries; /****************************************************************\ EOF PRIVATE PROPERTIES \****************************************************************/ /****************************************************************\ Constructor \****************************************************************/ function Database ($host='', $user='', $pass='', $name='') { $this->host = ( empty($host) ? '' : $host ); $this->user = ( empty($user) ? '' : $user ); $this->pass = ( empty($pass) ? '' : $pass ); $this->name = ( empty($name) ? '' : $name ); $this->ERROR_DEBUG = false; $this->ERROR_DISPLAY = false; $this->ERROR_DIE = false; $this->FATAL_ERROR_DIE = true; $this->BENCH = false; $this->_link_identifier = NULL; $this->_last_query_resource = NULL; $this->_queries = array(); } /****************************************************************\ EOF Constructor \****************************************************************/ /***********************************************************************************************\ PUBLIC METHODS \***********************************************************************************************/ function connect($host='', $user='', $pass='', $name='', $_pconnect=false) { $this->host = ( empty($host) ? $this->host : $host ); $this->user = ( empty($user) ? $this->user : $user ); $this->pass = ( empty($pass) ? $this->pass : $pass ); $this->name = ( empty($name) ? $this->name : $name ); if ($_pconnect) { $this->_link_identifier = @mysql_pconnect($this->host, $this->user, $this->pass); } else { $this->_link_identifier = @mysql_connect($this->host, $this->user, $this->pass); } if ($this->_link_identifier === false) { $this->_fatalErrorHandler('Cannot open connection to MySQL server.'); return false; } if ($this->select_db($this->name, $this->_link_identifier) === false) { $this->_fatalErrorHandler('Cannot select database.'); return false; } return $this->_link_identifier; } function pconnect($host='', $user='', $pass='', $name='') { return $this->connect($host, $user, $pass, $name, true); } function disconnect($link_identifier=NULL) { if (!isset($link_identifier)) { $link_identifier = $this->_link_identifier; } if ( !mysql_close($link_identifier) ) { $this->_fatalErrorHandler('Cannot close connection to MySQL server.'); return false; } return true; } function query($query, $display=false, $execute=true, $link_identifier=NULL) { if (!isset($link_identifier)) { $link_identifier = $this->_link_identifier; } if ($display === true) { $this->_debugHandler($query); } // if query is not to be executed return false if ($execute === false) { return false; } // else continue with execution if ($this->BENCH === true) { $time_start = microtime(); } $qid = mysql_query($query, $link_identifier); if ($this->BENCH == true) { $time_stop = microtime(); if (stristr(substr($query, 0, 6), 'SELECT') === false) { if (strlen($query) < 200) { $_query = $query; } else { $_query = substr($query, 0, 100) .'... ...'. substr($query, -100); } } else { $_query = $query; } $this->_queries[] = array('query' => $_query, 'time_start' => $time_start, 'time_stop' => $time_stop); } if ($qid === false) { $this->_errorHandler('Cannot execute query', $query, $link_identifier); return false; } $this->_last_query_resource = $qid; return $qid; } function query_array($query, $display=false, $execute=true, $link_identifier=NULL) { $res = $this->query($query, $display, $execute, $link_identifier); if ($res === false) { return false; } if ($this->num_rows() != 1) { $this->_errorHandler('Result is not a single array', $query, $link_identifier); return false; } else { return $this->fetch_array(); } } function query_assoc($query, $display=false, $execute=true, $link_identifier=NULL) { $res = $this->query($query, $display, $execute, $link_identifier); if ($res === false) { return false; } if ($this->num_rows() != 1) { $this->_errorHandler('Result is not a single associative array', $query, $link_identifier); return false; } else { return $this->fetch_assoc(); } } function query_row($query, $dispaly=false, $execute=true, $link_identifier=NULL) { $res = $this->query($query, $display, $execute, $link_identifier); if ($res === false) { return false; } if ($this->num_rows() != 1) { $this->_errorHandler('Result is not a single row', $query, $link_identifier); return false; } else { return $this->fetch_row(); } } function query_object($query, $display=false, $execute=true, $link_identifier=NULL) { $res = $this->query($query, $display, $execute, $link_identifier); if ($res === false) { return false; } if ($this->num_rows() != 1) { $this->_errorHandler('Result is not a single object', $query, $link_identifier); return false; } else { return $this->fetch_object(); } } function query_field($query, $display=false, $execute=true, $link_identifier=NULL) { $row = $this->query_row($query, $display, $execute, $link_identifier); if ($row === false) { return false; } if ($this->num_fields() != 1) { $this->_errorHandler('Result is not a single value', $query, $link_identifier); return false; } else { return $row[0]; } } function fetch_array($result=NULL) { if (!isset($result)) { $result = $this->_last_query_resource; } return mysql_fetch_array($result); } function fetch_assoc($result=NULL) { if (!isset($result)) { $result = $this->_last_query_resource; } return mysql_fetch_assoc($result); } function fetch_row($result=NULL) { if (!isset($result)) { $result = $this->_last_query_resource; } return mysql_fetch_row($result); } function fetch_object($result=NULL) { if (!isset($result)) { $result = $this->_last_query_resource; } return mysql_fetch_object($result); } function num_rows($result=NULL) { if (!isset($result)) { $result = $this->_last_query_resource; } return mysql_num_rows($result); } function num_fields($result=NULL) { if (!isset($result)) { $result = $this->_last_query_resource; } return mysql_num_fields($result); } function affected_rows($link_identifier=NULL) { if (!isset($link_identifier)) { $link_identifier = $this->_link_identifier; } return mysql_affected_rows($link_identifier); } function insert_id($link_identifier=NULL) { if (!isset($link_identifier)) { $link_identifier = $this->_link_identifier; } return mysql_insert_id($link_identifier); } function free_result($result=NULL) { if (!isset($result)) { $result = $this->_last_query_resource; } return mysql_free_result($result); } function select_db($db_name, $link_identifier=NULL) { if (!isset($link_identifier)) { $link_identifier = $this->_link_identifier; } return mysql_select_db($db_name, $link_identifier); } function errno($link_identifier=NULL) { if (!isset($link_identifier)) { $link_identifier = $this->_link_identifier; } return mysql_errno($link_identifier); } function error($link_identifier=NULL) { if (!isset($link_identifier)) { $link_identifier = $this->_link_identifier; } return mysql_error($link_identifier); } function data_seek($result, $row_number=NULL) { if (!isset($row_number)) { $row_number = $result; $result = $this->_last_query_result; } return mysql_data_seek($result, $field_index); } function fetch_field($result, $field_offset=NULL) { if (!isset($field_offset)) { $field_offset = $result; $result = $this->_last_query_result; } return mysql_fetch_field($result, $field_offset); } function showQueries($bold_threshold_percent = 10, $critical_threshold_time = 1) { // count executed queries first $queries_count = count($this->_queries); if ($queries_count == 0) { echo "No queries successfully executed."; return true; } // calculate time spent $total_time_spent = 0; foreach ($this->_queries as $key => $value) { list($start_usec, $start_sec) = explode(" ", $value['time_start']); list($stop_usec, $stop_sec) = explode(" ", $value['time_stop']); $time = ($stop_sec + $stop_usec) - ($start_sec + $start_usec); $this->_queries[$key]['time'] = $time; $total_time_spent += $time; } // calculate average $average_query_time = $total_time_spent / $queries_count; // calculate estimated page loads per seconds $estimated_page_loads = 1 / $total_time_spent; // bold threshold $bold_threshold_time = $average_query_time * (1 + $bold_threshold_percent / 100); // value given in percent // critical threshold $critical_threshold_time = $critical_threshold_time / 1000; //value given in miliseconds echo '
| Queries executed: | '. $queries_count .' | ||
| Total time spent: | '. number_format($total_time_spent * 1000, 3) .' ms | ||
| Average query time: | '. number_format($average_query_time * 1000, 3) .' ms | ||
| Estimated page loads: | '. number_format($estimated_page_loads, 1) .' pages/second | ||
| '; } elseif ($value['time'] > $bold_threshold_time) { echo ' | '; } else { echo ' | '; } echo number_format($value['time'] * 1000, 3) .' ms'; echo ' | '; echo htmlspecialchars($value['query']); echo ' |
'. htmlspecialchars($query) .'
'. htmlspecialchars($query) .'