core db.class.php

расширенный класс для работы с базой данных

 
Посетитель
no avatar
Сообщений: 63
расширенный класс для работы с базой данных. может быть применен при разработке модулей и компонентов.

Код PHP:
  1. <?php
  2. /**
  3.  * MYSUBD_SQL INSTANT CMS Database php FrameWork [[email protected]]
  4.  *
  5.  * InstantCMS v1.9
  6.  * http://instantcms.ru/
  7.  * produced by InstantSoft, (www.instantsoft.ru)
  8.  *
  9.  * @copyright LICENSED BY GNU/GPL v2
  10.  * @since PHP 5
  11.  *
  12.  */
  13.  
  14. class cmsDatabase {
  15.  
  16. private static $instance;
  17.  
  18. public $q_count = 0;
  19. public $q_dump = '';
  20.  
  21. public $db_link;
  22.  
  23. /**
  24. * Фукция вывода отчета от ошибке.
  25.  * Запускается при обнаружении ошибок в соединении с базой.
  26.  * Аварийно завершает все вызовы на сайте через exit;
  27. *
  28. * @return null
  29. */
  30. static function show_Error($er = '') { // отчет об ошибке
  31. echo '<body bgcolor="#FAEBD7"><center><font color=blue size=+2><b>Проблема с базой данных, технические неполадки, зайдите позже</b></font></center><hr>';
  32. echo mysql_error().' | '.$er;
  33. echo '<hr>MYSUBD_SQL INSTANT CMS Database php FrameWork';
  34. }
  35.  
  36.  
  37. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. private function __construct(){
  40. $inConf = cmsConfig::getInstance();
  41.  
  42. $this->db_link = mysql_connect($inConf->db_host, $inConf->db_user, $inConf->db_pass) or self::show_Error('Cannot connect to MySQL server');
  43.  
  44. mysql_select_db($inConf->db_base, $this->db_link) or self::show_Error('Cannot select "'.$inConf->db_base.'" database');
  45.  
  46. $this->query("SET NAMES cp1251");
  47. }
  48.  
  49. /**
  50. * статический конструктор класса cmsDatabase
  51. *
  52. * @return cmsDatabase
  53. */
  54. public static function getInstance() {
  55. if (self::$instance === null) {
  56. self::$instance = new self;
  57. }
  58. return self::$instance;
  59. }
  60.  
  61. /**
  62. * Функция автоматической замены префикса в запросах
  63. *
  64. * @param string $sql текст запроса
  65. * @param string $prefix префикс запроса
  66. * @return string
  67. */
  68. protected function replacePrefix( $sql, $prefix='cms_' ) {
  69.  
  70. /*$inConf = cmsConfig::getInstance();
  71.  
  72.   $sql = trim(str_replace($prefix, $inConf->db_prefix.'_', $sql));
  73.  
  74.   return $sql;*/
  75. if ((preg_match('/(select)(.+)(where)(.+)$/ims',$sql,$s))||
  76. (preg_match('/(update)(.+)(set)(.+)$/ims',$sql,$s))||
  77. (preg_match('/(insert)(.+)(values)(.+)$/ims',$sql,$s))||
  78. (preg_match('/(delete)(.+)(where)(.+)$/ims',$sql,$s))) {
  79. $s[2] = str_replace($prefix, cmsConfig::getInstance()->db_prefix.'_', $s[2]);
  80. return $s[1].$s[2].$s[3].$s[4];
  81. } else {
  82. return str_replace($prefix, cmsConfig::getInstance()->db_prefix.'_', $sql);
  83. }
  84. }
  85.  
  86.  
  87. /**
  88. * Функция выполняет действия mysql_query
  89.  *
  90. * @param string $sql текст запроса
  91. * @param boolean $ignore_errors режим показа ошибок
  92. *
  93. * @return mysql_result
  94. */
  95. public function query($sql, $ignore_errors=false){
  96. $inConf = cmsConfig::getInstance();
  97. $sql = $this->replacePrefix($sql);
  98. $result = mysql_query($sql, $this->db_link);
  99.  
  100. if ($inConf->debug){
  101. $this->q_count += 1;
  102. $this->q_dump .= '<pre>'.$sql.'</pre><hr/>';
  103. }
  104.  
  105. if (mysql_error() && $inConf->debug && !$ignore_errors){
  106. self::show_Error('<b>QUERY ERROR</b>: '.$sql);
  107. }
  108.  
  109. return $result;
  110. }
  111.  
  112. /**
  113. * Функция выполняет действия mysql_num_rows
  114.  *
  115. * @param mysql_result $result
  116.  *
  117. * @return int
  118. */
  119. public function num_rows($result){
  120. return (int)mysql_num_rows($result);
  121. }
  122.  
  123. /**
  124. * Функция выполняет действия mysql_fetch_assoc
  125.  * по окончании чтения делает сброс указателя для возможности повторного чтения данных запроса
  126.  *
  127. * @param mysql_result $result
  128.  *
  129. * @return array
  130. */
  131. public function fetch_assoc($result){
  132. //return mysql_fetch_assoc($result);
  133.  
  134. if ($res = mysql_fetch_assoc($result)) {
  135. return $res;
  136. } else {
  137. mysql_data_seek($result,0);
  138. return false;
  139. }
  140. }
  141.  
  142. /**
  143. * Функция выполняет действия mysql_fetch_row
  144.  *
  145. * @param mysql_result $result
  146.  *
  147. * @return array
  148. */
  149. public function fetch_row($result){
  150. return mysql_fetch_row($result);
  151. }
  152.  
  153. /**
  154. * Функция выполняет действия mysql_affected_rows
  155.  *
  156. * @return int
  157. */
  158. public function affected_rows(){
  159. return mysql_affected_rows($this->db_link);
  160. }
  161.  
  162. /**
  163. * Функция возвращает последний вставленный ID
  164.  *
  165. * @param string $table имя таблицы
  166.  *
  167. * @return int
  168. */
  169. public function get_last_id($table){
  170. if ($res = $this->read_one("SELECT LAST_INSERT_ID() as lastid FROM $table LIMIT 1")) {
  171. return $res;
  172. } else {
  173. return 0;
  174. }
  175. }
  176.  
  177.  
  178.  
  179. /**
  180. * Функция возвращает количество строк запроса
  181.  *
  182. * @param string $table имя таблицы
  183. * @param string $where SQL условие
  184. * @param string $limit SQL предел (LIMIT)
  185.  *
  186. * @return int
  187. */
  188. public function rows_count($table, $where, $limit=0){
  189. $sql = "SELECT COUNT(*) FROM $table WHERE $where";
  190. if ($limit) { $sql .= " LIMIT ".$limit; }
  191. return $this->read_one($sql);
  192. }
  193.  
  194. /**
  195. * Функция возвращает ячейку таблицы по ее имени. результат схож с read_one()
  196.  * при неудачном запросе возвращет FALSE. В то время как read_one() возвращает NULL
  197.  *
  198. * @param string $table имя таблицы
  199. * @param string $where SQL условие
  200. * @param string $field имя поля
  201.  *
  202. * @return mixed
  203. */
  204. public function get_field($table, $where, $field){
  205. if ($res = $this->read_one("SELECT $field as getfield FROM $table WHERE $where LIMIT 1")) {
  206. return $res;
  207. } else { return false; }
  208. }
  209.  
  210. /**
  211. * SQL конструктор запроса
  212.  * Фукнция самостоятельно составляет запрос из параметров
  213.  * Возвращает первую строку запроса ввиду ассоциативного массива
  214.  *
  215. * @param string $table имя таблицы
  216. * @param string $where SQL условие
  217. * @param string $fields строка полей
  218. * @param string $order строка сортировки
  219.  *
  220. * @return array
  221. */
  222. public function get_fields($table, $where, $fields, $order='id ASC'){
  223.  
  224. $sql = "SELECT $fields FROM $table WHERE $where ORDER BY $order LIMIT 1";
  225. $result = $this->query($sql);
  226.  
  227. if ($this->num_rows($result)){
  228. return $this->fetch_assoc($result);
  229. } else {
  230. return false;
  231. }
  232. }
  233.  
  234. /**
  235. * Функция возвращает двумерный массив результата запроса
  236.  * результат схож с read_all()
  237.  * при неудачном запросе возвращет FALSE. В то время как read_all() возвращает NULL
  238.  *
  239. * @param string $table имя таблицы
  240. * @param string $where SQL условие
  241. * @param string $fields строка полей
  242.  *
  243. * @return mixed
  244. */
  245. public function get_table($table, $where='', $fields='*'){
  246. $sql = "SELECT $fields FROM $table";
  247. if ($where) { $sql .= ' WHERE '.$where; }
  248. $result = $this->query($sql);
  249. while($data =$this->fetch_assoc($result)){
  250. $list[] = $data;
  251. }
  252. if (isset($list)) { return $list; }
  253. return false;
  254. }
  255.  
  256. /**
  257. * Функция выполняет действия mysql_errno
  258.  *
  259. * @return mixed
  260. */
  261. public function errno() {
  262. return mysql_errno($this->db_link);
  263. }
  264.  
  265. /**
  266. * Функция выполняет действия mysql_error
  267.  *
  268. * @return string
  269. */
  270. public function error() {
  271. return mysql_error($this->db_link);
  272. }
  273.  
  274. /**
  275. * Функция выполняет действия mysql_real_escape_string
  276.  *
  277. * @return string
  278. */
  279. public function escape_string($string) {
  280. return mysql_real_escape_string($string);
  281. }
  282.  
  283. /**
  284. * Функция проверяет наличие поля в таблице
  285.  *
  286.  * @param string $table имя таблицы
  287.  * @param string $field имя поля
  288.  *
  289. * @return boolean
  290. */
  291. public function isFieldExists($table, $field){
  292.  
  293. $sql = "SHOW COLUMNS FROM $table WHERE Field = '$field'";
  294. $result = $this->query($sql);
  295.  
  296. if ($this->errno()) { return false; }
  297.  
  298. return (bool)$this->num_rows($result);
  299.  
  300. }
  301.  
  302. /**
  303. * Функция проверяет соответвие типа поля в таблице
  304.  *
  305.  * @param string $table имя таблицы
  306.  * @param string $field имя поля
  307.  * @param string $type тип по стандарту SQL
  308.  *
  309. * @return boolean
  310. */
  311. public function isFieldType($table, $field, $type){
  312.  
  313. $sql = "SHOW COLUMNS FROM $table WHERE Field = '$field' AND Type = '$type'";
  314. $result = $this->query($sql);
  315.  
  316. if ($this->errno()) { return false; }
  317.  
  318. return (bool)$this->num_rows($result);
  319.  
  320. }
  321.  
  322. /**
  323. * Функция проверяет наличие таблицы в базе данных
  324.  *
  325.  * @param string $table имя таблицы
  326.  *
  327. * @return boolean
  328. */
  329. public function isTableExists($table){
  330.  
  331. $sql = "SELECT 1 FROM $table LIMIT 1";
  332. $result = $this->query($sql, true);
  333.  
  334. if ($this->errno()){ return false; }
  335.  
  336. return true;
  337.  
  338. }
  339.  
  340. /**
  341. * Функция выполняет оптимизацию таблиц
  342.  *
  343.  * @param mixed $tlist массив таблиц. если не указан то будут оптимизированы все таблицы базы
  344.  *
  345. * @return boolean
  346. */
  347. public static function optimizeTables($tlist=''){
  348.  
  349. $inDB = self::getInstance();
  350.  
  351. if(is_array($tlist)) {
  352.  
  353. foreach($tlist as $tname) {
  354. $inDB->query("OPTIMIZE TABLE $tname", true);
  355. $inDB->query("ANALYZE TABLE $tname", true);
  356. }
  357.  
  358. } else {
  359.  
  360. $inConf = cmsConfig::getInstance();
  361.  
  362. $tlist = $inDB->get_table('information_schema.tables', "table_schema = '{$inConf->db_base}'", 'table_name');
  363.  
  364. if (!is_array($tlist)) { return false; }
  365.  
  366. foreach($tlist as $tname) {
  367. $inDB->query("OPTIMIZE TABLE {$tname['table_name']}", true);
  368. $inDB->query("ANALYZE TABLE {$tname['table_name']}", true);
  369. }
  370.  
  371. }
  372.  
  373. if ($inDB->errno()){ return false; }
  374.  
  375. return true;
  376.  
  377. }
  378.  
  379. /**
  380. * Функция выполняет запрос на удаление
  381.  *
  382.   * @param string $table имя таблицы
  383.   * @param string $where условие
  384.   * @param int $limit предел
  385.   *
  386. * @return boolean
  387. */
  388. public function delete($table, $where='', $limit=0) {
  389.  
  390. $sql = "DELETE FROM {$table} WHERE {$where}";
  391.  
  392. if ($limit) { $sql .= " LIMIT {$limit}"; }
  393.  
  394. $result = $this->query($sql, true);
  395.  
  396. if ($this->errno()){ return false; }
  397.  
  398. return true;
  399.  
  400. }
  401. /**
  402. * Функция выполняет запрос на удаление с ипользованием транзакций
  403.  *
  404.   * @param string $table имя таблицы
  405.   * @param mixed $id значение ключевого поля
  406.   *
  407. * @return boolean
  408. */
  409. public function deleteNS($table, $id) {
  410.  
  411. $inCore = cmsCore::getInstance();
  412.  
  413. $ns = $inCore->nestedSetsInit($table);
  414.  
  415. $ns->DeleteNode($id);
  416.  
  417. return true;
  418.  
  419. }
  420.  
  421. ####################################
  422. ########## НОВЫЕ ФУНКЦИИ ###########
  423. ####################################
  424.  
  425. /**
  426. * Функция выполняет чтение превой строки результата запроса
  427.  *
  428. * @param string $query текст запроса
  429. * @param MYSQL_CONST $type MYSQL_ASSOC, MYSQL_NUM и MYSQL_BOTH
  430. *
  431. * @return array
  432. */
  433. public function read($query,$type = MYSQL_ASSOC) { #line
  434. if ($res = $this->query($query)) {
  435. $ret = mysql_fetch_array($res,$type);
  436. return $ret;
  437. } else { return null; }
  438. }
  439.  
  440. /**
  441. * помещает результат запроса mysql_result в двумерный массив
  442.  * при пустом запросе возвращет null , при $array=true возвращает array()
  443.  *
  444.  * @param string $query текст запроса
  445.  * @param boolean $array режим массива, при true всегда в результате получается массив
  446. *
  447. * @return array
  448. */
  449. public function read_all($query, $array = false){ #table
  450. $res = $this->query($query);
  451. while ($row=mysql_fetch_assoc($res)) { $ret[]=$row; } //ассоциативный
  452. if (isset($ret)) { return $ret; }
  453. if ($array) { return array(); }
  454. return null;
  455. }
  456.  
  457. /**
  458. * Функция выполняет чтение первой ячейки результата запроса
  459.  *
  460. * @param string $query текст запроса
  461. *
  462. * @return mixed
  463. */
  464. public function read_one($query){
  465. if ($ret=$this->read($query,MYSQLI_NUM)) {
  466. if (is_array($ret)) {return $ret[0]; }
  467. }
  468. return null;
  469. }
  470.  
  471. /**
  472. * Символ кавычки для обертки строковых параметров SQL запросов
  473.  *
  474. * @access public
  475. * @var string
  476. */
  477. public $q = "'";
  478.  
  479. /**
  480. * функция экранирует строку согласно стандарту функции MYSQL_REAL_ESCAPE_STRING
  481.  * дополнительно заданные кавычки в переменной $this->q ставятся в начале и конце искомой строки
  482.  *
  483. * @param string $str входная строка для обработки
  484. *
  485. * @return string
  486. */
  487. public function es($str) { // escape string
  488. return $this->q.$this->escape_string($str).$this->q;
  489. }
  490.  
  491. /**
  492. * функция экранирует любое количество переданных праметров с помощью функции es($str)
  493.  * при вызове наличие знака & перед каждым параметром строго обязательно
  494.  *
  495. * es_all(&$name, &$email, &$user_last_name)
  496.  *
  497. * @return null
  498. */
  499. public function es_multi() { // ev(&$name, &$email) пример вызова
  500. $trace = debug_backtrace();
  501. $args = $trace[0]['args'];
  502. foreach ($args as &$a) {
  503. $a = $this->es($a);
  504. }
  505. }
  506.  
  507. /**
  508. * функция экранирует переданные данные с помощью функции es($str)
  509. * согласно строке типов данных $strtypes
  510.  * если строка $strtypes не указана то все занчения будут экранированы
  511.  * если строка $strtypes короче массива то экранирование будет идти в порядке,
  512.  * указанным строкой в цикле читая строку заново
  513.  * $strtypes - s - строка i - числа, и все остальные типы
  514.  *
  515.  * es_array(&$array); // все значения массива $array будут экранированы
  516.  * es_array(&$array, 'sssis'); // первое второе третье занчение будут экранированы,
  517.  * // четвертое имеет флаг i что запрещает обработку этого значения
  518.  * // четвертое значение остается без изменений
  519.  * // пятое значение экранировано
  520.  *
  521.  * @param mixed $array значения для экранирования. допускается передавать значения не являющиеся массивами
  522.  * @param string $strtypes строка представляет собой последовательность типов данных в массиве
  523.  *
  524. * @return null
  525. */
  526. public function es_array(&$array,$strtypes = '') { // es_array(&$array,'sssis')
  527. if (!is_array($array)) { $array = array($array); }
  528. if ($strtypes == '') { $ts = 's'; } else { $ts = $strtypes; }
  529. $strtypes = str_pad($strtypes,count($array),$ts,STR_PAD_RIGHT);
  530. foreach ($array as $key=>&$ar) {
  531. if ($strtypes{$key}=='s') {
  532. $ar = $this->es($ar);
  533. }
  534. }
  535. }
  536.  
  537. /**
  538. * универсальное экранирование для LIKE переменных поиска
  539.  * фукнция применятся для строковых параметров, передаваемых для оператора LIKE в SQL запросах
  540.  *
  541.  * $c = $mysql->query('SELECT * FROM users WHERE username LIKE '.$mysql->es_like('L',' %'));
  542.  * //в $c будут выведены все пользователи чье имя начинается на L
  543.  * $c = $mysql->query('SELECT * FROM users WHERE username LIKE '.$mysql->es_like('L','%%'));
  544.  * //в $c будут выведены все пользователи чье имя содержит на L
  545.  * $c = $mysql->query('SELECT * FROM users WHERE username LIKE '.$mysql->es_like('L','% '));
  546.  * //в $c будут выведены все пользователи чье имя оканчивается на L
  547.  *
  548.  * @param string $str текст
  549.  * @param string $between строка обертки (2 символа). ' ' ничего не ставится % - ставится %
  550.  *
  551. * @return string
  552. */
  553. public function es_like($str, $between = '%%') {
  554. $this->connect_to();
  555. if ($between{0}==' ') { $ret = ''; } else { $ret = $between{0}; }
  556. $ret .=
  557. str_replace('*','%',addCslashes($this->escape_string(str_replace('\\','\\\\',
  558. $str
  559. )), '_% '));
  560. if ($between{1}!=' ') { $ret .= $between{1}; }
  561. return $this->q.$ret.$this->q;
  562. }
  563.  
  564. /**
  565. * функция составляет запрос для вставки строки данных в таблицу.
  566.  *
  567.  * @param string $tableFields 'table (id, user, password, about)' строка информации о структуре полей таблицы
  568.  * @param mixed $values ОДНОМЕРНЫЙ массив с чиловыми индексами или ЗНАЧЕНИЕ, с данными которые будут вставлены в таблицу
  569.  * @param string $strtypes строка типов полей. см. функцию es_array
  570.  *
  571.  * $mysql->insert('table (id, user, password, about)', array(0,'alex','123456','15 лет школьник'),'isss');
  572.  *
  573.  * @return mysql_result
  574. */
  575.  
  576. public function insert($tableFields, $values, $strtypes = '') {
  577. $this->es_array($values,$strtypes);
  578. return @$this->query(
  579. 'INSERT INTO '.$tableFields.' VALUES ('.implode(', ',$values).')'
  580. );
  581. }
  582.  
  583. /**
  584. * функция составляет запрос для мульти вставки данных в таблицу.
  585.  *
  586.  * @param string $tableFields 'table (id, user, password, about)' строка информации о структуре полей таблицы
  587.  * @param array $values ОДНОМЕРНЫЙ массив с чиловыми индексами, с данными которые будут вставлены в таблицу, размер массива кратен числу вставляемых строк
  588.  * @param string $strtypes строка типов полей. см. функцию es_array
  589.  *
  590.  * $mysql->insert_all('table (id, user, password, about)', array(
  591.  * 0,'alex','123456','15 лет школьник',
  592.  * 1,'sasha','147547','20 лет студент'),
  593.  * 'isss'
  594.  * );
  595.  *
  596. * @return mysql_result
  597. */
  598. public function insert_all($tableFields, $values, $strtypes = '') {// мульти вставка
  599. $kol = substr_count(',',$tableFields)+1;
  600. $this->es_array($values,$strtypes);
  601. $skol= count($values)/$kol;
  602. $qu = '';
  603. for ($i=0; $i<$skol; $i++) {
  604. $qu .= "(";
  605. for ($ii=0; $ii<$kol; $ii++) {
  606. $qu .= $values[$i*$kol+$ii].',';
  607. }
  608. $qu{strlen($qu)-1} = ')';
  609. $qu .= ',';
  610. }
  611. $qu{strlen($qu)-1} = ';';
  612. return @$this->query('INSERT INTO '.$tableFields.' VALUES '.$qu);
  613. }
  614.  
  615. /**
  616. * функция составляет запрос для ОБНОВЛЕНИЯ данных в таблице.
  617.  *
  618.  * @param string $tableFields 'table (user, password)' строка информации о структуре полей таблицы
  619.  * @param mixed $values ОДНОМЕРНЫЙ массив с чиловыми индексами или ЗНАЧЕНИЕ, с данными которые будут обновлены
  620.  * @param string $where SQL условие для выбора данных для обновления
  621.  * @param string $strtypes строка типов полей. см. функцию es_array
  622.  *
  623.  * $mysql->update('table (user, password)', array('Lesha','241746'),'id = 1');
  624.   * $mysql->update('table (user, password)', array('Lesha','241746'),'id = 1','ss');
  625.  *
  626.  * @return mysql_result
  627. */
  628. public function update($tableFields, $values, $where, $strtypes = '') {
  629. preg_match_all ('/\w+/',$tableFields,$t);
  630. $this->es_array($values,$strtypes);
  631. $table=array_shift($t[0]);
  632. $qu = '';
  633. for($i=0; $i<count($values); $i++) {
  634. $qu .= '`'.$t[0][$i].'` = '.$values[$i].',';
  635. }
  636. $qu{strlen($qu)-1} = ' ';
  637. return @$this->query(
  638. 'UPDATE `'.$table.'` SET '.$qu.'WHERE '.$where
  639. );
  640. }
  641.  
  642. //end class/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  643.  
  644. }
Погода в Тольятти
Посетитель
no avatar
Сообщений: 63
http://jqbook.narod.ru/works/db.class.zip

скачать класс можно отсюда
Погода в Тольятти
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.