Voting-система на PHP

Xakep, номер #049, стр. 049-090-2


no

ip

time

Остальные таблицы создаются динамически по мере добавления новых голосований.

Scripting

Система голосования будет представлять собой совокупность четырех скриптов: Vote.php - этот скрипт реализует процесс голосования.

Xakep.php - используется для защиты скрипта от злоумышленников.

Vote_admin.php - скрипт инсталляции системы и интерфейс для администрации.

Vote_set.php - файл конфигурации голосования.

Other_vote.php - скрипт для вывода всех доступных на сайте голосований.

В рамках статьи я приведу и подробнейшим образом прокомментирую код основного скрипта - vote.php. Полную версию системы можно найти на CD или на моем сайте - nikitos.inc.ru.

В первых четырех строках vote.php я подключаю остальные используемые скрипты к vote.php - скрипт защиты и конфигурационный файл.

В пятой строчке я описываю функцию connect(). Она будет подключаться к mySQL-серверу и выбирать активную БД. Поясню: функция - это, грубо говоря, некоторый кусок кода, который выделяют в отдельный блок в случаях, когда он очень часто используется. Это здорово сокращает код и помогает избежать ненужных повторений. Впрочем, едва ли такое определение функции можно считать полным ;).

После объявления функции я разветвляю код оператором if на два случая: в первом пользователь уже отправил html-форму, во втором еще нет. Об этом я сужу по значению переменной $submit. Поскольку кнопка в html-форме называется "submit", то после отправки формы в этой переменной будет лежать value этого элемента - фактически, надпись на кнопке. Если же форма не отправлена, то переменная будет пуста.

Чуть ниже мы присваиваем переменной sql некоторую, возможно непонятную тебе строчку. Это и есть тот самый SQL-запрос к серверу БД. Как видишь, он написан на интуитивно понятном языке, и научиться клепать такие запросы - пара пустяков. Рассмотрим для примера "select * from vote order by 'time' desc limit 1". Первая часть запроса означает, что будет производиться выборка всех полей из таблицы vote - вместо * можно было указать несколько полей через запятую. Во второй части мы сообщаем серверу, что ему необходимо провести сортировку записей (.. order by 'time' ..) в порядке убывания (.. desc limit 1) поля 'time' и вернуть клиенту (в нашем случае - интерпретатору php) первую запись. Строго говоря, обсуждение языка не является темой этой статьи, однако ты найдешь множество документов по этому поводу, набив в любом поисковике "+язык +sql".

После отправки запроса серверу тот отвечает, возвращая поток данных. В php реализована функция mysql_fetch_array, помещающая построчно ответ сервера в ассоциативный массив, ключами которого являются имена соответствующих полей таблицы. Т.е., к примеру, в таблице были два поля - a и b. Если ты напишешь $arr=mysql_fetch_array($result), где $result - ответ сервера, то обратиться к содержимому полей a и b можно будет, соответственно, так: $arr[a] и $arr[b].

Итак, мы присвоили $gol=mysql_fetch_array($rez);. Теперь $gol - массив, элементами которого является содержимое полей таблицы vote. Следует заметить, что наш запрос заведомо возвращает только одну запись, поэтому достаточно просто указать $gol=mysql_fetch_array($rez);. Но если запрос возвращает несколько строк, и нам требуется обратиться к каждой из них, тогда придется организовывать цикл while($gol=mysql_fetch_array($rez)) { .. }, в рамках которого нам были бы доступны все записи в том порядке, в каком они возвращаются сервером. Любую их сортировку значительно выгоднее производить еще на стадии составления запроса, так как, во-первых, это проще, а во-вторых, sql-сервер работает с большими объемами данных значительно эффективнее, нежели веб-сервер. Да и в целях безопасности на сценарии php обычно накладываются серьезные ограничения (типа объема памяти, доступной сценарию, времени его выполнения, максимальному съедаемому процессорному времени и т.п.).

Назад на стр. 049-090-1  Содержание  Вперед на стр. 049-090-3