(PHP) Классы для работы с запросами и таблицами

DocAl
Дата: 19.10.2006 23:25:36
У меня давно уже зреет идея написать пару универсальных классов для работы с запросами у СУБД и с результатами выборки. Идея, в общем-то, неоригинальная, но потому, собственно, так ещё и нереализованная: возможно, кто-то это уже сделал до меня, и сделал лучше. Сам я так и не нашёл, но может быть кто-то узнает что-то знакомое по описанию предполагаемой функциональности и подскажет ссылку?

Пока предполагается работа с PHP5 и MySQL4.1 и выше
1. Класс для работы с запросами.
Собственно, мне никогда не нравился код, в котором запросы формируются где-то в середине скрипта. Сначала я пытался просто выносить текст запроса в начало скрипта, этакую "область определения" или отдельный подключаемый файл. Что-то вроде
$query_select_categories = 'SELECT id, name FROM categories';
Понятно, что так можно вынести далеко не все запросы, а только самые простые: динамически добавляемые условия на выборку придётся как-то проставлять в коде, следующим этапом стало использование sprintf и mysql_real_escape_string, как-то так:
$stub_query_select_category_by_name = "SELECT id, name FROM categories WHERE name LIKE '%s%%'";
...
$query_select_category_by_name = sprintf($stub_query_select_category_by_name, $_REQUEST['category'])
Мне и самому-то это решение не очень нравилось, и плохо читаемо, и опять же, разнесено по скрипту, но лучших альтернатив на тот момент не придумалось. Правда, в случае использования php_mysqli, можно обойтись и без sprintf, и без mysql_real_escape_string, благодаря поддержке prepared statements, и я бы этим решением, наверное, удовлетворился, если бы не частая необходимость использования многострочных вставок. Окончательно я утвердился в необходимости что-то с этим делать когда пришлось перелопатить практически весь код OSCommerce, чтобы поправить кривые запросы, не работающие с MySQL5.0. Предполагаемая функциональность этого класса:
  • возможность описания запросов отдельно от прочего кода (по принципу prepared statements);
  • подготовка запроса по двумерному массиву данных (с численными или полу-асоциативными индексами(ассоциативные индексы столбцов и численные строк));
  • интерфейс модификации запроса в части добавления/изменения/удаления pre-join/join/post-join conditions, а также порядка сортировки результатов выборки, установки значений LIMIT;
  • интерфейс установки алиасов для полей выборки.

    Вот что-то такое мне думается... Кто-то что-то подобное знает? Принимаются также ответы типа "не страдай фигнёй, потому что...", но только аргументированные.)

    Ну и реализовав подобный класс, глупо было бы не дополнить его
    2. Классом для построения таблиц по результатам выборки.
    Предполагаемые функции:
  • собственно построение таблиц по результатам выборки, с возможностью задания осмысленных названий полей в шапке таблицы;
  • разбиение вывода на страницы;
  • возможность изменения порядка сортировки результатов с указанием полей, для которых эту возможность поддерживать.

    С той же ремаркой, что и по предыдущему пункту.)
  • Kachalov
    Дата: 20.10.2006 11:01:42
    DocAl
    Кто-то что-то подобное знает? Принимаются также ответы типа "не страдай фигнёй, потому что...", но только аргументированные.)

    на страдай фигней, потому что:
  • для работы с MySQL5 есть библиотека MySQLi
  • если нужны высокоуровневые классы поищи сначала здесь
  • прежде чем городить классы почитай про шаблоны проектирования (design patterns), в частности обрати внимание на шаблоны MVC и Model 2
  • DocAl
    Дата: 20.10.2006 11:42:46
    Про php-mysqli я упоминал, кстати,)
    А за остальное спасибо, погляжу.
    sergkarpenko
    Дата: 20.10.2006 18:06:50
    Может вам стоит посмотреть на ORM'ы, реализованные на php
    к примеру:
    http://www.phpdoctrine.com/
    http://propel.phpdb.org

    а на пеаровские mdb2 или adodb смотрели?

    или я вас не правильно понял?
    ForReal
    Дата: 23.10.2006 21:14:13
    Kachalov
    для работы с MySQL5 есть библиотека MySQLi

    Не катит, когда есть Php5.

    DocAl
    Пока предполагается работа с PHP5 и MySQL4.1 и выше

    Предлагаю использовать PDO.
    DocAl
    Дата: 24.10.2006 22:00:53
    ForReal
    Kachalov
    для работы с MySQL5 есть библиотека MySQLi

    Не катит, когда есть Php5.

    DocAl
    Пока предполагается работа с PHP5 и MySQL4.1 и выше

    Предлагаю использовать PDO.

    Пока документацию просмотрел лишь поверхностно, но вроде бы, отличие от mysqli только в том плане, что единообразно работает с рядом СУБД. Безусловно, это может быть существенно в некоторых ситуациях, и спасибо за ссылку, однако же, мне требуется несколько другое. Мне нужен класс для удобного составления и модифицирования запросов для одной определённой СУБД. Т.е. тут мне важнее, чтобы класс мог составлять запрос многострочной вставки в MySQL, чем возможность прозрачно переходить на Оракл или Информикс.
    Kachalov
    Дата: 24.10.2006 22:14:15
    ForReal
    Kachalov
    для работы с MySQL5 есть библиотека MySQLi

    Не катит, когда есть Php5.

    - а при чем тут PHP5?
    ForReal
    Дата: 25.10.2006 18:14:51
    Kachalov
    ForReal
    Kachalov
    для работы с MySQL5 есть библиотека MySQLi

    Не катит, когда есть Php5.

    - а при чем тут PHP5?

    "PDO ships with PHP 5.1, and is available as a PECL extension for PHP 5.0; PDO requires the new OO features in the core of PHP 5, and so will not run with earlier versions of PHP".

    Только в этом смысле.
    ForReal
    Дата: 25.10.2006 18:29:46
    DocAl
    ForReal
    Kachalov
    для работы с MySQL5 есть библиотека MySQLi

    Не катит, когда есть Php5.

    DocAl
    Пока предполагается работа с PHP5 и MySQL4.1 и выше

    Предлагаю использовать PDO.

    Пока документацию просмотрел лишь поверхностно, но вроде бы, отличие от mysqli только в том плане, что единообразно работает с рядом СУБД. Безусловно, это может быть существенно в некоторых ситуациях, и спасибо за ссылку, однако же, мне требуется несколько другое. Мне нужен класс для удобного составления и модифицирования запросов для одной определённой СУБД. Т.е. тут мне важнее, чтобы класс мог составлять запрос многострочной вставки в MySQL, чем возможность прозрачно переходить на Оракл или Информикс.

    В любом случае, Вам потребуется некоторый базовый интерфейс для работы с MySQL. Поэтому лучше изучить документацию подробнее.
    Чтобы знать, что уже изобретено до Вас . :)
    litvinenko
    Дата: 31.01.2007 00:04:51
    Извините. Может быть мой вопрос покажется простым или глупым. Я начинающий.
    Сейчас просмотрел мануал по mysqli и PDO - практически 1 в 1. Что лучше использовать с PHP 5.2.0 c Apache 5.0?