Сообщество IT-специалистов
Ответы на любые вопросы об IT
Профессиональное развитие в IT
Удаленная работа для IT-специалистов
class db { var $db_id = false; var $query_num = 0; var $query_list = array(); var $query_errors_list = array(); var $mysql_error = ''; var $mysql_version = ''; var $mysql_error_num = 0; var $mysql_extend = ""; var $MySQL_time_taken = 0; var $query_id = false; function connect($db_user, $db_pass, $db_name, $db_location = 'localhost', $show_error=1) { $db_location = explode(":", $db_location); if (isset($db_location[1])) { $this->db_id = @mysqli_connect($db_location[0], $db_user, $db_pass, $db_name, $db_location[1]); } else { $this->db_id = @mysqli_connect($db_location[0], $db_user, $db_pass, $db_name); } if(!$this->db_id) { if($show_error == 1) { $this->display_error(mysqli_connect_error(), '1'); } else { $this->query_errors_list[] = array( 'error' => mysqli_connect_error() ); return false; } } $this->mysql_version = mysqli_get_server_info($this->db_id); if( version_compare($this->mysql_version, '5.5.3', '<') ) { die ("Datalife Engine required MySQL version 5.5.3 or greater. You need upgrade MySQL version on your server."); } mysqli_set_charset ($this->db_id , COLLATE ); mysqli_query($this->db_id, "SET NAMES '" . COLLATE . "'"); $this->sql_mode(); return true; } function query($query, $show_error=true) { $time_before = $this->get_real_time(); if(!$this->db_id) $this->connect(DBUSER, DBPASS, DBNAME, DBHOST); if(!($this->query_id = mysqli_query($this->db_id, $query) )) { $this->mysql_error = mysqli_error($this->db_id); $this->mysql_error_num = mysqli_errno($this->db_id); if($show_error) { $this->display_error($this->mysql_error, $this->mysql_error_num, $query); } else { $this->query_errors_list[] = array( 'query' => $query, 'error' => $this->mysql_error ); } } $this->MySQL_time_taken += $this->get_real_time() - $time_before; // $this->query_list[] = array( 'time' => ($this->get_real_time() - $time_before), // 'query' => $query, // 'num' => (count($this->query_list) + 1)); $this->query_num ++; return $this->query_id; } function multi_query($query, $show_error=true) { $time_before = $this->get_real_time(); if(!$this->db_id) $this->connect(DBUSER, DBPASS, DBNAME, DBHOST); if( mysqli_multi_query($this->db_id, $query) ) { while( mysqli_more_results($this->db_id) && mysqli_next_result($this->db_id) ){ ; } } if( mysqli_error($this->db_id) ) { $this->mysql_error = mysqli_error($this->db_id); $this->mysql_error_num = mysqli_errno($this->db_id); if($show_error) { $this->display_error($this->mysql_error, $this->mysql_error_num, $query); } else { $this->query_errors_list[] = array( 'query' => $query, 'error' => $this->mysql_error ); } } $this->MySQL_time_taken += $this->get_real_time() - $time_before; $this->query_num ++; } function get_row($query_id = '') { if ($query_id == '') $query_id = $this->query_id; return mysqli_fetch_assoc($query_id); } function get_affected_rows() { return mysqli_affected_rows($this->db_id); } function get_array($query_id = '') { if ($query_id == '') $query_id = $this->query_id; return mysqli_fetch_array($query_id); } function super_query($query, $multi = false) { if(!$multi) { $this->query($query); $data = $this->get_row(); $this->free(); return $data; } else { $this->query($query); $rows = array(); while($row = $this->get_row()) { $rows[] = $row; } $this->free(); return $rows; } } function num_rows($query_id = '') { if ($query_id == '') $query_id = $this->query_id; return mysqli_num_rows($query_id); } function insert_id() { return mysqli_insert_id($this->db_id); } function get_result_fields($query_id = '') { if ($query_id == '') $query_id = $this->query_id; while ($field = mysqli_fetch_field($query_id)) { $fields[] = $field; } return $fields; } function safesql( $source ) { if(!$this->db_id) $this->connect(DBUSER, DBPASS, DBNAME, DBHOST); if ($this->db_id) return mysqli_real_escape_string ($this->db_id, $source); else return addslashes($source); } function free( $query_id = '' ) { if ($query_id == '') $query_id = $this->query_id; @mysqli_free_result($query_id); } function close() { @mysqli_close($this->db_id); $this->db_id = false; } function get_real_time() { list($seconds, $microSeconds) = explode(' ', microtime()); return ((float)$seconds + (float)$microSeconds); } function sql_mode() { $remove_modes = array( 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'ONLY_FULL_GROUP_BY', 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE', 'TRADITIONAL' ); $res = $this->query( "SELECT @@SESSION.sql_mode" ); $this->query_num --; $row = $this->get_array(); if ( !$row[0] ) { return; } $modes_array = explode( ',', $row[0] ); $modes_array = array_change_key_case( $modes_array, CASE_UPPER ); foreach ( $modes_array as $key => $value ) { if ( in_array( $value, $remove_modes ) ) { unset( $modes_array[ $key ] ); } } $mode_list = implode(',', $modes_array); if($row[0] != $mode_list) { $this->query( "SET SESSION sql_mode='{$mode_list}'" ); $this->query_num --; } } function __destruct() { if( $this->db_id ) @mysqli_close($this->db_id); $this->db_id = false; } function display_error($error, $error_num, $query = '') { $query = htmlspecialchars($query, ENT_QUOTES, 'utf-8'); $error = htmlspecialchars($error, ENT_QUOTES, 'utf-8'); $trace = debug_backtrace(); $level = 0; if ($trace[1]['function'] == "query" ) $level = 1; if ($trace[2]['function'] == "super_query" ) $level = 2; $trace[$level]['file'] = str_replace(ROOT_DIR, "", $trace[$level]['file']); echo <<<HTML <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>MySQL Fatal Error</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style type="text/css"> <!-- body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; font-style: normal; color: #000000; } .top { color: #ffffff; font-size: 15px; font-weight: bold; padding-left: 20px; padding-top: 10px; padding-bottom: 10px; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.75); background-color: #AB2B2D; background-image: -moz-linear-gradient(top, #CC3C3F, #982628); background-image: -ms-linear-gradient(top, #CC3C3F, #982628); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#CC3C3F), to(#982628)); background-image: -webkit-linear-gradient(top, #CC3C3F, #982628); background-image: -o-linear-gradient(top, #CC3C3F, #982628); background-image: linear-gradient(top, #CC3C3F, #982628); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#CC3C3F', endColorstr='#982628',GradientType=0 ); background-repeat: repeat-x; border-bottom: 1px solid #ffffff; } .box { margin: 10px; padding: 4px; background-color: #EFEDED; border: 1px solid #DEDCDC; } --> </style> </head> <body> <div style="width: 700px;margin: 20px; border: 1px solid #D9D9D9; background-color: #F1EFEF; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; -moz-box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.3); -webkit-box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.3); box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.3);" > <div class="top" >MySQL Error!</div> <div class="box" ><b>MySQL error</b> in file: <b>{$trace[$level]['file']}</b> at line <b>{$trace[$level]['line']}</b></div> <div class="box" >Error Number: <b>{$error_num}</b></div> <div class="box" >The Error returned was:<br /> <b>{$error}</b></div> <div class="box" ><b>SQL query:</b><br /><br />{$query}</div> </div> </body> </html> HTML; exit(); } }