Работа со списками

Статус
В этой теме нельзя размещать новые ответы.

mus

Новичок
Работа со списками

Дорогие друзья, есть ли у кого-либо из Вас класс или отлаженная функция (желательно класс) для работы со списком данных.

Пример подобного списка:

Стоит задача вывести на экран 200 строк из базы данных, причем только поля Имя, Фамилия, Возраст, Дата добавления (в базу), а поля Профессия и Зарплата проигнорировать. Причем следует учесть, что выводить следует все по дате добавления.

Что должен уметь класс. Класс должен уметь принимать все эти параметры от пользователя и формировать структуру данных для возврата программе. Причем структурой может быть как объект так и массив.

Есть ли у кого-либо что-либо подобное? И чем больше различных аргументов (кол-во выводимых строк на страницу, в какую сторону сортировать ASC или DESC) тем лучше.

Можно, конечно, и самому это написать, но если есть уже кем-то написанное, то хочется хотя бы глянуть как...
 

Фанат

oncle terrible
Команда форума
видимо, имеется в виду объект для работы с БД, а не со "списками"?
 

mus

Новичок
Фанат
Нет, не абстракция от БД, а методы для формирования списка, кстати, тот самый объект будет вспомогательным, потому как база данных у этого класса может быть любой....

Тоесть методы для того, чтобы внутри списка выполнять различные преобразования, например отсортировать в нужном направлении, разбить список на несколько страниц и т.д.
 

hermit_refined

Отшельник
случай тяжелый, но не безнадежный.
иные требуют в таких случаях от php встроенные функции, "без которых не могло бы быть" :))
в общем, есть такой совет - напишите сами. что непонятно - спрашивайте. предполагаемый объем кода - строчек двадцать.
 

mus

Новичок
в том-то и дело, что писать буду сам, просто хотелось бы поглядеть, как то же самое реализовано у других кодеров.

У меня получается такая чушь: (сразу поясню, что я не пытался реализовать то, о чем писал, этот блок кода как раз натолкнул меня написать что-либо универсальное)

PHP:
/*------------------------------------------------
view_order.php
**************************************************/
function OrderList($page, $end, $order_by, $order_side, $order_id = "") {
$OrderList = false;
$sql_append = "";
if(!empty($order_id)) $sql_append = "AND order_id = ?order_id";
        $sql = sql_placeholder("SELECT DISTINCT (
SELECT COUNT( * )
FROM `sup_ord`
WHERE order.order_id = sup_ord.order_id
) AS production_count,
supplier.title AS supplier_title,
supplier.name AS supplier_name, order.order_id AS order_id,
order.date AS date, order.trans_cost AS trans_cost,
order.supplier_id AS supplier_id
FROM `order` , `supplier`
WHERE order.supplier_id = supplier.supplier_id
$sql_append
ORDER BY $order_by $order_side LIMIT ?page, ?end",array(
                               "order_id" => $order_id,
                               "page" => $page,
                               "end" => $end));
$query = mysql_query($sql);
        if(mysql_num_rows($query)) {
                $i = -1;
                while($row = mysql_fetch_assoc($query)) {
                        $OrderList->item[++$i] = $row;
                        $sub_query = mysql_qw("SELECT production.production_id AS production_id,
                                               production.title AS production,
                                               sup_ord.price AS price,
                                               sup_ord.quantity AS count
                                               FROM `sup_ord` , `production`
                                               WHERE sup_ord.production_id = production.production_id
                                               AND sup_ord.order_id = ?", $OrderList->item[$i]['order_id']);
                        if(mysql_num_rows($sub_query)) {
                                while($sub_row = mysql_fetch_assoc($sub_query)) {
                                        $OrderList->item[$i]['production']->item[] = $sub_row;
                                }
                        $OrderList->item[$i]['production']->lenght = count($OrderList->item[$i]['production']->item);
                        }
                }
                $OrderList->lenght = count($OrderList->item);
        }
        if(!is_object($OrderList)) return false;
        else return $OrderList;
}
 

Фанат

oncle terrible
Команда форума
Нет, не абстракция от БД
Вроде бы, русским языком пишу. "объект для работы с БД".
мне отвечают - "нет, не абстракция".
я не говорю про абстракцию.
я говорю о том, что объект этот будет работать с бд.
а не с какими-то мифческими "списками".
база данных у этого класса может быть любой....
ну конечно. если база данных, то непременно разная.
ты с одной-то сначала научись работать по-человечески. а потом уже на абстракции рот разевай.
разбить список на несколько страниц и т.д.
Я правильно понимаю постановку задачи:
Абстрактрый драйвер БД выдаёт объект, который содержит, скажем, 2000 строк.
Этот объект передаётся твоему объекту работы со списками, и тот, отсекая ненужные 1800, выводит нужные 200. Так?
Всё ли я правильно понял?
 

hermit_refined

Отшельник
mus
ох... по коду:
1. дурное создание объекта $orderList.
2. странное использование алиасов. непонятно, зачем 'supplier.name AS supplier_name', ну а 'order.order_id AS order_id' - вообще финиш. читаемость запросов снижается.
3. запросы к бд в цикле - плохая идея. практически всегда можно без них обойтись. преждевременной пессимизации надо избегать.
4. рефакторинг - это хорошо, продолжайте.

по сути:
не понял, как соотносится ваш изначальный вопрос и приведенный код. вы сформулировали некую простую задачу. вы пытались её решить самостоятельно?..
 

Фанат

oncle terrible
Команда форума
hermit_refined
отношение, как раз, прямое.
по коду-то, собственно, и видно, что он хочет унифицировать подобные запросы.
чтобы функция (или, если ему угодно - класс), была не OrderList, а anyList.

-~{}~ 02.01.07 19:06:

мне кажется, здесь бы подошла некая надстройка над плейсхолдерами.
такие мета-холдеры, которые формируют лимит и ордер.
 

mus

Новичок
Я правильно понимаю постановку задачи:
Абстрактрый драйвер БД выдаёт объект, который содержит, скажем, 2000 строк.
Этот объект передаётся твоему объекту работы со списками, и тот, отсекая ненужные 1800, выводит нужные 200. Так?
Всё ли я правильно понял?
Да, верно. Именно средствами php, а не базы данных, так как в планах сие доработать и внедрить-таки работу с различными поставщиками списков.

САМА ИДЕЯ ЗАКЛЮЧАЕТСЯ В ТОМ, чтобы можно было обратиться к БД как "SELECT * FROM TABLE1", а далее, средствами php, выполнять всевозможные WHERE, LIMIT, ORDER и т.д.
 

Фанат

oncle terrible
Команда форума
САМА ИДЕЯ ЗАКЛЮЧАЕТСЯ В ТОМ, чтобы можно было обратиться к БД как "SELECT * FROM TABLE1",
То есть, ты не обратил внимания на количество строк, которое я взял для примера?
А если обратить? И подумать?

средствами php, выполнять всевозможные WHERE, LIMIT, ORDER и т.д.
Тебе голову не напекло?
 

mus

Новичок
Тебе голову не напекло?
Мне в России голову в Январе месяце напечь не может, а вот ты бы поосторожнее там у себя, в штатах, может это у тебя неполадки...

То есть, ты не обратил внимания на количество строк, которое я взял для примера?
А если обратить? И подумать?
Ну и? Первое, что приходит в голову - это сложность обработки оного числа строк средствами php. Есть негласное правило, все, что может обрабатывать база данных, пусть база и обрабатывает... Но если база непонятно какой будет?

Опять же, что Вы завязались на MySQL? Да и вообще на SQL в целом? Данные могут поступить из ФАЙЛА! И как к ним применим сей запрос?

Ладно, даже если изменить задачу и сделать ее таковой, каковой ВЫ её видите, то как можно реализовать то, что мне нужно, а именно этот самый AnyList?
 

hermit_refined

Отшельник
ага. понятно.
идея не совсем плохая.
только если не средствами php (это клиника, конечно), а например - поставщик создаёт объект new List('select * from table'), а клиент выполняет $oders = $orderList->fetch(0, 10, 'name desc'); (и только в методе fetch() уже выполняется запрос к бд). Но это так, развлечение.

Вообще, есть такое волшебное слово, как ORM. Но... по-моему вам пока рано в такие абстракции углубляться. Попробуйте провести рефакторинг своего кода, ввести абстрактный слой бд с замечательными методами вроде fetchAll, дробите функции/методы - жизнь уже упроститься.

-~{}~ 02.01.07 19:43:

Опять же, что Вы завязались на MySQL? Да и вообще на SQL в целом? Данные могут поступить из ФАЙЛА! И как к ним применим сей запрос?
так. а это уже ахтунг...
 

mus

Новичок
так. а это уже ахтунг...
эээ, стоп, неужто ты посчитал, что я собираюсь выполнять sql-запросы к файлам. Вопрос, скорее риторико-издевательский...

Вообще имелось ввиду следующее - в класс поступает массив данных, совершенно неупорядоченный, куча хлама, как говорится...

А уж далее мы начинаем обработку.
Теперь по поводу формирования изначального массива. Вот тут я хотел сделать вспомогательный класс, по типу функции ордерЛист, но сама функция очень кривая, посему я и задал сей вопрос на форуме - а как бы Вы сделали подобное?

Теперь же по Вашему предложению - принимаю на Ура, так как это единственная хорошая мысль в этом топике. Спасибо.

А Фанат ничего, кроме как критиковать, делать не умеет.

-~{}~ 02.01.07 19:53:

Да, кстати, если возможно - дайте почитать про ORM...
 

Фанат

oncle terrible
Команда форума
hermit_refined
то, что ты написал, это из серии "папа, ты с кем сейчас разговаривал"

-~{}~ 02.01.07 20:14:

чтобы ты не обольщался спасибами:
в класс поступает массив данных, совершенно неупорядоченный, куча хлама
он вообще не понял, что ты имел в виду.

-~{}~ 02.01.07 20:15:

это к вопросу о том, как опасно писать безумцам о том, что у них идея неплохая.
И о том, о чём я не устаю повторять - не надо судить аффтаров по себе
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху