Автор Тема: Никак не могу сделать голосование =:-(  (Прочитано 7712 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн JusT|CTaJIuH

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 52
  • +0/-0
  • 0
    • Просмотр профиля
    • http://just.times.lv
Уже несколько дней немогу сделать голосование , в php я полный новичёк ... ничего особенно пока не понимаю =;-( ... вот читая одну из первых статей по php я решил сделать такое "простое" вроде-бы голосование ...
Насколько я понял нужно иметь 3 файла ... :
1. vote.html - в нём само голосование с кнопкой submit.
2. vote.php - в нём скрипт обработчика.
3. 1.dat - в нём условия голосования ...
vote.php и 1.dat - нужно разместить в папке /php на сайте ...
Но я видимо что-то не так делаю ... раз у меня не работает ... может вы посмотрите , а ?  Это вроде как моя будущая домашняя страничка

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
Никак не могу сделать голосование =:-(
« Ответ #1 : 11 Октября 2002, 19:09:04 »
В 1.dat не пишется?
За это автору надо оторвать ...

Сделай файл 1.dat ненулевой длины путем вставления символа перевода каретки. (открой пустой 1.dat , нажми на enter чтобы в файле было 2 строки и сохрани его)
AS IS...

Оффлайн JusT|CTaJIuH

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 52
  • +0/-0
  • 0
    • Просмотр профиля
    • http://just.times.lv
Никак не могу сделать голосование =:-(
« Ответ #2 : 11 Октября 2002, 19:34:48 »
Так в 1.dat уже есть строки :

Как Вам наш новый дизайн?
5~Отлично!
3~Так себе, потянет...
1~Ужасно!!!

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
Никак не могу сделать голосование =:-(
« Ответ #3 : 11 Октября 2002, 21:04:56 »
Вообще в дат должно писаться результаты голосования.
AS IS...

Оффлайн JusT|CTaJIuH

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 52
  • +0/-0
  • 0
    • Просмотр профиля
    • http://just.times.lv
Никак не могу сделать голосование =:-(
« Ответ #4 : 11 Октября 2002, 22:08:02 »
А статью ты читал ? ... т.е что делать то ? в чём ошибка и как её исправить !? хЭлп ми , ай эм а ламИр ... =:-)

Оффлайн GotZfild

  • Универсал
  • Старожил
  • ****
  • Сообщений: 456
  • +0/-0
  • 2
    • Просмотр профиля
    • http://myphp.dem.ru
Никак не могу сделать голосование =:-(
« Ответ #5 : 12 Октября 2002, 09:46:06 »
Возьми готовый скрипт голосования (на текстовых файлах, не MySQL) и посмотри, как там все реализовано.
После трех дней без программирования жизнь становится бессмысленной.

Оффлайн JusT|CTaJIuH

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 52
  • +0/-0
  • 0
    • Просмотр профиля
    • http://just.times.lv
Никак не могу сделать голосование =:-(
« Ответ #6 : 12 Октября 2002, 14:49:02 »
А вы немогли бы дать адрессок такого ? ... =:-)

Оффлайн GotZfild

  • Универсал
  • Старожил
  • ****
  • Сообщений: 456
  • +0/-0
  • 2
    • Просмотр профиля
    • http://myphp.dem.ru
Никак не могу сделать голосование =:-(
« Ответ #7 : 12 Октября 2002, 16:26:24 »
Посмотри на http://cgi.myweb.ru - там таких навалом.
После трех дней без программирования жизнь становится бессмысленной.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Никак не могу сделать голосование =:-(
« Ответ #8 : 12 Октября 2002, 16:52:25 »
А на вебскрипте нету разве? :-)
И ведь из-за премишенов все равно не будет пахать у него - что готовое, что самописное.

JusT|CTaJIuH
выполни такой скрипт
$fp=fopen("test.txt","w");
fwrite($fp,"1");
fclose($fp);
?>
Если создаст, то создай таким образом и файл 1.дат, и все ьудет работать.
А если нет, то надо на папку просто поставить нужные атрибуты.

Оффлайн JusT|CTaJIuH

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 52
  • +0/-0
  • 0
    • Просмотр профиля
    • http://just.times.lv
Никак не могу сделать голосование =:-(
« Ответ #9 : 13 Октября 2002, 00:44:59 »
Нашёл готовое голосование , но есть вопросы ... !
В readme написанно : "Чтобы проголосовать, вызывайте скрипт vote.php4." - что это значит ? как его вызывать ? ...

З.Ы. извените ребята , чуствую себя полным идиотом =:-( ... может мне что-то для начала почитать ... по проще , а ?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Никак не могу сделать голосование =:-(
« Ответ #10 : 13 Октября 2002, 03:19:44 »
почитать - http://faq.phpclub.net/newbie
вызвать - написать в адресной строке бровзера и нажать Ентер.
спать - побольше
извИните- писать через "И"

Оффлайн JusT|CTaJIuH

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 52
  • +0/-0
  • 0
    • Просмотр профиля
    • http://just.times.lv
Никак не могу сделать голосование =:-(
« Ответ #11 : 13 Октября 2002, 04:17:41 »
Усё понятно Шеф ! Будем старатся ! =:-)
З.Ы. Насчёт сна не согласен !

Оффлайн Maniac

  • Ума нет - считай коллега
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 844
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Никак не могу сделать голосование =:-(
« Ответ #12 : 13 Октября 2002, 14:26:49 »
Цитировать
может мне что-то для начала почитать ... по проще

Почитай по-проще. Рассказываю я. Записывай и ДУМАЙ.
Итак, постановка простейшей задачи: скрипт голосования без использования БД, обрабатывает только один вопрос голосования, закон прироста: один голос=инкремент счетчика, без учета уникальности пользователя, код для создания формы голосования делаем ручками, запрос по методу GET (параметр передаетя в адресной строке браузера - исключительно для наглядности)

Надо: три файла. vote.php - голосуем, result.php - смотрим результат, vote.dat - храним данные о голосовании.
Формат фала .dat пусть будет такой:

Вопрос<перевод каретки>
<количество голосов>::<первый вариант><новая строка>
<количество голосов>::<второй вариант><новая строка>
.............
<количество голосов>::<новая строка>


Параметры, передаваемые скрипту: id - номер ответа.

Итак, допустим, юзверь проголосовал за что-то. Когда он нажал кнопку Submit (форму, надеюсь, сможешь сварганить?), браузер отправил вызывает файл запросом что-то типа vote.php?id=3

Начинает работать твой доблестный скрипт голосования. Договоримся сразу, что в случае возникновения какой-либо ошибки, будет вызываться функция Error(), которая что-то делает (выводит на экран сообщение, делает пересылку или что еще) и завершает работу скрипта.

Сначала проверим, передан ли, собственно говоря, тот самый параметр id, или просто какой-то недоумок решил поиграться с твоим скриптом.

<?
if (!isset(
$id)) Error();

Теперь ты точно уверен, что какой-то параметр был тебе передан. Работаем дальше.
Нам надо прочитать файл. Т.к. все порции данных в нем разделены символом новой строки и объем файла невелик, то читаем его при помощи функции file($name), которая читает содержимое файла и возвращает массив, каждый элемент которого - соответствующая строка файла.
Т.к.

$data
=file(\'vote.dat\');

В массиве $data первый элемент (с индексом 0) содержит вопрос голосования, а все остальные - варианты ответов. Исключительно для простоты будем нумеровать вопросы в файле начиная с единицы.

Тебе надо проверить, есть ответ, номер которого был передан скрипту в природе, или злобный хацкер решил побаловаться. Как это определить? Так уж волшебным образом получилось, что количество вопросов совпало с размером массива $data, а нумерация - с индексом вопроса в том же массиве. Т.е. если id меньше 1 или id больше количества элементов массива $data - то что-то не то. Мысль выссказанная есть реальность, посему запечатлеем её в камне, сиречь в коде:

if ($id<1||$id>count($data)) Error();
//функция count возвращает длину массива.

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

explode($char,$string) - возвращает массив, полученный из строки $string, разделенной по символу $char (т.е. explode(\'::\',\'PHP::Rules::FOREVA\'); возвратит Array([0]=>\'PHP\',[1]=>\'Rules\',[2]=>\'FOREVA\')
Работаем.

$temp
=explode(\'::\',$data[$id]);
/*Разделил строку с нужным нам вариантом и получили массив,
 нулевой элемент которого содержит количество 
проголосовавших, а первый - вопрос*/

В полученном массиве увеличиваем на единицу количество проголосовавших:

$temp
[0]++;

Следующая функция, которая нам понадобится - implode($char,$array) - делает обратное explode, т.е. сливает массив $array в строку, используя $char в качестве разделителя.
Возвращаем все на круги своя...

$data
[$id]=implode(\'::\',$temp);

В принципе почти все. В массиве $data мы имеем результаты голосования. Их надо записать обратно. Что и делаем:

$file
=fopen(\'vote.dat\',\'w\');
foreach($data as $line)
     fwrite($file,$line);
fclose($file)

Ну, и редиректим юзера на страницу итогов:

header
("Location: result.php");


Вот и все. Вопросы есть?
TANSTAAFL

Оффлайн JusT|CTaJIuH

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 52
  • +0/-0
  • 0
    • Просмотр профиля
    • http://just.times.lv
Никак не могу сделать голосование =:-(
« Ответ #13 : 13 Октября 2002, 15:06:38 »
уууу... ! Я пошёл разбератся со всем выше сказанным =:-) Как что-нить не пойму - сразу же напишу !
СПАСИБО за помощь !
З.Ы. Честное слово , не ожидал такой отзывчивости ! Ничего подобного ещё не видел ! Искренне рад ...

Оффлайн Дмитрий Попов

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 264
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.programmist.spb.ru
Никак не могу сделать голосование =:-(
« Ответ #14 : 13 Октября 2002, 15:15:24 »
Еще, потом (после того, как с этим разберешся), почитай вот это:
(что бы не давать ссылку на свою страницу, пишу здесь):
Защита от накрутки "массовых" голосований и счетчиков

Вариант один - это куки. Но это не выход. Отключить их очень несложно, и тогда это уже не поможет.

Запоминать IP - тоже не надежно, но все-таки более реально.

Как я понимаю, "небольшой скриптик" не является супер-навороченым проектом, который необходимо защищать от накрутки, как счет в ЦБ РФ...

Тогда есть три варианта решения:
1) Отслеживать IP
2) Писать Куки
3) И то и другое.

Как я понимаю, этот скрипт пойдет в массовое пользование. Если так, то применение MySQL для такой несложной задачи неприемлемо.
Тогда остаются текстовые файлы.
Но обо всем по порядку:
Если есть MySQL:
просто создаем таблицу с тремя полями:
IP | SID | IDTEEM
Где:
IP - ip-адрес голосующего
SID - может быть и не SID, но любое число, унифицирующее юзера, которое хранится в сессии.
IDTEEM - Id того голосования, за которое голосовал.
Далее при попытке голосования, запрашиваем в базе:
Сначала IP и IDTEEM, и если результат нулевой (ноль записей),
то запрашиваем SID и IDTEEM.
Если и здесь результат нулевой, значит:
а) пользователь и вправду впервые голосует
б) пользователь очень хочет Вас обмануть, и ничего Вам не поможет :-)
Далее принимаем голосование, и ставим ему в броузер SID, и в базе сохраняем SID и IP.
Как же работать с текстовыми файлами?
А элементарно:
Для каждой темы голосования создаем 2 своих текстовых файла. Назовем их, скажем
"ip".$IDTEEM.dat (ip1.dat) и "SID".$IDTEEM.dat.
Получаются пары, вроде:
ip1.dat sid1.dat - файлы с ip и sid первого голосования
ip2.dat sid2.dat - файлы с ip и sid Второго голосования и т.д.
При заходе просто перебираем файл с IP и SID данного голосования построчно (file()), и preg\'ом ищем совпадения.
Если нашли, то юзер уже голосовал. Если нет - то нет...
Естественно, это вариант с файлами не годится для сайтов с посещением 1000 человек в день...
Но нагрузку, голосов в 500-1000 на голосование он, думаю, потянет...
 За Родину! За Россию!
SendMail для любого хостинга.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28