За последние 24 часа нас посетили 17798 программистов и 1654 робота. Сейчас ищут 1546 программистов ...

Класс (обертка) для работы с mysqli кто какой юзает?

Тема в разделе "Решения, алгоритмы", создана пользователем Dmitriy A. Arteshuk, 19 апр 2013.

  1. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Поделитесь наработками или ссылками, пожалуйста...погуглил, чего только нет....

    или лучше не использовать обертки а писать

    Код (PHP):
    1. $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
    2.  
    и дальше все по мануалу?
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    лучше использовать обертки. ибо в итоге кода будет меньше, ошибок меньше, скорость разработки выше....
    свою или чужую не так важно. главное чтобы вам было удобно и покрывала ваши потребности.
    при необходимости такая обертка пишется за вечер. смотря что от нее нужно.
     
  3. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Вот я и чешу репу.....свою писать постепенно писать (добавлять нужное при необходимости, или чужую юзать...посмотрел чужие....просто не могу понять некоторые вещи в них...

    Вобщем то ничего особенного от нее не нужно, стандартные инсерт реплейс селект делит и т.д.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Код (PHP):
    1. <?php
    2.  
    3. class _DB {
    4.  
    5.   public static function connSettings($settings) {
    6.     static::$settings = $settings;
    7.   }
    8.  
    9.   public static function Init() {
    10.     if (!static::$inited) {
    11.       SLT::SectionStart(__CLASS__ . "::Init()");
    12.       //вместо ворнингов в лог мускул будет кидать эксепшены
    13.       mysqli_report(MYSQLI_REPORT_STRICT);
    14.       try {
    15.         ThrowOnTrue(empty(static::$settings), 'No DB settings.');
    16.         SLT::Step('Connecting...');
    17.         static::$connect = new mysqli(static::$settings['host'], static::$settings['login'], static::$settings['password'], static::$settings['dbname'], static::$settings['port'], static::$settings['socket']);
    18.         SLT::Step('Connected (' . static::$connect->host_info . ')');
    19.         static::$connect->query("SET NAMES '" . static::$settings['codepage'] . "'");
    20.         ThrowOnFalse(static::$connect->set_charset(static::$settings['codepage']), 'Не могу установить требуемую кодировку.', 100001);
    21.         static::$inited = TRUE;
    22.       } catch (Exception $e) {
    23.         echo "\nТехническое сообщение:\n Ошибка №" . $e->getCode() . ". " . $e->getMessage();
    24.         //1045 - не вошел в бд.
    25.         exit();
    26.       }
    27.       SLT::SectionEnd();
    28.     }
    29.     return true;
    30.   }
    31.  
    32.   static public function query($query) {
    33.     if (!static::Init()) {
    34.       return false;
    35.     }
    36.     SLT::SectionStart("query: [$query]");
    37.     static::$last_query = $query;
    38.     static::$allqueries[] = $query;
    39.     $t1 = microtime(true);
    40.     $r = static::$connect->query($query);
    41.     $t2 = microtime(true);
    42.     static::$alltimes[] = $t2 - $t1;
    43.     if ($r === false OR $r === true) {
    44.       static::$allnumrows[] = $r 'OK' : 'FAIL';
    45.     } else {
    46.       static::$allnumrows[] = $r->num_rows;
    47.     }
    48.     SLT::SectionEnd();
    49.     return $r;
    50.   }
    51.  
    52.   static public function escape($string) {
    53.     if (!static::Init()) {
    54.       return false;
    55.     }
    56.     return static::$connect->real_escape_string($string);
    57.   }
    58.  
    59.   static public function id($query) {
    60.     if (!static::query($query)) {
    61.       return false;
    62.     }
    63.     $id = static::$connect->insert_id;
    64.     return (int) $id;
    65.   }
    66.  
    67.   /**
    68.    * Выбор одного поля.
    69.    * Возвращает значение указанного поля из первой строки результата
    70.    * @param type $query
    71.    * @param type $column
    72.    * @return mixed
    73.    */
    74.   static public function column($query, $column) {
    75.     $r = static::assoc($query, $column);
    76.     return $r[0];
    77.   }
    78.  
    79.   static public function assoc($query, $value_column = false) {
    80.     SLT::SectionStart("assoc: [$query]");
    81.     $r = false;
    82.     $result = static::query($query);
    83.     if ($result !== false) {
    84.       //return $result->fetch_all(MYSQLI_ASSOC);
    85.       while ($row = $result->fetch_assoc()) {
    86.         $r[] = ($value_column === false ? $row : $row[$value_column]);
    87.       }
    88.     }
    89.     SLT::SectionEnd();
    90.     return $r;
    91.   }
    92.  
    93.   /**
    94.    * Возвращает массив как и assoc, но с айдишниками из БД в качестве ключей
    95.    * @param string $query
    96.    * @param string $value_column
    97.    * @return Array or FALSE
    98.    */
    99.   static public function assoc_id($query, $value_column = false) {
    100.     SLT::SectionStart("assoc_id: [$query]");
    101.     //возвращает массив как и assoc, но с айдишниками из БД в качестве ключей
    102.     $r = false;
    103.     $result = static::query($query);
    104.     if ($result !== false) {
    105.       //return $result->fetch_all(MYSQLI_ASSOC);
    106.       $r = array();
    107.       while ($row = $result->fetch_assoc()) {
    108.         $r[$row['id']] = ($value_column === false ? $row : $row[$value_column]);
    109.       }
    110.     }
    111.     SLT::SectionEnd();
    112.     return $r;
    113.   }
    114.  
    115.   /**
    116.    * Возвращает массив как и assoc, но в качестве ключей выступает значение $column
    117.    *
    118.    * @param string $query
    119.    * @param string $column
    120.    * @param string $value_column
    121.    * @return Array or FALSE
    122.    */
    123.   static public function assoc_column($query, $column, $value_column = false) {
    124.     SLT::SectionStart("assoc_column: [$query]");
    125.     //возвращает массив как и assoc, но в качестве ключей выступает значение $column
    126.     $r = false;
    127.     $result = static::query($query);
    128.     if ($result !== false) {
    129.       //return $result->fetch_all(MYSQLI_ASSOC);
    130.       $r = array();
    131.       while ($row = $result->fetch_assoc()) {
    132.         $r[$row[$column]] = ($value_column === false ? $row : $row[$value_column]);
    133.       }
    134.     }
    135.     SLT::SectionEnd();
    136.     return $r;
    137.   }
    138.  
    139.   static public function assoc_sorted($query, $group_column, $id_column = false, $value_column = false) {
    140.     SLT::SectionStart("assoc_sorted: [$query]");
    141.     //возвращает массив как и assoc, но с айдишниками из БД, сгруппированный в массивы по колонке
    142.     $r = false;
    143.     $result = static::query($query);
    144.     if ($result !== false AND $result->num_rows > 0) {
    145.       //return $result->fetch_all(MYSQLI_ASSOC);
    146.       $id_column = ($id_column === false ? 'id' : $id_column);
    147.       $r = array();
    148.       if ($value_column === false) {
    149.         while ($row = $result->fetch_assoc()) {
    150.           $r[$row[$group_column]][$row[$id_column]] = $row;
    151.         }
    152.       } else {
    153.         while ($row = $result->fetch_assoc()) {
    154.           $r[$row[$group_column]][$row[$id_column]] = $row[$value_column];
    155.         }
    156.       }
    157.     }
    158.     SLT::SectionEnd();
    159.     return $r;
    160.   }
    161.  
    162.   static public function count($table, $where = '') {
    163.     $query = 'SELECT COUNT(*) FROM `' . $table . '`' . ( $where ' WHERE ' . $where : '');
    164.     $r = static::query($query);
    165.     if ($r) {
    166.       $r = $r->fetch_row();
    167.       return $r[0];
    168.     }
    169.     return false;
    170.   }
    171.  
    172.   static public function value($table, $field, $id) {
    173.     $query = "SELECT `$field` FROM `$table` WHERE `id`=$id";
    174.     $r = static::query($query);
    175.     if ($r === false) {
    176.       return false;
    177.     }
    178.     $r = $r->fetch_row();
    179.     return $r[0];
    180.   }
    181.  
    182.   static public function firstrow($query, $lock = false) {
    183.     $query .= ' LIMIT 1';
    184.     if ($lock) {
    185.       if (!static::$transaction) {
    186.         throw new Exception('Can\'t lock row - transaction is not started');
    187.       }
    188.       $query .= ' FOR UPDATE';
    189.     }
    190.     $result = static::query($query);
    191.     if ($result) {
    192.       $row = $result->fetch_assoc();
    193.       if ($row) {
    194.         return $row;
    195.       }
    196.     }
    197.     return false;
    198.   }
    199.  
    200.   static public function FirstRowByID($table, $id, $lock = false) {
    201.     $id = (int) $id;
    202.     return static::firstrow('SELECT * FROM `' . static::escape($table) . '` WHERE `id` = ' . $id, $lock);
    203.   }
    204.  
    205.   static public function collect($array, $column, $string = true, $delimiter = ', ') {
    206.     $r = array();
    207.     if (is_array($array)) {
    208.       if (isset($array[$column])) {
    209.         $r[] = $array[$column];
    210.       } else {
    211.         foreach ($array as $value) {
    212.           $r = array_merge($r, static::collect($value, $column, false));
    213.         }
    214.       }
    215.     }
    216.     $r = array_unique($r);
    217.     sort($r);
    218.     if ($string === true) {
    219.       $r = implode($delimiter, $r);
    220.     }
    221.     return $r;
    222.   }
    223.  
    224.   public static function ShowQuery() {
    225.     echo "<pre>SQL: " . static::$last_query . "</pre>\n<br>\n";
    226.   }
    227.  
    228.   public static function StartTransaction() {
    229.     if (static::$transaction) {
    230.       throw new Exception('Transaction already started');
    231.     }
    232.     if (static::query('START TRANSACTION')) {
    233.       static::$transaction = true;
    234.       return true;
    235.     } else {
    236.       throw new Exception('Unable to start transaction');
    237.     }
    238.   }
    239.  
    240.   public static function Commit() {
    241.     if (!static::$transaction) {
    242.       throw new Exception('Transaction is not started');
    243.     }
    244.     static::$transaction = false;
    245.     if (!static::query('COMMIT')) {
    246.       throw new Exception('Unable to commit');
    247.     }
    248.     return true;
    249.   }
    250.  
    251.   public static function Rollback($quiet = true) {
    252.     if (!$quiet AND !static::$transaction) {
    253.       throw new Exception('Transaction is not started');
    254.     }
    255.     static::$transaction = false;
    256.     if (static::query('ROLLBACK')) {
    257.       return true;
    258.     } else {
    259.       if (!$quiet) {
    260.         throw new Exception('Unable to rollback');
    261.       }
    262.     }
    263.   }
    264.  
    265.   public static function Report() {
    266.     ob_start();
    267.     $rand = rand(0, 999999);
    268.     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>
    269.     <div id='queries$rand' style=\"font-family: monospace; display: none;\">Queries:<br>
    270.     ";
    271.     //. implode("<br><br>\n", DB::$allqueries) . "
    272.     echo "<table class='style2'>";
    273.     foreach (static::$allqueries as $key => $query) {
    274.  
    275.       echo "<tr><td class = 'right top' style = 'color: #909090;'>" . str_replace(' ', '&nbsp', number_format(static:: $alltimes[$key] * 1000, 3, '.', ' ')) . 'ms</td><td>'
    276.       . ((static::$allnumrows[$key] === 'OK' OR static::$allnumrows[$key] === 'FAIL') ? static::$allnumrows[$key] : static::$allnumrows[$key] . ' rows')
    277.       . '</td><td>' . $query . "</td></tr>\n";
    278.     }
    279.     echo "</table>";
    280.     echo "</div>";
    281.     return ob_get_clean();
    282.   }
    283.  
    284. }
    285.  
    286. class DB extends _DB {
    287.  
    288.   static public $connect = null;
    289.   static protected $last_query = '';
    290.   static protected $transaction = false;
    291.   static protected $inited = false; //if DB::Init() was already called once
    292.   static protected $settings = array();
    293.   static protected $allqueries = array();
    294.   static protected $alltimes = array();
    295.   static protected $allnumrows = array();
    296.  
    297. }
    298.  
    299. DB::connSettings(CFG::$conf['db']);
    300.  
    301. class BSMDB extends _DB {
    302.  
    303.   static public $connect = null;
    304.   static protected $last_query = '';
    305.   static protected $transaction = false;
    306.   static protected $inited = false; //if DB::Init() was already called once
    307.   static protected $settings = array();
    308.   static protected $allqueries = array();
    309.   static protected $alltimes = array();
    310.   static protected $allnumrows = array();
    311.  
    312. }
    313.  
    314. BSMDB::connSettings(CFG::$conf['bsmdb']); 
     
  5. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Игорь, а можно пару примеров, как с этим работать?

    Я так понимаю на 5.2 это не будет работать, верно?
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не знаю. =) я не слежу за СТАРЫМИ ВЕРСИЯМИ! :D

    подключение к бд ленивое. т.е. будет запрос - подключится.

    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):
    1.      $messages = DB::assoc_id("SELECT * FROM `messages` WHERE `forum` = '$id'");
    2.      $authors = DB::assoc_id("SELECT * FROM `users` WHERE `id` IN (" . DB::collect($messages, 'author') . ")");
    3.  
    выборка всех офисов всех компаний, сгруппированными в массивы по компаниям.
    Код (PHP):
    1.     $alloffices = db::assoc_sorted("SELECT * FROM `offices`" . ($brand " WHERE `brand` = '$brand'" : '') . " ORDER BY `brand`", 'brand');
    2.  
     
  7. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ок, спасибо!
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в классе есть вызовы другого класса - их можно удалить. это мерилка времени тоже.
     
  9. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград