| |
ось, и применяет соответствующие действия
по корректировке (вызывает нужные команды SQL).
r Поддерживается одно автоинкрементное поле с именем id, которое автоматиче-
ски проставляется у записи при ее добавлении в таблицу. Указывать его в списке
несущих полей не надо.
r Имеется набор стандартных операций, которые можно производить с таблицей: ее
создание и удаление, вставка новой записи, обновление записи, удаление записей,
выборка указанного числа записей с сортировкой. Кроме того, поддерживаются
дополнительные операции, такие как подсчет числа записей, удовлетворяющих
запросу, и получение всех уникальных значений в указанном столбце таблицы.
r Для каждой таблицы можно хранить один дополнительный блок информации лю-
бой структуры (например, это может быть даже многомерный ассоциативный
массив). Выборка и запись этого блока осуществляются методами GetInfo() и
SetInfo(). Блок информации нельзя получить никак иначе, кроме как посредст-
вом этих двух функций (он "не виден" даже для функции выборки).
r Для убыстрения работы программист может назначить для тех или иных столбцов
таблицы режим индексирования (при использовании индекса MySQL тратит зна-
чительно меньше времени на поиск данных). Индексы, как и несущие поля, встав-
ляются и удаляются автоматически при изменении параметров вызова конструк-
тора. Помните, что хотя они и убыстряют работу, но зато занимают на диске
довольно много места.
У этого класса есть один небольшой недостаток, который заставляет применять его
аккуратно. Так как количества и размеры полей при вставке могут быть любыми, то
злоумышленник может быстро "забить" таблицу разного рода "мусором". Например,
если таблица используется как хранилище для гостевой книги, то он может видоиз-
менить форму отправки сообщения и вставить туда какое-нибудь текстовое поле,
предварительно поместив в него пару мегабайтов текста. Чтобы избежать этой
потен-
циальной "дыры" в защите, рекомендуется перед вставкой записи в таблицу прове-
рять, какой объем она занимает в сериализованном виде, и в случае превышения
оп-
ределенного числа байтов выводить предупреждение и завершать сценарий по die().
Думаю, читатель сам без труда добавит такую возможность в свои сценарии или же
прямо в класс MysqlTable.
Согласитесь, не так уж и мало для каких-то четырехсот строчек кода.….. Листинг
31.2 представляет собой исходный текст библиотеки, реализующей наш класс. Она
предполагает, что соединение с MySQL уже открыто и выбрана верная текущая база
данных.
Глава 31. Объектно-ориентированное программирование на PHP 467
Листинг 31.2. Полноценный класс MySQL-таблицы
// MysqlTable — "прозрачная работа" с таблицей MySQL.
// Класс MysqlTable обычно делают базовым для какого-нибудь
// другого класса (например, CGuestBook), и переопределяют
// нужные функции.
// Поле для хранения сериализованных полей (снаружи "не видно")
define("DataField","__data__");
//******************* Вспомогательные функции *******************
// Если переменная пуста, инициализирует ее
function Def0(&$st,$def) { if(!isSet($st)||$st=="") $st=$def; }
// Подготавливает строку двоичных данных для помещения в таблицу.
function Apostrophs(&$st)
{ $st=str_replace(chr(0),"\\0",$st);
$st=ereg_replace("\\\\","\\\\",$st);
$st=ereg_replace("'","\\'",$st);
return $st;
}
// Упаковывает объект и превращает его в строку.
function SqlPack(&$obj)
{ $s=Serialize($obj); return Apostrophs($s); }
// Распаковывает строку и создает объект.
function SqlUnpack(&$st) { return Unserialize($st); }
//****************************************************************
//*** Далее идет описание класса таблицы.
// Каждая запись таблицы, помимо тех полей, которые указаны в
// конструкторе, будет иметь еще два поля — id (уникальный
// идентификатор записи) и __data__ (упакованный масси
|
|