if (!isset($z1))
$z1 = "";
require_once("vars.php");
ini_set('display_errors', 'Off');
class c_mysql extends c_vars
{
// Класс для открытия соединения с базой, наследует класс c_vars
/*
var $sql_login="root";
var $sql_passwd="";
var $sql_database="prima_db";
var $sql_host="localhost"; // localhost
*/
var $sql_login="prima_user";
var $sql_passwd="jAZX3kJA";
var $sql_database="prima_media";
var $sql_host="localhost"; // localhost
var $conn_id; // id соединения
var $sql_query; // текст запроса
var $sql_err; // номер ошибки
var $sql_res; // результат запроса
var $memcache;
// Functions
function sql_connect()
{
$this->memcache = new Memcached();
$this->memcache->addServer('127.0.0.1', 11211); //or die ("Could not connect");
$this->conn_id=mysqli_connect($this->sql_host,$this->sql_login,$this->sql_passwd,$this->sql_database);
// mysql_select_db($this->sql_database);
mysqli_query($this->conn_id, "set character_set_client='cp1251'");
mysqli_query($this->conn_id, "set character_set_results='cp1251'");
mysqli_query($this->conn_id, "set collation_connection='cp1251_general_ci'");
}
function sql_execute()
{
#if(!$_SESSION['log']) $_SESSION['log'] = array();
#$_SESSION['log'][] = $this->sql_query;
//-- скока время делается --
/*$t = explode (' ', microtime ());
$start = $t[1] + $t[0]; */
//--------------------------
if (isset($_GET['SQL_LOG'])) {
//if (!isset($GLOBALS['sql_log_time'])) $GLOBALS['sql_log_time'] = 0;
//if (!isset($GLOBALS['sql_log_num'])) $GLOBALS['sql_log_num'] = 0;
$time1 = microtime(true);
}
$this->sql_res=mysqli_query($this->conn_id, $this->sql_query);
if (isset($_GET['SQL_LOG']))
{
$time2 = microtime(true);
$today = date('d.m.Y', $this->now());
$dir = trim(dirname($_SERVER['PHP_SELF']), '/');
if (!file_exists($this->PATH['root'].'admin/test/sql_log/'.$dir) && $dir)
{//var_dump($this->PATH['root'].'test/sql_log/'.$dir);
mkdir($this->PATH['root'].'admin/test/sql_log/'.$dir);
}
$dir = ($dir) ? $dir.'/' : '';
$fileName = str_replace('.php', '', basename($_SERVER['SCRIPT_FILENAME']));
$date = date('d.H.i', $this->now());
file_put_contents($this->PATH['root'].'admin/test/sql_log/'.$dir.$fileName.$date.'.txt',
"\r\n\r\n--------------------------------\r\n".number_format($time2-$time1, 4, '.', ' ')." c\r\n".$this->sql_query, FILE_APPEND);
}
if (isset($_GET['nocdn']) && $_GET['name'])
{
$ch = curl_init('http://api.cdnvideo.ru:8888/0/purge1?id=01158_primamedia&type=http&object='.$_GET['name'].'');
$resu = curl_exec($ch);
curl_close($ch);
}
elseif (isset($_GET['nocdn']))
{
$ch = curl_init('http://api.cdnvideo.ru:8888/0/purge?id=01158_primamedia&type=http&object=*');
$resu = curl_exec($ch);
curl_close($ch);
}
$this->sql_err=mysql_error();
}
#
# кэширование запросов
# на вход - время жизни кэша
#
function fetchAllFromCache($sql, $t = 20)
{
$key = md5($sql);
$get_result = $this->memcache->get($key);
if ($get_result)
{
//var_dump( ""); //show it
return $get_result;
}
else
{
$this->sql_res=mysql_query($sql, $this->conn_id);
$this->sql_err=mysql_error();
if (mysql_num_rows($this->sql_res))
{
$data = array();
while ($r = mysql_fetch_assoc($this->sql_res))
{
$data[$r['id']] = $r;
}
$this->memcache->set($key, $data, $t);
//var_dump(" cache 2 ".$get_result."
"); //show it
return $data;
}
else
return false;
}
}
#
# выполнение запроса с генерацией страниц
#
var $rtotal; # количество записей
var $ptotal; # количество страниц
var $rpp; # количество записей на странице
var $p; # номер страницы
var $rstart; # запись начала вывода
var $rcount; # записей на вывод
function sql_execute_page()
{
//echo $query = preg_replace('/SELECT .+ (FROM .+ WHERE .+)/i', 'SELECT COUNT(*) $1', $this->sql_query);
//-- скока время делается --
/* $t = explode (' ', microtime ());
$start = $t[1] + $t[0];
//--------------------------
$this->sql_res=mysql_query($this->sql_query,$this->conn_id);
//-- скока время делается --
$t = explode (' ', microtime ());
$stop = $t[1] + $t[0];
$t = round (($stop - $start), 7);
$this->gq .= "
запрос: ".htmlspecialchars ($query)." время на него: ".$t."
";
$this->gt += $t;
//--------------------------
$this->sql_err=mysql_error(); */
$this->sql_query = preg_replace('/^SELECT/i', 'SELECT SQL_CALC_FOUND_ROWS', trim($this->sql_query), 1);
if($this->p < 1) $this->p = 1; # Проверка номера страницы на значение меньше 1
$this->rstart = ($this->p - 1)*$this->rpp;
$this->rcount = $this->rpp;
//if($this->p < $this->ptotal) $this->rcount = $this->rpp;
//else $this->rcount = $this->rtotal - $this->start;
$this->sql_query .= ' LIMIT '.$this->rstart.', '.$this->rcount;
//echo '';
//var_dump($this->sql_query );
$this->sql_execute();
list($this->rtotal) = mysql_fetch_row(mysql_query('SELECT FOUND_ROWS()', $this->conn_id));
//echo '';
if(!$this->sql_err && $this->rtotal){
//$this->rtotal = mysql_num_rows($this->sql_res);
// mysql_free_result($this->sql_res);
$this->ptotal = (int)ceil($this->rtotal/$this->rpp);
if($this->p > $this->ptotal) $this->p = $this->ptotal; # Проверка превышения номера страницы
$this->rstart = ($this->p - 1)*$this->rpp;
# записей на вывод
if($this->p < $this->ptotal) $this->rcount = $this->rpp;
else $this->rcount = $this->rtotal - $this->start;
//var_dump($this->rcount);
//echo $this->sql_query;
/*
//-- скока время делается --
$t = explode (' ', microtime ());
$start = $t[1] + $t[0];
//--------------------------
$this->sql_res=mysql_query($this->sql_query,$this->conn_id);
//-- скока время делается --
$t = explode (' ', microtime ());
$stop = $t[1] + $t[0];
$t = round (($stop - $start), 7);
$this->gq .= "
запрос: ".htmlspecialchars ($this->sql_query)." время на него: ".$t."
";
$this->gt += $t;
//--------------------------
$this->sql_err=mysql_error(); */
// $this->sql_execute();
}
}
function sql_close()
{
mysql_close($this->conn_id);
}
#========= из класса БД для работы со структурой =========#
function query($sql) {
if(!$this->conn_id) return 0;
return mysql_query($sql, $this->conn_id);
}
function affected_rows() {
return mysql_affected_rows($this->conn_id);
}
function num_rows($q) {
return mysql_num_rows($q);
}
function fetch_array($q, $result_type=MYSQL_ASSOC) {
return mysql_fetch_array($q, $result_type);
}
function fetch_object($q) {
return mysql_fetch_object($q);
}
function data_seek($q, $n) {
return mysql_data_seek($q, $n);
}
function free_result($q) {
return mysql_free_result($q);
}
function insert_id() {
return mysql_insert_id($this->conn_id);
}
function error() {
return mysql_error($this->conn_id);
}
function error_die($msg='') {
die(((empty($msg))?'':$msg.': ').$this->error());
}
function sql2var($sql) {
if((empty($sql)) || (!($query = $this->query($sql)))) return false;
if($this->num_rows($query) < 1) return false;
return $this->result2var($query);
}
function result2var($q) {
if(!($Data = $this->fetch_array($q))) return false;
$this->free_result($q);
foreach($Data as $k=>$v) $GLOBALS[$k] = $v;
return true;
}
function sql2array($sql, $keyField='') {
if((empty($sql)) || (!($query = $this->query($sql)))) return false;
if($this->num_rows($query) < 1) return false;
return $this->result2array($query, $keyField);
}
function result2array($q, $keyField='') {
$Result = array();
while($Data = $this->fetch_array($q))
if(empty($keyField)) $Result[] = $Data;
else $Result[$Data[$keyField]] = $Data;
$this->free_result($q);
return $Result;
}
function list_tables() {
return mysql_list_tables($this->sql_database, $this->conn_id);
}
function list_fields($table_name) {
return mysql_list_fields($this->sql_database, $table_name, $this->conn_id);
}
#
# выполнить запрос и получиь массив данных
#
public function fetchAssoc($pagination = FALSE, $key = NULL, $columnKey = NULL, $memKey = NULL, $memTime = 60)
{
if ($memKey && ($pagination || $this->__pagination)) {
$memKey = FALSE;
//$memKey .= 'p='.$this->p.'&rpp'.$this->rpp;
}
// получаем данные из кэша
if ($memKey && $arr = $this->mem_cache->get($memKey))
{
$this->cleanQueryParam();
return $arr;
}
$arr = array();
// выполнить запрос, если $pagination == TRUE то с пагинацией, иначе обычный
($pagination || $this->__pagination) ? $this->sql_execute_page() : $this->sql_execute();
$this->cleanQueryParam();
// поместить данные в массив
if (!$this->sql_err && mysql_num_rows($this->sql_res))
{
while($row = mysql_fetch_assoc($this->sql_res))
{
if ($columnKey) $arr[$row[$columnKey]] = $row;
elseif ($key) $arr[$key] = $row;
else $arr[] = $row;
}
if ($memKey)
{
$this->mem_cache->set($arr, $memKey, $memTime);
}
return $arr;
}
if ($memKey)
{
//$this->mem_cache->set('Не удалось получить информацию', $memKey, $memTime);
}
return false;
}
public function cleanQueryParam ()
{
$this->__select = NULL;
$this->__from = NULL;
$this->__where = NULL;
$this->__group = NULL;
$this->__order = NULL;
$this->__limit = NULL;
$this->__pagination = NULL;
}
/**
* получить максимальный id в таблице
* @param varchar table имя таблицы
* return integer
*/
public function getMaxId($table)
{
$this->sql_query = 'SELECT max(id) FROM '.$table;
$this->sql_execute();
return list($maxId) = mysql_fetch_row($this->sql_res);
}
/**
* получить максимальный значение в табл по выбранному полю
* @param string $column столбец в БД по которому будут проходить вычисления по умолчанию ID
* @param string $table табл в БД
* @param string $where условия запросы
*/
public function getMax($table, $column = 'id', $where = 1)
{
return $this->agregateFunc ('max', $column, $table, $where);
}
/**
* получить минимальное значение в табл по выбранному полю
* @param string $column столбец в БД по которому будут проходить вычисления по умолчанию ID
* @param string $table табл в БД
* @param string $where условия запросы
*/
public function getMin($table, $column = 'id', $where = 1)
{
return $this->agregateFunc ('min', $column, $table, $where);
}
/**
* получить кол-во значение в табл по выбранному полю
* @param string $column столбец в БД по которому будут проходить вычисления по умолчанию ID
* @param string $table табл в БД
* @param string $where условия запросы
*/
public function getCount($table, $column = 'id', $where = 1)
{
return $this->agregateFunc ('count', $column, $table, $where);
}
/**
* получить сумму значение в табл по выбранному полю
* @param string $column столбец в БД по которому будут проходить вычисления по умолчанию ID
* @param string $table табл в БД
* @param string $where условия запросы
*/
public function getSum($table, $column = 'id', $where = 1)
{
return $this->agregateFunc ('sum', $column, $table, $where);
}
/**
* получить среднее значение значение в табл по выбранному полю
* @param string $column столбец в БД по которому будут проходить вычисления по умолчанию ID
* @param string $table табл в БД
* @param string $where условия запросы
*/
public function getAvg($table, $column = 'id', $where = 1)
{
return $this->agregateFunc ('avg', $column, $table, $where);
}
/**
* получить значение агрегатной функции ? http://www.mysql.ru/docs/gruber/mg06.html
* @param string $func сама функция (sum, max, min, ...)
* @param string $column столбец в БД по которому будут проходить вычисления по умолчанию ID
* @param string $table табл в БД
* @param string $where условия запросы
*/
private function agregateFunc($funcs, $column, $table, $where)
{
$this->sql_query = 'SELECT '.$funcs.'('.$column.') FROM '.$table.' WHERE '.$where;
$this->sql_execute();
list($value) = mysql_fetch_row($this->sql_res);
return $value;
}
/*
* сохранение записи в БД
* @param string $table имя таблицы
* @param array $array ассоциативный массив с парами вида "имя столбца - значение"
* @result идентификатор новой строки
*/
public function insert($table, $array)
{
$columns = array();
$values = array();
foreach ($array as $key => $value)
{
$key = $this->text2query($key . '');
$columns[] = $key;
if ($value === null)
{
$values[] = 'NULL';
}
else
{
$value = $this->text2query($value . '');
$values[] = "'$value'";
}
}
$columns_s = implode(',', $columns);
$values_s = implode(',', $values);
$this->sql_query = 'INSERT INTO `'.$table.'` ('.$columns_s.') VALUES ('.$values_s.')';
$this->sql_execute();
if ($this->sql_err)
{
throw new Exception ('Не удалось сохранить данные.
');
}
return mysql_insert_id();
}
// TODO выделить повторяющиеся куски для insert and update
//
// Изменение строк
// $table - имя таблицы
// $object - ассоциативный массив с парами вида "имя столбца - значение"
// $where - условие (часть SQL запроса)
// результат - число измененных строк
//
public function update($table, $object, $where)
{
$sets = array();
foreach ($object as $key => $value)
{
$key = $this->text2query($key . '');
if ($value === null)
{
$sets[] = "$key=NULL";
}
else
{
$value = $this->text2query($value . '');
$sets[] = "$key='$value'";
}
}
$sets_s = implode(',', $sets);
$this->sql_query = "UPDATE $table SET $sets_s WHERE $where";
$this->sql_execute();
/*if ($this->sql_err)
{
die ('Не удалось обновить данные.
'.$this->sql_err.'
SQL:'.$this->sql_query); // TODO только на этапе разработки!
}*/
return mysql_affected_rows();
}
/**
* удалить запись
* @param varchar $table
* @param varchar $column
* @param varchar $val
*/
public function del($table, $column, $val)
{
if ($table && $column && $val)
{
$this->sql_query = 'DELETE FROM `'.$table.'` WHERE `'.$column.'` = "'.$this->text2query($val).'"';
$this->sql_execute();
}
}
}
?>