Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class DB {
- var $host = '127.0.0.1',
- $database = 'roystonvasey',
- $username = 'root',
- $password = '',
- $charset = 'utf8',
- $tablePrefix = 'rv_',
- $logFile = 'sql_errors.log',
- $db;
- function __construct() {
- @$this->db = new mysqli($this->host, $this->username, $this->password, $this->database);
- if ($this->db->connect_error) {
- die("сant't connect to db.");
- }
- $this->db->set_charset($this->charset);
- }
- static function getInstance() {
- static $instance;
- if (!$instance) {
- $instance = new self;
- }
- return $instance;
- }
- function log($err) {
- $fp = fopen($this->logFile, 'a+');
- flock($fp, LOCK_EX);
- fwrite($fp, date('d.m.Y H:i:s') . "\t" . $_SERVER['REMOTE_ADDR'] . "\t" . $_SERVER['REQUEST_URI'] . "\t" . $err . "\r\n");
- flock($fp, LOCK_UN);
- fclose($fp);
- }
- function raw($sql) {
- if (!(@$res = $this->db->query($sql))) {
- $err = $this->db->error;
- $this->log($err);
- die("bad sql query: $err.");
- }
- return $res;
- }
- function escape($str) {
- return $this->db->real_escape_string($str);
- }
- function quote($str) {
- return "'" . $this->escape($str) . "'";
- }
- function quoteIndent($str) {
- return '`' . str_replace('`', '``', $str) . '`';
- }
- function getFullTableName($table) {
- return $this->quoteIndent($this->tablePrefix . $table);
- }
- function sanitize($data) {
- foreach ($data as &$v) {
- $v = gettype($v) == 'string' ? $this->quote($v) : var_export($v, 1);
- }
- return $data;
- }
- function array2str($data) {
- return implode(',', $this->sanitize($data));
- }
- function assoc2str($data) {
- $data = $this->sanitize($data);
- $arr = array();
- foreach ($data as $k => $v) {
- $arr[] = $this->quoteIndent($k) . '=' . $v;
- }
- return implode(',', $arr);
- }
- function _query($args) {
- $parts = preg_split('/\?([_aAbfis]?)/', $args[0], -1, PREG_SPLIT_DELIM_CAPTURE);
- $total = count($parts);
- $cur = 1;
- for ($i = 1; $i < $total; $i += 2) {
- $part = &$parts[$i];
- if ($part == '_') {
- $part = $this->tablePrefix;
- }
- else {
- $val = $args[$cur++];
- switch ($part) {
- case 'a':
- $part = $this->array2str($val);
- break;
- case 'A':
- $part = $this->assoc2str($val);
- break;
- case 'b':
- $part = $val ? 'true' : 'false';
- break;
- case 'f':
- $part = (float) $val;
- break;
- case 'i':
- $part = (int) $val;
- break;
- default:
- $part = $this->quote($val);
- }
- }
- }
- $sql = implode('', $parts);
- // echo $sql;
- return $this->raw($sql);
- }
- /**
- * $db->query($sql, $val1, $val2, ...);
- * Плейсхолдеры:
- * ?_ - преффикс для таблиц
- * ?a - простой массив (значения через запятую)
- * ?A - ассоциативный массив (field1=val1, field2=val2, ...)
- * ?b - булев
- * ?f - число с плавающей точкой
- * ?i - целое число
- * ?, ?s - строка в кавычках
- *
- * @return mysqli_result
- */
- function query() {
- $args = func_get_args();
- // var_dump($args);
- return $this->_query($args);
- }
- function one() {
- $args = func_get_args();
- $res = $this->_query($args);
- $row = $res->fetch_row();
- return $row[0];
- }
- function row() {
- $args = func_get_args();
- $res = $this->_query($args);
- return $res->fetch_assoc();
- }
- function rows() {
- $args = func_get_args();
- $res = $this->_query($args);
- return $res->fetch_all(MYSQLI_ASSOC);
- }
- function assoc() {
- $args = func_get_args();
- $res = $this->_query($args);
- $arr = $res->fetch_all(MYSQLI_NUM);
- $total = count($arr);
- $ret = array();
- for ($i = 0; $i < $total; ++$i) {
- $ret[$arr[$i][0]] = $arr[$i][1];
- }
- return $ret;
- }
- function insert($table, $data) {
- $sql = 'INSERT INTO' . $this->getFullTableName($table);
- $values = array_values($data);
- if ($values != $data) {
- $fields = array_keys($data);
- $sql .= '(' . implode(',', array_map(array($this, 'quoteIndent'), $fields)) . ')';
- }
- $sql .= 'VALUES(' . $this->array2str($values) . ')';
- $this->raw($sql);
- return $this->db->insert_id;
- }
- function update($table, $data, $id) {
- $this->raw('UPDATE' . $this->getFullTableName($table) . ' SET ' . $this->assoc2str($data) . ' WHERE id=' . intval($id));
- return $this->db->affected_rows;
- }
- function delete($table, $id) {
- $this->raw('DELETE FROM' . $this->getFullTableName($table) . ' WHERE id=' . intval($id));
- return $this->db->affected_rows;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement