Advertisement
stuppid_bot

DB Class

Feb 27th, 2014
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.60 KB | None | 0 0
  1. <?php
  2.  
  3. class DB {
  4.     var $host = '127.0.0.1',
  5.         $database = 'roystonvasey',
  6.         $username = 'root',
  7.         $password = '',
  8.         $charset = 'utf8',
  9.         $tablePrefix = 'rv_',
  10.         $logFile = 'sql_errors.log',
  11.         $db;
  12.  
  13.     function __construct() {
  14.         @$this->db = new mysqli($this->host, $this->username, $this->password, $this->database);
  15.         if ($this->db->connect_error) {
  16.             die("сant't connect to db.");
  17.         }
  18.         $this->db->set_charset($this->charset);
  19.     }
  20.  
  21.     static function getInstance() {
  22.         static $instance;
  23.         if (!$instance) {
  24.             $instance = new self;
  25.         }
  26.         return $instance;
  27.     }
  28.  
  29.     function log($err) {
  30.         $fp = fopen($this->logFile, 'a+');
  31.         flock($fp, LOCK_EX);
  32.         fwrite($fp, date('d.m.Y H:i:s') . "\t" . $_SERVER['REMOTE_ADDR'] . "\t" . $_SERVER['REQUEST_URI'] . "\t" . $err . "\r\n");
  33.         flock($fp, LOCK_UN);
  34.         fclose($fp);
  35.     }
  36.  
  37.     function raw($sql) {
  38.         if (!(@$res = $this->db->query($sql))) {
  39.             $err = $this->db->error;
  40.             $this->log($err);
  41.             die("bad sql query: $err.");
  42.         }
  43.         return $res;
  44.     }
  45.  
  46.     function escape($str) {
  47.         return $this->db->real_escape_string($str);
  48.     }
  49.  
  50.     function quote($str) {
  51.         return "'" . $this->escape($str) . "'";
  52.     }
  53.  
  54.     function quoteIndent($str) {
  55.         return '`' . str_replace('`', '``', $str) . '`';
  56.     }
  57.  
  58.     function getFullTableName($table) {
  59.         return $this->quoteIndent($this->tablePrefix . $table);
  60.     }
  61.  
  62.     function sanitize($data) {
  63.         foreach ($data as &$v) {
  64.             $v = gettype($v) == 'string' ? $this->quote($v) : var_export($v, 1);
  65.         }
  66.         return $data;
  67.     }
  68.  
  69.     function array2str($data) {
  70.         return implode(',', $this->sanitize($data));
  71.     }
  72.  
  73.     function assoc2str($data) {
  74.         $data = $this->sanitize($data);
  75.         $arr = array();
  76.         foreach ($data as $k => $v) {
  77.             $arr[] =  $this->quoteIndent($k) . '=' . $v;
  78.         }
  79.         return implode(',', $arr);
  80.     }
  81.  
  82.     function _query($args) {
  83.         $parts = preg_split('/\?([_aAbfis]?)/', $args[0], -1, PREG_SPLIT_DELIM_CAPTURE);
  84.         $total = count($parts);
  85.         $cur = 1;
  86.         for ($i = 1; $i < $total; $i += 2) {
  87.             $part = &$parts[$i];
  88.             if ($part == '_') {
  89.                 $part = $this->tablePrefix;
  90.             }
  91.             else {
  92.                 $val = $args[$cur++];
  93.                 switch ($part) {
  94.                     case 'a':
  95.                         $part = $this->array2str($val);
  96.                         break;
  97.  
  98.                     case 'A':
  99.                         $part = $this->assoc2str($val);
  100.                         break;
  101.  
  102.                     case 'b':
  103.                         $part = $val ? 'true' : 'false';
  104.                         break;
  105.  
  106.                     case 'f':
  107.                         $part = (float) $val;
  108.                         break;
  109.  
  110.                     case 'i':
  111.                         $part = (int) $val;
  112.                         break;
  113.  
  114.                     default:
  115.                         $part = $this->quote($val);
  116.                 }
  117.             }
  118.         }
  119.         $sql = implode('', $parts);
  120.         // echo $sql;
  121.         return $this->raw($sql);
  122.     }
  123.  
  124.     /**
  125.      * $db->query($sql, $val1, $val2, ...);
  126.      * Плейсхолдеры:
  127.      * ?_ - преффикс для таблиц
  128.      * ?a - простой массив (значения через запятую)
  129.      * ?A - ассоциативный массив (field1=val1, field2=val2, ...)
  130.      * ?b - булев
  131.      * ?f - число с плавающей точкой
  132.      * ?i - целое число
  133.      * ?, ?s - строка в кавычках
  134.      *
  135.      * @return mysqli_result
  136.      */
  137.     function query() {
  138.         $args = func_get_args();
  139.         // var_dump($args);
  140.         return $this->_query($args);
  141.     }
  142.  
  143.     function one() {
  144.         $args = func_get_args();
  145.         $res = $this->_query($args);
  146.         $row = $res->fetch_row();
  147.         return $row[0];
  148.     }
  149.  
  150.     function row() {
  151.         $args = func_get_args();
  152.         $res = $this->_query($args);
  153.         return $res->fetch_assoc();
  154.     }
  155.  
  156.     function rows() {
  157.         $args = func_get_args();
  158.         $res = $this->_query($args);
  159.         return $res->fetch_all(MYSQLI_ASSOC);
  160.     }
  161.  
  162.     function assoc() {
  163.         $args = func_get_args();
  164.         $res = $this->_query($args);
  165.         $arr = $res->fetch_all(MYSQLI_NUM);
  166.         $total = count($arr);
  167.         $ret = array();
  168.         for ($i = 0; $i < $total; ++$i) {
  169.             $ret[$arr[$i][0]] = $arr[$i][1];
  170.         }
  171.         return $ret;
  172.     }
  173.  
  174.     function insert($table, $data) {
  175.         $sql = 'INSERT INTO' . $this->getFullTableName($table);
  176.         $values = array_values($data);
  177.         if ($values != $data) {
  178.             $fields = array_keys($data);
  179.             $sql .= '(' . implode(',', array_map(array($this, 'quoteIndent'), $fields)) . ')';
  180.         }
  181.         $sql .= 'VALUES(' . $this->array2str($values) . ')';
  182.         $this->raw($sql);
  183.         return $this->db->insert_id;
  184.     }
  185.  
  186.     function update($table, $data, $id) {
  187.         $this->raw('UPDATE' . $this->getFullTableName($table) . ' SET ' . $this->assoc2str($data) . ' WHERE id=' . intval($id));
  188.         return $this->db->affected_rows;
  189.     }
  190.  
  191.     function delete($table, $id) {
  192.         $this->raw('DELETE FROM' . $this->getFullTableName($table) . ' WHERE id=' . intval($id));
  193.         return $this->db->affected_rows;
  194.     }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement