Вопрос ответ php форма

Скрипт опросов на PHP и MySQLi

Ранее мы уже приводили код скрипта голосования на PHP. Теперь настало время рассмотреть более продвинутый код скрипта для голосования на PHP с использованием БД MySQLi.

Плюсом данного кода является то, что все необходимые данные хранятся в БД MySQLi в трех таблицах независимо от количества созданных опросов. В рассмотренном же ранее скрипте голосования, который не использует БД, для каждого опроса создавалось по два файла. Также представленный в данной теме скрипт сделан более наглядным и позволяет оставить голос и посмотреть результаты без перезагрузки страницы.

Пример работы предлагаемого нами скрипта голосования на PHP с использованием MySQLi БД и без перезагрузки страницы расположен ниже:

Какую CMS для сайта Вы предпочитаете?

Скрипт учитывает только один голос с одного IP адреса для каждого голосования в отдельности. Таким образом, если с указанного IP адреса голосуют первый раз, то под результатами голосования Вы увидите надпись «Ваш голос учтен!» и Ваш голос будет засчитан. При попытке повторного голосования с IP адреса, который уже принимал участие в опросе, под результатами голосования появится надпись «Вы уже голосовали!» и голос не будет засчитан.

Теперь давайте перейдем непосредственно к созданию подобного скрипта голосования на Вашем сайте. Для начала Вам понадобится создать три таблицы в MySQLi для хранения всех необходимых данных по опросам, как на скриншотах ниже:

Скриншот таблицы polls

Таблица: polls.

Скриншот таблицы poll_ip

Таблица: poll_ip.

Скриншот таблицы poll_answer

Таблица: poll_answer.

Для создания указанных таблиц, Вы можете воспользоваться следующим кодом:

CREATE TABLE IF NOT EXISTS ` polls ` (
` id ` int ( 10 ) unsigned NOT NULL auto_increment , ` title ` varchar ( 255 ) NOT NULL ,
PRIMARY KEY (` id `)
) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1 ;

CREATE TABLE IF NOT EXISTS ` poll_answer ` (
` id ` int ( 10 ) unsigned NOT NULL auto_increment , ` poll_id ` int ( 10 ) unsigned NOT NULL ,
` title ` varchar ( 255 ) NOT NULL , ` votes ` int ( 10 ) unsigned NOT NULL default ‘0’ ,
PRIMARY KEY (` id `)
) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1 ;

CREATE TABLE IF NOT EXISTS ` poll_ip ` (
` id ` int ( 10 ) unsigned NOT NULL auto_increment , ` poll_id ` int ( 10 ) unsigned NOT NULL ,
` ip ` int ( 10 ) unsigned NOT NULL , ` date ` int ( 10 ) unsigned NOT NULL ,
PRIMARY KEY (` id `)
) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1 ;

Далее Вам понадобится создать файл, например, polls.php, который будет отвечать за отображение Ваших опросов.

В данный файл (polls.php), либо на уже имеющеюся у Вас страничку поместите следующий код:

$db = mysqli_connect ( «localhost» , «Логин» , «Пароль» , «Имя_БД» );
$res = mysqli_query ( $db , «set names utf8» );

$res = mysqli_fetch_array ( mysqli_query ( $db , «SELECT max(id) FROM polls LIMIT 1» ));
$poll_id = $res [ 0 ];

if (isset( $_GET [ «poll_id» ]) and is_numeric ( $_GET [ «poll_id» ]) and $_GET [ «poll_id» ]> 0 ) $res = mysqli_fetch_array ( mysqli_query ( $db , «SELECT id FROM polls
WHERE > . $_GET [ «poll_id» ]. «‘ LIMIT 1» ));
if ( $res [ 0 ]!= » ) $poll_id = $res [ 0 ];
>
$poll = mysqli_fetch_array ( mysqli_query ( $db , «SELECT id,title FROM polls
WHERE > . $poll_id . «‘» ));
?>

Читайте также:  How we create menu in html

echo ‘

‘ . $poll [ «title» ]. ‘?‘ ;
echo ‘
. $poll_id . ‘»>’ ;
$res = mysqli_query ( $db , «SELECT id,title FROM poll_answer
WHERE poll_id='» . $poll_id . «‘ ORDER BY id» );
while ( $answer = mysqli_fetch_array ( $res )) echo ‘
‘ ;
echo ‘
value=»Посмотреть результат»>’ ;
echo » ;
echo ‘

‘ ;
?>

< script type = "text/javascript" >
$( document ). ready (function() $( «.poll input:first» ). prop ( «checked» , true );

$( «#vote» ). click (function() jQuery . post ( «polls_result.php» , < poll_id :$( this ). parents ( ".poll" ). attr ( "id" ).
split ( ‘_’ )[ 1 ], answer_id :$( ‘input:checked’ ). val ()>, rating_poll );>);

$( «#view_res» ). click (function() jQuery . post ( «polls_result.php» , < poll_id :$( this ). parents ( ".poll" ). attr ( "id" ).
split ( ‘_’ )[ 1 ]>, rating_poll );>);

Обращаем Ваше внимание на то, что если у Вас на сайте не подключена библиотека jQuery, или Вы делаете отдельную страничку для опросов, то в файле polls.php Вам необходимо подключить ее следующим образом:

Для того чтобы не создавать для каждого опроса свою страничку, как Вы могли заметить, мы добавили переменную $_GET[«poll_id»]. Таким образом, при обращении к файлу polls.php следующим образом: polls.php?poll_id=3, будет отображен опрос с >

Как говорилось ранее, скрипт голосования работает без перезагрузки странички, следовательно, нам понадобится создать еще один файл, например, polls_result.php. Данный файл будет вносить изменения в БД и выводить результаты голосования по нужному опросу.

Обращаем Ваше внимание на то, что наименование файла polls_result.php используется в предыдущем файле (polls.php), так что если Вы захотите переименовать файл polls_result.php, то следует внести изменения и в файл polls.php.

В файл polls_result.php, поместите следующий код:

if (isset( $_POST [ «poll_id» ]) and is_numeric ( $_POST [ «poll_id» ])) $poll_id = $_POST [ «poll_id» ];
>
else $poll_id = » ;
if (isset( $_POST [ «answer_id» ]) and is_numeric ( $_POST [ «answer_id» ])) $answer_id = $_POST [ «answer_id» ];
>
else $answer_id = » ;

if ( $poll_id > 0 ) $db = mysqli_connect ( «localhost» , «Логин» , «Пароль» , «Имя_БД» );
$res = mysqli_query ( $db , «set names utf8» );

