Вечная тема с PHP и MySQL -25


Всем привет! Наверняка каждый из тех, кто много и постоянно пишет на PHP сталкивался с вопросом оптимизации и упрощения запросов в базы данных MySQL. Кто-то написал уже себе удобные классы/процедуры, кто-то нашел что-нибудь на просторах сети.

Поскольку у меня скрипты на PHP все больше и больше начинают сворачиваться к одной задаче — выборке из базы данных и передаче этих данных клиентским Java-скриптам, я себе облегчил участь тем, что создал удобный (для меня, конечно) класс по работе с базами данных MySQL.

Сразу оговорюсь — встроенный класс mqsli достаточно удобен и функционален, но сталкиваясь день ото дня с одними и теми же вопросами было бы странно немного не облегчить свою участь.

Вашему вниманию предлагается класс exDBase, это по сути своей оболочка для класса mysqli. Сразу оговорюсь — я программист начинающий, и готов в комментариях или личных сообщениях получить массу критики за написанный код. Я не очень владею RegExp например, которые сильно бы упростили код, возможно есть и другие претензии. Но, тем не менее…

Вся библиотека содержится в одном файле — exdbase.php. Это файл содержит описание класса exDBase. Чтобы начать работать, нужно просто, скачав файл, прописать такую строчку:

require_once ('exdbase.php');

Для начала создадим экземпляр класса, это очень просто:

$DB = new exDBase (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if ($DB->error)
    echo "Ошибка соединения: $DB->error";

В свойстве $DB->error всегда будет ошибка последней операции (если была ошибка), либо оно будет пустым.

Формат практически идентичен созданию экземпляра класса mysqli. Естественно, вместо указанных в примере констант нужно подставить реальные значения для хоста, имени пользователя, пароля и имени базы данных.

Теперь можно и поупражняться. Допустим у нас есть готовая база данных, и в ней есть таблица clients с полями:

ID — уникальный номер, автоинкремент
NAME — имя клиента
AGE — возраст клиента
AMOUNT — сумма покупок
BLOCKED — булева переменная, заблокирован клиент или активен
SETTINGS — личные параметры, мы их храним в формате JSON

Запрос в базу данных


Давайте получим все записи из таблицы 'clients'. Для этого существует метод fetchArray.

$res = $DB->fetchArray ('clients'); // получаем все записи в виде массива ассоциативных массивов
if ($res)
    foreach ($res as $client)
        echo print_r ($client, true); // выдаем все записи на экран

А если мы хотим получить только первую запись запроса? Для этого есть метод fetchFirst.

$res = $DB->fetchFirst ('clients'); // получаем первую запись в виде ассоциативного массива
if ($res)
    echo print_r ($client, true); // выдаем первую запись на экран

Но, нам вряд ли понадобится получать все записи из таблицы, всегда есть условия отбора (поле WHERE в команде SELECT). Как нам поступить? Да очень просто. Это второй аргумент методов fetchArray или fetchFirst.

Допустим, что мы хотим выбрать всех клиентов с именем John. В нашем классе это можно сделать двумя способами.

Первый — просто задать условие строкой вида «NAME = 'John'»

$res = $DB->fetchArray ('clients', "NAME = 'John'");

Второй — задать условие массивом:

$res = $DB->fetchArray ('clients', array ("NAME" => "John"));

А если есть еще условия? Например, возраст должен равняться 30 лет? Легко:

$res = $DB->fetchArray ('clients', array ("NAME" = "John", "AGE" => 30));

Таким образом можно объединять несколько условий поиска. Но равенство… А если мы хотим найти всех клиентов с именем John, которые старше 25 лет? Тут на помощь приходят специальные префиксы:

$res = $DB->fetchArray ('clients', array ("NAME" = "John", ">=AGE" => 25));

Кроме ">=" вы можете использовать: ">", "<", "<=", "!=", "<>", "!=". Таким образом можно создавать запросы разной степени сложности и всегда получать нужные ответы.

Третий параметр методов выборки из базы данных — это поля таблицы. Их можно задать как строкой (например: «NAME, AGE»), так и массивом: array («NAME», «AGE»).

$res = $DB->fetchArray ('clients', array ("NAME" = "John", ">=AGE" => 25), array ("NAME", "AGE"));

Четвертый и последний параметр методов выборки fetchArray и fetchFirst это порядок сортировки. Он также задается либо строкой (типа: «ID ASC, NAME DESC») либо массивом array («ID» => «ASC», «NAME» => «DESC»).

$res = $DB->fetchArray ('clients', array ("NAME" = "John", ">=AGE" => 25), array ("NAME", "AGE"), array ("ID" => "ASC", "NAME" => "DESC"));

Ну, заканчивая с получением данных вы спросите — а как лимитировать выборку? Например, нужны только 10 первых записей?

Это делается методом setLimit(), вот так:

$DB->setLimit (10);
$res = $DB->fetchArray ('clients', "NAME = 'John'");

Метод setLimit() работает только на один запрос, после этого лимиты обнуляются.

Вставка новых данных


Для записи новых данных существует метод insert().

$id = $DB->insert ('clients', array ("NAME" => 'Peter', "AGE" => 27, "AMOUNT" => 1000.25));

Он возвращает значение первичного ключа автоинкремента (если такой задан в таблице). В нашем случае он вернет ID вставленной записи.

Обновление данных


Обновление данных осуществляется методом update().

$DB->update ('clients', array ("NAME" => 'Peter'), array ("AGE" => 30, "AMOUNT" => 2000.25));

Мы обновили все записи где имя (поле NAME) — это 'Peter'. Второй аргумент метода — это условие выбора, точно в таком же формате как WHERE для SELECT. Ну, а третий аргумент метода — это сами данные. Теперь у всех таких записей с именем 'Peter' возраст будет равен 30, а сумма — 2000.25.

Удаление данных


Если вы уже поняли логику работы библиотеки, то удаление дастся очень просто. Метод называется delete().

$DB->delete ('clients', array ("NAME" => 'Peter'); // удалить все записи с именем 'Peter'
$DB->delete ('clients', array (">AGE" => '20'); // удалить все записи с возрастом больше 20.

Вот такой вот первый краткий экскурс в библиотеку exDBase. Существует еще целый ряд других, более продвинутых функций, но об этом в другой раз.

Скачать файл можно по ссылке
(Выберите загрузить файл по ссылке как ...)

Всем хорошего кода!




К сожалению, не доступен сервер mySQL