Source for file class.database.php

Documentation is available at class.database.php

  1. <?php
  2.  
  3. /**
  4.  * AVE.cms
  5.  *
  6.  * @package AVE.cms
  7.  * @filesource
  8.  */
  9.  
  10. /**
  11.  * Класс работы с результатом выполнения MySQL-запроса
  12.  */
  13. {
  14.  
  15. /**
  16.  *    СВОЙСТВА
  17.  */
  18.  
  19.     /**
  20.      * Результат выполнения запроса
  21.      *
  22.      * @var resource 
  23.      * @access private
  24.      */
  25.     var $_result;
  26.  
  27. /**
  28.  *    ВНУТРЕННИЕ МЕТОДЫ
  29.  */
  30.  
  31. /**
  32.  *    ВНЕШНИЕ МЕТОДЫ
  33.  */
  34.  
  35.     /**
  36.      * Конструктор, возвращает объект с указателем на результат выполнения SQL-запроса
  37.      *
  38.      * @param resource $result    указателем на результат выполнения SQL-запроса
  39.      * @return object AVE_DB_Result 
  40.      * @access public
  41.      */
  42.     function AVE_DB_Result($result)
  43.     {
  44.         $this->_result $result;
  45.     }
  46.  
  47.     /**
  48.      * Обрабатывает ряд результата запроса, возвращая ассоциативный массив и численный массив
  49.      *
  50.      * @return array 
  51.      * @access public
  52.      */
  53.     function FetchArray()
  54.     {
  55.         return @mysql_fetch_array($this->_result);
  56.     }
  57.  
  58.     /**
  59.      *  Обрабатывает ряд результата запроса и возвращает ассоциативный массив
  60.      *
  61.      * @return array 
  62.      * @access public
  63.      */
  64.     function FetchAssocArray()
  65.     {
  66.         return @mysql_fetch_array($this->_resultMYSQL_ASSOC);
  67.     }
  68.  
  69.     /**
  70.      * Обрабатывает ряд результата запроса и возвращает объект
  71.      *
  72.      * @return object 
  73.      * @access public
  74.      */
  75.     function FetchRow()
  76.     {
  77.         return @mysql_fetch_object($this->_result);
  78.     }
  79.  
  80.     /**
  81.      * Возвращает данные результата запроса
  82.      *
  83.      * @return mixed 
  84.      * @access public
  85.      */
  86.     function GetCell()
  87.     {
  88.         if ($this->NumRows())
  89.         {
  90.             return @mysql_result($this->_result0);
  91.         }
  92.         return false;
  93.     }
  94.  
  95.     /**
  96.      * Перемещает внутренний указатель в результате запроса
  97.      *
  98.      * @param int $id - номер ряда результатов запроса
  99.      * @return bool 
  100.      * @access public
  101.      */
  102.     function DataSeek($id 0)
  103.     {
  104.         return @mysql_data_seek($this->_result$id);
  105.     }
  106.  
  107.     /**
  108.      * Возвращает количество рядов результата запроса
  109.      *
  110.      * @return int 
  111.      * @access public
  112.      */
  113.     function NumRows()
  114.     {
  115.         return @mysql_num_rows($this->_result);
  116.     }
  117.  
  118.     /**
  119.      * Возвращает количество полей результата запроса
  120.      *
  121.      * @return int 
  122.      * @access public
  123.      */
  124.     function NumFields()
  125.     {
  126.         return mysql_num_fields($this->_result);
  127.     }
  128.  
  129.     /**
  130.      * Возвращает название указанной колонки результата запроса
  131.      *
  132.      * @param int $i - индекс колонки
  133.      * @return string 
  134.      * @access public
  135.      */
  136.     function FieldName($i)
  137.     {
  138.         return mysql_field_name($this->_result$i);
  139.     }
  140.  
  141.     /**
  142.      * Освобождает память от результата запроса
  143.      *
  144.      * @return bool 
  145.      * @access public
  146.      */
  147.     function Close()
  148.     {
  149.         $r @mysql_free_result($this->_result);
  150.         unset($this);
  151.         return $r;
  152.     }
  153. }
  154.  
  155. /**
  156.  * Класс работы с MySQL
  157.  */
  158. class AVE_DB
  159. {
  160.  
  161. /**
  162.  *    СВОЙСТВА
  163.  */
  164.  
  165.     /**
  166.      * Идентификатор соединения с БД
  167.      *
  168.      * @var DbStateHandler 
  169.      * @access private
  170.      */
  171.     var $_handle;
  172.  
  173.     /**
  174.      * Список выполненных запросов
  175.      *
  176.      * @var array 
  177.      * @access private
  178.      */
  179.     var $_query_list;
  180.  
  181.     /**
  182.      * Метки времени до и после выполнения SQL-запроса
  183.      *
  184.      * @var array 
  185.      * @access private
  186.      */
  187.     var $_time_exec;
  188.  
  189. /**
  190.  *    ВНУТРЕННИЕ МЕТОДЫ
  191.  */
  192.  
  193.     /**
  194.      * Конструктор
  195.      *
  196.      * @param string $host    адрес сервера
  197.      * @param string $user    имя пользователя
  198.      * @param string $pass    пароль
  199.      * @param string $db    имя БД
  200.      * @return object        AVE_DB - объект
  201.      * @access public
  202.      */
  203.     function AVE_DB($host$user$pass$db)
  204.     {
  205.         if ($this->_handle @mysql_connect($host$user$pass))
  206.         {
  207.             $this->_error('connect');
  208.             return false;
  209.         }
  210.  
  211.         if (@mysql_select_db($db$this->_handle))
  212.         {
  213.             $this->_error('select');
  214.             return false;
  215.         }
  216.  
  217.         if (function_exists('mysql_set_charset'))
  218.         {
  219.             mysql_set_charset('cp1251'$this->_handle);
  220.         }
  221.         else
  222.         {
  223.             mysql_query("SET NAMES 'cp1251'");
  224.         }
  225.  
  226.         if (defined('PROFILING'&& PROFILING)
  227.         {
  228. //            mysql_query("QUERY_CACHE_TYPE = OFF");
  229. //            mysql_query("FLUSH TABLES");
  230.             mysql_query("SET PROFILING_HISTORY_SIZE = 100");
  231.             mysql_query("SET PROFILING = 1");
  232.         }
  233.  
  234.         return true;
  235.     }
  236.  
  237.     /**
  238.      * Получить функцию из которой пришел запрос с ошибкой
  239.      *
  240.      * @return string 
  241.      */
  242.     function get_caller()
  243.     {
  244.         if (function_exists('debug_backtrace')) return '';
  245.  
  246.         $stack debug_backtrace();
  247.         $stack array_reverse($stack);
  248.  
  249.         $caller array();
  250.         foreach ((array)$stack as $call)
  251.         {
  252.             if (@$call['class'== __CLASS__continue;
  253.             $function $call['function'];
  254.             if (isset($call['class']))
  255.             {
  256.                 $function $call['class'"->$function";
  257.             }
  258.             $caller[(isset($call['file']'FILE: ' $call['file'' ' '')
  259.                         . 'FUNCTION: ' $function
  260.                         . (isset($call['line']' LINE: ' $call['line''');
  261.         }
  262.  
  263.         return implode(', '$caller);
  264.     }
  265.  
  266.     /**
  267.      * Обработка ошибок
  268.      *
  269.      * @param string $type - тип ошибки
  270.      *          (при подключении к БД или при выполнении SQL-запроса)
  271.      * @param string $query - текст SQL запроса вызвавшего ошибку
  272.      * @access private
  273.      */
  274.     function _error($type$query '')
  275.     {
  276.         if ($type != 'query')
  277.         {
  278.             display_notice('Error ' $type ' MySQL database. <br />');
  279.         }
  280.         else
  281.         {
  282.             $my_error mysql_error();
  283.  
  284.             reportLog('SQL ERROR: ' $my_error PHP_EOL
  285.                     . "\t\tQUERY: " stripslashes($queryPHP_EOL
  286.                     . "\t\t"        $this->get_caller(PHP_EOL
  287.                     . "\t\tURL: "   HOST $_SERVER['SCRIPT_NAME']
  288.                                     . '?' $_SERVER['QUERY_STRING'PHP_EOL
  289.             );
  290.             if (SEND_SQL_ERROR)
  291.             {
  292.                 $mail_body ('SQL ERROR: ' $my_error PHP_EOL
  293.                     . 'TIME: '  date('d-m-Y, H:i:s'PHP_EOL
  294.                     . 'URL: '   HOST $_SERVER['SCRIPT_NAME']
  295.                                 . '?' $_SERVER['QUERY_STRING'PHP_EOL
  296.                     . $this->get_caller(PHP_EOL
  297.                     . 'QUERY: ' stripslashes($queryPHP_EOL
  298.                 );
  299.                 send_mail(
  300.                     get_settings('mail_from'),
  301.                     $mail_body,
  302.                     'MySQL Error!',
  303.                     get_settings('mail_from'),
  304.                     get_settings('mail_from_name'),
  305.                     'text'
  306.                 );
  307.             }
  308.         }
  309.     }
  310.  
  311. /**
  312.  *    ВНЕШНИЕ МЕТОДЫ
  313.  */
  314.  
  315.     /**
  316.      * Посылает запрос MySQL
  317.      *
  318.      * @param string $query - текст SQL-запроса
  319.      * @return object объект с указателем на результат выполнения запроса
  320.      * @access public
  321.      */
  322.     function Query($query)
  323.     {
  324. //        $this->_time_exec[] = microtime();
  325.         $res @mysql_query($query$this->_handle);
  326. //        $this->_time_exec[] = microtime();
  327. //        $this->_query_list[] = $query;
  328.         if (!$res$this->_error('query'$query);
  329.  
  330.         return new AVE_DB_Result($res);
  331.     }
  332.  
  333.     /**
  334.      * Экранирует специальные символы в строках для использования в выражениях SQL
  335.      *
  336.      * @param mixed $value - обрабатываемое значение
  337.      * @return mixed 
  338.      * @access public
  339.      */
  340.     function Escape($value)
  341.     {
  342.         if (!is_numeric($value))
  343.         {
  344.             $value function_exists('mysql_real_escape_string')
  345.                 ? mysql_real_escape_string($value$this->_handle)
  346.                 : mysql_escape_string($value);
  347.         }
  348.  
  349.         return $value;
  350.     }
  351.  
  352.     /**
  353.      * Возвращает ID, сгенерированный при последнем INSERT-запросе
  354.      *
  355.      * @return int 
  356.      * @access public
  357.      */
  358.     function InsertId()
  359.     {
  360.         return mysql_insert_id($this->_handle);
  361.     }
  362.  
  363.     /**
  364.      * Статистика выполнения SQL-запросов
  365.      *
  366.      * @param string $type - тип запрашиваемой статистики
  367.      *  <pre>
  368.      *  Возможные значения:
  369.      *      list  - список выполненых зпаросов
  370.      *      time  - время исполнения зпросов
  371.      *      count - количество выполненных запросов
  372.      *  </pre>
  373.      * @return mixed 
  374.      * @access public
  375.      */
  376.     function DBStatisticGet($type '')
  377.     {
  378.         switch ($type)
  379.         {
  380.             case 'list':
  381.                 list($s_dec$s_secexplode(' '$GLOBALS['start_time']);
  382.                 $query_list '';
  383.                 $nq 0;
  384.                 $time_exec 0;
  385.                 $arr $this->_time_exec;
  386.                 $co sizeof($arr);
  387.                 for ($it=0;$it<$co;)
  388.                 {
  389.                     list($a_dec$a_secexplode(' '$arr[$it++]);
  390.                     list($b_dec$b_secexplode(' '$arr[$it++]);
  391.                     $time_main ($a_sec $s_sec $a_dec $s_dec)*1000;
  392.                     $time_exec ($b_sec $a_sec $b_dec $a_dec)*1000;
  393.                     $query sizeof(array_keys($this->_query_list$this->_query_list[$nq])) 1
  394.                         ? "<span style=\"background-color:#ff9;\">" $this->_query_list[$nq++"</span>"
  395.                         : $this->_query_list[$nq++];
  396.                     $query_list .= (($time_exec 1"<li style=\"color:#c00\">(" "<li>(")
  397.                         . round($time_main" ms) " $time_exec " ms " $query "</li>\n";
  398.                 }
  399.  
  400.                 return $query_list;
  401.                 break;
  402.  
  403.             case 'time':
  404.                 $arr $this->_time_exec;
  405.                 $time_exec 0;
  406.                 $co sizeof($arr);
  407.                 for ($it=0;$it<$co;{
  408.                     list($a_dec$a_secexplode(" "$arr[$it++]);
  409.                     list($b_dec$b_secexplode(" "$arr[$it++]);
  410.                     $time_exec += $b_sec $a_sec $b_dec $a_dec;
  411.                 }
  412.  
  413.                 return $time_exec;
  414.                 break;
  415.  
  416.             case 'count':
  417.                 return sizeof($this->_query_list);
  418.                 break;
  419.  
  420.             default:
  421.                 return '';
  422.                 break;
  423.         }
  424.     }
  425.  
  426.     /**
  427.      * Статистика выполнения SQL-запросов
  428.      *
  429.      * @param string $type - тип запрашиваемой статистики
  430.      *  <pre>
  431.      *  Возможные значения:
  432.      *      list  - список выполненых зпаросов
  433.      *      time  - время исполнения зпросов
  434.      *      count - количество выполненных запросов
  435.      *  </pre>
  436.      * @return mixed 
  437.      * @access public
  438.      */
  439.     function DBProfilesGet($type '')
  440.     {
  441.         static $result$list$time$count;
  442.  
  443.         if (!(defined('PROFILING'&& PROFILING)) return false;
  444.  
  445.         if (!$result)
  446.         {
  447.             $list "<table width=\"100%\">"
  448.                 . "\n\t<col width=\"20\">\n\t<col width=\"70\">";
  449.             $result mysql_query("SHOW PROFILES");
  450.             while (list($qid$qtime$qstringmysql_fetch_row($result))
  451.             {
  452.                 $time += $qtime;
  453.                 $list .= "\n\t<tr>\n\t\t<td><strong>"
  454.                     . $qid
  455.                     . "</strong></td>\n\t\t<td><strong>"
  456.                     . number_format($qtime 16',''')
  457.                     . "</strong></td>\n\t\t<td><strong>"
  458.                     . $qstring
  459.                     . "</strong></td>\n\t</tr>";
  460.                 $res mysql_query("
  461.                     SELECT STATE, FORMAT(DURATION, 6) AS DURATION
  462.                     FROM INFORMATION_SCHEMA.PROFILING
  463.                     WHERE QUERY_ID = " $qid
  464.                 );
  465.                 while (list($state$durationmysql_fetch_row($res))
  466.                 {
  467.                     $list .= "\n\t<tr>\n\t\t<td>&nbsp;</td><td>"
  468.                         . number_format($duration 16',''')
  469.                         . "</td>\n\t\t<td>" $state "</td>\n\t</tr>";
  470.                 }
  471.             }
  472.             $time number_format($time 16',''');
  473.             $list .= "\n</table>";
  474.             $count mysql_num_rows($result);
  475.         }
  476.  
  477.         switch ($type)
  478.         {
  479.             case 'list':  return $list;  break;
  480.             case 'time':  return $time;  break;
  481.             case 'count'return $countbreak;
  482.         }
  483.  
  484.         return false;
  485.     }
  486.  
  487.     /**
  488.      * Возвращает информацию о сервере MySQL
  489.      *
  490.      * @return string 
  491.      * @access public
  492.      */
  493.     function mysql_version()
  494.     {
  495.         return  mysql_get_server_info($this->_handle);
  496.     }
  497. }
  498.  
  499. global $AVE_DB;
  500.  
  501. if (isset($AVE_DB))
  502. {
  503.     require(BASE_DIR '/inc/db.config.php');
  504.  
  505.     if (isset($config)) exit;
  506.  
  507.     if (defined('PREFIX')) define('PREFIX'$config['dbpref']);
  508.  
  509.     $AVE_DB new AVE_DB($config['dbhost']$config['dbuser']$config['dbpass']$config['dbname']);
  510.  
  511.     unset($config);
  512. }
  513.  
  514. ?>

Documentation generated on Fri, 04 Jun 2010 18:01:33 +0400 by phpDocumentor 1.4.3