Я@R

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Я@R » Претечи » Драйвер базы данных.


Драйвер базы данных.

Сообщений 1 страница 10 из 14

1

Для сайтов обычно используется MySQL, так что и мы , но и напишем несколько простых утилит для работы с такой базой. Реально я в течении последних 15 лет использовал эти драйвера в своих проектах с использованием на сайтах баз данных. Этот минимум мне позволял решать большой круг задач, причем вся сложность с выборкой перекладывается на сам SQL-запрос. Так что конструктивы выборки определяются умением создавать SQL-запросы

Самое первое в любом движке, это Драйвер Базы Данных, если конечно движок использует в качестве единицы сохранения информации — базу данных.
Но современные движки, как форумские, так и инетовские без баз практически  сейчас не работают…
В движке Foreach  драйвер занимает особенную роль , так как на нем и построено все общение с базой. Головная структура движка выполнена на трех основных файлах, расположенных в основной библиотеке сервиса.
Это файлы
   connect.php
   record.cls.php
   code/_mysql.inc
Каждый из этих файлов строго отвечают за определенные действия в общей системе управления движком, причем их искусственое разбиение строго на две части, вызвано желанием оптимизировать код.

2

connect.php
Этот файл определяет коннекты с базой данных

connect.php
Код:
<?

include_once("code/_mysql.inc");

function db_use(){ global $_link;
  if($_link) return true;
  if($_link = @mysql_connect(
        _DB_HOST,_DB_USER,_DB_PINC)){
    if(@mysql_select_db(_DB_NAME,$_link))
         return true;
  }
  return false;
}

function db_query($sql){ global $_link;
  if(!$_link) if(!db_use()) return false;
  return @mysql_query($sql,$_link);
}
function db_last_id(){ global $_link;
  if(!$_link) if(!db_use()) return false;
  return @mysql_insert_id($_link);
}
function db_close(){ global $_link,$_stat;
  if(count($_stat)){
    if(db_use()){
      @mysql_query("begin",$_link);
      foreach($_stat as $sql)
          @mysql_query($sql,$_link);
      @mysql_query("commit",$_link);
    }
  }
  if($_link) mysql_close($_link);
  $_link = false;
  unset($_stat);
  $_stat = array();
}

?>

Файл содержит три основные и одну вспомогательную функции, которые испьзуются для построения всех возможных коннектов с базой данных. Я исходно не стал включать в драйвер специализированые функции с явным указанмес сиквиль запросов, за исключенмем самых необходимых..
Вот эти функции
db_query($sql)
db_close()
db_last_id()
db_use()

3

db_query($sql)
Эта функция выполняет все действия с базой данных. В качестве аргумента этой функции передается сиквиль запрос. Если эта функция приминяется в начале каждого сеанса коннекта с базой данных, она в своем теле вызывает вспомогательную функцию db_use().
В качестве возврата функция передает указатель на рекорд базы данных по запросу или в случае неудачи возвращает FALSE.

4

db_close()
Эта функция завершает все процессы коннекта с базой данных, и выполняет перед закрытием и сбросом и инициаллизацией переменных завершающие операции отложеных сиквиль запросов, сохраненных в очереди $_stat.
Все эти отложенные запросы выполняются в пакетном режиме и после выдачи все инфы в инет, и поэтому исполняются очень быстро.

5

db_last_id()
Эта функция возвращает последний автоинкрементный ключ. Алгоритм работы такой же как у функции db_query()

6

db_use()
Вспомогательная функция, которая включает базу по определением коннекта определенных в файле включения… Эта функция вызывается через другие, поэтому ее явный вызов не столь необходим.

7

code/_mysql.inc
В этом файле задаются насстройки аккранта на базу данных, причем в отличии от многих систем файл расположен глубоко в теле движка в дирректории, к которому извне доступа нет.

code/_mysql.inc
Код:
<?
$_link = false;
$_stat = array();

//////////////////////////////////////
define("_DB_NAME","Base_Name");
//////////////////////////////////////
define("_DB_HOST","localhost");
define("_DB_USER","User");
define("_DB_PINC","PassWord");
?>

