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(); } } } ?>