Прошу зацените класс для работы с БД http://pastebin.ru/295136 Особенности: - надстройка над PDO - улучшена работа с PDO, убраны много словные запросы (Сразу скажу названия функции я взял из SimpleDB в целях переносимости кода с этой системы) - логирование ошибочных sql зарпосов - кэширование select запросов - подсчет статистики (число запросов, их тип, время выполнения) - префиксы для таблиц Я хотел совместить простоту работы (как в SimpleDB) и скорость работы PDO Нужно ли комунить такое? если нужно, то что следует изменить или добавить
Ну там строка вида 00000, если запрос нормально выполнился можно и по другому написать if($e[0] !== "00000")
В моем варианте строка приводится к числу, а потом число к булевому типу Ваш вариант тоже будет работать, только здесь преобразованием занимается сам пхп вообще это столь принципиально ?
Помоему PDO может работать быстрей стандарнтых функций mysql, за счет своей реализации плэйсхолдеров bindvalue
pihel MySQLi - покажи мне что-нить быстрее родного драйвера (placeholders там присутствуют), ибо PDO это надстройка над стандартными драйверами. Учим матчасть господа.
[оффтоп] Psih PDO это скомпилиный C код, он на порядок быстрее PEAR :: DB mysql выпустила нативные драйвера, зовутся mysqlnd, они быстрее включены в ветку php-5.3, могут юзатся в расширениях mysql и mysqli отдельная версия драйвера для PDO
Ti Я знаю что такое mysqlnd. Это я к тому, что нафиг сдался что PDO, что PEARB - есть нормальные родные библиотеки. Для серьёзных проектов абстракции типа PDO или PEARB убийственны и бесполезны, а для мелочёвки это просто излишество. Т.е. по сути куда не плюнь, везде вы упрётесь в то, что как только напишите запрос, специфичный для конкретной базы данных или просто различно работающий на двух разных БД, вы автоматом теряете ВСЮ кроссплатформенность. Вам оно надо трахаться, извините за мой французкий, с запросами, пытаясь заставить их быстро и корректно работать во всех базах которые вам надо? Да хотя бы элементарное TOP vs LIMIT в MSSQL vs MySQL - подходы настолько разные, что без шаманства (и тормозов) не обойтись. А сложный запрос построить на базе PDO или PEAR:B не выйдет. Вам тогда нужен Doctrine, а это хоть и хорошая штука, но очень тяжелая хочу заметить и по этой причине не везде её можно применять (особенно когда кол-во запросов идёт на тысячи в секунду и вы не владеете дата центром)
вообщето наоборот, PDO - родная и нормальная библиотека остальной флейм - частный случай, всякие инструменты полезны и хороши для своих задач
Горбунов Олег Ну эта унификация у них получилась слишком тяжелой имхо. Ладна если нужно работать с несколькими базами сразу, но это и проекты совершенно другого уровня как правило и частенько там даже не PHP А если нужен один MySQL - то mysqli идеально подходит + в объектном стиле она сама по себе даёт абстракцию названий методов, можно легко имплементировать её функциональность самому для того же MSSQL (что знакомый мой один и сделал, PDO ему не понравился, зато MySQLi на ура использует) или PostrgeSQL
Достаточно давно пользую этот код: PHP: <?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; ### TEMP ### 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 ); ### TEMP ### return( true ); } else { $this -> add_query_log( $this -> tmp_query , $p , false ); ### TEMP ### 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 ); ### TEMP ### return( $row ); } else { $this -> add_query_log( 'SELECT '.$what.' FROM '.DB_TABLE_PREF.$table.' WHERE '.$where , $param , false ); ### TEMP ### return( false ); } } else { $this -> add_query_log( 'SELECT '.$what.' FROM '.DB_TABLE_PREF.$table.' WHERE '.$where , $param , false ); ### TEMP ### return( false ); } } else { $this -> add_query_log( 'SELECT '.$what.' FROM '.DB_TABLE_PREF.$table.' WHERE '.$where , $param , false ); ### TEMP ### 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 ); ### TEMP ### return( $this -> db -> lastInsertId() ); } else { $this -> add_query_log( $query , $data , false ); ### TEMP ### return( false ); } } else { $this -> add_query_log( $query , $data , false ); ### TEMP ### 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 ); ### TEMP ### $this -> r = $r; return( true ); } else { $this -> add_query_log( $query , $data , false ); ### TEMP ### return( false ); } } else { $this -> add_query_log( $query , $data , false ); ### TEMP ### 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 ); ### TEMP ### return( $r -> rowCount() ); } else { $this -> add_query_log( $query , $data , false ); ### TEMP ### return( false ); } } else { $this -> add_query_log( $query , $data , false ); ### TEMP ### 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 ); ### TEMP ### return( $r -> rowCount() ); } else { $this -> add_query_log( $query , $data , false ); ### TEMP ### return( false ); } } else { $this -> add_query_log( $query , $data , false ); ### TEMP ### return( false ); } } public function query( $query ) { if( $this -> r = $this -> db -> query( $query ) ) { $this -> add_query_log( $query , NULL , true ); ### TEMP ### return( true ); } else { $this -> add_query_log( $query , NULL , false ); ### TEMP ### return( false ); } } }