Требует пояснение несколько моментов.
В этом файле задается переменная
$_stat;
Эта переменная используется для сбора поточных сиквиль запросов, исполняемых в момент закрытия базы данных в конце сеанса коннекта с сайтом и не влияющих на само отображение. К таким запросам относятся запросы оптимизации таблиц и проверки, а так же расчета статистики и прочии

8

Класс record.cls.php
Этот класс связывает драйвер базы с объектами управления

record.cls.php
Код:
<?
include_once("$_libr/connect.php");

class record {
  var $name;
  var $rows;
  var $total;

  function record($name){
    $this->name  = $name;
    $this->_clear();
  }
  function get(){
    $this->_clear();
    $arg = func_get_args();
    if(count($arg)) {
      $sql = array_shift($arg);
      if(count($arg)){
        $func = array_shift($arg);
        $args = "";
        foreach($arg as $v)
           $args.= ",$v";
        $evl = "$func($r$args);";
      }else $evl = "$r;";
      if($rst = db_query($sql)){
        while($r = mysql_fetch_row($rst))
          eval("$this->rows[] = $evl");
        mysql_free_result($rst);
        $this->total = count($this->rows);
      }
    }else $this->_count();
    return $this->total;
  }
  function _count($sfx=";"){
    if($rst=db_query("SELECT count(*)
          FROM $this->name$sfx")){
      if($r=mysql_fetch_row($rst))
           $this->total = $r[0];
    }
    mysql_free_result($rst);
  }
  function _clear(){
    $this->total = 0;
    $this->rows = array();
  }
}
?>

Класс record при своем использовани сам вызывает файлы коннекта и настройки конфигурации, поэтому их отдельный вызов не требуется.
Активация класса происходит через конструктор класса, с указанием в качестве аргумента, имени таблицы, с которой вы будите работать.

$rst = new record(‘tabl’);

Когструктор выполняет обнуление переменных, назначение начальных значений.

9

Член класса
$this->_count($sfx=";");
выполняет запрос по подсчету колличества данных по простому запросу.
SELECT count(*)FROM tabl, причем в качестве аргумента используется любой набор текстовых суффиксов, допустимых в данном запросе. К примеру значением суффикса в параметре могут быть:
" WHERE pole>10″,
т.е подсчитать сколько элементов в таблице имеющее значение поля pole больше 10.
Важно: не надо только забывать, что любое допустимое предложение для суффикса обязательно должно начинаться с пробела

10

Член класса
$this->get()
выполняет любой запрос, но в основном предназначен для выполнения запроса выборки, с определенными условиями..
Эта функция достаточно своеобразная. Она в качестве своих параметров содержит набор разных аргументов, имеющие следующий, обязательный порядок.
Первым параметром этой функции всегда сиквиль запрос. Сам сиквиль запрос и остальные параметры не-обязательны. В случае если эта функция вызывается без аргументов, то ее действия аналгична вызову без аргументов функции, того же класса $this->_count().
В результате вызова с одним аргументом — функция get класса record заполняет внутреннею переменную $this->rows, которая получает массив значений данных, в соответствии с сиквиль-запросом, а сама функция возвращает значение внутренней переменной $this->totаl равную числу выбраных значений.
В случае, если используется больше чем 1 параметр фунуции get, то следующим аргументом, будет имя функции. Это значение должно быть передано в виде строки, а все последующие аргументы, необязательные, являются параметрами этой функции.
В этом случее выполнение запроса get совмещает выборку из базы данных с обработкой данных и представлением их для выдачи в поток.
Таким образом экономится время выборки и обработки , а также функция становится универсальном элементом работы с базой данных.
И последнее замечание.
Для сокращения скорости выборки и обработки данных, в драйвере используется выборка строки данных с цифровыми индексами. Эти функции , по сравнению с ассоциативными индексами, исполняются на порядок быстрее. Нв первое время это кажущееся неудобство, полностью нивелируется удобством самой функции, а в будещем вообще входит в постоянную привычку.


Вы здесь » Я@R » Претечи » Драйвер базы данных.