| |
воспользоваться методом Select(), который по
// запросу сразу возвращает массив со всеми обработанными результатами!
function TableGetResult($r)
{ $this->Error="";
// Выбираем очередную строку в виде массива
if($r) $Result=mysql_fetch_array($r);
else $this->Error=mysql_error();
if(!@is_array($Result)) return;
// Перебираем все поля таблицы и записываем их в массив $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); }
Часть V. Приемы программирования на PHP 470
// Аналог mysql_data_seek(). После вызова этой функции указатель на
// дескриптор $r "перескочит" на найденную запись номер $to, после
// чего GetResult() ее и возвратит.
function DataSeek($r,$to) { return mysql_data_seek($r,$to); }
// Создает или загружает таблицу по имени $Name.
// $Fields — список полей базы. Именно по ним в дальнейшем можно
// будет вести поиск и строить индекс. Кроме того, в запись можно будет
// добавлять ЛЮБЫЕ другие переменные, но они будут сериализованы, а
// потом восстановлены. Формат списка: массив с ключами — именами
// переменных и значениями — их типами. Если $Fields — не массив, то
// считается, что таблица открывается такой, какой она есть. В противном
// случае производится проверка: не добавились или не удалились ли какие-
// то поля или индексы и, если это так, то выполняется соответствующая
// модификация таблицы (кстати, это процесс довольно длительный).
// ВНИМАНИЕ: если в таблице было какое-то поле, которое сериализуется, то
// в будущем при добавлении этого поля к $Fields оно НЕ будет
// автоматически переведено в ранг несущих, т. е. попросту
// пропадет (и наоборот).
// РЕКОМЕНДАЦИЯ: перечисляйте в $Fields те поля, для которых вы ТОЧНО
// уверены, что они будут всегда присутствовать в базе, а также те,
// по которым нужно будет вести поиск, строить индекс и использовать
// 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");
Глава 31. Объектно-ориентированное программирование на PHP 471
$Data=$this->TableGetResult(
mysql_query("select ".DataField." from $Name where id=1")
);
// Если таблица существует, то запрос окончится успешно.
// В этом случае нужно проверить, не изменилась ли таблица с момента
// последнего обращения, и если это так, то подкорректировать ее.
if(@is_array($Dat
|
|