PHP
9 комментариев Как сделать форму для опроса на 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 не выполняется (можно извратиться и заставить выполняться, но это будет дыра в безопасности сайта, поэтому и не нужно).
Итак, Уважаемые Программисты, вопрос к знатокам:
"Какую среду для программирования Вы используете чаще всего?"












Метки:
admin
Просмотров: 54 535
Запись опубликована в 22:22
Не совсем понятны пункты 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);
с учетом, что переменные в запрос не идут
Если будет сто опций опроса, то да, не комильфо код размножать, надо будет в цикле, что-ли, делать...
С плагинами подсветки и подписки на комменты надо будет заняться
Не совсем понял, как проверять проголосовал ли пользователь? В куки записывать или сессии?
Можно в сессии, можно в куки, как Ваша фантазия подскажет
Огогошеньки! Я надеялся, что код будет не таким большим. А проще это сделать никак нельзя? только плагины не предлагайте
Половина - это комментарии, сам код не очень объемный, тут по минимуму сделано.
Конечно, можно и короче, сделайте формирование опций в цикле.