Есть вопрос?
Зайди на форум

Поиск на сайте: Advanced

Denix - новый дистрибутив Linux. Русификация Ubuntu и установка кодеков

dkws.org.ua
Форум сайта dkws.org.ua
 
Главная    ТемыТемы    АльбомАльбом    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Голосование на сайте
На страницу 1, 2  След.
 
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP
 
Автор Сообщение
Павел

Участник тусовки


Зарегистрирован: 17.02.2006
Сообщения: 110
Откуда: Санкт-Петербург

СообщениеДобавлено: Сб Апр 29, 2006 7:53 am    Заголовок сообщения: Голосование на сайте
Ответить с цитатой

Решил немного модифицировать скрипт голосования из Самоучителя PHP 5, т.е. выводить результаты в процентном формате и строить шкалы.
Вот часть кода:
Код:
echo "<b>Результаты голосования:</b>";
 $im = ImageCreate(100,20);
 $color = imagecolorallocate($im,0,0,255);
 echo "<br>Новый - <b>";
 printf("%.1f%s\n",$data[1]/$n*100,"%");
 echo "</b>";
 ImageFilledRectangle($im,0,0,$data[1]/$n*100,20,$color);
 ImagePng($im);
 echo "<br>Старый - <b>";
 printf("%.1f%s\n",$data[2]/$n*100,"%");
 echo "</b>";
 ImageFilledRectangle($im,0,0,$data[2]/$n*100,20,$color);
 ImagePng($im);
 echo "<br>Никакой - <b>";
 printf("%.1f%s\n",$data[3]/$n*100,"%");
 echo "</b>";
 ImageFilledRectangle($im,0,0,$data[3]/$n*100,20,$color);
 ImagePng($im);
 echo "<br>Мне все равно - <b>";
 printf("%.1f%s\n",$data[4]/$n*100,"%");
 echo "</b>";
 ImageFilledRectangle($im,0,0,$data[4]/$n*100,20,$color);
 ImagePng($im);
 echo "<br><br>Всего голосов: <font color=red>".$n."</font>";

Проблема в том, что вместо шкалы выводится такой набор символов
"‰PNG  IHDRdA ЦPLTEяЉxТW IDATxњc`ШЙ^ЬУIEND®B`‚"
Скажите, пожалуйста, в чем ошибка? Arrow
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Сб Апр 29, 2006 1:29 pm    Заголовок сообщения:
Ответить с цитатой

Потому что перед выводом картинки нужно выводить формат рисунка - это указание браузеру, что сейчас будет выводиться картинка, а не текст. По умолчанию считается что выводится текст.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Павел

Участник тусовки


Зарегистрирован: 17.02.2006
Сообщения: 110
Откуда: Санкт-Петербург

СообщениеДобавлено: Вс Апр 30, 2006 8:43 am    Заголовок сообщения:
Ответить с цитатой

Добавил Header("Content-type: image/png");
но браузер выводит ошибку
Warning: Cannot modify header information - headers already sent by (output started at c:\www\html\vote\vote.php:77) in c:\www\html\vote\vote.php on line 85
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Вс Апр 30, 2006 8:46 am    Заголовок сообщения:
Ответить с цитатой

В самоучителе четко сказано - вывод заголовка браузера должен осуществляться до первого вывода. А ты сначала эхом выводишь "Результаты голосования" К тому же ты не можешь выводить одновременно и текст и картинку - определись что ты выводишь. Конечно лучше сразу выводить картинку, а строку "Результаты голосования" можно вывести в саму картинку с помощью соотв. функции
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Павел

Участник тусовки


Зарегистрирован: 17.02.2006
Сообщения: 110
Откуда: Санкт-Петербург

СообщениеДобавлено: Вс Апр 30, 2006 8:59 am    Заголовок сообщения:
Ответить с цитатой

А может лучше вообще не париться, а выводить картинки тегом <img>?
Да, еще вопрос - где-то вычитал функцию printf, использую ее так
printf("%.1f%s\n",$data[1]/$n*100,"%");
Но в итоге она так округляет, что в сумме 100% никак не получаются.
Не подскажите решение?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Вс Апр 30, 2006 10:49 am    Заголовок сообщения:
Ответить с цитатой

Все равно в теге <img> ты пишешь:

<img src=im1.php>

а в сценарии im1.php нужно вывести формат и сделать это нужно до первого вывода из сценария, поскольку потом не сможешь установить заголовки

с sprintf так не разбирался, поэтому ничего подсказать не могу, нужно пробовать какие-то другие функции или округлять самостоятельно, но тогда вырастет код сценария
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Павел

Участник тусовки


Зарегистрирован: 17.02.2006
Сообщения: 110
Откуда: Санкт-Петербург

СообщениеДобавлено: Пн Май 01, 2006 11:34 am    Заголовок сообщения:
Ответить с цитатой

Да нет. Просто нарисовать картинку - прямоугольник, а потом растягивать ее <img src="image.jpg" width=$x height=20>
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Вс Сен 14, 2008 11:25 am    Заголовок сообщения:
Ответить с цитатой

А у меня вообще не работает голосование. Сделала всё как в учебнике. Но не засчитывает голоса. Всё время показывает ноль.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Вс Сен 14, 2008 12:54 pm    Заголовок сообщения:
Ответить с цитатой

Скорее всего проблема с правами доступа к файлу
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Вс Сен 14, 2008 1:45 pm    Заголовок сообщения:
Ответить с цитатой

Я их не меняла. Кстати, я не поняла как менять права доступа. Допустим, в Far. Выбираю file attributes, а что делать дальше я незнаю. Что надо выбирать(Read only, archive, hidden, system, compressed), чтобы установить права доступа 777, 666 или 755.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Вс Сен 14, 2008 2:12 pm    Заголовок сообщения:
Ответить с цитатой

погоди, так ты в винде запускаешь сценарий???
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Вс Сен 14, 2008 2:53 pm    Заголовок сообщения:
Ответить с цитатой

localhost/
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Вс Сен 14, 2008 3:09 pm    Заголовок сообщения:
Ответить с цитатой

Онлайн-опросы не очень полезны для привлечения новых пользователей, зато они позволяют выяснить, какой бы контент хотели видеть (или, наоборот, не хотели видеть) на страницах сайта уже существующие пользователи. Лучшая часть голосований – это простота реализации.
Чтобы предотвратить множественное голосование, когда один и тот же человек голосует несколько раз, мы будем использовать Cookies. Да, этот способ довольно просто обойти, но для большинства целей этого достаточно. Если вы нуждаетесь в кое-чем лучше, используете систему входа в систему для регистрации избирателя.
Наша система голосований будет состоять из следующих сценариев:

vote_form.php – отображает голосование пользователю
vote_process.php – обрабатывает голосование
vote_tally.php – отображает результаты голосования
vote_config.php – соединяется с базой данных

У нас будет три таблицы. Вот таблица, содержащая вопросы:

CREATE TABLE `poll` (
`ID` INT NOT NULL AUTO_INCREMENT ,
`question` MEDIUMTEXT NOT NULL ,
PRIMARY KEY ( `ID` )
) TYPE = MYISAM ;

Таблица ответов содержит ответы на вопросы из таблицы голосования. Поле answer_ID создано для объединения с полем ID таблицы poll:

CREATE TABLE `answer` (
`answer_ID` INT NOT NULL AUTO_INCREMENT ,
`ID` INT NOT NULL ,
`answer` MEDIUMTEXT NOT NULL ,
PRIMARY KEY ( `answer_ID` )
) TYPE = MYISAM ;

Таблица vote содержит голосования, то есть ответы пользователей. Поля ID и answer_ID – зеркало аналогичных полей из таблиц poll и answer.

CREATE TABLE `vote` (
`ID` INT NOT NULL ,
`answer_ID` INT NOT NULL ,
INDEX ( `ID` )
) TYPE = MYISAM ;

Создадим один вопрос и три варианта ответа:

INSERT INTO poll (question) VALUES ("Would you like a cheeseburger?");
INSERT INTO answer (ID, answer) VALUES (1, "Yes.");
INSERT INTO answer (ID, answer) VALUES (1, "No.");
INSERT INTO answer (ID, answer) VALUES (1, "Maybe.");

Все сценарии подключаются к базе данных, поэтому имеет смысл вынести детали соединения в отдельный файл vote_config.php:

<?php
$db = @mysql_connect("localhost", "sql_login", "sql_password") or
die("Couldn't connect.");
@mysql_select_db("wcphp", $db) or die("Couldn't select database.");
?>

Теперь давайте рассмотрим остальные компоненты сценария.

Создание формы голосования

Сценарий vote_form.php – очень простой. Данному сценарию нужно передать параметр poll, содержащий ID голосования, после чего наш сценарий отобразит голосование с указанным ID. На рис. 12.1 изображено наше голосование.

Рис. 12.1. Форма голосования

Первым делом мы загрузим конфигурацию базы данных и получим параметр poll:

<?php
/* Display a vote form. */
require_once("vote_config.php");
$poll = $_GET['poll'];
if (!is_numeric($poll)) {
die("Invalid poll");
}

Мы можем проверить, что ID голосования правильный и отобразим варианты ответа. Идея заключается в следующем: если нет такого голосования, то результат будет пустой.

/* Look up the poll in the database. */
$sql = "SELECT P.question, A.answer, A.answer_ID
FROM poll P, answer A
WHERE P.ID = $poll
AND A.ID = P.ID";
$result = mysql_query($sql, $db) or die ("mysql error: " . mysql_error());
if (mysql_num_rows($result) == 0) {
die('Invalid poll.');
}

Если ID голосования правильный, нам нужно убедиться, что пользователь еще не голосовал. Как было отмечено ранее, мы будем использовать Cookies. Будем считать, что если Cookie-переменная poll_voted_id (где id – это ID голосования) существует, пользователь голосовал, и мы должны его отправить на результаты голосования:

/* If the user has already voted, show the results. */
if ($_COOKIE["poll_voted_$poll"]) {
header("Location: vote_tally.php?poll=$poll");
exit;
}

Настало время пробежаться по вариантам ответа и построить HTML-форму. Цикл помещает серию радио-кнопок в переменную $question_list:

/* Vote form */
$question_list = "";
while($row = mysql_fetch_array($result)) {
$question = $row['question'];
$question_list .= '<li><input name="answer" type="radio" value="' .
$row['answer_ID'] . '"> ' . $row['answer'] .
'</li>';
}

Теперь нам осталось лишь вывести HTML, мы можем сделать это в текстовом режиме:

?>
<html>
<head></head>
<body>
<span style="font-size: 12px;">
<span style="font-weight: bold; font-size: 14px;">
Poll #<?php print $poll; ?>
</span><br />
<span style="font-weight: bold"><?php print $question; ?></span>
<form action="vote_process.php" method="post">
<ul style="list-style-type: none;">
<?php print $question_list; ?>
</ul>
<input name="poll" type="hidden" value="<?php print $poll; ?>">
<input name="" type="submit" value="Vote!">
</form>
</span>
</body></html>

Заметьте, что форма использует сценарий vote_process.php. Это наш следующий сценарий.

Обработка голосования

Роль vote_process.php – добавить результат голосования в базу данных, если ответ пользователя правильный. Сначала загрузим конфигурацию базы данных и убедимся, что параметры poll и answer – числа:

<?php
require_once("vote_config.php");
$poll = $_POST['poll'];
$answer = $_POST['answer'];

if (!is_numeric($poll) || !is_numeric($answer)) {
die("Invalid poll or answer");
}


Мы можем убедиться, что ID и ответ правильны путем поиска соответствующих записей в базе данных. Если они правильны, мы добавляем ответ в базу данных. Данный запрос не возвращает никаких результатов:

/* Look up the poll and answer. */
$sql = "SELECT A.answer_ID
FROM poll P, answer A
WHERE P.ID = A.ID
AND P.ID = $poll
AND A.answer_ID = $answer";
$result = @mysql_query($sql, $db) or die (mysql_error());
if (mysql_num_rows($result) == 0) {
die('Invalid poll or answer.');
}

Мы должны проверить, что пользователь еще не голосовал и добавить результат опроса:

/* Check for prior votes. */
if (!$_COOKIE["poll_voted_$poll"]) {
/* Insert the vote. */
$sql = "INSERT INTO `vote` ( `answer_ID` , `ID`)
VALUES ($answer, $poll);";
$result = @mysql_query($sql, $db) or die ("Couldn't insert: " . mysql_error());

Если мы удачно добавили результат опроса, мы устанавливаем Cookie, запрещающее пользователю принимать участие в этом голосовании на протяжении 30 дней:

/* Mark the poll as voted. */
setcookie("poll_voted_$poll", "1", time() + (60*60*24 * 30));
}

Затем вне зависимости от того, проголосовал ли пользователь или нет, мы отправляет его на результаты голосования:

/* Redirect to poll results. */
header("Location: vote_tally.php?poll=$poll");
?>

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

Результаты голосования

Конечно, всякий, что проголосовал, он захочет увидеть результаты голосования. Мы будем использовать чистый HTML, чтобы отобразить результаты голосования, как показано на рис. 12.2.

Рис. 12.2. Результаты голосования

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

<?php
/* Display the results of a poll. */
require_once("vote_config.php");
$poll = $_REQUEST['poll'];
if (!is_numeric($poll)) {
die("Invalid poll");
}

При проверке правильности ID голосования мы заодно получим вопрос голосования и отобразим эту информацию:

/* Look up the question. */
$sql = "SELECT question
FROM poll
WHERE ID = $poll";
$result = @mysql_query($sql, $db) or die ("mysql error: " . mysql_error());
if (mysql_num_rows($result) != 1) {
die('Invalid poll.');
}
$row = mysql_fetch_array($result);
$question = $row["question"];

А теперь получим общее количество голосов, чтобы высчитать процентное соотношение для вариантов ответов голосования:

$query = "SELECT count(*) AS num_total_votes
FROM vote V
WHERE V.ID = $poll";

$result = @mysql_query($query, $db) or die ("mysql error: " . mysql_error());
$row = mysql_fetch_array($result);
$num_total_votes = $row["num_total_votes"];

Теперь настало время для большого запроса, который получает счетчики каждого голоса. Это прекрасное время использовать предложение LEFT JOIN для классификации всех голосов. Данный запрос немного сложнее, чем все остальные, с которыми мы до этого сталкивались:

$query = "SELECT A.answer, A.answer_ID, count(V.answer_ID) as num_votes
FROM answer A
LEFT JOIN vote V
ON V.ID = A.ID
AND V.answer_ID = A.answer_ID
WHERE A.ID = $poll
GROUP BY A.answer_ID
ORDER BY num_votes DESC, A.answer ASC
";
$result = @mysql_query($query, $db) or die ("mysql error: " . mysql_error());

Когда результаты запроса получены, мы подготавливаем HTML-заголовок и первую часть страницы:

print "<html><head><title>Poll: $question</title></head><body>";
print '<ul style="list-style-type: none; font-size: 12px;">';
print '<li style="font-weight: bold; padding-bottom: 10px;">';
print "Poll #$poll: $question";
print '</li>';

Мы "пройдемся" по каждому выбору и отобразим результаты каждого голоса:

while ($row = mysql_fetch_array($result)) {
if ($num_total_votes != 0) {
$pct = sprintf("%.2f", 100.0 * $row["num_votes"] / $num_total_votes);
} else {
$pct = "0";
}
$boxwidth = strval(1 + intval($pct)) . "px";
print '<li style="clear: left;">';
print "$row[answer]";
print "</li>";
print '<li style="clear: left; padding-bottom: 7px;">';
print '<div style="width: ' . $boxwidth . '; height: 15px;' .
'; background: black; margin-right: 5px; float: left;">' .
"</div>$pct%";
print '</li>';
}

Наконец, мы выводим HTML с общим числом голосов и закрываем теги:

print '<li style="clear: left;">';
print "Total Votes: $num_total_votes";
print '</li>';
print '</ul>';
print '</body></html>';
?>
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Вс Сен 14, 2008 3:43 pm    Заголовок сообщения:
Ответить с цитатой

Спасибо!

А всё же как ставить права доступа?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Вс Сен 14, 2008 3:49 pm    Заголовок сообщения:
Ответить с цитатой

в виндовс прав доступа нет, а я так понял у тебя сервер под управлением виндовс, в Linux см

man chmod
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Показать сообщения:   
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP Часовой пояс: GMT
На страницу 1, 2  След.
Страница 1 из 2
 Главная страница сайта
 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
© Колисниченко Денис