|
Автор |
Сообщение |
Павел
Участник тусовки
Зарегистрирован: 17.02.2006 Сообщения: 110 Откуда: Санкт-Петербург
|
|
|
|
Решил немного модифицировать скрипт голосования из Самоучителя 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`‚"
Скажите, пожалуйста, в чем ошибка? |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Потому что перед выводом картинки нужно выводить формат рисунка - это указание браузеру, что сейчас будет выводиться картинка, а не текст. По умолчанию считается что выводится текст. |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Павел
Участник тусовки
Зарегистрирован: 17.02.2006 Сообщения: 110 Откуда: Санкт-Петербург
|
|
|
|
Добавил 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 Откуда: Кировоград, Украина
|
|
|
|
В самоучителе четко сказано - вывод заголовка браузера должен осуществляться до первого вывода. А ты сначала эхом выводишь "Результаты голосования" К тому же ты не можешь выводить одновременно и текст и картинку - определись что ты выводишь. Конечно лучше сразу выводить картинку, а строку "Результаты голосования" можно вывести в саму картинку с помощью соотв. функции |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Павел
Участник тусовки
Зарегистрирован: 17.02.2006 Сообщения: 110 Откуда: Санкт-Петербург
|
|
|
|
А может лучше вообще не париться, а выводить картинки тегом <img>?
Да, еще вопрос - где-то вычитал функцию printf, использую ее так
printf("%.1f%s\n",$data[1]/$n*100,"%");
Но в итоге она так округляет, что в сумме 100% никак не получаются.
Не подскажите решение? |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Все равно в теге <img> ты пишешь:
<img src=im1.php>
а в сценарии im1.php нужно вывести формат и сделать это нужно до первого вывода из сценария, поскольку потом не сможешь установить заголовки
с sprintf так не разбирался, поэтому ничего подсказать не могу, нужно пробовать какие-то другие функции или округлять самостоятельно, но тогда вырастет код сценария |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Павел
Участник тусовки
Зарегистрирован: 17.02.2006 Сообщения: 110 Откуда: Санкт-Петербург
|
|
|
|
Да нет. Просто нарисовать картинку - прямоугольник, а потом растягивать ее <img src="image.jpg" width=$x height=20> |
|
Вернуться к началу |
|
|
Лиза
Новенький
Зарегистрирован: 10.07.2008 Сообщения: 35
|
|
|
|
А у меня вообще не работает голосование. Сделала всё как в учебнике. Но не засчитывает голоса. Всё время показывает ноль. |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Скорее всего проблема с правами доступа к файлу |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Лиза
Новенький
Зарегистрирован: 10.07.2008 Сообщения: 35
|
|
|
|
Я их не меняла. Кстати, я не поняла как менять права доступа. Допустим, в Far. Выбираю file attributes, а что делать дальше я незнаю. Что надо выбирать(Read only, archive, hidden, system, compressed), чтобы установить права доступа 777, 666 или 755. |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
погоди, так ты в винде запускаешь сценарий??? |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
Лиза
Новенький
Зарегистрирован: 10.07.2008 Сообщения: 35
|
|
|
|
localhost/ |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
Онлайн-опросы не очень полезны для привлечения новых пользователей, зато они позволяют выяснить, какой бы контент хотели видеть (или, наоборот, не хотели видеть) на страницах сайта уже существующие пользователи. Лучшая часть голосований – это простота реализации.
Чтобы предотвратить множественное голосование, когда один и тот же человек голосует несколько раз, мы будем использовать 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
|
|
|
|
Спасибо!
А всё же как ставить права доступа? |
|
Вернуться к началу |
|
|
den
Старожил
Зарегистрирован: 31.01.2006 Сообщения: 13870 Откуда: Кировоград, Украина
|
|
|
|
в виндовс прав доступа нет, а я так понял у тебя сервер под управлением виндовс, в Linux см
man chmod |
|
Вернуться к началу |
dhsilabs@jabber.ru |
|
|
|
|
 Главная страница сайта
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|