<?php
/**
* $Revision: 132 $
* $Author: CrashX $
* $Date: 2010-02-02 14:27:01 +0600 (Вт, 02 фев 2010)$
* $LastChangedDate: 2010-08-19 14:33:27 +0700 (Чт, 19 авг 2010) $
* $Id: mysqli.php 132 2010-08-19 07:33:27Z CrashX $
* Copyright © CrashX <XSiteCMS@gmail.com>
* Всі права захищено © CrashX
*/
if (!defined('_SHELL'))
die();
/**
* MySQLi
*/
class DriverDB {
// версия класса
var $version = 0.01;
var $driver = 'MySQLi';
// статус и id соединения
var $connected = false;
// настройки сервера
var $server = 'localhost';
var $user = 'root';
var $password = null;
var $database = null;
var $port = '3306';
var $persistent = false;
// кодовая страница
var $collate = 'utf8';
// текст запроса
var $query = null;
// описание запроса
var $info = null;
// время запроса
var $timer = null;
// id запроса для освобождения памяти по указателю
var $id = null;
// id последнего insert
var $last = null;
// версионность
var $mysql = null;
var $compatibility = '4.0';
// статистика
// ведение журнала
var $logging = true;
// освобожднеие памяти после выполнения запроса
var $free = true;
var $log = array(array('info' => '', 'query' => '', 'error' => '', 'time' => ''));
// кол-во запросов
var $counter = 0;
function __construct() {
$this->db();
}
/**
* Конфигурация соединения
*
*/
function db() {
if (!defined('DB_SERVER'))
$this->server = 'localhost'; else
$this->server = DB_SERVER;
if (!defined('DB_USER'))
$this->user = 'root'; else
$this->user = DB_USER;
if (!defined('DB_PASSWORD'))
$this->password = null; else
$this->password = DB_PASSWORD;
if (!defined('DB_DATABASE'))
$this->database = null; else
$this->database = DB_DATABASE;
if (!defined('DB_PORT'))
$this->port = 3306; else
$this->port = DB_PORT;
}
/**
* Подключение к указанной СуБД
*/
function connect() {
global $engine;
$this->timer = $engine->debug->dbtime('on');
if (!$this->connected):
//$this->connected = mysqli_init();
$this->connected = @mysqli_connect($this->server, $this->user, $this->password, $this->database, $this->port);
endif;
if ($this->connected):
$this->mysql = mysqli_get_server_info($this->connected);
if (version_compare($this->mysql, $this->compatibility, ">=")):
$this->query = "/* !40101 SET NAMES '" . $this->collate . "' */";
else:
$this->query = "SET NAMES '" . $this->collate . "'";
endif;
$this->info = "db->connect(" . $this->database . ")";
$this->query();
else:
die("Not connect server ! Нет соединения с базой данных: <b>" . $this->database . "</b> !");
endif;
}
function __destruct() {
//Disconnect
$this->disconnect();
}
/**
* Enter description here...
*
*/
function disconnect() {
global $engine;
$this->timer = $engine->debug->dbtime('off');
if ($this->connected):
$this->free();
@mysqli_close($this->connected);
$this->connected = null;
$this->database = '';
endif;
@mysqli_close();
}
static function table(&$fields, $key, $prefix) {
$fields = $prefix . '.' . $fields;
}
/**
* Возвращает ID, сгенерированный при последнем INSERT-запросе
*/
function last() {
$this->last = mysqli_insert_id($this->connected);
}
/**
* Выполняет запросы и возвращает указатель на данные
*/
function query() {
global $engine;
$this->free ? $this->free() : $this->id = null;
$this->timer = '';
if ($this->query != ""):
$this->id = mysqli_query($this->connected, $this->query);
//$this->id=mysqli_multi_query($this->connected,$this->query);
$this->last();
$this->counter++;
else:
return false;
endif;
if ($this->logging):
$this->log();
endif;
$this->info = null;
$this->query = null;
if (!$this->id):
$engine->debug->error = 'DEFAULT';
$engine->debug->dump();
return false;
endif;
return true;
}
/**
* Enter description here...
*/
function free() {
while (mysqli_more_results($this->connected)):
if (mysqli_next_result($this->connected)) :
$this->id = mysqli_use_result($this->connected);
@mysqli_free_result($this->id);
endif;
endwhile;
$this->id = null;
$this->log = array();
$this->log = null;
}
/**
* Ведение журнала запросов текущего пользователя
*/
function log() {
$this->log[$this->counter - 1]['info'] = $this->info;
$this->log[$this->counter - 1]['query'] = $this->query;
@$this->log[$this->counter - 1]['error'] = mysqli_errno($this->connected) . ':' . mysqli_error($this->connected);
@$this->log[$this->counter - 1]['time'] = date('d.m.Y H:i');
}
/**
* Возвращение результата в виде массива
* @param MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH
* @return mixed результат
*/
function result($type=MYSQL_ASSOC) {
return @mysqli_fetch_array($this->id, $type);
}
/**
* Возвращает количество рядов результата запроса
* @return mixed результат
*/
function rows() {
return @mysqli_num_rows($this->id);
}
/**
* Создание текста запроса для выборки записи
* @param поля в виде ассоциативного массива
* @param таблица имя
* @param критерии в виде ассоциативного массива
* @param доплительные части запроса или директивы
* @return mixed
*/
function select($fields=array(), $table=null, $criteria=array(), $directive=null) {
// SELECT *ПОЛЯ* FROM *ТАБЛИЦА* WHERE *УСЛОВИЯ* *ДИРЕКТИВЫ*
$fields = implode(", ", array_keys($fields));
if (is_array($criteria)):
$wheres = array();
foreach ($criteria as $column => $value):
$wheres[] = "{$column}='{$value}'";
endforeach;
$wheres = implode(" AND ", $wheres);
endif;
$this->query.="SELECT {$fields}";
if (!empty($table)):
$this->query.=" FROM {$table}";
endif;
if (!empty($wheres)):
$this->query.=" WHERE {$wheres}";
endif;
$this->query.=" {$directive}";
$this->query.=";";
return true;
}
/**
* Создание текста запроса для добавления записи
* @param поля в виде ассоциативного массива
* @param таблица имя
*/
function insert($fields=array(), $table=null) {
// INSERT INTO *ТАБЛИЦА* *ПОЛЯ* VALUES *ЗНАЧЕНИЯ*
$values = array();
foreach ($fields as $field):
$values[] = "'{$field}'";
endforeach;
$columns = array_keys($fields);
$this->query.="INSERT INTO {$table} (" . implode(", ", $columns) . ")";
$this->query.=" VALUES (" . implode(", ", $values) . ")";
$this->query.=";";
return true;
}
/**
* Создание текста запроса для обновления записи
* @param поля в виде ассоциативного массива
* @param таблица имя
* @param критерии в виде ассоциативного массива
* @return mixed
*/
function update($fields, $table, $criteria) {
// UPDATE *ТАБЛИЦА* SET *ПОЛЯ* WHERE *УСЛОВИЯ*
$wheres = array();
$updates = array();
foreach ($fields as $column => $value):
$updates[] = "{$column}='{$value}'";
endforeach;
$update = implode(", ", $updates);
foreach ($criteria as $column => $value):
$wheres[] = "{$column}='{$value}'";
endforeach;
$where = implode(" AND ", $wheres);
$this->query.="UPDATE {$table}";
$this->query.=" SET {$update}";
$this->query.=" WHERE {$where}";
$this->query.=";";
return true;
}
/**
* Создание текста запроса для удаления записи
* @param таблица имя
* @param критерии в виде ассоциативного массива
* @return mixed
*/
function delete($table, $criteria) {
// DELETE *?!ПОЛЯ!?* FROM *ТАБЛИЦА* WHERE *УСЛОВИЯ*
$wheres = array();
foreach ($criteria as $column => $value):
$wheres[] = "{$column}='{$value}'";
endforeach;
$where = implode(" AND ", $wheres);
$this->query.="DELETE FROM {$table}";
$this->query.=" WHERE {$where}";
$this->query.=";";
return true;
}
function procedure($fields, $procedure, $result='@result') {
//CALL *ИМЯ ПРОЦЕДУРЫ* (*ЗНАЧЕНИЯ*,*РЕЗУЛЬТАТ*)
$values = array();
foreach ($fields as $field):
$values[] = "'{$field}'";
endforeach;
$columns = array_keys($fields);
if ($result && !empty($result))
$result = ',' . $result;
$this->query = "CALL " . $procedure . "(" . implode(", ", $values) . $result . ");";
}
}
?>