if ( $answer_id != » ) $ip = $_SERVER [ ‘REMOTE_ADDR’ ];
$res = mysqli_query ( $db , «SELECT count(id) FROM poll_ip
WHERE poll_id='» . $poll_id . «‘ and ip=INET_ATON(‘» . $ip . «‘) LIMIT 1» );
$number = mysqli_fetch_array ( $res );
if ( $number [ 0 ]== 0 ) $res = mysqli_query ( $db , «INSERT INTO poll_ip (poll_id,ip,date)
values (‘» . $poll_id . «‘,INET_ATON(‘» . $ip . «‘),'» . time (). «‘)» );
$res = mysqli_query ( $db , «UPDATE poll_answer SET votes=(votes+1)
WHERE > . $answer_id . «‘ LIMIT 1» );
$answer = ‘Ваш голос учтен!’ ;
>
else $answer = ‘Вы уже голосовали!’ ;
>

$summa = mysqli_fetch_array ( mysqli_query ( $db , «SELECT max(votes) AS max_v, sum(votes)
AS sum_v FROM poll_answer WHERE poll_id='» . $poll_id . «‘ LIMIT 1» ));
if ( $summa [ «max_v» ]== 0 ) $summa [ «max_v» ]= 1 ;
$res = mysqli_query ( $db , «SELECT title,votes FROM poll_answer
WHERE poll_id='» . $poll_id . «‘ ORDER BY votes DESC» );

Читайте также:  Javascript inline onclick this

После того, как Вы создали БД, файл опросов (polls.php) и файл, вносящий изменения в БД (polls_result.php), можно считать, что все готово, но осталось лишь самое простое — сделать админку по добавлению, изменению и удалению опросов. Для этого лучше создать отдельный файл, закрытый от других пользователей паролем (например, admin_polls.php), в который добавьте следующий код:

if ( session_id ()== » ) session_start ();
$db = mysqli_connect ( «localhost» , «Логин» , «Пароль» , «Имя_БД» );
$res = mysqli_query ( $db , «set names utf8» );

if (isset( $_POST [ «add_poll» ])) $res = mysqli_query ( $db , «INSERT INTO polls (title)
values (‘» . $_POST [ «new_poll» ]. «‘)» );
if (isset( $_POST [ «add_answer» ])) $res = mysqli_query ( $db , «INSERT INTO poll_answer
(poll_id,title) values (‘» . $_SESSION [ «this_id» ]. «‘,'» . $_POST [ «new_answer» ]. «‘)» );
if (isset( $_POST [ «del_answer» ])) $res = mysqli_query ( $db , «DELETE FROM poll_answer
WHERE > . $_POST [ «del_answer_id» ]. «‘ LIMIT 1» );
if (isset( $_POST [ «del_poll» ])) $res = mysqli_query ( $db , «DELETE FROM polls WHERE > . $_SESSION [ «this_id» ]. «‘» );
$res = mysqli_query ( $db , «DELETE FROM poll_answer WHERE
poll_id='» . $_SESSION [ «this_id» ]. «‘» );
>
if (isset( $_POST [ «end_poll» ]) or isset( $_POST [ «del_poll» ])) $_SESSION [ «this_id» ]= » ;
if (isset( $_POST [ «edit_answer» ])) $res = mysqli_query ( $db , «UPDATE poll_answer
SET title='» . $_POST [ «text_answer» ]. «‘ WHERE > . $_POST [ «id_answer» ]. «‘» );
if (isset( $_POST [ «edit_question» ])) $res = mysqli_query ( $db , «UPDATE polls SET
title='» . $_POST [ «text_question» ]. «‘ WHERE > . $_SESSION [ «this_id» ]. «‘» );

if (isset( $_POST [ «edit_poll» ])) $res = mysqli_fetch_array ( mysqli_query ( $db , «SELECT id FROM polls WHERE
> . $_POST [ «poll_id» ]. «‘» ));
if ( $res [ «id» ]!= 0 ) $_SESSION [ «this_id» ]= $_POST [ «poll_id» ];
>

if (isset( $_POST [ «add_poll» ]) or isset( $_POST [ «add_answer» ]) or
isset( $_POST [ «edit_poll» ]) or isset( $_POST [ «edit_question» ]) or
isset( $_POST [ «edit_answer» ]) or isset( $_POST [ «del_answer» ]) or
isset( $_POST [ «del_poll» ])) < header ( "Location: admin_polls.php" );exit;>
?>

if ( $_SESSION [ «this_id» ]!= » ) $res = mysqli_fetch_array ( mysqli_query ( $db , «SELECT id,title FROM polls WHERE
> . $_SESSION [ «this_id» ]. «‘» ));
echo ‘‘ . $res [ «title» ]. ‘ (id=’ . $res [ «id» ]. ‘)
‘ ;
$res = mysqli_query ( $db , «SELECT id,title FROM poll_answer WHERE
poll_id='» . $_SESSION [ «this_id» ]. «‘ ORDER BY id» );
while ( $answer = mysqli_fetch_array ( $res ))
echo ‘- ‘ . $answer [ «title» ]. ‘ (id=’ . $answer [ «id» ]. ‘)
‘ ;
?>

Пусть размер приведенного кода в данной теме Вас не пугает, т.к. это все-таки код для трех разных файлов, выполняющих разные функции. Если же Вы все сделали так, как написано в данной теме, то у Вас должна получиться страничка для проведения опросов на PHP и MySQLi, как в примере, продемонстрированном на данной страничке.

Источник

Простейший сервис Вопрос/Ответ, используя Formspring

В данной статье я покажу, как можно использовать сервис анонимных вопросов Formspring для организации раздела «Вопрос/Ответ» на стороннем ресурсе на PHP.

Читайте также:  Верхний уровень модуля python

Formpring API в природе существует (REST-like), но сейчас находится на стадии «беты», и полноценно им пользоваться могут, насколько я понял, лишь избранные. На странице для разработчиков пишут: «The API is currently limited to a select group of users and partners right now». Нужна регистрация, которая не тут же выплёвывает необходимые для работы ключи. Я уже посылал свою заявку какое-то время назад, но ответа так и не получил. Однако, некоторыми методами API можно пользоваться, не проходя аутентификации (банальное получение информации).

Вывод списка ответов

Для нашего сервиса ограничимся стандартной выдачей в 20 записей. Тут сложностей нет, поэтому воспользуемся функцией file_get_contents(). Запрос делаем по URL:

beta-api.formspring.me/answered/listВАШ_ЛОГИН

Такой запрос вернёт нам список ответов в формате JSON.
В итоге получим примерно такой код:

$data = json_decode(file_get_contents('http://beta-api.formspring.me/answered/list/ВАШ_ЛОГИН')); foreach ($data->response as $item) < echo ' '.$item->question.' ('.date('d.m', strtotime($item->time)).' #) 
'.$item->answer.'
'; >

Примечание: ещё запись содержит поле asked_by, которое будет не пустым, если вопрос задали не анонимно.

Отправка анонимного вопроса

Тут и начинается главное шаманство. Первым делом получим token, который позволит успешно осуществить задуманное. Для этого лучше всего выйти из учётной записи (разлогиниться), т.е. стать анонимом и зайти на вашу страничку:

www.formspring.meВАШ_ЛОГИН

Смотрим исходный код страницы (обычно используются клавиши Ctrl+U). Ищем там или «token», или «id=”ask”», внутри которого ищем скрытое поле token.
Теперь нужно узнать User-Agent вашего браузера. По моим наблюдениям, token генерируется с использованием значения User-Agent, поэтому нужно узнать это значения для браузера, в котором искали token. Сделать это можно разными способами. Например, для Firefox или Google Chrome можно открыть консоль JavaScript и ввести:

Например, для моего браузера это строка:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0

Теперь переходим непосредственно к кодированию. Создайте форму с полем для ввода текста вопроса. Обработчик отправки формы должен быть примерно следующим:

$ch = curl_init('http://www.formspring.me/profile/ask/ВАШ_ЛОГИН'); $data = array( 'token' => ПОЛУЧЕННЫЙ_ТОКЕН, 'question' => ТЕКСТ_ИЗ_ФОРМЫ, 'ajax' => 1 ); curl_setopt($ch, CURLOPT_URL, 'http://www.formspring.me/profile/ask/ВАШ_ЛОГИН'); curl_setopt($ch, CURLOPT_REFERER, 'http://www.formspring.me/ВАШ_ЛОГИН'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_USERAGENT, ПОЛУЧЕННЫЙ_USER-AGENT); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if (curl_exec($ch) !== FALSE) < echo 'Вопрос был успешно отправлен!'; >else < echo curl_error($ch); >curl_close($ch); 

Используем библиотеку cURL для имитации работы браузера и отправки формы на сервер Formspring.

Если всё было сделано правильно, ответить на вопрос можно будет со страницы профиля на Formspring (как и другое управление вопросами/ответами). Я не описывал всего подробно, не рассматривал обработку ошибок, сконцентрировавшись лишь на донесении основной идеи.

Пример работы скрипта также прилагается.

UPDATE:
По многочисленным просьбам залил исходники и примеры использования на github. Оформил всё в виде отдельного класса. Вероятно, в коде много Индии, поэтому об ошибках, неточностях и пожаланиях сообщайте!

UPDATE 2:
Также люди просили исходники самой страницы. Получите.

Источник

Оцените статью