Current Path : /var/www/html/clients/rebirth.e-nk.ru/ips_kernel/ |
Current File : /var/www/html/clients/rebirth.e-nk.ru/ips_kernel/class_db.php |
<?php /* +-------------------------------------------------------------------------- | Invision Power Services Kernel [DB Abstraction] | Invision Power Board | ============================================= | by Matthew Mecham | (c) 2001 - 2006 Invision Power Services, Inc. | Nullified by Terabyte | ============================================= | +--------------------------------------------------------------------------- | THIS IS NOT FREE / OPEN SOURCE SOFTWARE +--------------------------------------------------------------------------- | | > Core Module | > Module written by Matt Mecham | > Date started: Monday 28th February 2005 16:46 | | > Module Version Number: 2.1.0 +-------------------------------------------------------------------------- */ /** * IPS Kernel Pages: Database Object Core * * Basic Usage Examples * <code> * $db = new db_driver(); * Update: * $db->do_update( 'table', array( 'field' => 'value', 'field2' => 'value2' ), 'id=1' ); * Insert * $db->do_insert( 'table', array( 'field' => 'value', 'field2' => 'value2' ) ); * Delete * $db->build_and_exec_query( array( 'delete' => 'table', 'where' => 'id=1' ) ); * Select * $db->build_query( array( 'select' => '*', * 'from' => 'table', * 'where' => 'id=2 and mid=1', * 'order' => 'date DESC', * 'limit' => array( 0, 30 ) ) ); * $db->exec_query(); * while( $row = $db->fetch_row() ) { .... } * Select with join * $db->build_query( array( 'select' => 'd.*', * 'from' => array( 'dnames_change' => 'd' ), * 'where' => 'dname_member_id='.$id, * 'add_join' => 0 => array( 'select' => 'm.members_display_name', * 'from' => array( 'members' => 'm' ), * 'where' => 'm.id=d.dname_member_id', * 'type' => 'inner' ), * 'order' => 'dname_date DESC' ) ); * $db->exec_query(); * </code> * * @package IPS_KERNEL * @subpackage DatabaseAbstraction * @author Matt Mecham * @version 2.1 */ /** * DB Class: Core Methods * * Base class for database abstraction * * @package IPS_KERNEL * @subpackage DatabaseAbstraction * @author Matt Mecham * @version 2.1 */ //----------------------------------------- // Allow SUB SELECTS? //----------------------------------------- /** * This can be overridden by using * $DB->allow_sub_select = 1; * before any query construct */ define( 'IPS_DB_ALLOW_SUB_SELECTS', 0 ); class db_main { # Global OBJECT /** * DB object array * * @var array */ var $obj = array ( "sql_database" => "" , "sql_user" => "root" , "sql_pass" => "" , "sql_host" => "localhost", "sql_port" => "" , "persistent" => "0" , "sql_tbl_prefix" => "ibf_" , "cached_queries" => array() , 'shutdown_queries' => array() , 'debug' => 0 , 'use_shutdown' => 1 , 'query_cache_file' => '' , 'force_new_connection' => 0 , 'error_log' => '' , 'use_error_log' => 0 , 'use_debug_log' => 0 , ); /** * Error message * * @var string */ var $error = ""; var $error_no = ""; /** * Return error message or die inline * * @var integer */ var $return_die = 0; /** * DB query failed * * @var integer */ var $failed = 0; /** * Work based SQL query * * @var string */ var $sql = ""; /** * Current sql query * * @var string */ var $cur_query = ""; /** * Current DB query ID * * @var object */ var $query_id = ""; /** * Current DB connection ID * * @var object */ var $connection_id = ""; /** * Number of queries used per page gen * * @var integer */ var $query_count = 0; /** * Escape / don't escape slashes during insert ops * * @var integer */ var $manual_addslashes = 0; /** * Is a shutdown query * * @var integer */ var $is_shutdown = 0; /** * Prefix handling * * @var integer */ var $prefix_changed = 0; /** * Prefix already converted * * @var integer */ var $no_prefix_convert = 0; /** * DB record row * * @var array */ var $record_row = array(); /** * Extra classes loaded * * @var array */ var $loaded_classes = array(); /** * Connection variables set when installed * * @var array */ var $connect_vars = array(); /** * Over-ride guessed data types in insert/update ops * * @var array */ var $force_data_type = array(); /** * Select which fields aren't escaped during insert/update ops * * @var array */ var $no_escape_fields = array(); /** * Name of queries file class * * @var string */ var $sql_queries_name = 'sql_queries'; var $mysql_version; var $true_version; /* * Allow sub selects for this query * * @var int */ var $allow_sub_select = 0; /*-------------------------------------------------------------------------*/ // Constructor /*-------------------------------------------------------------------------*/ /** * db_driver constructor * */ function db_driver() { //-------------------------------------------- // Set up any required connect vars here: //-------------------------------------------- $this->connect_vars = array(); } /*-------------------------------------------------------------------------*/ // Set debug mode /*-------------------------------------------------------------------------*/ /** * Set debug mode flag * * @param integer Boolean */ function set_debug_mode( $int=0 ) { $this->obj['debug'] = intval($int); //----------------------------------------- // If debug, no shutdown.... //----------------------------------------- if ( $this->obj['debug'] ) { $this->obj['use_shutdown'] = 0; } } /*-------------------------------------------------------------------------*/ // Set manual escape fields /*-------------------------------------------------------------------------*/ /** * Set no escape fields via DB class * * @param array SQL table fields */ function set_no_escape_fields( $array=array() ) { $this->no_escape_fields = $array; } /*-------------------------------------------------------------------------*/ // Load extra query cache file /*-------------------------------------------------------------------------*/ /** * Load extra SQL query file (DBA) * * @param string File * @param string Classname of file */ function load_cache_file( $filepath, $classname='sql_extra_queries' ) { if ( ! file_exists( $filepath ) ) { print "Cannot locate $filepath - exiting!"; exit(); } else { require_once( $filepath ); { $this->$classname = new $classname( $this ); $this->loaded_classes[] = $classname; } } } /*-------------------------------------------------------------------------*/ // ALIAS: Simple elements /*-------------------------------------------------------------------------*/ /** * Alias for build_query * * @param array SQL commands * @see build_query * @since 2.1 */ function simple_construct( $a ) { return $this->build_query( $a ); } /*-------------------------------------------------------------------------*/ // ALIAS: Load cache query /*-------------------------------------------------------------------------*/ /** * Alias for build_query_from_cache * * @param string Name of query file function to use * @param array Optional arguments to be parsed inside query function * @param string Optional class name * @see build_query_from_cache * @since 2.1 */ function cache_add_query( $q="", $args=array(), $method='sql_queries' ) { return $this->build_query_from_cache( $q, $args, $method ); } /*-------------------------------------------------------------------------*/ // ALIAS: Simple elements /*-------------------------------------------------------------------------*/ /** * Alias for exec_query * * @see exec_query * @since 2.1 */ function cache_exec_query() { return $this->exec_query(); } /*-------------------------------------------------------------------------*/ // ALIAS: Execute a shutdown query from cache or build query /*-------------------------------------------------------------------------*/ /** * Alias for exec_shutdown_query * * @see exec_shutdown_query * @since 2.1 */ function cache_shutdown_exec() { return $this->exec_shutdown_query(); } /*-------------------------------------------------------------------------*/ // ALIAS: Simple elements /*-------------------------------------------------------------------------*/ /** * Alias for simple_exec * * @see simple_exec * @since 2.1 */ function simple_exec() { return $this->exec_query(); } /*-------------------------------------------------------------------------*/ // ALIAS: Shutdown store query /*-------------------------------------------------------------------------*/ /** * Alias for exec_shutdown_query * * @see exec_shutdown_query * @since 2.1 */ function simple_shutdown_exec() { return $this->exec_shutdown_query(); } /*-------------------------------------------------------------------------*/ // ALIAS: Build and exec query /*-------------------------------------------------------------------------*/ /** * Alias for build_and_exec_query * * @see build_and_exec_query * @since 2.1 */ function simple_exec_query( $a ) { return $this->build_and_exec_query( $a ); } /*-------------------------------------------------------------------------*/ // Shutdown update /*-------------------------------------------------------------------------*/ /** * Alias for do_update * * @see do_update * @since 2.1 */ function do_shutdown_update( $tbl, $arr, $where="" ) { # Alias, redirect. $this->do_update( $tbl, $arr, $where, TRUE ); } /*-------------------------------------------------------------------------*/ // Shutdown insert /*-------------------------------------------------------------------------*/ /** * Alias for do_insert * * @see do_insert * @since 2.1 */ function do_shutdown_insert( $tbl, $arr ) { # Alias, redirect. $this->do_insert( $tbl, $arr, TRUE ); } /*-------------------------------------------------------------------------*/ // Quick function: DO DELETE /*-------------------------------------------------------------------------*/ function do_delete( $table, $where="" ) { $this->build_and_exec_query( array( 'delete' => $table, 'where' => $where ) ); } /*-------------------------------------------------------------------------*/ // Simple elements /*-------------------------------------------------------------------------*/ /** * Takes array of set commands and generates a SQL formatted query * * @param array Set commands (select, from, where, order, limit, etc) */ function build_query( $a ) { if ( isset($a['select']) && $a['select'] ) { if ( isset($a['add_join']) && is_array( $a['add_join'] ) ) { $this->simple_select_with_join( $a['select'], $a['from'], isset($a['where']) ? $a['where'] : '', $a['add_join'] ); } else { $this->simple_select( $a['select'], $a['from'], isset($a['where']) ? $a['where'] : '' ); } } if ( isset($a['update']) && $a['update'] ) { $this->simple_update( $a['update'], $a['set'], isset($a['where']) ? $a['where'] : '', isset($a['lowpro']) ? $a['lowpro'] : '' ); } if ( isset($a['delete']) && $a['delete'] ) { $this->simple_delete( $a['delete'], $a['where'] ); } if ( isset($a['group']) && $a['group'] ) { $this->simple_group( $a['group'] ); } if ( isset($a['order']) && $a['order'] ) { $this->simple_order( $a['order'] ); } if ( isset($a['limit']) && is_array( $a['limit'] ) ) { $this->simple_limit( $a['limit'][0], $a['limit'][1] ); } } /*-------------------------------------------------------------------------*/ // Build, execute and return the first row of a query /*-------------------------------------------------------------------------*/ /** * Takes array of set commands and generates a SQL formatted query * and returns the first row automatically * * @param array Set commands (select, from, where, order, limit, etc) * * @return array Array from SQL server */ function build_and_exec_query( $a ) { $this->build_query( $a ); $ci = $this->exec_query(); if ( isset($a['select']) AND $a['select'] ) { return $this->fetch_row( $ci ); } } /*-------------------------------------------------------------------------*/ // Load query from cache file /*-------------------------------------------------------------------------*/ /** * Takes array of set commands and generates a SQL formatted query * and returns the first row automatically * * @param string Name of query file function to use * @param array Optional arguments to be parsed inside query function * @param string Optional class name */ function build_query_from_cache( $q="", $args=array(), $method='sql_queries' ) { if ( $this->obj['query_cache_file'] and $method == 'sql_queries' ) { $this->cur_query .= $this->sql->$q( $args ); } else if ( in_array( $method, $this->loaded_classes ) ) { $this->cur_query .= $this->$method->$q( $args ); } } /*-------------------------------------------------------------------------*/ // SIMPLE: EXEC QUERY /*-------------------------------------------------------------------------*/ /** * Executes stored SQL query * * @return object Query ID */ function exec_query() { if ( $this->cur_query != "" ) { $ci = $this->query( $this->cur_query ); } $this->cur_query = ""; $this->is_shutdown = 0; return $ci; } /*-------------------------------------------------------------------------*/ // Exec shut down cache /*-------------------------------------------------------------------------*/ /** * Executes stored SQL query * */ function exec_shutdown_query() { if ( ! $this->obj['use_shutdown'] ) { $this->is_shutdown = 1; return $this->exec_query(); } else { $this->obj['shutdown_queries'][] = $this->cur_query; $this->cur_query = ""; } } /*-------------------------------------------------------------------------*/ // Test to see if a field exists by forcing and trapping an error. // It ain't pretty, but it do the job don't it, eh? // Return 1 for exists, 0 for not exists and jello for the naked guy // Fun fact: The number of times I spelt 'field' as 'feild'in this part: 104 /*-------------------------------------------------------------------------*/ /** * Test to see whether a field exists in a table * * @param string Field name * @param string Table name * * @return integer Boolean (0,1) */ function field_exists($field, $table) { $this->return_die = 1; $this->error = ""; $this->simple_select( "COUNT($field) as count", $table ); $this->simple_exec(); $return = 1; if ( $this->failed ) { $return = 0; } $this->error = ""; $this->return_die = 0; $this->error_no = 0; $this->failed = 0; return $return; } /*-------------------------------------------------------------------------*/ // Return the amount of queries used /*-------------------------------------------------------------------------*/ /** * Returns current number of parsed and run queries * * @return integer Value stored in var $query_count */ function get_query_cnt() { return $this->query_count; } /*-------------------------------------------------------------------------*/ // Flushes the in memory query string /*-------------------------------------------------------------------------*/ /** * Flushes the $this->cur_query string * * @return void */ function flush_query() { $this->cur_query = ""; } /*-------------------------------------------------------------------------*/ // Basic error handler /*-------------------------------------------------------------------------*/ /** * Prints SQL error message * * @param string Additional error message * * @return integer Optional, if var $return_die is set to 1 */ function fatal_error($the_error="") { //----------------------------------------- // INIT //----------------------------------------- $this->error = $this->_get_error_string(); $this->error_no = $this->_get_error_number(); if ( $this->return_die == 1 ) { $this->error = ( $this->error == "" ? $the_error : $this->error ); $this->failed = 1; return; } else if ( $this->obj['use_error_log'] AND $this->obj['error_log'] ) { $_error_string = "\n==================================================="; $_error_string .= "\n Date: ". date( 'r' ); $_error_string .= "\n Error Number: " . $this->error_no; $_error_string .= "\n Error: " . $this->error; $_error_string .= "\n IP Address: " . $_SERVER['REMOTE_ADDR']; $_error_string .= "\n ".$the_error; if ( $FH = @fopen( $this->obj['error_log'], 'a' ) ) { @fwrite( $FH, $_error_string ); @fclose( $FH ); } print "<html><head><title>IPS Driver Error</title> <style>P,BODY{ font-family:arial,sans-serif; font-size:11px; }</style></head><body> <blockquote><h1>IPS Driver Error</h1><b>There appears to be an error with the database.</b><br> You can try to refresh the page by clicking <a href=\"javascript:window.location=window.location;\">here</a> </body></html>"; } else { $the_error .= "\n\nSQL error: ".$this->error."\n"; $the_error .= "SQL error code: ".$this->error_no."\n"; $the_error .= "Date: ".date("l dS \o\f F Y h:i:s A"); $out = "<html><head><title>IPS Driver Error</title> <style>P,BODY{ font-family:arial,sans-serif; font-size:11px; }</style></head><body> <blockquote><h1>IPS Driver Error</h1><b>There appears to be an error with the database.</b><br> You can try to refresh the page by clicking <a href=\"javascript:window.location=window.location;\">here</a>. <br><br><b>Error Returned</b><br> <form name='mysql'><textarea rows=\"15\" cols=\"60\">".htmlspecialchars($the_error)."</textarea></form><br>We apologise for any inconvenience</blockquote></body></html>"; print $out; } exit(); } /*-------------------------------------------------------------------------*/ // Create an array from a multidimensional array returning formatted // strings ready to use in an INSERT query, saves having to manually format // the (INSERT INTO table) ('field', 'field', 'field') VALUES ('val', 'val') /*-------------------------------------------------------------------------*/ /** * Compiles SQL formatted insert fields * * @param array Array of field => value pairs * * @return array FIELD_NAMES (string) FIELD_VALUES (string) */ function compile_db_insert_string($data) { $field_names = ""; $field_values = ""; foreach ($data as $k => $v) { $add_slashes = 1; if ( $this->manual_addslashes ) { $add_slashes = 0; } if ( isset($this->no_escape_fields[ $k ]) AND $this->no_escape_fields[ $k ] ) { $add_slashes = 0; } if ( $add_slashes ) { $v = $this->add_slashes( $v ); } $field_names .= "$k,"; //----------------------------------------- // Forcing data type? //----------------------------------------- if ( isset($this->force_data_type[ $k ]) AND $this->force_data_type[ $k ] ) { if ( $this->force_data_type[ $k ] == 'string' ) { $field_values .= "'$v',"; } else if ( $this->force_data_type[ $k ] == 'int' ) { $field_values .= intval($v).","; } else if ( $this->force_data_type[ $k ] == 'float' ) { $field_values .= floatval($v).","; } } //----------------------------------------- // No? best guess it is then.. //----------------------------------------- else { if ( is_numeric( $v ) and intval($v) == $v ) { $field_values .= $v.","; } else { $field_values .= "'$v',"; } } } $field_names = preg_replace( "/,$/" , "" , $field_names ); $field_values = preg_replace( "/,$/" , "" , $field_values ); return array( 'FIELD_NAMES' => $field_names, 'FIELD_VALUES' => $field_values, ); } /*-------------------------------------------------------------------------*/ // Create an array from a multidimensional array returning a formatted // string ready to use in an UPDATE query, saves having to manually format // the FIELD='val', FIELD='val', FIELD='val' /*-------------------------------------------------------------------------*/ /** * Compiles SQL formatted update fields * * @param array Array of field => value pairs * * @return string SET .... update string */ function compile_db_update_string($data) { $return_string = ""; foreach ($data as $k => $v) { //----------------------------------------- // Adding slashes? //----------------------------------------- $add_slashes = 1; if ( $this->manual_addslashes ) { $add_slashes = 0; } if ( isset($this->no_escape_fields[ $k ]) && $this->no_escape_fields[ $k ] ) { $add_slashes = 0; } if ( $add_slashes ) { $v = $this->add_slashes( $v ); } //----------------------------------------- // Forcing data type? //----------------------------------------- if ( isset($this->force_data_type[ $k ]) && $this->force_data_type[ $k ] ) { if ( $this->force_data_type[ $k ] == 'string' ) { $return_string .= $k . "='".$v."',"; } else if ( $this->force_data_type[ $k ] == 'int' ) { $return_string .= $k . "=".intval($v).","; } else if ( $this->force_data_type[ $k ] == 'float' ) { $return_string .= $k . "=".floatval($v).","; } } //----------------------------------------- // No? best guess it is then.. //----------------------------------------- else { if ( is_numeric( $v ) and intval($v) == $v ) { $return_string .= $k . "=".$v.","; } else { $return_string .= $k . "='".$v."',"; } } } $return_string = preg_replace( "/,$/" , "" , $return_string ); return $return_string; } /*-------------------------------------------------------------------------*/ // Use different escape method for different SQL engines /*-------------------------------------------------------------------------*/ function add_slashes( $t ) { # Driver specific } /*-------------------------------------------------------------------------*/ // Use different escape method for different SQL engines /*-------------------------------------------------------------------------*/ function remove_slashes( $t ) { # Driver specific } /*-------------------------------------------------------------------------*/ // Removes quotes from a DB query /*-------------------------------------------------------------------------*/ function remove_all_quotes( $t ) { //----------------------------------------- // Remove empty comments // We now check for comments in SQL classes //----------------------------------------- #$t = preg_replace( "#/\*(.??)\*/#s", " ", $t ); #$t = preg_replace( "#/\*.+?\*/#s" , " ", $t ); //----------------------------------------- // Remove quotes //----------------------------------------- $t = preg_replace( "#\\\{1,}[\"']#s", "", $t ); $t = preg_replace( "#'[^']*'#s" , "", $t ); $t = preg_replace( "#\"[^\"]*\"#s" , "", $t ); $t = preg_replace( "#\"\"#s" , "", $t ); $t = preg_replace( "#''#s" , "", $t ); #print $t; return $t; } /*-------------------------------------------------------------------------*/ // Basic error handler /*-------------------------------------------------------------------------*/ /** * Prints SQL error message * * @param string Additional error message * * @return integer Optional, if var $return_die is set to 1 */ function write_debug_log( $query, $data, $endtime ) { //----------------------------------------- // INIT //----------------------------------------- if ( $this->obj['use_debug_log'] AND $this->obj['debug_log'] ) { $_string = "\n=============================================================================="; $_string .= "\n Date: ". date( 'r' ); $_string .= "\n IP Address: " . $_SERVER['REMOTE_ADDR']; $_string .= "\n Time Taken: ".$endtime; $_string .= "\n ".$query; $_string .= "\n=============================================================================="; $_string .= "\n".$data; if ( $FH = @fopen( $this->obj['debug_log'], 'a' ) ) { @fwrite( $FH, $_string ); @fclose( $FH ); } } } /*-------------------------------------------------------------------------*/ // INTERNAL: Get error number /*-------------------------------------------------------------------------*/ function _get_error_number() { # Driver specific } /*-------------------------------------------------------------------------*/ // INTERNAL: Get error number /*-------------------------------------------------------------------------*/ function _get_error_string() { # Driver specific } /*-------------------------------------------------------------------------*/ // Internal: CHECK AND SET PREFIX /*-------------------------------------------------------------------------*/ /** * Set SQL table prefix * */ function _set_prefix() { if ( ! defined( 'SQL_PREFIX' ) ) { $this->obj['sql_tbl_prefix'] = isset($this->obj['sql_tbl_prefix']) ? $this->obj['sql_tbl_prefix'] : 'ibf_'; define( 'SQL_PREFIX', $this->obj['sql_tbl_prefix'] ); } } /*-------------------------------------------------------------------------*/ // Internal: CHECK AND LOAD CACHE FILE /*-------------------------------------------------------------------------*/ /** * Load cache file * */ function _load_cache_file() { if ( $this->obj['query_cache_file'] ) { require_once( $this->obj['query_cache_file'] ); $sql_queries_name = $this->sql_queries_name ? $this->sql_queries_name : 'sql_queries'; $this->sql = new $sql_queries_name( $this ); } } } ?>