Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 [ 155 ] 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

var $Fields; все физические поля таблицы ( имя=тип, имя=тип... ) var $Error; текст последней ошибки ("", если нет) var $JustCreated; 1, если таблица б1ла создана, а не загружена *** Внутренние функции

Упаков1вает поля массива в строку, за исключением тех, которые сами являются непосредственн1ми полями в базе данн1х. function PackFields(&$Hash) { $Data=array();

foreach($Hash as $k=>$v) if($k!=DataField) if(!isSet($this->Fields[$k])) $Data[$k]=$v;

return Serialize($Data);

Виртуальная функция производного класса выз1вается ПЕРЕД люб1м занесением данн1х в таблицу (добавлением и обновлением). То есть она предназначена для " прозрачной" автоматической генерации некоторых полей записи ( например, времени ее изменения) в производном классе перед ее сохранением.

Можно, к примеру, в таблице держать какую-нибудь дату в формате SDN, а " делать вид", что она хранится в обычном представлении "дд. мм. гггг".

Если эта функция возвратит 0, то операция закончится с ошибкой. function PreModify(&$Rec) { return 1; }

Виртуальная функция выз1вается ПОСЛЕ выборки записи из таблиц:, а также в конце модификации записи. То есть она предназначена для "прозрачной" модификации только что полученной из таблицы записи. Возвращаясь к предыдущему примеру, мы можем при извлечении записи из таблице! STM-поле преобразовать в "дд.мм.гггг", и "никто ничего не заметит".

function PostSelect(&$Rec) { return; } Возвращает имя таблицы

function GetTableName() { return $this->TableName; } Возвращает результат запроса select. В дальнейшем этот результат ( дескриптор) будет, скорее всего, обработан при помощи GetResult(). $Expr - в1ражение SQL, по которому будет идти выборка $Order - правила сортировки ( по умолчанию - по убыванию id) function TableSelectQuery($Expr="",$Order="id desc") { $this->Error=""; if(!$Expr) $Expr="1=1";

$r=mysql query("select * from ".$this->TableName.



" where ($Expr) and (id>1) order by $Order"); if(!$r) { $this->Error=mysql error(); return; } return $r;

function SelectQuery($Expr="",$Order="id desc") { return $this->TableSelectQuery($Expr,$Order); }

Возвращает результат предыдущего запроса select ( точнее, очередную

найденную запись) в виде распакованного (!) массива. Если

SelectQuery() нашла несколько записей, то, последовательно выз1вая

GetResult(), можно считать их все. Метод делает всю "черную" работу

по сериализации. Еще раз: если у результата несколько строк, то метод

возвращает очередную. Если строки кончились, возвращает "".

Чаще всего в вызове этой функции (и функции SelectQuery) нет

необходимости - можно воспользоваться методом Select(), который по

запросу сразу возвращает массив со всеми обработанными результатами!

function TableGetResult($r)

{ $this->Error="";

Выбираем очередную строку в виде массива if($r) $Result=mysql fetch array($r); else $this->Error=mysql error(); if(!@is array($Result)) return;

Перебираем все поля таблица: и запис1ваем их в массив $Hash $Hash=array();

foreach($this->Fields as $k=>$i) if(isSet($Result[$k])) $Hash[$k]=$Result[$k]; Распаковываем поле с данными

$Hash+=SqlUnpack($Hash[DataField]); unSet($Hash[DataField]);

$this->PostSelect($Hash); Все сделано return $Hash;

function GetResult($r) { return $this->TableGetResult($r); }

Примечание: мы используем две функции, из которых GetResult()

просто является синонимом для TableGetResult(), чтобы позволить

производному классу вызывать функции MysqlTable, даже если они

переопределены в нем. К сожалению, в PHP это единственный метод

добиться цели.

Аналог mysql num rows()

function GetNumRows($r) { return mysql num rows($r); }



Аналог mysql data seek(). После вызова этой функции указатель на дескриптор $r "перескочит" на найденную запись номер $to, после чего GetResult() ее и возвратит.

function DataSeek($r,$to) { return mysql data seek($r,$to); } Создает или загружает таблицу по имени $Name.

$Fields - список полей базы. Именно по ним в дальнейшем можно будет вести поиск и строить индекс. Кроме того, в запись можно будет добавлять ЛЮБЫЕ другие переменн1е, но они будут сериализован:, а потом восстановлен!. Формат списка: массив с ключами - именами переменных и значениями - их типами. Если $Fields - не массив, то считается, что таблица открывается такой, какой она есть. В противном случае производится проверка: не добавились или не удалились ли какие то поля или индексы и, если это так, то выполняется соответствующая модификация таблицы ( кстати, это процесс довольно длительный). ВНИМАНИЕ: если в таблице б1ло какое-то поле, которое сериализуется, то в будущем при добавлении этого поля к $Fields оно НЕ будет автоматически переведено в ранг несущих, т. е. попросту пропадет ( и наоборот).

РЕКОМЕНДАЦИЯ: перечисляйте в $Fields те поля, для котор1х вы ТОЧНО уверены, что они будут всегда присутствовать в базе, а также те, по которым нужно будет вести поиск, строить индекс и использовать distinct.

$Index - по каким полям нужно строить индекс. Индекс несколько увеличивает размер базы, но зато вырастает скорость поиска по ней ( точнее, по тем полям, для которых используется индекс). Ключи - имена столбцов, значения - "размер" индекса (0, если по умолчанию, что чаще всего наиболее разумно)

function MysqlTable($Name,$Fields="",$Index="") { $this->TableName=$Name; $this->Error="";

if(is array($Fields)) {

foreach($Fields as $k=>$v)

if(!eregi("not null",$v)) $Fields[$k]=$v." not null"; $Fields=array("id"=>"int auto increment primary key") +$Fields+array(DataField=>"mediumblob");

Def0($Index,array());

Считываем из таблицы поле с ее параметрами $this->Fields=array(DataField=>"mediumblob");



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 [ 155 ] 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189