Господа оптимизаторы! Подскажите как быть?

SiMM

Новичок
CjEcho, не надо привязывать пользователей к IP. Если речь не о локалке какой-нибудь.
 

Фанат

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

weregod

unserializer
> защита от накруток - тем сложная и муторная.
более чем. но интересная

танаФ
> пишешь в куку номер опроса, за который человек голосовал. и все.
работает, но до того момента, пока не ввести сортировку вывода опросов по разным критериям и не позволить её менять администратору
без поправки про сортировки. CjEcho, о сортировках лучше позаботиться позже
 

dimagolov

Новичок
weregod, ты как ляпнешь что-то, так на постой невпопад :( то ты в $_REQUEST хрень всякую тулишь, то для сортировки чего-либо меняешь id элементов. может, лучше, орбит?
 

CjEcho

Новичок
То есть при использовании кукисов логика должна быть такова:

//Если не голосовали
IF empty(cookies):
cookies=0;
<Вывод опроса>;
ENDIF;

//Если голосовали
IF cookies>0:

//Если опрос не изменился
IF cookies=question_id:
<вывод результатов опроса>;
ENDIF;

//Если опрос изменился
IF cookies<>question_id:
cookies=0;
<вывод опроса>;
ENDIF;

ENDIF;

В теле опроса, после голосования задать: cookies=question_id
 

Фанат

oncle terrible
Команда форума
такое ощущение, как будто я ничего не писал вообще
IF cookies=question_id:
<вывод результатов опроса>;
ELSE:
<вывод опроса>;
ENDIF;
 

CjEcho

Новичок
Извини, затроил что-то... Буду пробовать.

-~{}~ 15.05.09 14:26:

Тут с куками теперь проблема:

PHP:
//Загружаем активный опрос
mysql_connect($server, $user, $pass) or die('<b>Нет коннекта с базой данных.</b>'); 
mysql_select_db($db);
$q1 = mysql_query("SELECT * FROM question WHERE quest_active='1'");
$a = mysql_fetch_array($q1);

//Текст вопроса в опросе
$quest_quest=$a['quest_quest'];

//Текущий номер опроса
$quest_id=$a['quest_id'];

//Текст вариантов ответов
$qa=$a['quest_vara'];
$qb=$a['quest_varb'];
$qc=$a['quest_varc'];
$qd=$a['quest_vard'];
$qe=$a['quest_vare'];

//Счетчики голосов
$ca=$a['quest_countera'];
$cb=$a['quest_counterb'];
$cc=$a['quest_counterc'];
$cd=$a['quest_counterd'];
$ce=$a['quest_countere'];

echo "<br>";

//Если нажали на кнопку "Проголосовать"
if (empty($_POST)):else:

	echo "REQUEST прошел";
	setcookie('cookies_question',$quest_id,time()+31570560);
	echo $cookies_question;
	
	// Добавляем голос в 1 вариант
	if ($_POST['variant']==1):$increment=$a['quest_countera']+1;$q2=mysql_query("UPDATE LOW_PRIORITY question SET quest_countera=$increment WHERE quest_id=$quest_id");endif;
	
	// Добавляем голос в 2 вариант
	if ($_POST['variant']==2):$increment=$a['quest_counterb']+1;$q2=mysql_query("UPDATE LOW_PRIORITY question SET quest_counterb=$increment WHERE quest_id=$quest_id");endif;
	
	// Добавляем голос в 3 вариант
	if ($_POST['variant']==3):$increment=$a['quest_counterc']+1;$q2=mysql_query("UPDATE LOW_PRIORITY question SET quest_counterc=$increment WHERE quest_id=$quest_id");endif;

	// Добавляем голос в 4 вариант
	if ($_POST['variant']==4):$increment=$a['quest_counterd']+1;$q2=mysql_query("UPDATE LOW_PRIORITY question SET quest_counterd=$increment WHERE quest_id=$quest_id");endif;

	// Добавляем голос в 5 вариант
	if ($_POST['variant']==5):$increment=$a['quest_countere']+1;$q2=mysql_query("UPDATE LOW_PRIORITY question SET quest_countere=$increment WHERE quest_id=$quest_id");endif;
	
endif;

if ($_COOKIE['cookies_question']==$quest_id):
	//ВЫВОД РЕЗУЛЬТАТОВ ОПРОСА
	echo "Debug: ВЫВОД РЕЗУЛЬТАТОВ ОПРОСА";

	echo "<FONT class='NEWSCAPT'>Результаты опроса:</FONT><br><br>";
	echo "<DIV align='justify'>".$a['quest_quest']."</DIV>";
	if ($qa=="<none>"):else:echo "<br>".$qa."<br>".$ca." (100%)";endif;
	if ($qb=="<none>"):else:echo "<br>".$qb."<br>".$cb." (100%)";endif;
	if ($qc=="<none>"):else:echo "<br>".$qc."<br>".$cc." (100%)";endif;
	if ($qd=="<none>"):else:echo "<br>".$qd."<br>".$cd." (100%)";endif;
	if ($qe=="<none>"):else:echo "<br>".$qe."<br>".$ce." (100%)";endif;
	
else:	
	//ВЫВОД ФОРМЫ ОПРОСА
	echo "<FORM action='' method='post'>";
	echo "<FONT class='NEWSCAPT'>Опрос:</FONT><br><br>";
	echo "<DIV align='justify'>".$quest_quest."</DIV><br>";
	if ($qa=="<none>"):else:echo "<INPUT title='Выбрать вариант ответа' name='variant' value='1' type='radio' checked>&nbsp;$qa</INPUT><br>";endif;
	if ($qb=="<none>"):else:echo "<INPUT title='Выбрать вариант ответа' name='variant' value='2' type='radio'>&nbsp;$qb</INPUT><br>";endif;
	if ($qc=="<none>"):else:echo "<INPUT title='Выбрать вариант ответа' name='variant' value='3' type='radio'>&nbsp;$qc</INPUT><br>";endif;
	if ($qd=="<none>"):else:echo "<INPUT title='Выбрать вариант ответа' name='variant' value='4' type='radio'>&nbsp;$qd</INPUT><br>";endif;
	if ($qe=="<none>"):else:echo "<INPUT title='Выбрать вариант ответа' name='variant' value='5' type='radio'>&nbsp;$qe</INPUT><br>";endif;
	echo "<br><INPUT title='Проголосовать' value='Проголосовать' type='submit'></INPUT>";
	echo "</FORM>";
	
endif;
При нажатии на кнопку голосовать Debug: запрос прошел, а значение cookie не выводит... и видимо не задает...

-~{}~ 15.05.09 14:27:

ну всё... за такой большой код сейчас забанят точно...

-~{}~ 15.05.09 14:31:

просто ниразу с cookies не работал а надо срочняк...
 

Фанат

oncle terrible
Команда форума
код длинный потому что дурацкий
неужели нельзя было сделать добавление ответов в одну строчку?

error_reporting(E_ALL);
в начало скрипта и смотрим что выведет при добавлении
потом сюда http://phpfaq.ru/na_tanke
сюда http://phpfaq.ru/headers
и сюда http://phpfaq.ru/debug

-~{}~ 15.05.09 12:33:

про "срочняк" свой забудь.

-~{}~ 15.05.09 12:55:

ох ё.
ну, и разумеется, http://phpfaq.ru/slashes
 

CjEcho

Новичок
по поводу http://phpfaq.ru/slashes, строка должна принять такой вид?

$q2=mysql_query("UPDATE LOW_PRIORITY `question` SET `quest_countera`='".mysql_real_escape_string($increment)."' WHERE `quest_id`='".mysql_real_escape_string($quest_id)."'");
 

CjEcho

Новичок
танаФ, помоги.

Я понял что setcookie() должна находится рядом с session_start(), до вывода HTML. Но не могу понять следующее: Я же должен задать какое-то значение переменной, чтобы проинициализировать куку? А если я задам явное значение, то смысл куки мне неясен вовсе.

т.е. вопрос такой, как проинициализировать куку, чтобы её значение не изменилось?
 

CjEcho

Новичок
Всё, приехали... чем дальше в лес... (это я про себя, похоже нужен reboot)

74 echo "REQUEST прошел";
75 setcookie('cookies_question',$quest_id,time()+31570560);
76 echo $cookies_question;

ошибка выдается в 75 строке: Notice: Undefined index: cookies_question in "localhost" on line 75

выходит что эту строку я должен перенести в самое начало? До какой либо печати в html?
 

Фанат

oncle terrible
Команда форума
раздели свою программу на две.
одна занимается только выводом, а другая - только обработкой.
так легче будет.

ты понимаешь, что куку тебе надо ставить только если человек проголосовал?

-~{}~ 15.05.09 15:08:

в 75 строку у тебя не может выводиться такая ошибка

-~{}~ 15.05.09 15:11:

в этой строке должна быть ошибка Warning: headers already sent
 

CjEcho

Новичок
Вывод опроса у меня производится сбоку в "колонтитуле", колонтитул подключается @includ'ом с разных страниц, так-же в самом начале страницы подключается @init модуль в котором session_start(), и глобальные переменные типа dbname, pass.

Если я расположу логику в init модуль, то при нажатии на кнопку "проголосовать" я получу не пустой "$_POST", который увижу в init модуле и сделаю изменения в куке.

Далее в модуле с выводом я ловлю эту куку и на основании этого либо вывожу опрос, либо результат???
 

Фанат

oncle terrible
Команда форума
да это все не имеет отношения к вопросу.
1. раздели свой скрипт на два.
2. разрабатывай его ОТДЕЛЬНО от своих колонтитулов и инклюдов. не надо делать десять дел сразу - ты не сделаешь ни одного. учишься опросы делать - делай опросы. только.
если пост у тебя будет обрабатывать другой файл, то никакие инклюды и колонтитулы тебе мешать не будут. логично?
 

CjEcho

Новичок
Вообщем разделил на 2 части, получилось так:

PHP:
// logic.php
<?php //ЛОГИКА ОПРОСА
error_reporting(E_ALL);

// Инициализация переменных для работоспособности сайта
$server = '<hidden>'; 		// Название сервера (Для БД)
$user = 'root'; 					// Имя пользователя
$pass = '<hidden>'; 			// Пароль к базе данных
$db = 'database';					// Имя базы данных

//Загружаем активный опрос
mysql_connect($server, $user, $pass) or die('<b>Нет коннекта с базой данных.</b>'); 
mysql_select_db($db);
$q1 = mysql_query("SELECT * FROM `question` WHERE `quest_active`='1'");
$a = mysql_fetch_array($q1);

//Текст вопроса в опросе
$quest_quest=$a['quest_quest'];

//Текущий номер опроса
$quest_id=$a['quest_id'];

//Если нажали на кнопку "Проголосовать"
if (empty($_POST)):else:
	setcookie('cookies_question',$quest_id,time()+10);
	//Добавление элементов
	...............................................................
endif;
?>

// output.php
<?php //ВЫВОД ДАННЫХ
if ($cookies_question==$quest_id):
	//ВЫВОД РЕЗУЛЬТАТОВ ОПРОСА
	...............................................................
else:	
	//ВЫВОД ФОРМЫ ОПРОСА
	echo "<FORM action='' method='post'>";
	...............................................................
endif;
?>
-~{}~ 15.05.09 17:53:

Ошибка "Notice: Undefined variable: cookies_question" при запуске в этой строке:

if ($cookies_question==$quest_id):

потому что переменная еще не задана...
 

Фанат

oncle terrible
Команда форума
не вижу здесь никакого разделения. в одном скрипте и обработка поста и вывод.
что ты куда поделил?

-~{}~ 15.05.09 15:57:

ошибка правильная.
исправляется так:
if (isset($_COOKIE['cookies_question'] AND $_COOKIE['cookies_question']==$quest_id):
 

CjEcho

Новичок
разделение есть... я пустой index.php сделал, в него include"logic.php" и следом include "output.php"... просто друг за другом их расположил... чтобы всё показать
 

dimagolov

Новичок
CjEcho, разделение это когда обработку формы делает скрипт который НИЧЕГО не выводит. он только обрабатывает принятые значения, сохраняет их в базу и устанавливает куку о том, что опрос проведен. в конце он делает переадресацию на страницу, которая уже все выводит. понятно?
 
Сверху