Может кто заделаться укомплектованным классом. ну если не ясно о чём я то приведу пример mysqlli_class Код (Text): <?php class db{ var $db_id = false; var $query_num = 0; var $query_list = array(); var $mysql_error = ''; var $mysql_version = ''; var $mysql_error_num = 0; var $mysql_extend = "MySQLi"; 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 { return false; } } $this->mysql_version = mysqli_get_server_info($this->db_id); if(!defined('COLLATE')){ define ("COLLATE", "cp1251");} mysqli_query($this->db_id, "SET NAMES '" . COLLATE . "'"); 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); } } $this->MySQL_time_taken += $this->get_real_time() - $time_before; $this->query_num ++; return $this->query_id; } 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); } function get_real_time(){ list($seconds, $microSeconds) = explode(' ', microtime()); return ((float)$seconds + (float)$microSeconds); } function display_error($error, $error_num, $query = ''){ if($query) { $query = preg_replace("/([0-9a-f]){32}/", "********************************", $query); } $query = htmlspecialchars($query, ENT_QUOTES, 'ISO-8859-1'); $error = htmlspecialchars($error, ENT_QUOTES, 'ISO-8859-1'); $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=windows-1251" /> <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;" > <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(); } } ?> Добавлено спустя 28 минут 24 секунды: http://php.ru/forum/viewtopic.php?t=33516 нашол такой вариант Код (Text): <?php // Класс для работы с БД (PDO) @package AcFrame @author Sylex @copyright 2011, AcFrame @version 1.0 (2011/06/08) class db { // Экземпляр объекта @var object private static $_instance; // Текущая БД (в конфиге) @var string private static $_name; // Режим отладки @var int private static $_debug = 0; // Режим записи ошибок в лог @var int private static $_log_error = 0; // Время выполнения запроса в секундах - для записи запросов в лог (если 0 - отключено) @var int private static $_log_sql = 0; // Вывод времени выполнения запросов @var int private static $_print_time = 0; // Счетчик количества запросов @var int private static $_nq = 0; // Текущее подготовленное выражение @var object private static $_statement = null; // Запрещаем создавать объект private function __construct() {} // Запрещаем клонировать объект private function __clone() {} // Вызов всех статических методов для PDO (PHP ver. >= 5.3) @param $method - метод @param $arguments - аргументы @return mixed final public static function __callStatic($method, $arguments){ $_instance = self::init(); return call_user_func_array(array($_instance, $method), $arguments); } // Возвращает текущий экзмепляр объекта PDO или создает новое соединение @param string $name - имя конфига @return object public static function init($name = ''){ if (empty($name)) $name = !empty(self::$_name) ? self::$_name : 'default'; if (!self::$_instance || self::$_name != $name) { if (!class_exists('PDO')) { self::error('Extension PDO not installed'); } $config = Config::read('database'); $db_config = $config[$name]; self::$_debug = (int) $db_config['debug']; self::$_log_error = (int) $db_config['log_error']; self::$_log_sql = isset($db_config['log_sql']) ? floatval($db_config['log_sql']) : 0; $params = array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES '{$db_config['char']}'", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); try { self::$_instance = new PDO("{$db_config['driver']}:host={$db_config['host']};dbname={$db_config['name']}", $db_config['user'], $db_config['pass'], $params); } catch (PDOException $e) {self::error('Connection failed: ' . $e->getMessage()); } self::$_name = $name; } return self::$_instance; } // Выполняет запрос @param string/array $sql - запрос @return bool public static function query($sql) { $state = false; if (is_array($sql)) { $args = func_get_args(); $args = isset($args[0]) ? $args[0] : array(''); $sql = strval(array_shift($args)); } if (empty($sql)){ return false; } if (self::$_print_time == 1 || self::$_log_sql > 0) { benchmark::startTimer('db_query'); } try { self::$_statement = self::init()->prepare($sql); } catch (PDOException $e) { $es = array(); foreach($e->getTrace() as $v) { $es[] = $v['file'] . ' on line ' . $v['line']; } $es = implode("\n", $es); self::error('['.$e->errorInfo[1].'] ' . $e->errorInfo[2]. "\n\nQuery: <b>" . $sql . "</b>\n\n" . $es . "\n", $e->errorInfo[0]); } if (is_object(self::$_statement)) { if (!isset($args)) { $args = func_get_args(); array_shift($args); } if (func_num_args() > 1) { if (is_array($args[0])) { $args = $args[0]; } } try { $state = self::$_statement->execute($args); self::$_nq++; } catch(Exception $e) { $es = array(); foreach($e->getTrace() as $v) { $es[] = $v['file'] . ' on line ' . $v['line']; } $es = implode("\n", $es); self::error('['.$e->errorInfo[1].'] ' . $e->errorInfo[2]. "\n\nQuery: <b>" . $sql . "</b>\n\n" . $es . "\n", $e->errorInfo[0]); } if (self::$_print_time == 1 || self::$_log_sql > 0) { $time = benchmark::getTimer('db_query'); if (self::$_print_time == 1) { echo $time, '<br />', $sql, '<br /><br />'; } elseif($time >= self::$_log_sql) { @file_put_contents(LOG . date('Y-m-d') . '_db_query.log', date('Y-m-d H:i:s') . ' ' . self::$_name . ' *** ' . $time . ' - ' . $sql . "\n\n", FILE_APPEND); } } if ($state === false) { $e = self::$_statement->errorInfo(); self::error('['.$e[1].']',$e[2]. "\nQuery: " . $sql, $e[0]); } } return $state; } // Возвращает одно значение @param string $sql - запрос @return mixed public static function getOne($sql) { self::query(func_get_args()); return is_object(self::$_statement) ? self::$_statement->fetchColumn() : false; } // Возвращает строку @param string $sql - запрос @return mixed public static function getRow($sql) { self::query(func_get_args()); return is_object(self::$_statement) ? self::$_statement->fetch(PDO::FETCH_OBJ) : false; } // Возвращает ряд строк @param string/array $sql - запрос @return mixed public static function getAll($sql) { self::query(func_get_args()); return is_object(self::$_statement) ? self::$_statement->fetchAll(PDO::FETCH_OBJ) : false; } // Обработка исключений @param string $message - сообщение @param int $code - код ошибки private static function error($message, $code = 0){ if (self::$_log_error == 1) { @file_put_contents(LOG . date('Y-m-d') . '_db_error.log', date('Y-m-d H:i:s') . ' *** ' . $code . ' - ' . $message. "\n\n", FILE_APPEND);} if (self::$_debug == 0) { throw new Error('error in ' . __CLASS__, -1); } elseif(self::$_debug == 1) { throw new Error($message, $code); } } // Установка кодировки @param string $char - кодировка public static function setNames($char) { db::init(); self::query("SET NAMES ?", $char); } // Установка режима отладки @param int $mode - режим public static function setDebug($mode) { db::init(); self::$_debug = (int) $mode; } // Установка режима вывода времени выполнения запросов на экран @param int $mode - режим public static function setPrintTime($mode) { self::$_print_time = (int) $mode; } // Установка режима логирования запросов в файл @param int $mode - режим public static function setLogError($mode) { db::init(); self::$_log_error = (int) $mode; } // Возвращает общее количество запросов @return int public static function getQueries() { return self::$_nq; } // объявление методов только PHP ver. < 5.3 // Возвращает кол-во строк затронутых при запросах DELETE, INSERT или UPDATE @return int public static function rowCount() { return is_object(self::$_statement) ? intval(self::$_statement->rowCount()) : 0; } // Возвращает ID последней вставленной записи @param string $name @return string public static function lastInsertId($name = null) { return self::init()->lastInsertId($name); } // Начать транзакцию @return bool public static function beginTransaction() { return self::init()->beginTransaction(); } // Завершить транзакцию @return bool public static function commit() { return self::init()->commit(); } // Отменить транзакцию @return bool public static function rollBack() { return self::init()->rollBack(); } } // конец класса db ?> Добавлено спустя 20 минут 17 секунд: нашол такой вариант http://php.ru/forum/viewtopic.php?t=12857 Код (Text): <?php class SQL{ private $db = NULL; private $error_log = NULL; private $query_log = NULL; private $r = NULL; private $all = 0; private $q = NULL; private $tmp_query = NULL; public function __construct( $db_host , $db_name , $db_user , $db_pass ) { $db = new PDO( 'mysql:host='.$db_host.';dbname='.$db_name , $db_user , $db_pass ); if( !$db ) return( false ); $db -> exec( 'SET NAMES '.DB_ENCODING ); $this -> db = $db; $this -> error_log['all'] = 0; $this -> query_log['all'] = 0; } private function add_query_log( $query , $array , $res ) { $this -> all++; if( $res ){ $this -> q[ $this -> all ][0] = true; }else{ $this -> q[ $this -> all ][0] = false; }$this -> q[ $this -> all ][1] = $query; $this -> q[ $this -> all ][2] = $array; } public function log() { $all = $this -> all; $q = $this -> q; if( $all > 0 ) echo '<br><b>DB log:</b><hr>'; print_r( $this -> db -> errorInfo() ); echo '<hr>'; for( $i=1 ; $i<=$all ; $i++ ) { $query = $q[$i][1]; $n = 0; $data = NULL; if( $q[$i][2] ) { foreach( $q[$i][2] as $val ) { $n++; $data[$n] = $val; } } $n = 0; while( is_int( $pos = strpos( $query , '?' , 0 ) ) ) { $n++; if( isset( $data[$n] ) ) { $query = substr_replace( $query , '\''.$data[$n].'\'' , $pos , true ); } else{ $query = str_replace( '?' , '#' , $query ); }} if( $q[$i][0] ) echo '<b>['.$i.']</b> '.$query.';<hr>'; else echo '<b>['.$i.']</b> <font color="red">'.$query.';</font><hr>'; } } public function get_res() { return( $this -> r ); } public function fetch() { return( $this -> r -> fetch(PDO::FETCH_ASSOC) ); } public function fetch_all() { return( $this -> r -> fetchAll(PDO::FETCH_ASSOC) ); } public function count() { return( $this -> r -> rowCount() ); } private function del_slashes( $data ) { foreach( $data as $key => $value ) { $data[$key] = stripslashes( $value ); } return( $data ); } public function prepare( $request ) { $this -> tmp_query = $request; if( $this -> r = $this -> db -> prepare( $request ) ){ return( true ); } else{ return( false );} } public function execute( $p ) { $p = $this -> del_slashes( $p ); if( $this -> r -> execute( $p ) ) { $this -> add_query_log( $this -> tmp_query , $p , true );return( true ); } else { $this -> add_query_log( $this -> tmp_query , $p , false );return( false ); } } public function last_id() { return( $this -> db -> lastInsertId() ); } public function get_row( $table , $what , $where , $param ) { if( $r = $this -> db -> prepare( 'SELECT '.$what.' FROM '.DB_TABLE_PREF.$table.' WHERE '.$where ) ) { if( $r -> execute( $param ) ) { if( $row = $r -> fetch(PDO::FETCH_ASSOC) ) { $this -> add_query_log( 'SELECT '.$what.' FROM '.DB_TABLE_PREF.$table.' WHERE '.$where , $param , true );return( $row ); } else { $this -> add_query_log( 'SELECT '.$what.' FROM '.DB_TABLE_PREF.$table.' WHERE '.$where , $param , false );return( false ); } } else { $this -> add_query_log( 'SELECT '.$what.' FROM '.DB_TABLE_PREF.$table.' WHERE '.$where , $param , false );return( false ); } } else { $this -> add_query_log( 'SELECT '.$what.' FROM '.DB_TABLE_PREF.$table.' WHERE '.$where , $param , false );return( false ); } } public function insert( $table , $fields , $data ) { $data = $this -> del_slashes( $data ); $all = count( $data ); $query = 'INSERT INTO '.DB_TABLE_PREF.$table.' ('.$fields.') VALUES ( '; if( $all > 0 ) $query .= ' ? '; for( $i=1 ; $i<$all ; $i++ ) $query .= ', ? '; $query .= ')'; if( $r = $this -> db -> prepare( $query ) ) { if( $r -> execute( $data ) ) { $this -> add_query_log( $query , $data , true );return( $this -> db -> lastInsertId() ); } else { $this -> add_query_log( $query , $data , false );return( false ); } } else { $this -> add_query_log( $query , $data , false );return( false ); } } public function select( $table , $what , $where , $data ) { $data = $this -> del_slashes( $data ); $query = 'SELECT '.$what.' FROM '.DB_TABLE_PREF.$table.' WHERE '.$where; if( $r = $this -> db -> prepare( $query ) ) { if( $r -> execute( $data ) ) { $this -> add_query_log( $query , $data , true );$this -> r = $r; return( true ); } else { $this -> add_query_log( $query , $data , false );return( false ); } } else { $this -> add_query_log( $query , $data , false );return( false ); } } public function update( $table , $what , $where , $data , $limit ) { $data = $this -> del_slashes( $data ); $query = 'UPDATE '.DB_TABLE_PREF.$table.' SET '.$what; if( $where ) $query .= ' WHERE '.$where; if( $limit = (int)$limit > 0 ) $query .= ' LIMIT '.$limit; if( $r = $this -> db -> prepare( $query ) ) { if( $r -> execute( $data ) ) { $this -> add_query_log( $query , $data , true );return( $r -> rowCount() ); } else { $this -> add_query_log( $query , $data , false );return( false ); } } else { $this -> add_query_log( $query , $data , false );return( false ); } } public function delete( $table , $where , $data , $limit ) { $query = 'DELETE FROM '.DB_TABLE_PREF.$table.' WHERE '.$where; if( $limit = (int)$limit > 0 ) $query .= ' LIMIT '.$limit; if( $r = $this -> db -> prepare( $query ) ) { if( $r -> execute( $data ) ) { $this -> add_query_log( $query , $data , true );return( $r -> rowCount() ); } else { $this -> add_query_log( $query , $data , false );return( false ); } }else{$this -> add_query_log( $query , $data , false );return( false ); } } public function query( $query ) { if( $this -> r = $this -> db -> query( $query ) ) { $this -> add_query_log( $query , NULL , true ); return( true ); } else { $this -> add_query_log( $query , NULL , false ); return( false ); } } } ?> p.s. Домашняя страница http://php.ru/manual/book.pdo.html www.php.net/manual/ru/book.pdo.php статья про pdo http://habrahabr.ru/post/137664/ Есть у кого ещё варианты?