Просмотр полной версии : трехуровневый принцип
Всем приветы!
Переписываю уже не в первый раз интерфейс для БД (точнее одной единственной таблицы, но это неважно, можно расширить -- принцип тот же). Итак. Должен быть реализован трехуровневый принцип: контроллер, движок (сами ф-ции), БД (ну, и, понятно, уровень 0 -- сама панель). Контроллеру передается команда с параметрами, под которую он "подыскивает" соответствующую функцию, обращающуюся в свою очередь к БД. С фунциями, назначение которых изменять что-то в БД (например, select() или add()) проблем нет. Неприятности возникают с функицией, возвращающей данные в броузер (select()). Проблема в том, что данные должны по сути запрашиваться и выдаваться в разных файлах, иначе нарушится структура.
Сталкивался уже кто-либо с подобной проблемой?
Спасибо.
ЗЫ аттач
ИМХО - медленный и печальный подход к работе с БД.
Аттача нет, но можешь изложить причины такой заморочки ?
Картинка была слишком большая, вот аттач и не загрузился...
Так вот, зачем заморочка: во-первых, мне сама идея разделения очень нравится -- позволяет разбиват программу на части, что делает возможным программирование (и перепрограммирование!) отдельных кусков независимо друг от друга. Кроме того это делает код обозримым и понятным, что особенно важно при отладке, а также переработке пару месяцев/лет спустя после написания приложения. Да и коллегам (если работаешь не один) проще. Во-вторых... требують, хотять... :)
Почему "медленный и печальный подход к работе с БД"?
Потому что php - скриптовый язык, призванный не обеспечить удобство разработчика и читаемость кода, а быстрое выполнение маленьких (относительно) скриптов.
Картинки типа приаттаченной хорошо смотреть на семинарах и слушать объяснения от теоретиков. На практике каждая прокладка между БД и скриптом - большой и толстый тормоз всего скрипта.
А собственно, по первому вопросу - неясно, какая структура нарушается-то ? Что кому мешает ? :)
Структура нашается при SELECT, потому что это единственный запрос, результат которого должен выводиться в броузер. Но чтобы не нарушать структуру, файл запрашивающий и файл, куда выводится содержание result, должны быть разными, в смысле, не одним и тем же.
Да простят меня модеры, но IMHO это глупо.
Думаю, простят, а насчет того глупо ли... Что ты имеешь в виду?
Структура нашается при SELECT, потому что это единственный запрос, результат которого должен выводиться в броузер. Но чтобы не нарушать структуру, файл запрашивающий и файл, куда выводится содержание result, должны быть разными, в смысле, не одним и тем же.
Это почему они должны быть разными ?
Почему разные файлы вообще пугают ?
Одним файлом гораздо удобнее и что не менее важно быстрее.
А про эту структуру ты сам придумал??
Обычно просто пишеш файл (файлы) с функциями, которые вставляеш куда надо.
Например:
function db_connect($host,$user,$pass,$db)
{
mysql_pconnect($host,$user,$pass) or die ('!!!');
mysql_select_db($db);
}
А потом пихай эту функцию куда надо и сразу же запрос и вывод.
Pashka2k
14.12.2005, 01:11
Т.е. я так понимаю, что надо из файл1 запросить данные, которые асинхронно получит файл2? Если так, то можно попользовать XMLHttpRequest джаваскриптовый, который будет (будучи запущенным из файл2) по победного бэкграундно вызывать файл3 (пхпшный), оный в свою очередь (на сервере) будет проверять, не появились ли в сессии данные от прослойки, которая произведя селект его результат положит в сессию.
Или структура линейная? Если линейная, то собсно из передай в прослойку параметром нужный файл и включи его из прослойки после селекта.
Или я не понял задачи :cool:
смеятся или плакать?
На практике каждая прокладка между БД и скриптом - большой и толстый тормоз всего скрипта.
это в какой школе мало того, то учат такому, так еще и заставляют, видимо, этим бредом делится?
вцелом вообще автор только начинает узнавать этот мир и ему очень страшно, что он больше того, что можно увидеть.
можно рассказать об mvc, только это совсем не поможет. пока мозг не понимает, что делают руки точно не поможет.
значит, выход один. есть такая штука - "храбрость". в данном случае - храбрость попробовать. попробуешь, а со временем поймешь, правильно или неправильно принял то или иное решение.
Вождь, при всем уважении :)
мы тут вроде про php+mysql говорим, разве нет ?
Ну так сделай два варианта - с нагороженными прокладками от скрипта до БД и со сравнительно "чистым" mysql_query().
Если ты считаешь, что 0.000000001 секунда разницы для тебя несущественна - дальше можешь не читать и думать, что прав.
Я так почему-то мыслю, что величина (любая ненулевая разница * количество пользователей) стремится к осязаемым величинам.
Ну а выводы каждый делает сам - удобство разработки или удобство конечного пользователя ставить во главу угла.
Pashka2k
14.12.2005, 16:47
Величина стремится будет еще очень долго ибо нагрузка на сервер в количестве 1*10^6 запросов одновременно - это из области фантастики, даже в контексте корпоративного сервера. И пусть корпорация большая - логично при подобной нагрузке делать распределенные копии бд и совсем не мускульную архитектуру.
Или структура линейная? Если линейная, то собсно из передай в прослойку параметром нужный файл и включи его из прослойки после селекта.Да, структура линейная. Т.е. файл_1 получает, к примеру, параметры для SQL-запроса, делает запрос и переправляет полученные данные файлу_2. Тот в свою очередь работает, как тэмплэйт -- получает данные и, обработав их, впихивает определенным образом в HTML-структуру (ну, и зацикливает, где надо).
Проблема вот в чем. Функции в для файла_2 уже давно готовы и отлажены, НО им нужен $result, то есть результат запроса mysql_query(). Но у меня не получается передать $result через $_SESSION, точнее получается, но того, на что он ссылается (временной таблицы?), видимо, уже нет. Не знаю, понятно ли я выражаюсь... Есть ли способ так передать данные, чтобы их можно было бы обрабатывать стандартными пхпшными "mysql_"-функциями?
СериализацияПробовал.
Файл_1...
$result = serialize($result);
$_SESSION['result'] = $result;
...Файл_2...
$result = $_SESSION['result'];
$result = unserialize($result);
...Не получается.:(
serialize() handles all types, except the resource-type (http://de.php.net/manual/ru/function.serialize.php)
Или я неправильно понял?
Pashka2k
13.01.2006, 11:35
Всё правильно понял, сериализовать хэндл ессно нельзя - это ж фактически индекс в таблице адресов процесса. Можно в модуле, где создаешь запрос вытащить данные из него в массив, его сериализовать и в таком виде положить в сессию.
В сессию можно и весь массив без сериализации положить.
Илья, что видится напрямую - так это отдавать из файла1 не результат запроса, а текст запроса, ну а mysql_query() делать там, где надо.
Всё правильно понял, сериализовать хэндл ессно нельзя - это ж фактически индекс в таблице адресов процесса. Можно в модуле, где создаешь запрос вытащить данные из него в массив, его сериализовать и в таком виде положить в сессию.Прочитай, пожалуйста, внимательно мое сообщение. ;)
В сессию можно и весь массив без сериализации положить.
Илья, что видится напрямую - так это отдавать из файла1 не результат запроса, а текст запроса, ну а mysql_query() делать там, где надо.Не знаю. Это рушит всю идею к чертовой матери, но решения лучше, похоже, нет... :(
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.