| |
// всех остальных полей). Кроме того, в запись можно вводить
// произвольные поля — они тоже будут сохраняться, но по
// ним нельзя будет вести поиск (предложение "select"),
// потому что эти поля будут автоматически сериализованы при
// добавлении/изменении записи и распакованы при извлечении.
class MysqlTable {
//*** Внутренние переменные
var $TableName; // имя таблицы
var $UniqVars; // список уникальных полей (имя=1, имя=1...)
var $Index; // для этих полей построены индексы (имя=1, имя=1...)
Часть V. Приемы программирования на PHP 468
var $Fields; // все физические поля таблицы (имя=тип, имя=тип...)
var $Error; // текст последней ошибки ("", если нет)
var $JustCreated; // 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);
}
// Виртуальная функция производного класса вызывается ПЕРЕД любым
// занесением данных в таблицу (добавлением и обновлением). То есть
// она предназначена для "прозрачной" автоматической генерации некоторых
// полей записи (например, времени ее изменения) в производном классе
// перед ее сохранением.
// Можно, к примеру, в таблице держать какую-нибудь дату в формате
// SDN, а "делать вид", что она хранится в обычном представлении
// "дд.мм.гггг".
// Если эта функция возвратит 0, то операция закончится с ошибкой.
function PreModify(&$Rec) { return 1; }
// Виртуальная функция вызывается ПОСЛЕ выборки записи из таблицы, а
// также в конце модификации записи. То есть она предназначена для
// "прозрачной" модификации только что полученной из таблицы записи.
// Возвращаясь к предыдущему примеру, мы можем при извлечении записи
// из таблицы STM-поле преобразовать в "дд.мм.гггг", и "никто ничего
// не заметит".
function PostSelect(&$Rec) { return; }
// Возвращает имя таблицы
function GetTableName() { return $this->TableName; }
// Возвращает результат запроса select. В дальнейшем этот результат
// (дескриптор) будет, скорее всего, обработан при помощи GetResult().
// $Expr — выражение SQL, по которому будет идти выборка
// $Order — правила сортировки (по умолчанию — по убыванию id)
function TableSelectQuery($Expr="",$Order="id desc")
{ $this->Error="";
if(!$Expr) $Expr="1=1";
$r=mysql_query("select * from ".$this->TableName.
Глава 31. Объектно-ориентированное программирование на PHP 469
" 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() нашла несколько записей, то, последовательно вызывая
// GetResult(), можно считать их все. Метод делает всю "черную" работу
// по сериализации. Еще раз: если у результата несколько строк, то метод
// возвращает очередную. Если строки кончились, возвращает "".
// Чаще всего в вызове этой функции (и функции SelectQuery) нет
// необходимости — можн
|
|