23.01.2011, 19:03
общий
это ответ
Здравствуйте, Каминский Руслан Анатольевич!
Примерный расклад такой: для каждого опроса в БД создается отдельная таблица 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_id ...). В зависимости от количества необходимых вариантов ответа на странице отображается форма с полями 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.
Если будут вопросы - пишите в мини-форуме.
Удачи!