Поделитесь наработками или ссылками, пожалуйста...погуглил, чего только нет.... или лучше не использовать обертки а писать Код (PHP): $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); и дальше все по мануалу?
лучше использовать обертки. ибо в итоге кода будет меньше, ошибок меньше, скорость разработки выше.... свою или чужую не так важно. главное чтобы вам было удобно и покрывала ваши потребности. при необходимости такая обертка пишется за вечер. смотря что от нее нужно.
Вот я и чешу репу.....свою писать постепенно писать (добавлять нужное при необходимости, или чужую юзать...посмотрел чужие....просто не могу понять некоторые вещи в них... Вобщем то ничего особенного от нее не нужно, стандартные инсерт реплейс селект делит и т.д.
Код (PHP): <?php class _DB { public static function connSettings($settings) { static::$settings = $settings; } public static function Init() { if (!static::$inited) { SLT::SectionStart(__CLASS__ . "::Init()"); //вместо ворнингов в лог мускул будет кидать эксепшены mysqli_report(MYSQLI_REPORT_STRICT); try { ThrowOnTrue(empty(static::$settings), 'No DB settings.'); SLT::Step('Connecting...'); static::$connect = new mysqli(static::$settings['host'], static::$settings['login'], static::$settings['password'], static::$settings['dbname'], static::$settings['port'], static::$settings['socket']); SLT::Step('Connected (' . static::$connect->host_info . ')'); static::$connect->query("SET NAMES '" . static::$settings['codepage'] . "'"); ThrowOnFalse(static::$connect->set_charset(static::$settings['codepage']), 'Не могу установить требуемую кодировку.', 100001); static::$inited = TRUE; } catch (Exception $e) { echo "\nТехническое сообщение:\n Ошибка №" . $e->getCode() . ". " . $e->getMessage(); //1045 - не вошел в бд. exit(); } SLT::SectionEnd(); } return true; } static public function query($query) { if (!static::Init()) { return false; } SLT::SectionStart("query: [$query]"); static::$last_query = $query; static::$allqueries[] = $query; $t1 = microtime(true); $r = static::$connect->query($query); $t2 = microtime(true); static::$alltimes[] = $t2 - $t1; if ($r === false OR $r === true) { static::$allnumrows[] = $r ? 'OK' : 'FAIL'; } else { static::$allnumrows[] = $r->num_rows; } SLT::SectionEnd(); return $r; } static public function escape($string) { if (!static::Init()) { return false; } return static::$connect->real_escape_string($string); } static public function id($query) { if (!static::query($query)) { return false; } $id = static::$connect->insert_id; return (int) $id; } /** * Выбор одного поля. * Возвращает значение указанного поля из первой строки результата * @param type $query * @param type $column * @return mixed */ static public function column($query, $column) { $r = static::assoc($query, $column); return $r[0]; } static public function assoc($query, $value_column = false) { SLT::SectionStart("assoc: [$query]"); $r = false; $result = static::query($query); if ($result !== false) { //return $result->fetch_all(MYSQLI_ASSOC); while ($row = $result->fetch_assoc()) { $r[] = ($value_column === false ? $row : $row[$value_column]); } } SLT::SectionEnd(); return $r; } /** * Возвращает массив как и assoc, но с айдишниками из БД в качестве ключей * @param string $query * @param string $value_column * @return Array or FALSE */ static public function assoc_id($query, $value_column = false) { SLT::SectionStart("assoc_id: [$query]"); //возвращает массив как и assoc, но с айдишниками из БД в качестве ключей $r = false; $result = static::query($query); if ($result !== false) { //return $result->fetch_all(MYSQLI_ASSOC); $r = array(); while ($row = $result->fetch_assoc()) { $r[$row['id']] = ($value_column === false ? $row : $row[$value_column]); } } SLT::SectionEnd(); return $r; } /** * Возвращает массив как и assoc, но в качестве ключей выступает значение $column * * @param string $query * @param string $column * @param string $value_column * @return Array or FALSE */ static public function assoc_column($query, $column, $value_column = false) { SLT::SectionStart("assoc_column: [$query]"); //возвращает массив как и assoc, но в качестве ключей выступает значение $column $r = false; $result = static::query($query); if ($result !== false) { //return $result->fetch_all(MYSQLI_ASSOC); $r = array(); while ($row = $result->fetch_assoc()) { $r[$row[$column]] = ($value_column === false ? $row : $row[$value_column]); } } SLT::SectionEnd(); return $r; } static public function assoc_sorted($query, $group_column, $id_column = false, $value_column = false) { SLT::SectionStart("assoc_sorted: [$query]"); //возвращает массив как и assoc, но с айдишниками из БД, сгруппированный в массивы по колонке $r = false; $result = static::query($query); if ($result !== false AND $result->num_rows > 0) { //return $result->fetch_all(MYSQLI_ASSOC); $id_column = ($id_column === false ? 'id' : $id_column); $r = array(); if ($value_column === false) { while ($row = $result->fetch_assoc()) { $r[$row[$group_column]][$row[$id_column]] = $row; } } else { while ($row = $result->fetch_assoc()) { $r[$row[$group_column]][$row[$id_column]] = $row[$value_column]; } } } SLT::SectionEnd(); return $r; } static public function count($table, $where = '') { $query = 'SELECT COUNT(*) FROM `' . $table . '`' . ( $where ? ' WHERE ' . $where : ''); $r = static::query($query); if ($r) { $r = $r->fetch_row(); return $r[0]; } return false; } static public function value($table, $field, $id) { $query = "SELECT `$field` FROM `$table` WHERE `id`=$id"; $r = static::query($query); if ($r === false) { return false; } $r = $r->fetch_row(); return $r[0]; } static public function firstrow($query, $lock = false) { $query .= ' LIMIT 1'; if ($lock) { if (!static::$transaction) { throw new Exception('Can\'t lock row - transaction is not started'); } $query .= ' FOR UPDATE'; } $result = static::query($query); if ($result) { $row = $result->fetch_assoc(); if ($row) { return $row; } } return false; } static public function FirstRowByID($table, $id, $lock = false) { $id = (int) $id; return static::firstrow('SELECT * FROM `' . static::escape($table) . '` WHERE `id` = ' . $id, $lock); } static public function collect($array, $column, $string = true, $delimiter = ', ') { $r = array(); if (is_array($array)) { if (isset($array[$column])) { $r[] = $array[$column]; } else { foreach ($array as $value) { $r = array_merge($r, static::collect($value, $column, false)); } } } $r = array_unique($r); sort($r); if ($string === true) { $r = implode($delimiter, $r); } return $r; } public static function ShowQuery() { echo "<pre>SQL: " . static::$last_query . "</pre>\n<br>\n"; } public static function StartTransaction() { if (static::$transaction) { throw new Exception('Transaction already started'); } if (static::query('START TRANSACTION')) { static::$transaction = true; return true; } else { throw new Exception('Unable to start transaction'); } } public static function Commit() { if (!static::$transaction) { throw new Exception('Transaction is not started'); } static::$transaction = false; if (!static::query('COMMIT')) { throw new Exception('Unable to commit'); } return true; } public static function Rollback($quiet = true) { if (!$quiet AND !static::$transaction) { throw new Exception('Transaction is not started'); } static::$transaction = false; if (static::query('ROLLBACK')) { return true; } else { if (!$quiet) { throw new Exception('Unable to rollback'); } } } public static function Report() { ob_start(); $rand = rand(0, 999999); echo "Total " . count(static::$allqueries) . " queries in " . number_format(array_sum(static::$alltimes) * 1000, 3) . "ms <span style=\"cursor: pointer\" onclick=\"$('#queries$rand').toggle();\">[ + ]</span><br> <div id='queries$rand' style=\"font-family: monospace; display: none;\">Queries:<br> "; //. implode("<br><br>\n", DB::$allqueries) . " echo "<table class='style2'>"; foreach (static::$allqueries as $key => $query) { echo "<tr><td class = 'right top' style = 'color: #909090;'>" . str_replace(' ', ' ', number_format(static:: $alltimes[$key] * 1000, 3, '.', ' ')) . 'ms</td><td>' . ((static::$allnumrows[$key] === 'OK' OR static::$allnumrows[$key] === 'FAIL') ? static::$allnumrows[$key] : static::$allnumrows[$key] . ' rows') . '</td><td>' . $query . "</td></tr>\n"; } echo "</table>"; echo "</div>"; return ob_get_clean(); } } class DB extends _DB { static public $connect = null; static protected $last_query = ''; static protected $transaction = false; static protected $inited = false; //if DB::Init() was already called once static protected $settings = array(); static protected $allqueries = array(); static protected $alltimes = array(); static protected $allnumrows = array(); } DB::connSettings(CFG::$conf['db']); class BSMDB extends _DB { static public $connect = null; static protected $last_query = ''; static protected $transaction = false; static protected $inited = false; //if DB::Init() was already called once static protected $settings = array(); static protected $allqueries = array(); static protected $alltimes = array(); static protected $allnumrows = array(); } BSMDB::connSettings(CFG::$conf['bsmdb']);
Игорь, а можно пару примеров, как с этим работать? Я так понимаю на 5.2 это не будет работать, верно?
я не знаю. =) я не слежу за СТАРЫМИ ВЕРСИЯМИ! подключение к бд ленивое. т.е. будет запрос - подключится. function query($query) ну ты понел function escape($string) real_escape_string текущего коннекта function firstrow($query, $lock = false) выборка одной строки. Второй параметр лочит строку. function FirstRowByID($table, $id, $lock = false) то же самое но сразу по колонке id function id($query) сделает запрос и вернет insert_id function assoc($query, $value_column = false) вернёт ассоциативный массив, каждый член которого массив полей строки. если указан второй параметр - вернет только его значения. function assoc_id($query, $value_column = false) вернёт массив, в котором ключами будут значения поля `id`. function assoc_column($query, $column, $value_column = false) Вернёт массив, ключами будут значения указанной колонки. function assoc_sorted($query, $group_column, $id_column = false, $value_column = false) Вернёт массив, в котором ключем является значение колонки $group_column, а членами - массивы с айдишником из колонки $id_column. Т.е. по этому массиву нужно будет пройти двойным циклом. Допустим можно выбрать сообщения, сгруппировав их по автору, а внутри группы - по дате. function count($table, $where = '') считает function value($table, $field, $id) значение одного поля по айдишнику function collect($array, $column, $string = true, $delimiter = ', ') вернёт строку или массив уникальных значений из членов массива с указанным ключем. удобна в запросах вида WHERE ... IN ( , , , , ) function ShowQuery() выводит последний запрос function StartTransaction() function Commit() Rollback($quiet = true) транзакции function Report() список запросов и времени исполнения и числа строк в выборке. примеры: выбор всех сообщений форума, выбор всех авторов сообщений Код (PHP): $messages = DB::assoc_id("SELECT * FROM `messages` WHERE `forum` = '$id'"); $authors = DB::assoc_id("SELECT * FROM `users` WHERE `id` IN (" . DB::collect($messages, 'author') . ")"); выборка всех офисов всех компаний, сгруппированными в массивы по компаниям. Код (PHP): $alloffices = db::assoc_sorted("SELECT * FROM `offices`" . ($brand ? " WHERE `brand` = '$brand'" : '') . " ORDER BY `brand`", 'brand');
я это гавно использую периодически - https://github.com/vasa-c/go-db для php < 5.2- https://github.com/vasa-c/godb-old