Как сделать форму для опроса на PHP
Захотелось мне провести опрос среди читателей блога, какое средство разработки используется наиболее часто (данный вопрос естественно адресуется к читателям, уже имеющим представление о программировании).
Самый простой путь - это найти плагин для WordPress, который реализует такой функционал.
Таких плагинов немало, например есть русифицированный Wp polls, который создает красивый опросник.
Но это не интересно, ведь "нормальные герои всегда идут в обход", и поэтому я задался целью сделать такой опросник самостоятельно.
Для создания опросника я решил использовать PHP.
Сразу уточню, что раньше я на PHP ничего не писал.
Поэтому первые пару часов я лазил по интернету и читал про PHP.
PHP замечательный язык, и что мне особенно в нем понравилось, что писать на нем можно в обычном блокноте, никакого средства разработки не требуется.
Для начала в базе mysql надо сделать табличку для хранения результатов опроса.
В опроснике планировалось сделать выбор из 6 пунктов, поэтому в табличке должно быть 6 полей, плюс поле для хранения ключа.
Для создания таблички я открыл PhpMyAdmin и в закладке SQL в окошке выполнения запроса вставил следующий код
CREATE TABLE opros (nn int(20), vsnet int(20), delphi int(20), php int(20), java int(20), android int(20), other int(20) )
После чего нажал ОК.
В результате в базе MySQL была создана табличка opros
С следующими полями:
nn - для хранения ключа (цифры 1)
vsnet - для хранения количества использующих MS Visual Studio NET
delphi - для хранения количества использующих Borland Delphi
php - для хранения количества использующих PHP
java - для хранения количества использующих Java
android - для хранения количества использующих Android Studio/Eclipse
other - для хранения количества использующих другие средства разработки
Затем я сделал следующий запрос для вставки строки в эту таблицу и простановки первоначальных значений (нули)
INSERT INTO opros VALUES('1','0','0','0','0','0','0' )
и вставил его в окошке выполнения запроса в закладке SQLПосле чего нажал ОК.
В результате в табличку opros были вставлены начальные значения.
Табличка для хранения результатов опроса сделана и дело осталось за малым - написать сам опросник.
Часа четыре написания букв и цифр, и в результате получился вот такой код (в коде я проставил комментарии, что означает каждый блок):
<? echo '<br><br><center><b><h2>ОПРОС</h2></b></center>'; /* Сначала задаем переменные для соединения с базой данных, значения различные для разных хостингов, дает хостер */ /* имя сервера базы данных */ $hostname = "XXXX"; /* имя пользователя для соединения с базой данных */ $username = "XXXX"; /* пароль для соединения с базой данных */ $password = "XXXX"; /* имя базы данных */ $dbName = "XXXX"; /* itog1 - itog6 переменные, для вывода результатов опроса, в дальнейшем их значения будут браться из таблички opros */ $itog1="0"; $itog2="0"; $itog3="0"; $itog4="0"; $itog5="0"; $itog6="0"; /* переменная poisko получает методом POST значение, которое ранее выбрал опрашиваемый */ $poisk0 = $_POST['poisk']; /* переменная povtori используется для отслеживания повторных нажатий */ $povtori = $_POST['povtori']; /*фильтруем передаваемые переменные в соответствии с комментарием Дмитрия*/ $poisk0 = stripslashes($poisk0); $poisk0 = htmlspecialchars($poisk0); $poisk0 = nl2br($poisk0); $povtori = stripslashes($povtori); $povtori = htmlspecialchars($povtori); $povtori = nl2br($povtori); /* если опросник только загружен, то присваиваем переменной poisko значение 0, для того, чтобы выбор в опроснике не стоял ни на одной позиции */ if ($poisk0<1) { $poisk0="0"; } /* каждая новое нажатие на кнопку "Отправить результат" увеличивает переменную povtori на 1, как только становится больше 2, ставим переменную povtor=1 */ if ($povtori<1) { $povtori=1; } else { $povtori=$povtori+1; } if ($povtori>2) { $povtor="1"; } /* изврат, конечно, зато работает. Вариант с $_SESSION сразу не заработал, а тратить на это много времени жалко было */ /* в переменную userstable прописываем название таблички с результатами opros, в дальнейшем эта переменная будет использоваться в запросах */ $userstable = "opros"; /* создается соединение с базой данных */ mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); /* выбрать базу данных. Если произойдет ошибка - вывести ее */ mysql_select_db($dbName) or die(mysql_error()); /* получаем текущие значения из таблички opros*/ $query = "SELECT * FROM $userstable WHERE nn = '1' "; $res = mysql_query($query) or die(mysql_error()); /* если количество строк больше 0 (у нас 1 строка), то присваиваются значения результатов опроса */ $number1 = mysql_num_rows($res); if ($number1 == 0) { echo 'Результат не найден!<BR><BR>'; } else { while ($row=mysql_fetch_array($res)) { $itog1=$row['vsnet']; $itog2=$row['delphi']; $itog3=$row['php']; $itog4=$row['java']; $itog5=$row['android']; $itog6=$row['other']; } } /* далее делается непосредственно форма отправки, данные передаются методом POST */ echo '<FORM ACTION="opros.php" METHOD="POST" enctype="multipart/form-data" >'; echo '<br><b>Какую среду для программирования Вы используете чаще всего?</b><br>'; /* размещаем Переключатель (radiobutton) с шестью опциями выбора */ echo '<br><input type="radio" name="poisk" '; if ($poisk0=="1") { /* если переменная povtor не равна 1, то увеличиваем значение itog1 на 1 (это общее количество выбравших средство разработки, соответствующее данной опции переключателя), аналогично в других */ /* аналогично при выборе других опций увеличиваются на 1 другие переменные - itog2, itog3, itog4, itog5, itog6 */ if ($povtor=="1") { } else { $itog1=$itog1+1; } echo ' checked '; } echo 'value="1"> Microsoft Visual Studio NET '; echo '<br><input type="radio" name="poisk" '; if ($poisk0=="2") { if ($povtor=="1") { } else { $itog2=$itog2+1; } echo ' checked '; } echo 'value="2"> Borland Delphi '; echo '<br><input type="radio" name="poisk" '; if ($poisk0=="3") { if ($povtor=="1") { } else { $itog3=$itog3+1; } echo ' checked '; } echo 'value="3"> PHP + HTML + CSS '; echo '<br><input type="radio" name="poisk" '; if ($poisk0=="4") { if ($povtor=="1") { } else { $itog4=$itog4+1; } echo ' checked '; } echo 'value="4"> Java '; echo '<br><input type="radio" name="poisk" '; if ($poisk0=="5") { if ($povtor=="1") { } else { $itog5=$itog5+1; } echo ' checked '; } echo 'value="5"> Android Studio/Eclipse '; echo '<br><input type="radio" name="poisk" '; if ($poisk0=="6") { if ($povtor=="1") { } else { $itog6=$itog6+1; } echo ' checked '; } echo 'value="6"> Другое средство разработки '; /* это закончился переключатель. ниже добавлено скрытое поле, которое я сюда всунул для определения повторных нажатий */ echo '<INPUT TYPE="hidden" NAME="povtori" VALUE="'.$povtori.'" SIZE="1" MAXLENGTH="1">'; echo '<br><br><P><INPUT TYPE="submit" VALUE="Отправить результат"></FORM>'; /* закончилась форма отправки выбранной опции переключателя*/ /* далее, при условии, что не повторное нажатие (povtor не равен 1), записываем новый итоговый результат (itog1-6) в табличку opros */ if ($povtor=="1") { echo "Вы уже высказали свое мнение."; } else { /* составление запроса для изменения информации в таблице opros */ $query = "UPDATE $userstable SET vsnet='".$itog1."', delphi='".$itog2."', php='".$itog3."', java='".$itog4."', android='".$itog5."', other='".$itog6."' WHERE nn='1'"; /* выполнение запроса. Если произойдет ошибка - вывести ее. */ mysql_query($query) or die(mysql_error()); /* если это не первая загрузка формы, т.е. был сделан выбор, выводится уведомление */ if ($poisk0>0) { echo "Ваше мнение учтено."; } } /* закрытие соединения с базой MySQL */ mysql_close(); /* и в конце выводим итоговый результат опроса с учетом выбора отвечающего */ echo '<br><br><br><br><b><center>Результаты опроса</center><P>'; echo '<br>Microsoft Visual Studio NET '.$itog1.'<P>'; echo 'Borland Delphi '.$itog2.'<P>'; echo 'PHP+HTML+CSS '.$itog3.'<P>'; echo 'Java '.$itog4.'<P>'; echo 'Android Studio/Eclipse '.$itog5.'<P>'; echo 'Другое средство разработки '.$itog6.'<P></b>'; ?>
Результатом выполнения этого кода стал опрос "Какую среду для программирования Вы используете чаще всего?"
Опрос пришлось оформить в виде отдельного php файла (https://ds-release.ru/opros.php), т.к. в постах WordPress код PHP не выполняется (можно извратиться и заставить выполняться, но это будет дыра в безопасности сайта, поэтому и не нужно).
Итак, Уважаемые Программисты, вопрос к знатокам:
"Какую среду для программирования Вы используете чаще всего?"
Не совсем понятны пункты PHP и Java. Да и сам опрос слишком узок, хотя охватывает довольно обширную тему.
Я, например, пишу на PHP + HTML + CSS в Sublime Text 3, а на C# в VS(При этом в обоих одинаково часто).
Согласен, что не совсем корректный опрос, большинство программистов, как я понимаю, использует два и больше языков программирования. Поэтому и оговорился про "чаще всего", но в Вашем случае оговорка не сработала
Пункт PHP я заменил на PHP + HTML + CSS
Поставь плагин для подсветки и форматирования кода)
Post-переменные надо фильтровать, а то у тебя xss скорее всего выходит. Хорошо ещё, что в запрос их не включаешь.
А если 100 вариантов в опросе, у тебя будет 100 почти одинаковых кусков кода?
И ещё мне не хватает плагина для подписки на новые комментарии к посту
Дмитрий, спасибо за замечание)
Первый блин, как обычно, комом))
фильтрацию сделал так
$poisk0 = stripslashes($poisk0);
$poisk0 = htmlspecialchars($poisk0);
$poisk0 = nl2br($poisk0);
$povtori = stripslashes($povtori);
$povtori = htmlspecialchars($povtori);
$povtori = nl2br($povtori);
с учетом, что переменные в запрос не идут
Если будет сто опций опроса, то да, не комильфо код размножать, надо будет в цикле, что-ли, делать...
С плагинами подсветки и подписки на комменты надо будет заняться
Не совсем понял, как проверять проголосовал ли пользователь? В куки записывать или сессии?
Можно в сессии, можно в куки, как Ваша фантазия подскажет
Огогошеньки! Я надеялся, что код будет не таким большим. А проще это сделать никак нельзя? только плагины не предлагайте
Половина - это комментарии, сам код не очень объемный, тут по минимуму сделано.
Конечно, можно и короче, сделайте формирование опций в цикле.