Существует множество библиотек для PHP, предоставляющих единый интерфейс для обращения к различным СУБД:
PEAR DB,
ADOdb and
PDO.
Код, написанный с использованием этих библиотек, оказывается довольно "многословным" и
чрезмерно перегруженным деталями. DbSimple предоставляет интерфейс, значительно
более простой и удобный, чем приведенные выше (да и многие другие) библиотеки абстракций
от СУБД.
Поддержка PHP 4 и 5, СУБД: MySQL, PostgreSQL и InterBase/FireBird.
Простой и лаконичный интерфейс (см. примеры ниже).
Условные макроподстановки в теле SQL-запроса ({}-блоки), позволяющие динамически генерировать даже очень сложные запросы без ущерба читабельности кода.
Кэширование результатов выполнения запроса (если это необходимо).
Поддержка различных видов placeholder-ов (параметров запроса): списковый, ассоциативный, идентификаторный и т. д.
Поддержка функции "выборка + подсчет общего числа строк" (для отображения по страницам).
Функции непосредственной выборки: всего результата, строки, столбца, ячейки, ассоциативного массива, многомерного массива, связанного дерева и т. д.
Удобный интерфейс для отслеживания и обработки ошибок.
Поддержка расширенного логирования запросов (включая результат выполнения запроса и номер строки вызывающей программу).
Поддержка "родных" placeholder-ов СУБД и автоматическая оптимизация "один prepare, много execute".
Объектный интерфейс работы с BLOB-ами (если это необходимо).
Код библиотеки весьма компактен: один файл - базовый класс, один файл - драйвер
конкретной СУБД.
Библиотека не должна выравнивать различия между разными СУБД на уровне языка SQL.
Интерфейс должен быть максимально лаконичным и удобным в использовании.
"Выполнение запроса" и "получение результирующих данных" должны быть объединены в одну операцию.
Если запрос формируется "кусками" (динамически), это не должно делаться в ущерб читабельности.
Оптимизация вида "один prepare, много execute" должна быть скрыта от пользователя и выполняться автоматически.
Чем неудобны другие библиотеки
PEAR DB, ADOdb:
библиотеки не упрощают работу с СУБД, они просто предоставляют единый (и многословный) интерфейс; отладочные возможности в зачаточном состоянии.
PDO:
требует PHP 5; неудобная работа с placeholder-ами и результатами выборки.
Стандартные функции PHP для работы с СУБД: низкая читабельность кода, значительные неудобства в отладке,
подверженность уязвимостям вида SQL Injection.
Выборка ограниченного двумерного массива с занесением общего числа записей в переменную.
mixed query(string $query [,$arg1...])
Вызов не-SELECT запроса; для автоинкрементных полей в INSERT-запросах возвращает ID вставленной записи.
mixed transaction([mixed $parameters])
Запускает новую транзакцию.
mixed commit() / mixed rollback()
Подтверждает/отменяет текущую транзакцию.
Для изменения формата представления результата дополнительно используются зарезервированные имена столбцов (ARRAY_KEY* и т. д.) и атрибутные комментарии (например, для включения кэширования). См. ниже примеры их использования.
$rows = $DB->select('
SELECT * FROM user
WHERE
1=0
{ OR user_id IN(?a) }
',
$listOfUserIdsMayBeEmpty
// Если пусто, разворачивается в 1=0, т.е. false.
);
Листинг 7: Кэширование результатов запроса по времени
$DB->setCacher('myCacher');
$row = $DB->select('
CACHE: 10h 20m 30s
SELECT * FROM table WHERE id=123
');
// Определяем функцию работы с кэш-хранилищем.
function myCacher($key, $value)
{
// Если $value !== null, то следует записать его в кэш с ключом $key.
// Если $value === null, то следует вернуть значение кэша с ключом $key.
}
Листинг 8: Кэширование результатов запроса с зависимостью от изменения таблиц
// Здесь forum.modified и topic.modified - поля типа TIMESTAMP.
$row = $DB->select('
CACHE: 10h 20m 30s, forum.modified, topic.modified
SELECT *
FROM forum JOIN topic ON topic.forum_id=forum.id
WHERE id=123
');
// Обратите внимание на "@"!
// Также по полю id должен быть создан уникальный индекс.
if (!@$DB->query('INSERT INTO tbl(id, field) VALUES(1, ?)', $field)) {
// Здесь идет реакция на ошибку, если она возникла.
// Контекст ошибки можно получить через $DB->error.
$DB->query('UPDATE tbl SET field=? WHERE id=1', $field);
}