Согласитесь, не так уж и мало для каких-то четырехсот строчек кода.….. Листинг 31.2 представляет собой исходный текст библиотеки, реализующей наш класс. Она предполагает, что соединение с MySQL уже открыто и выбрана верная текущая база данных.
Листинг 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__ (упакованный массив
// всех остальных полей). Кроме того, в запись можно вводить
// произвольные поля — они тоже будут сохраняться, но по
// ним нельзя будет вести поиск (предложение "select"),
// потому что эти поля будут автоматически сериализованы при
// добавлении/изменении записи и распакованы при извлечении.
class MysqlTable {
//*** Внутренние переменные
var $TableName; // имя таблицы