За последние 24 часа нас посетили 20087 программистов и 1082 робота. Сейчас ищет 721 программист ...

Класс для работы не только с MySQL ^_^

Тема в разделе "Решения, алгоритмы", создана пользователем dark-demon, 9 июн 2007.

  1. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    сам класс: http://mojura.googlecode.com/svn/trunk/db/dbclass.onc
    PHP:
    1. <?php
    2.  
    3. class Mojura_DBclass {
    4.     var $driver= null;  # database driver (object)
    5.     function Mojura_DBclass ($dsn='') {
    6.         if ($dsn) $this->connect($dsn);
    7.     }
    8.     function debug ($d= null) {
    9.         return $this->driver->debug($d);
    10.     }
    11.     function connect ($config) { # connect ('mysql://username:userpass@localhost/database/')
    12.         if (is_string($config)) $config= parse_url($config);
    13.         if (!$driver= onc(dirname(__FILE__).'/drivers/'.$config['scheme'])) return !trigger_error('database driver not found',E_USER_ERROR);
    14.         if (!$this->driver= $driver->newobj()) return !trigger_error("can't instantiate database driver",E_USER_ERROR);
    15.         return $this->driver->connect($config);
    16.     }
    17.     function prepare ($q) { # prepare ('a ','b',array('c','c2',null,'c3'),array(' d')) # a "b" d
    18.         $s= '';
    19.         $i= 0;
    20.         foreach ($q as $n => $p):
    21.             if (is_null($p)) return '';
    22.             if (is_array($p)):
    23.                 $i= 0;
    24.                 $s.= $this->prepare($p);
    25.             else:
    26.                 $s.= ($i^=1) ? $p : $this->escape($p);
    27.             endif;
    28.         endforeach;
    29.         return $s;
    30.     }
    31.     function escape ($q) { # escape ('any_string')
    32.         return $this->driver->escape($p);
    33.     }
    34.     function ident ($q) { # ident ('table_name')
    35.         return $this->driver->ident($p);
    36.     }
    37.     function query ($q) { # query ('insert into table values (',_GET('a'),')')
    38.         if (!$q) return false;
    39.         $sql= $this->prepare(func_get_args());
    40.         return $this->driver->query($sql);
    41.     }
    42.     function get2d () { # --//--
    43.         $q= func_get_args();
    44.         if ($q) $this->query($q);
    45.         return $this->driver->get2d();
    46.     }
    47.     function get2dt () { # --//--
    48.         $q= func_get_args();
    49.         if ($q) $this->query($q);
    50.         return $this->driver->get2dt();
    51.     }
    52.     function get1d () { # --//--
    53.         $q= func_get_args();
    54.         if ($q) $this->query($q);
    55.         return $this->driver->get1d();
    56.     }
    57.     function get1dt () { # --//--
    58.         $q= func_get_args();
    59.         if ($q) $this->query($q);
    60.         return $this->driver->get1dt();
    61.     }
    62.     function get0d () { # --//--
    63.         $q= func_get_args();
    64.         if ($q) $this->query($q);
    65.         return $this->driver->get0d();
    66.     }
    67.     function affected () { # affected()
    68.         return $this->driver->affected();
    69.     }
    70.     function lastid () { # lastid()
    71.         return $this->driver->lastid();
    72.     }
    73.     function begin () { # begin()
    74.         return $this->driver->begin();
    75.     }
    76.     function rollback () { # rollback()
    77.         return $this->driver->rollback();
    78.     }
    79.     function commit () { # commit
    80.         return $this->driver->commit();
    81.     }
    82.     function table ($table, $columns) { # table ('table', array('id'=>'INTEGER PRIMARY KEY','name'=>'TEXT',))
    83.         return $this->driver->table($table, $columns);
    84.     }
    85.     function insert ($table, $row) { # insert ('table', array(/*'id'=>10,*/ 'name'=>'qwerty','age'=>'13'),)
    86.         return $this->driver->insert($table, $row);
    87.     }
    88.     function statquery () {
    89.         return $this->driver->statquery();
    90.     }
    91.     function statime () {
    92.         return $this->driver->statime();
    93.     }
    94. }
    95.  
    96. return new Mojura_DBclass();
    97.  
    98. ?>
    драйвер для mysql-native: http://mojura.googlecode.com/svn/trunk/ ... /mysql.onc
    PHP:
    1. <?php
    2.  
    3. class Mojura_mysql_DBclass {
    4.     var $link= null;                            # link to database (resource)
    5.     var $res= null;                             # last query result (resource)
    6.     var $debug= false;                          # debug mode trigger (bool)
    7.     var $stats= array('query'=>0,'time'=>0);    # statistics (hash)
    8.     function newobj() {return new $this;}
    9.     function debug ($d=null) {
    10.         if (!is_null($d)) $this->debug= $d;
    11.         return $this->debug;
    12.     }
    13.     function lasterror () {
    14.         $errno= mysql_errno($this->link);
    15.         if (!$this->res) trigger_error($errno.':'.mysql_error($this->link),E_USER_WARNING);
    16.         return $errno;
    17.     }
    18.     function connect ($config) {
    19.         $this->link= mysql_connect($config['host'].(isset($config['port']) ? ':'.$config['port'] : ''), $config['user'], $config['pass'])
    20.         and (mysql_select_db(trim($config['path'],'/'), $this->link))
    21.         or $this->lasterror();
    22.         return $this->link;
    23.     }
    24.     function escape ($s) {
    25.         return "'".mysql_real_escape_string($s, $this->link)."'";
    26.     }
    27.     function ident ($s) {
    28.         return '`'.$s.'`';
    29.     }
    30.     function query ($sql) {
    31.         if ($this->debug()) trigger_error($sql);
    32.         $this->statquery(1);
    33.         $time= getmicrotime();
    34.         $this->res= mysql_unbuffered_query($sql, $this->link);
    35.         $this->statime(getmicrotime()-$time);
    36.         $this->lasterror();
    37.         return $this->res;
    38.     }
    39.     function get2d() {
    40.         $ret= array();
    41.         while ($row= $this->get1d()) $ret[]= $row;
    42.         return $ret;
    43.     }
    44.     function get2dt() {
    45.         $ret= array();
    46.         while ($row= $this->get1d()) foreach ($row as $name => $val) $ret[$name][]= $val;
    47.         return $ret;
    48.     }
    49.     function get1d() {
    50.         return $this->res ? mysql_fetch_assoc($this->res) : array();
    51.     }
    52.     function get1dt() {
    53.         if (!$this->res) return NULL;
    54.         $ret= array();
    55.         while ($row= mysql_fetch_row($this->res)) $ret[]= $row[0];
    56.         return $ret;
    57.     }
    58.     function get0d() {
    59.         if (!$this->res) return NULL;
    60.         $row= mysql_fetch_row($this->res);
    61.         return $row[0];
    62.     }
    63.     function affected () {
    64.         return mysql_affected_rows ($this->link);
    65.     }
    66.     function lastid () {
    67.         return mysql_insert_id($this->link);
    68.     }
    69.     function begin () {
    70.         return $this->query('BEGIN');
    71.     }
    72.     function rollback () {
    73.         return $this->query('ROLLBACK');
    74.     }
    75.     function commit () {
    76.         return $this->query('COMMIT');
    77.     }
    78.     function table ($table, $columns) {
    79.         $colrefs= array();
    80.         foreach ($columns as $col => $ref) $colrefs[]= $this->ident($col).' '.$ref;
    81.         $res= $this->query('CREATE TABLE '.$this->ident($table).' ('.implode(',',$colrefs).');');
    82.         $this->lasterror();
    83.         return $res;
    84.     }
    85.     function insert ($table, $row) {
    86.         $c= array();
    87.         $vars= $vals= Array();
    88.         foreach ($row as $n => $v):
    89.             $vars[]= $this->ident($n);
    90.             $vals[]= $this->escape($v);
    91.         endforeach;
    92.         $this->query ('REPLACE INTO '.$this->ident($table).' ('.implode(',',$vars).") VALUES (".implode($vals,',').")");
    93.         return $this->lastid();
    94.     }
    95.     function statquery ($inc= 0) {
    96.         return $this->stats['query']+=$inc;
    97.     }
    98.     function statime ($inc= 0) {
    99.         return $this->stats['time']+=$inc;
    100.     }
    101. }
    102.  
    103. return new Mojura_mysql_DBclass();
    104.  
    105. ?>
    также етсь драйвер для mysqli и почти дописан для pdo

    подключение к базе данных:
    Код (Text):
    1. $db= new $dbclass('mysql://user:pass@host/database/');
    или так:
    Код (Text):
    1. $db= new $dbclass('pdo:sqlite:/tmp/foo.db');
    или так:
    Код (Text):
    1. $db= new $dbclass();
    2. $db->connect('pdo:sqlite:/tmp/foo.db');
    соответствующие драйвера подгружаются по мере необходимости.

    создаём таблицу:
    Код (Text):
    1. $db->table ('test', array('id'=>'integer primary key auto_increment','name'=>'varchar(255)','value'=>'text'));
    к сожалению пока не проверяются поля, но впоследствие планируется это добавить.

    простейший запрос:
    Код (Text):
    1. $db->query('drop table `test`');
    query возвращает либо false, либо ресурс. так, на всякий случай ;-)

    запрос возвращающий массив содержащий все строки в виде ассоциативных массивов:
    Код (Text):
    1. $db->get2d('select * from test');
    get2dt - то же самое, но возвращается транспонированная таблица (ассоциативный массив из индексных).
    get1d - возвращает первую строку (при последующем вызове без параметров возвращает следующую)
    get1dt - возвращает первый столбец индексным массивом
    get0d - возвращает первое значение первой строки (при повторном вызове без параметров возвращает первое значение следующей строки)

    query и семейство get методов поддерживают автоэкранирование и автодроп.

    автоэкранирование:
    Код (Text):
    1. $db->query('select * from table where name=',$name,' and value=1);
    каждое чётное значение будет проэкранировано в соответствии с используемой субд и заключено в кавычки. каждое нечётное - вставлено как есть. тобишь образуется примерно такой запрос:
    Код (Text):
    1. select * from table where name="вася пупкин" and value=1
    при необходимости им можно передавать параметры ввиде массива:
    Код (Text):
    1. $db->query(array('select * from table where name=',$name,' and value=1));
    автодроп: иногда бывает необходимо убрать часть запроса ввиду отсутствия значения какой-то переменной - для этого можно использовать вложенные массивы, например:
    Код (Text):
    1. $db->query('select * from table where value=1',array(' and name=',$name),' and 1=1');
    если хотябы одно значение во вложенном массиве равно null, то вместо всего массива будет подставлена пустая строка, то есть если $name не задана - образуется такой запрос:
    Код (Text):
    1. select * from table where value=1 and 1=1
    тут важно отметить, что после вложенного массива "чётность" сбрасывается, то есть следующий элемент проэкранирован не будет, следующий после этого - будет, следующий не будет и так далее.

    всё это дело преобразуется в конечный sql-запрос с помощью функции prepare()

    вставка строки из ассоциативного массива:
    Код (Text):
    1. $db->insert ('test', array('name'=>'321','value'=>'texto'));
    где первым параметром идёт имя таблицы, а вторым - массив задающий значения полей.
    если задать значение для праймари поля, и в таблице уже будет запись с таким номером - она будет замещена. например:
    Код (Text):
    1. $db->insert('test',array('id'=>5,'name'=>'321','value'=>'texto'));
    возвращает этот метод идентификатор вставленной строки.

    работа с транзакциями - говорящие методы begin(), rollback(), commit()

    statquery() и statime() - возвращают общее число выполненных запросов к базе и общее время, которое это заняло, соответственно

    affected() - число рядов затронутых последним запросом. у разных субд разное представление о том, что тут должно возвращаться, поэтому не рекомендую использовать.

    lastid() - идентификатор последней вставленной строки

    escape() - экранирует строку в соответствии с используемым драйвером

    ident() - экранирует идентификатор (например, имя таблицы или поля) в соответствии с используемым драйвером

    debug(true) - включает режим отладки
    debug(false) - выключает режим отладки
    debug(!debug()) - переключает режим отладки

    в режиме отладки в виде нотисов валятся посылаемые субд sql-запросы. другого ничего (пока) не происходит.
     
  2. C

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

    С нами с:
    28 май 2006
    Сообщения:
    326
    Симпатии:
    0
    Офтоп, а как на гуглкоде проект сделать, я чё-то не найду сцылку? :(
     
  3. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград