![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
iddqd |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
Есть достаточно сложная и путанная структура данных. И путаный требуемый алгоритм их обработки. Сейчас все данные и вопросы и конечный текст в XML.
Итак. Пользователь выбирает какой-то пункт при опросе.
И так еще большое количество вопросов. Затем происходит вывод текста из XML. Допустим, пользователь выбрал в первом вопросе 2, а во втором — 1. Запишем это в виде переменных v_1 = 2 и v_2 = 1. Тут у нас v_1 это вопрос 1, ну и v_2 — вы поняли. В XML с текстом, про который я писал выше у нас есть вот такие заманчивые конструкции:
Суть заключается в том, что если пользователь выбрал в первом вопросе 1, то мы выводим "Если выбрали ответ один", а если выбрал пункт 2, то выводим "Если выбрали ответ два". Да, с помощью PHP я легко разберу этот XML и выведу нужные мне данные. Но до каких пор возможностей XML будет хватать? Уже сейчас, при не большой посещаемости (~ 500 человек/сутки) я вижу, что не хватает сил. И хочу перейти на нормальную БД. Например, MySQL. Как мне это сделать? Еще раз подведу итог сложности: мне нужно выводить большое количество текста. В зависимости от выбора пользователя текст (местами) может подставляться разный. В БД я намерен хранить весь текст. Как мне это сделать правильно? Именно хранение разных данных и выбор нужной строки в зависимости от выбора пользователя? Спасибо заранее. Надеюсь, хоть что-то мне удалось разъяснить. -------------------- |
||||||
|
|||||||
smartov |
|
||||||||||||||||
![]() свой собственный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 7 Всего: 259 |
Перевести в общем не сложно. Правда есть нюансы.
Если количество ответов на вопрос - величина статическая (например всегда 3, как в примерах) либо не статическая но "не больше N" где N - число до 10, то я бы таблицу вопросов сделал так:
Вроде громоздкая, но с другой стороны - удобная для использования, поиск по ней не нужен, а запись всегда используется целиком. Далее, учитывая, что количество текста на вывод после ответов большое, то он будет выделен в отдельную таблицу.
А связующим звеном выступит таблица, описательное название которй я не осилил придумать
Для пущеё важности по полям id_question и id_answer можно создать индексы. Ну а теперь: Теперь нет смысла складывать это в переменные, да и вообще неудобно это. Лучше складывать в массив, пусть будет $results. Причем не просто складывать, а в виде строк, подготовленных по шаблону
Думаю имена переменных описательны и понятно что куда совать. Таким образом после всех ответов (Допустим, пользователь выбрал в первом вопросе 2, а во втором — 1) выйдет примерно такой массив:
Если я правильно понял, то выводить текст нужно уже после того, как пользователь поотвечал на все вопросы. Готовим кусок текста для запроса - объединяем массив.
Отдельной строкой я это выделил просто для наглядности. Можно это делать уже на месте при вставке в запрос. Ну а сам запрос будет выглядеть вот так:
То есть по сути, запрос, который увидит SQL сервер будет такой
Нужно учесть однно ограничение. Если вопросов в опроснике очень много - можно превысить длину SQL запроса. Тогда надо будет либо её увеличивать на сервере, либо разбивать изначальный массив $results на несколько массивов и вытягивать текст "ответов" за несколько запросов. |
||||||||||||||||
|
|||||||||||||||||
iddqd |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
Ой, спасибо огромное.
Кажется, это как раз то, что мне нужно. Сейчас вот только чуть-чуть вникну в это все. -------------------- |
|||
|
||||
iddqd |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
После длительных размышлений я пришел вот к какому выводу.
Оказывается, можно все упростить и убрать предварительный опрос пользователя. Но тогда ему нужно предоставить возможность выбора прямо на странице. Выглядеть это будет примерно так:
Так вот этот самый "Если выбрали ответ один" будет кликабельным и при клике будут всплывать все варианты, которые были при голосовании еще. Пожалуйста, подскажите, как в таком случае меняется структура данных, а то слабоват я в этом? Но явно вижу, что меняется. Только вот понять не могу — проще или сложней становится. -------------------- |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
По моему - возможности xml еще не исчерпаны
![]() Вообще говоря, нужно хранить достаточно развесистую, вероятно с циклами, деревянную структуру в xml? Можно посоветовать поменять структуру
Кстати, чем и как делается разбор xlm? Какого размера примерно файл с данными? Текстовый файл удобнее базы тем что он текстовый и его можно менять где угодно. Для базы нужно писать специальную тулзу для редактирования. Это сообщение отредактировал(а) ksnk - 17.6.2010, 09:43 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
iddqd |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
ksnk, хочу совсем уйти от модели с вопросами, а делать так, как я написал в последнем своем сообщении.
Размеры файлов не очень большие. Дело в том, что речь про текстовые статьи. Текст в них частично может меняться в зависимости от выбора пользователя. Всего статей порядка 200 и каждая из них хранится в своем XML-файле размером от 5Кб до 100Кб. Добавлено через 3 минуты и 39 секунд Еще вот сейчас появилась идея про использование XSLT для разбора XML, но пока разбираюсь с самим XSLT и с чем его едят. -------------------- |
|||
|
||||
iddqd |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
На первый взгляд, XSLT вполне способен справится с моей задачей. Но в связи с этим вопрос: не будет ли нагрузка на сервер все же выше, чем при работе с MySQL. Мне кажется, будет.
-------------------- |
|||
|
||||
Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
iddqd, я думаю, что если использовать xml-технологии, то тут лучше всего подойдет не xslt, а xpath. На нем можно писать достаточно серьезные запросы, не уступающие по сложности sql, но я все-же советую использовать БД для лучшей масштабируемости
-------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Это - imho, очень большой объем, чтобы рассуждать об обработке его с помощью xml в php. Лучше вытаскивать данные из базы. Или в xml оставить компактную управляющую структуру, а данные большого объема красиво разбросать по файловой системе... Проблема xml в том, что весь файл сначала закачивается в память, парсится и потом обрабатывается. Если файл большой - работа с ним существенно замедляется. Возможно есть приличные кэширующие xml-читалки для php, но я сужу по simplexml... Это описание Hypertext Markup Language? ![]() Честно говоря не очень понял идею, можно её ещё раз пояснить? что вообще такое делается? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
iddqd |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
Давайте не будем вникать в совсем уж детали, которые ничего не меняют.
Я вот техническое задание даже написал в поисках того человека, кто может сделать, но желающих нет и делать, видимо, буду сам. Так что дам ссылку, чтобы желающие помочь советом могли лучше вникнуть. Ссылка вот. Меня интересует именно лучшая реализация. Пока вникаю в XSL. -------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |