Forum Webscript.Ru

Программирование => PHP => Тема начата: JusT|CTaJIuH от 11 Октября 2002, 18:59:27

Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 11 Октября 2002, 18:59:27
Уже несколько дней немогу сделать голосование , в php я полный новичёк ... ничего особенно пока не понимаю =;-( ... вот читая одну из первых статей по php (http://www.webscript.ru/stories/02/06/19/4602528) я решил сделать такое "простое" вроде-бы голосование ...
Насколько я понял нужно иметь 3 файла ... :
1. vote.html - в нём само голосование с кнопкой submit.
2. vote.php - в нём скрипт обработчика.
3. 1.dat - в нём условия голосования ...
vote.php и 1.dat - нужно разместить в папке /php на сайте ...
Но я видимо что-то не так делаю ... раз у меня не работает ... может вы посмотрите , а ?  Это вроде как моя будущая домашняя страничка  (http://www.stalin.pit.lv/voting.html)
Название: Никак не могу сделать голосование =:-(
Отправлено: ThE0ReTiC от 11 Октября 2002, 19:09:04
В 1.dat не пишется?
За это автору надо оторвать ...

Сделай файл 1.dat ненулевой длины путем вставления символа перевода каретки. (открой пустой 1.dat , нажми на enter чтобы в файле было 2 строки и сохрани его)
Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 11 Октября 2002, 19:34:48
Так в 1.dat уже есть строки :

Как Вам наш новый дизайн?
5~Отлично!
3~Так себе, потянет...
1~Ужасно!!!
Название: Никак не могу сделать голосование =:-(
Отправлено: ThE0ReTiC от 11 Октября 2002, 21:04:56
Вообще в дат должно писаться результаты голосования.
Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 11 Октября 2002, 22:08:02
А статью ты читал ? ... т.е что делать то ? в чём ошибка и как её исправить !? хЭлп ми , ай эм а ламИр ... =:-)
Название: Никак не могу сделать голосование =:-(
Отправлено: GotZfild от 12 Октября 2002, 09:46:06
Возьми готовый скрипт голосования (на текстовых файлах, не MySQL) и посмотри, как там все реализовано.
Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 12 Октября 2002, 14:49:02
А вы немогли бы дать адрессок такого ? ... =:-)
Название: Никак не могу сделать голосование =:-(
Отправлено: GotZfild от 12 Октября 2002, 16:26:24
Посмотри на http://cgi.myweb.ru - там таких навалом.
Название: Никак не могу сделать голосование =:-(
Отправлено: Меняздесьдавнонет от 12 Октября 2002, 16:52:25
А на вебскрипте нету разве? :-)
И ведь из-за премишенов все равно не будет пахать у него - что готовое, что самописное.

JusT|CTaJIuH
выполни такой скрипт
$fp=fopen("test.txt","w");
fwrite($fp,"1");
fclose($fp);
?>
Если создаст, то создай таким образом и файл 1.дат, и все ьудет работать.
А если нет, то надо на папку просто поставить нужные атрибуты.
Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 13 Октября 2002, 00:44:59
Нашёл готовое голосование , но есть вопросы ... !
В readme написанно : "Чтобы проголосовать, вызывайте скрипт vote.php4." - что это значит ? как его вызывать ? ...

З.Ы. извените ребята , чуствую себя полным идиотом =:-( ... может мне что-то для начала почитать ... по проще , а ?
Название: Никак не могу сделать голосование =:-(
Отправлено: Меняздесьдавнонет от 13 Октября 2002, 03:19:44
почитать - http://faq.phpclub.net/newbie
вызвать - написать в адресной строке бровзера и нажать Ентер.
спать - побольше
извИните- писать через "И"
Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 13 Октября 2002, 04:17:41
Усё понятно Шеф ! Будем старатся ! =:-)
З.Ы. Насчёт сна не согласен !
Название: Никак не могу сделать голосование =:-(
Отправлено: Maniac от 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");


Вот и все. Вопросы есть?
Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 13 Октября 2002, 15:06:38
уууу... ! Я пошёл разбератся со всем выше сказанным =:-) Как что-нить не пойму - сразу же напишу !
СПАСИБО за помощь !
З.Ы. Честное слово , не ожидал такой отзывчивости ! Ничего подобного ещё не видел ! Искренне рад ...
Название: Никак не могу сделать голосование =:-(
Отправлено: Дмитрий Попов от 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 на голосование он, думаю, потянет...
Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 13 Октября 2002, 15:30:03
Дмитрий ! Огромное спасибо за то что пытаетесь мне помочь =:-) НО , вы наверное думаете что слова типа "При заходе просто перебираем файл с IP и SID данного голосования построчно (file()), и preg\'ом ищем совпадения. " - мне о чём то говорят =:-)) вы ошибаетесь ... пока (повторяю .. п-о-к-а) , я вообще ничего не понимаю ... ! НО очень хочу научится ... !
Ещё раз спасибо !
[offtopic] Щаз у моего провайдера получил место для странички , специально для изучения php ... потому как я знаю .. локально очень не просто увидеть работающий скрипт ! НО , опять же ... , php скрипты не работают на страничке , хотя провайдер уверял что php поддержка у них стоит ! =:-(( Что посоветуете ? Написать чтоб проверили ещё разок ? [/offtopic]
Название: Никак не могу сделать голосование =:-(
Отправлено: Меняздесьдавнонет от 13 Октября 2002, 15:36:55
попробовать дать файлу расширение из вариантов
.phtml .php .php3 .php4
Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 13 Октября 2002, 17:03:02
Уже пробовал , вот смотрите на мою страничку голосования (http://www.stalin.pit.lv/vote.php4), взятую из исходников =:-(
Название: Никак не могу сделать голосование =:-(
Отправлено: Меняздесьдавнонет от 13 Октября 2002, 17:49:42
если ни один из вариантов не подходит, то надо обращаться таки не сюда а к хостеру.
Название: Никак не могу сделать голосование =:-(
Отправлено: JusT|CTaJIuH от 13 Октября 2002, 17:56:08
уху , уже письмецо им накотал ... ! "Вот уроды ... " блин , а я у них специально спрашивал , точно ли работает php ... они мне "Да , конечно !!" ... мде =:-(