Дек 1, 2014 - PHP    9 комментариев

Как сделать форму для опроса на PHP

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

opros0 450x241 Как сделать форму для опроса на 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) )

 

opros1 450x84 Как сделать форму для опроса на PHP

 

После чего нажал ОК.

opros2 450x303 Как сделать форму для опроса на PHP

В результате в базе MySQL была создана табличка opros

opros31 130x350 Как сделать форму для опроса на PHP

С следующими полями:

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' )

и вставил его в окошке выполнения запроса в закладке SQLopros4 450x73 Как сделать форму для опроса на PHPПосле чего нажал ОК.

 opros5 450x285 Как сделать форму для опроса на PHP

В результате в табличку opros были вставлены начальные значения.

opros6 450x308 Как сделать форму для опроса на PHP

 

Табличка для хранения результатов опроса сделана и дело осталось за малым - написать сам опросник.

Часа четыре написания букв и цифр, и в результате получился вот такой код (в коде я проставил комментарии, что означает каждый блок):

<?

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 &nbsp;&nbsp;'.$itog1.'<P>';
 echo 'Borland Delphi &nbsp;&nbsp;'.$itog2.'<P>';
 echo 'PHP+HTML+CSS &nbsp;&nbsp;'.$itog3.'<P>';
 echo 'Java &nbsp;&nbsp;'.$itog4.'<P>';
 echo 'Android Studio/Eclipse &nbsp;&nbsp;'.$itog5.'<P>';
 echo 'Другое средство разработки &nbsp;&nbsp;'.$itog6.'<P></b>';

?>

 

Результатом выполнения этого кода стал опрос "Какую среду для программирования Вы используете чаще всего?"

opros71 281x350 Как сделать форму для опроса на PHP

Опрос пришлось оформить в виде отдельного php файла (https://ds-release.ru/opros.php), т.к. в постах WordPress код PHP не выполняется (можно извратиться и заставить выполняться, но это будет дыра в безопасности сайта, поэтому и не нужно).

Итак, Уважаемые Программисты, вопрос к знатокам:

 "Какую среду для программирования Вы используете чаще всего?"

 

  Метки:
  admin
  Просмотров: 50 491
  Запись опубликована в 22:22

9 комментариев

  • Не совсем понятны пункты PHP и Java. Да и сам опрос слишком узок, хотя охватывает довольно обширную тему.
    Я, например, пишу на PHP + HTML + CSS в Sublime Text 3, а на C# в VS(При этом в обоих одинаково часто).

    • Согласен, что не совсем корректный опрос, большинство программистов, как я понимаю, использует два и больше языков программирования. Поэтому и оговорился про "чаще всего", но в Вашем случае оговорка не сработала :wink:
      Пункт PHP я заменил на PHP + HTML + CSS

  • Поставь плагин для подсветки и форматирования кода)
    Post-переменные надо фильтровать, а то у тебя xss скорее всего выходит. Хорошо ещё, что в запрос их не включаешь.
    А если 100 вариантов в опросе, у тебя будет 100 почти одинаковых кусков кода?

    • И ещё мне не хватает плагина для подписки на новые комментарии к посту :oops:

    • Дмитрий, спасибо за замечание)
      Первый блин, как обычно, комом))

      фильтрацию сделал так

      $poisk0 = stripslashes($poisk0);
      $poisk0 = htmlspecialchars($poisk0);
      $poisk0 = nl2br($poisk0);

      $povtori = stripslashes($povtori);
      $povtori = htmlspecialchars($povtori);
      $povtori = nl2br($povtori);

      с учетом, что переменные в запрос не идут

      Если будет сто опций опроса, то да, не комильфо код размножать, надо будет в цикле, что-ли, делать...

      С плагинами подсветки и подписки на комменты надо будет заняться :oops:

  • Не совсем понял, как проверять проголосовал ли пользователь? В куки записывать или сессии?

    • Можно в сессии, можно в куки, как Ваша фантазия подскажет :)

  • Огогошеньки! Я надеялся, что код будет не таким большим. А проще это сделать никак нельзя? только плагины не предлагайте

    • Половина - это комментарии, сам код не очень объемный, тут по минимуму сделано.
      Конечно, можно и короче, сделайте формирование опций в цикле.

Есть что сказать? Тогда действуй!