[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Голосование на сайте
shmit
Здравствуйте. Думаю многие видели какое голосование предложил Е. Попов в своих видео уроках ( там где создают блог ). Я бы хотел его немножко усовершенствовать, дело в том что в нем нет ограничений, пользователь может голосовать сколько угодно. Насколько я понимаю нужно сделать ограничение по айпи? создать поле в базе и туда записывать айпи, если айпи совпали вовремя голосование то вывести ошибку, не совпали засчитать голос?



Спустя 3 часа, 1 минута, 44 секунды (4.04.2010 - 07:02) twin написал(а):
Цитата
Думаю многие видели какое голосование предложил Е. Попов в своих видео уроках
Свят, свят...

Спустя 3 часа, 54 минуты, 23 секунды (4.04.2010 - 10:57) shmit написал(а):
Исчерпывающий ответ.

Спустя 4 минуты, 38 секунд (4.04.2010 - 11:01) twin написал(а):
Причем вполне достаточный. Как малое дитя всякую гадость в рот тащишь.
Ну или хотя бы код представил, а то почему то решил, что всем эта блевотина известна.

Спустя 39 минут, 53 секунды (4.04.2010 - 11:41) glock18 написал(а):
twin
кажется, тут кто-то тему недавно открывал о Попове wink.gif уже опять поменял свое мнение? ))

Спустя 41 минута, 59 секунд (4.04.2010 - 12:23) twin написал(а):
Где???? biggrin.gif biggrin.gif

Спустя 4 часа, 48 минут, 11 секунд (4.04.2010 - 17:11) revaninfo написал(а):
shmit, меньше смотри его уроки... Все что он там рассказывает - полная чушь, хочешь нормальный код, пиши сам, ну или по крайней мере у нормальных разработчиков их бери, если конечно не хочешь иметь сайт весь в дырах, как автомобиль, после погони с перестрелкой smile.gif

Да и если уж решил все-таки тот кривой блог совершенствовать, то давай хоть код в студию, или ты думаешь, что все программисты, учились по видеоурокам Попова?

Спустя 1 час, 59 минут, 14 секунд (4.04.2010 - 19:11) vagrand написал(а):
Цитата
Насколько я понимаю нужно сделать ограничение по айпи? создать поле в базе и туда записывать айпи, если айпи совпали вовремя голосование то вывести ошибку, не совпали засчитать голос?


Не нужно по IP, если конечно от голосования не зависит что-то важное. Лучше просто в cookie флаг записать. Бо с одного IP может сидеть оч много юзверей.

Спустя 3 часа, 15 минут, 59 секунд (4.04.2010 - 22:27) shmit написал(а):
<form action="vot_res.php" method="post" name="vv">
<p class="pvote">Оцените заметку: 1 <input name="score" type="radio" value="1"> 2 <input name="score" type="radio" value="2"> 3 <input name="score" type="radio" value="3"> 4 <input name="score" type="radio" value="4"> 5 <input name="score" type="radio" value="5" checked>
<input class="sub_vote" name="submit" type="submit" value="Оценить">
<input name="id" type="hidden" value="<?php echo "$id";?>">
</p>
</form>


<?
if (isset($_POST['score']))
{
$score = $_POST['score'];
}

if (isset($_POST['id']))
{
$id = $_POST['id'];
}

$result = mysql_query("SELECT rating,q_vote FROM ".safety8." WHERE id='$id'",$db);

if (!$result)
{
echo "<p>Запрос на выборку данных из базы не прошел. Напишите об этом администратору admin@ruseller.com. <br> <strong>Код ошибки:</strong></p>";
exit(mysql_error());
}

if (mysql_num_rows($result) > 0)

{
$myrow = mysql_fetch_array($result);

$new_rating = $myrow['rating'] + $score;
$new_q_vote = $myrow['q_vote'] + 1;
$update = mysql_query("UPDATE date SET rating = '$new_rating', q_vote = '$new_q_vote' WHERE id='$id'",$db);

if ($update)
{
echo "<html><head>
<meta http-equiv='Refresh' content='0; URL=view_post.php?id=
$id'>
</head></html>"
;
exit();

}


}


else
{
echo "<p>Информация по запросу не может быть извлечена в таблице нет записей.</p>";
exit();
}




?>

Спустя 2 минуты, 53 секунды (4.04.2010 - 22:29) shmit написал(а):
Да причем там собираю, я по тем уроками которые вы предлагаете нифига не понимаю, я смотрю курс Попова, что-то сам пытаюсь додумать, что-то спрашиваю здесь, так легче выучить этот язык нежели смотреть на код как баран, ничего не понимая.

Спустя 16 часов, 12 минут, 13 секунд (5.04.2010 - 14:42) revaninfo написал(а):
Здесь тебя научат профессионально программировать, а там, ты научишься только быдлокодерству... Насчет твоего скрипта, функции explode и implode знаешь? Создай поле ip и заноси в него через запятую ip адреса после голосования, перед тем как заносить, когда пользователь будет голосовать, с помощью explode разбиваешь поле ip в массив, и в массиве ищешь тот ip адрес, который соответствует айпишнику голосующего.

Спустя 12 минут, 35 секунд (5.04.2010 - 14:54) glock18 написал(а):
Цитата (revaninfo @ 5.04.2010 - 11:42)
Здесь тебя научат профессионально программировать, а там, ты научишься только быдлокодерству... Насчет твоего скрипта, функции explode и implode знаешь? Создай поле ip и заноси в него через запятую ip адреса после голосования, перед тем как заносить, когда пользователь будет голосовать, с помощью explode разбиваешь поле ip в массив, и в массиве ищешь тот ip адрес, который соответствует айпишнику голосующего.


да, сейчас ты уже научишь его профессионально программировать smile.gif

Спустя 3 минуты, 16 секунд (5.04.2010 - 14:58) shmit написал(а):
гггггг)))) Ребята, так что, как осуществить через куки? Подскажите хоть ход мысли)

Спустя 13 минут, 55 секунд (5.04.2010 - 15:11) glock18 написал(а):
чтобы меня неправильно не поняли. пост выше был внутри тегов <сарказм>. только они не напечатались почему то. а почему, а потому что хранить множественные данные в одной ячейке таблицы плохо. думаю, что попов примерно так же сделал бы.

Спустя 2 минуты, 50 секунд (5.04.2010 - 15:14) revaninfo написал(а):

$votes = explode(",", $_COOKIE['votes']);

if (in_array($id, $votes)) {
setcookie('votes',$_COOKIE['votes'].','.$id,time()+3600*24*30*3,"/", '.domain.com');
// Добавляешь там голоса или что тебе еще нужно
}

Спустя 2 минуты, 7 секунд (5.04.2010 - 15:16) revaninfo написал(а):
Цитата
чтобы меня неправильно не поняли. пост выше был внутри тегов <сарказм>. только они не напечатались почему то. а почему, а потому что хранить множественные данные в одной ячейке таблицы плохо. думаю, что попов примерно так же сделал бы.


А чем плохо? Я знаю, можно сделать еще одну таблицу, к ней присоеденить id новости или чего там, и ip адрес, потом использовать те две таблицы, и выполнять в два раза больше запросов

Спустя 4 минуты, 21 секунда (5.04.2010 - 15:21) shmit написал(а):
Цитата (revaninfo @ 5.04.2010 - 12:14)

$votes = explode(",", $_COOKIE['votes']);

if (in_array($id, $votes)) {
setcookie('votes',$_COOKIE['votes'].','.$id,time()+3600*24*30*3,"/", '.domain.com');
// Добавляешь там голоса или что тебе еще нужно
}

Жесть, я вообще не чехлю куда это даже втулить, ладно всем спасибо, буду разбираться.

Спустя 11 минут, 17 секунд (5.04.2010 - 15:32) revaninfo написал(а):
Да и еще перед in_array поставь "!" ато я забыл smile.gif

Спустя 7 минут, 12 секунд (5.04.2010 - 15:39) twin написал(а):
Ну поехали по порядку. Вот это для чего, как ты считаешь? Там Жэка не рассказывал?]

<?
if (isset($_POST['score']))
{
$score = $_POST['score'];
}

if (isset($_POST['id']))
{
$id = $_POST['id'];
}

Спустя 9 минут, 32 секунды (5.04.2010 - 15:49) shmit написал(а):
twin, рассказывал, это мы передаем из формы методом пост (score,id) и некоторые серверы не поддерживают метод пос по этому мы присваиваем к переменной.

Спустя 3 минуты, 51 секунда (5.04.2010 - 15:53) revaninfo написал(а):
Это что за сервера такие? smile.gif

Спустя 15 минут, 33 секунды (5.04.2010 - 16:08) glock18 написал(а):
Цитата (shmit @ 5.04.2010 - 12:49)
twin, рассказывал, это мы передаем из формы методом пост (score,id) и некоторые серверы не поддерживают метод пос по этому мы присваиваем к переменной.


огого, давай поподробнее отсюда smile.gif

Спустя 3 минуты (5.04.2010 - 16:11) shmit написал(а):
Если мы передаем из формы переменные методом пост, то некоторые сервера (хосты) не передают, так он говорил, по этому нужно такую комбинацию делать, чтобы наверняка переменные дошли к обработчику.

Спустя 2 минуты, 58 секунд (5.04.2010 - 16:14) revaninfo написал(а):
shmit, меньше слушай таких "мегамастеров"
glock18, ответь мне на мой вопрос, интересно же

смит тебе вопросы :


if (!$result)
{
echo "<p>Запрос на выборку данных из базы не прошел. Напишите об этом администратору admin@ruseller.com. <br> <strong>Код ошибки:</strong></p>";
exit(mysql_error());
}


на кой черт эта конструкция?


if ($update)
{
echo "<html><head>
<meta http-equiv='Refresh' content='0; URL=view_post.php?id=
$id'>
</head></html>"
;
exit();

}


}


else
{
echo "<p>Информация по запросу не может быть извлечена в таблице нет записей.</p>";
exit();
}


Что еще интереснее, зачем вот эта пародия?

Спустя 5 минут, 28 секунд (5.04.2010 - 16:20) twin написал(а):
Ну то, что он там чушь несет несусветную никто и не сомневался. smile.gif
Поставь первой строчкой скрипта вот это:
   error_reporting(E_ALL);

Спустя 2 минуты, 1 секунда (5.04.2010 - 16:22) shmit написал(а):
На счет первого я знаю что оно нафиг не нужно, мне уже обьяснили как и что, просто я ещё здесь его не изменил, а вот по поводу второй цитаты ничего сказать не могу, поскольку я не знаю как по другому реализовать обновление страницы.

Спустя 3 минуты, 20 секунд (5.04.2010 - 16:25) twin написал(а):
Он имел ввиду register_globals скорее всего. Мол если отключено, то POST. Только то, что POST есть в любом случае подикась и сам недогнал smile.gif

shmit, поставил строчку?

Спустя 3 минуты, 32 секунды (5.04.2010 - 16:29) revaninfo написал(а):
Я не имею ввиду обновление, вот смотри, почему бы не сделать так:

Вместо:

$result = mysql_query("SELECT rating,q_vote FROM ".safety8." WHERE id='$id'",$db);

if (!$result)
{
echo "<p>Запрос на выборку данных из базы не прошел. Напишите об этом администратору admin@ruseller.com. <br> <strong>Код ошибки:</strong></p>";
exit(mysql_error());
}



$result = mysql_query("SELECT rating,q_vote FROM ".safety8." WHERE id='$id'",$db) or die(mysql_error());


Вместо:

$update = mysql_query("UPDATE date SET rating = '$new_rating', q_vote = '$new_q_vote' WHERE id='$id'",$db);

if ($update)
{
echo "<html><head>
<meta http-equiv='Refresh' content='0; URL=view_post.php?id=
$id'>
</head></html>"
;
exit();

}


}


else
{
echo "<p>Информация по запросу не может быть извлечена в таблице нет записей.</p>";
exit();
}



$update = mysql_query("UPDATE date SET rating = '$new_rating', q_vote = '$new_q_vote' WHERE id='$id'",$db) or die(mysql_error());
header ("Location: view_post.php?id=$id");

Спустя 7 минут, 50 секунд (5.04.2010 - 16:36) glock18 написал(а):
Цитата (revaninfo @ 5.04.2010 - 12:16)
А чем плохо? Я знаю, можно сделать еще одну таблицу, к ней присоеденить id новости или чего там, и ip адрес, потом использовать те две таблицы, и выполнять в два раза больше запросов


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

1. тип поля text. раз записей там может быть много, то длина поля должна быть достаточно большой чтобы все их вместить

2. сбор статистики превращается в нечто сильно напоминающее индусский код. потому что по-человечески рейтинг из этой массы чисел в одном поле посчитать ресурсо-экономично будет достаточно геморно.

3. поиск ip среди проголосовавших - в большинстве случаев приведет либо к тому, что часть из них не удастся найти (смогут проголосовать еще), либо к жестким выражениям в sql, которые будут фиксить эту проблему.

Спустя 5 минут, 12 секунд (5.04.2010 - 16:42) shmit написал(а):
revaninfo , спасибо за подсказку. ЕСЛИ БЫ Я ЗНАЛ Я Б ТАК И СДЕЛАЛ, ОБЯЗАТЕЛЬНО))


Спустя 1 минута, 51 секунда (5.04.2010 - 16:43) shmit написал(а):
glock18 , насколько я понял, ip не катит, значит нужно по кукам делать проверку?

Спустя 48 секунд (5.04.2010 - 16:44) revaninfo написал(а):
1. Не вижу ничего плохого в типе text
2. Вы будете ip адреса собирать? Почему не сделать int поле, куда будем добавлять количество голосов?
3. Почему нельзя будет найти, и что за выражения sql?

Спустя 19 минут, 21 секунда (5.04.2010 - 17:04) glock18 написал(а):
Цитата (revaninfo @ 5.04.2010 - 13:44)
2. Вы будете ip адреса собирать? Почему не сделать int поле, куда будем добавлять количество голосов?


а кто как проголосовал? данные потеряются. если складывать их в виде суммы в одно поле, то в общем то это нормально. но и то, только если допустимо пойти на такие ограничения.

Цитата (revaninfo @ 5.04.2010 - 13:44)
1. Не вижу ничего плохого в типе text

а этого очень много. особенно если по нему вести выборку

Цитата (revaninfo @ 5.04.2010 - 13:44)
. Почему нельзя будет найти, и что за выражения sql?

вопрос из разряда того же, что и выше.

Спустя 1 час, 2 минуты, 45 секунд (5.04.2010 - 18:06) HardWoman написал(а):
Я так понимаю задача стоит не в голосовании, а анкетировании и выводе статистики по результатам анкетирования.

Спустя 5 часов, 22 минуты, 44 секунды (5.04.2010 - 23:29) shmit написал(а):
Задача стоит в ограничении голосовать.

Спустя 3 дня, 4 часа, 46 минут, 22 секунды (9.04.2010 - 04:15) shmit написал(а):
Подскажет кто-то как можно решить эту проблему?

Спустя 2 дня, 10 часов, 4 минуты, 59 секунд (11.04.2010 - 14:20) moskitos80 написал(а):
Я например сделал так - не знаю правильно или нет (гуру php - не пинайте сильно: я ведь тоже ещё учусь... ) В начале страницы стартуется сессия с именем зашифрованным посредством md5 - IP голосующего. Потом, когда пользователь проголосовал его перекидывает по ссылке на новую страницу, где тоже стартуется сессия при таких же условиях(т.е. на сколько я помню если файл сессии с таким именем существует, то мы имеем переменные из него, если нет создается новый файл, но в данном случае нам важна привязка имени сессии к ip. Причем серверная переменная: REMOTE_ADDR - мне показывала иенно МОЙ IP - даже при подключении через "анонимайзер"!) в сессии создаётся массив, в который заносится идентификатор сотрудника за которого проголосовали - страница на которую перекидывает голосующего - это по сути контроллер, который пробегает по массиву сессии, в котором должны храниться id сотрудников, за которых проголосовали с данного ip, и если за этого сотрудника уже голосовали, то выводится соответствующая инфа и ссылка "назад" без зачёта баллов. Если за этого сотрудника, с этого ip не голосовали, то баллы засчитываются, выводиться фотка со "спасибо" и тоже ссылка "назад". Минус этого метода это то что сессии не вечны и по прошествии установленного времени они уничтожаются, как я понимаю, что бы их не набралось в итоге туева куча. Но по идее, если пользователь (или сам сотрудник ) попытается сразу проголосовать еще раз - его отфутболит. В любом случае "накрутка" рейтинга будет затруднена - временем жизни сесии. Не каждый догадается, что допустим через 30 мин, или сколько там сессиям - админы сервера жить разрешили - можно будет проголосовать еще раз... Я в процессе обучения написал целую автономную систему рейтинга - с установщиком, защищённой панелью администрирования, фронтендом короче её установить сможет даже полный чайник - и использовать тоже, можно добавлять - удалять - редактировать админов, сотрудников - их фотки, высказывания... и пр. Есть не хитрый дизайн и защита на случай если тебя кинул работадатель - уничтожение одного из важных файлов посредством ввода секретного слова в адресной строке biggrin.gif - Если интересно могу поделиться ею, и объяснить если что будет не понятно. - Она кстати протестирована на реальном сервере. Спросите зачем буду делиться по сути готовым продуктом? - Просто у меня нет друзей, с которыми можно пообщаться на тему программинга. А так вдруг появится друг... с которым можно вместе преодолевать трудности изучения программирования.
Пиши если нужна моя разработка...

Спустя 12 часов, 57 минут, 40 секунд (12.04.2010 - 03:18) shmit написал(а):
moskitos80, спасибо за помощь, честно говоря мне не нужен такой хитрый механизм который ты написал, мне лишь бы ограничить пользователей от накрутки рейтинга, скоро мы обьявляем конкурс, накрутке не миновать, вот и решил каким- то образом ограничить голосования, ты бы не мог обьяснить работу с сессиями и привязки их к ip, я просто не совсем понимаю принцип работы. спасибо

Спустя 5 часов, 53 минуты, 6 секунд (12.04.2010 - 09:11) moskitos80 написал(а):
Всё довольно просто - когда пользователь запускает сценарий голосования в самом начале скрипта стартуем сессию с заданием ей имени которое будет md5 хэшом IP - пользователя:

session_name(md5(strval($_SERVER['REMOTE_ADDR'])));
session_start();

Теперь допустим пользователь проголосовал нажав на цифирь, допустим "5" под сотрудником "Василий", а цифирь - являяется ссылкой в которой зашито id - Васи и количество баллов "5". Пользователя переносит на другую страницу, в скрипте которой в самом начале то же самое:

session_name(md5(strval($_SERVER['REMOTE_ADDR'])));
session_start();

Далее: ситуация развивается следующим образом:
1. скрипт проверяет сессию на наличие массива допустим: $empl, если его не существует создаёт его и заносит туда значение id сотрудника, и зачисляет сотруднику баллы.
2. Если массив $empl - существует скрипт смотрит его циклом сравнивая значения с переданным ранее по ссылке id - Васи, если значение найдено то выводим какое нибудь сообщение типа "Вы уже голосовали за этого сотрудника", ссылку на предыдущую страницу, баллы не зачисляем.
3. Если массив $empl - существует скрипт смотрит его циклом и не находит совпадений то зачисляем баллы, записываем значение id в массив и отправляем пользователя на пред. страницу.
Всегда когда пользователь заходит голосовать, сервер сначала будет искать файл сесии с именем md5 его IP. Если он есть на сервере, то этот файл вступает в работу и там будет и массив с id сотрудников за которых он проголосовал. Если такого файла нет (пользователь пришёл впервые) то такой файл создаётся.
Теперь надеюсь вроде понятно объяснил smile.gif
PS
Жизнь сессиям можно увеличить следующтим образом:
1 - создаём файл php.ini в корне своего сайта и прописываем в нём:

session.gc_maxlifetime = 10800
session.cookie_lifetime = 10800

Где 10800 - это время в секундах, в данном случае 3 часа - выставишь скока надо. Вторая строка - точно не помню, возможно она относится к кукам
2 - создаём файл .htaccess в корне своего сайта и прописываем в нём:

php_value session.gc_maxlifetime 10800
php_value session.cookie_lifetime 10800

по аналогии сверху.
- Удачи.
PPS
Плюс работы с сессиями - это то, что нам плевать на выключенные куки у пользователя smile.gif - такое тоже бывает.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.