RFpro.ru: Программирование на PHP

  Все выпуски  

RFpro.ru: Программирование на PHP


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

vladisslav
Статус: 8-й класс
Рейтинг: 1339
∙ повысить рейтинг »
amnick
Статус: Профессионал
Рейтинг: 858
∙ повысить рейтинг »
Палян Александр Михайлович
Статус: 6-й класс
Рейтинг: 309
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / PHP

Номер выпуска:1224
Дата выхода:24.01.2011, 11:00
Администратор рассылки:Устинов С.Е. (Профессионал)
Подписчиков / экспертов:310 / 146
Вопросов / ответов:1 / 1

Вопрос № 181933: Здравствуйте, уважаемые эксперты! срочно нужна ваша помощь, в решении задачи по php. Необходимо создать систему опроса (голосования) для сайтов. Система состоит из административной и клиентской части. - Административная часть. С ее помощ...



Вопрос № 181933:

Здравствуйте, уважаемые эксперты! срочно нужна ваша помощь, в решении задачи по php. Необходимо создать систему опроса (голосования) для сайтов.
Система состоит из административной и клиентской части.

- Административная часть.
С ее помощью создаются опросы. При создании нового опроса администратор вводит вопрос и
количество ответов в опросе. На следующей странице сценария уже готовая форма, с количеством текстовых полей равным количеству
ответов. Администратор заполняет эти текстовые поля формулировками ответов. На последней странице формируется текст сценария в
html-формате, который необходимо разместить на странице сайта, где будет проводится опрос (форма
с вопросами и ответами-радиокнопками, кнопкой "Проголосовать",а также со ссылкой на просмотр результатов опроса). Все опросы имеют
свой идентификатор, что позволяет сценариям отличать их друг от друга.

Все опросы сохраняются в БД MySQL. (Структуру БД необходимо разработат ь самостоятельно)

Кроме сценария, формирующего опрос, необходимы еще сценарии: принимающий ответ от посетителя сайта (предусмотреть возможность
защиты от частого голосования с одного IP-адреса - например проголосовать с одного IP можно не чаще чем один раз в 5 минут), и
сценарий, формирующий результаты опроса для посетителей сайта в виде диаграмм - с помощью графических возможностей PHP.

Администратор системы опроса должен иметь возможность видеть все опросы, существующие в БД, иметь возможность просматривать
результаты и удалять ненужные опросы.

Структуру БД, хранящей опросы и результаты ответов, разработать самостоятельно.

- Клиентская часть.
Посетитель сайта (клиент) видя опрос на страничке, выбирает наиболее подходящий для него ответ (радиокнопкой) и нажимает на
кнопку "Проголосовать". Сценарий принимает голос-ответ клиента и отображает общие результаты текущего голосования на другой
странице сайта.

Отправлен: 18.01.2011, 21:08
Вопрос задал: Каминский Руслан Анатольевич (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает lupus campestris (Академик) :
Здравствуйте, Каминский Руслан Анатольевич!

Примерный расклад такой: для каждого опроса в БД создается отдельная таблица opros_id (id,variant,votes), где id (можно делать автоинкремент) - идентификатор варианта ответа, variant (тип - текстовое поле нужной длины) - значение варианта для отображения пользователю, votes (тип - число) - количество голосов за данный вариант. Название opros_id состоит из постоянной части "opros_" и переменной части "id", опросы идентифицируются по этой переменной части.
Когда администратор открывает страницу со списком опросов, вытаскиваются названия существующих таблиц в БД (команда show tables), отбираются те, что попадают под "opros_*" и выводятся списком, при этом для каждого опроса формируются еще дополнительные ссылки: на скрипт удаления опроса и на скрипт просмотра результатов опроса. Это два отдельных скрипта, каждому из которых можно в качестве параметра передавать идентификатор опроса (то есть п олучится что-то типа del.php?id=opros_id).
Скрипт удаления опроса принимает идентификатор опроса в качестве параметра и удаляет этот опрос (команда drop table opros_id), после удаления опроса пользователя лучше вернуть на страницу со списком опросов.
Скрипт просмотра результатов опроса принимает идентификатор опроса в качестве параметра и выполняет запрос к БД (команда select variant, votes from opros_id order by votes desc), затем построчно выводит полученный результат. Можно вывод делать в отдельном окошке (target=_blank).
На странице со списком опросов нужно добавить отдельный раздел для создания нового опроса. Для этого достаточно простой формы (<form></form>) с полем для ввода количества вариантов ответа и кнопкой "создать опрос", которая будет вызывать скрипт new.php и передавать ему необходимое количество вариантов ответа. Скрипт в первую очередь генерирует уникальный id для опроса и создает таблицу для этого опроса (create table opros_i d ...). В зависимости от количества необходимых вариантов ответа на странице отображается форма с полями input и идентификаторами с привязкой к данному варианту, то есть <input type=text name="variant1"><input type=text name="variant2"> и т.д., по необходимому количеству полей. Кнопка отправки формы на обработку проверяет наличие элемента с name=variant1 и сохраняет его данные в БД (insert into opros_id (id,variant,votes) values (...)), и так для каждого элемента ввода.
После загрузки данных администратору надо сгенерировать текст в формате html, часть текста будет постоянной (объявление формы (<form action="vote.php" method=post>...</form>), кнопка голосования (submit button), ссылка на страницу с результатами (show.php?id=opros_id)), скрытое поле с идентификатором опроса (<input type=hidden name=opros value="opros_id">),а часть формируется динамически - делается запрос к БД (select variant from opros_ id), затем построчно формируются варианты ответа (<input type=radio name=var value="variant">). Этот полученный текст html можно вставить в любую страницу.
Скрипт vote.php обеспечивает голосование. В рамках параметров он принимает идентификатор опроса (через скрытое поле с name=opros) и вариант ответа (через кнопку с name=var). Данные загружаются в БД (update opros_id set votes=votes+1 where variant=...).
Для защиты от накруток можно создать в БД отдельную таблицу для хранения IP адресов sec (IP, opros_id, time). Перед тем, как засчитать голос можно проверить, не голосовали ли с этим адресом (select time from sec where ip="..." and opros_id="..."). Если от полученного времени 5 минут еще не прошли, то голос не засчитывать и выводить предупреждение. Если все чисто - засчитать голос и обновить БД (update sec set time=... where opros_id=... and ip=...). IP адрес пользователя берется из переменных окружения, время для простоты можно счит ать в unix-time (в секундах).
После засчитанного голоса пользователь перенаправляется на страницу show.php?id=opros_id.
Если будут в опросы - пишите в мини-форуме.

Удачи!
-----
«С кем тяжело молчать, с тем не о чем говорить» (Метерлинк)

Ответ отправил: lupus campestris (Академик)
Ответ отправлен: 23.01.2011, 19:03
Номер ответа: 265566
Россия, Москва
Адрес сайта: http://lupus-campestris.blogspot.com/

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265566 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное