Помогите пожалуйста, немогу настроить свой скрипт голосования.

  • Автор темы BeatBox
  • Дата начала

BeatBox

Guest
Помогите пожалуйста, немогу настроить свой скрипт голосования.

Здравствуйте.
я пишу сейчас код голосования. вот сам код:
http://phpclub.ru/paste/369
отдача голоса происходит по ссылке:

http://www.site.com/vote.php?act=game&vote_id=АЙДИШНИК_СТАТЬИ&vote_mark=ОЦЕНКА_1-10

Впринципе голоса записываються нормально. но я никак немогу настроить так, чтобы если юзер уже голосовал за эту статью, то чтобы он не мог голосовать заново.

Помогите пожалуйста

-~{}~ 07.03.05 21:15:

Тоесть если существует уже поле где
vote_id='$game_id', vote_act='games', user_voted='$user' то чтобы заново не записывало повторный результат.
(значение $game_id береьтся из ссылки а в ссылку оно попадает во время формирования страницы статьи).

-~{}~ 07.03.05 21:20:

можно ли составить такой запрос в бд. который проверит существет ли поле 'WHERE vote_id='$game_id', vote_act='games', user_voted='$user' если существует то...?
 

uchenik

Новичок
В чем проблема?

Первым запросом проверяешь голосовал ли данный юзер. Если нет - вторым запросом добавляешь голос.
 

BeatBox

Guest
Просто как будет выглядеть запрос? Если
Select 'user_voted' from ..... то таких полей в таблице немерянно, он же не один голосовал. я поэтому и спрашиваю - я немного недогоняю :(
 

CDParker

Guest
А у тебя для каждой статьи типа своя таблица дл голосования ? Тогда нужно временную табличку завести и в неё хранить проголосовавшых.
 

uchenik

Новичок
BeatBox

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

Отвечать на миллион твоих элементарных вопросов по-моему глупо. Эти вопросы просто отпадут, когда ты прочитаешь пару глав из Дюбуа.

Конкретно по твоей голосовалке - писал её полный лопух в MySQL, потому что заводить для каждой статьи свою таблицу нормальный человек не будет.
 

BeatBox

Guest
uchenik там не таблица заводитться а создаеться поле.
Пожалуйста скажи как мне исправить дубль голосоа от нескольких. Оченб нужно. Это можно сказать единственная весомая вещь, которая непозволяет мне сдать сайт к сроку :(
Или, если не тяжело, может подскажете, как лучше исправить этоткод голосования? Хотя пока что мне бы просто убрать возможность два раза голосовать и я буду счастлив! :)
 

SelenIT

IT-лунатик :)
BeatBox
Ты уже практически сформулировал нужное тебе условие для WHERE. Осталось всего ничего - подставить его в SELECT и посчитать число записей, соответствующих этому условию. Если оно больше 0 - значит, юзер уже голосовал, если равно нулю - голосует впервые.

Далее см. ответ uchenikа.
 

uchenik

Новичок
Зачем писать такую хитрую конструкцию в запросах к базе данных
PHP:
from ".$prefix."_vote
если результаты голосования хранятся в 1 таблице?

-~{}~ 08.03.05 00:26:

Еще поражает сумашедшая конструкция в начале скрипта:

if()
elseif
......

которая заменяется парой строчек НОРМАЛЬНОГО кода.
 

SelenIT

IT-лунатик :)
Бр-р... взглянул на код - чуть кондратий не хватил....
BeatBox
зачем этот чудовищный if-elseif в начале каждой функции, если в каждой его ветви переменной $mc присваивается единица, а $vote_mark умножается на 10 (или, что то же самое, дополняется нулем в конце)?

Если же нужно проверить, что $vote_mark принадлежит множеству допустимых значений - для этого есть [m]in_array[/m]...
 

BeatBox

Guest
SelenIT
Здравствуйте снова :)
SelenIT, uchenik, - смотрите. я кажеться сделал.. и даже вроде бы все работает.. просто пришлось сделать цикл.
Теперь вопрос - как лучше переделать саму эту голосовалку? я изучил несколько скриптов, и в них во всех так же голоса учитываються - создаеться по 1 дополнительному полю за каждый голос.
пс
Посмотрите пожалуйста, правильно ли я сделал:
PHP:
cookiedecode($user);
$username = $cookie[1];
$vote_id = stripslashes($vote_id);
$sql = "SELECT user_voted FROM ".$prefix."_vote WHERE vote_id='$vote_id' AND vote_act='game'";
$result2 = $db->sql_query($sql);
while($rowvote2 = $db->sql_fetchrow($result2)){
$uservtd = $rowvote2['user_voted'];
}
if ($username!==$uservtd) {
$vote_mark = intval($vote_mark);
$uname_voted = $username;
$db->sql_query("INSERT INTO ".$prefix."_vote (vote_act, vote_mark, vote_id, user_voted) VALUES ('game', '$vote_mark', '$vote_id', '$uname_voted')");
echo "<script>javascript:history.go(-1)</script>";
}
//Uje progolosoval!
echo "<script>javascript:history.go(-1)</script>";
}
-~{}~ 08.03.05 00:33:

SelenIT
поясню зачем мне там if-elseif
- дело в том что пользщователи могут давать оценку только от 1 до 10 баллов. Каждый из этих результатов заменеться на умноженное * 10, и также, если оценка "правильна" то присваеваеться $mc - я подразумевал словосочетание mark correct. Тоесть если кто-то шибко грамотный введет в ссылку скажем оценку на 5, а 5,2 или -1 или 0 или 11 и т.п. - $mc уже не будет единицей. и голос не засчитаеться ;)
 

uchenik

Новичок
PHP:
"SELECT user_voted FROM ".$prefix."_vote WHERE vote_id='$vote_id' AND vote_act='game'";
Что по-твоему должен вернуть этот запрос?

-~{}~ 08.03.05 00:35:

:) :) :)

Про mark correct ты написал шикарно. :) :)
 

SelenIT

IT-лунатик :)
Конечно неправильно.

Во-первых, тут ты выбираешь всех проголосовавших юзеров, но текущего сравниваешь только с последним из выбранных.

Во-вторых, так делать нерационально в принципе. Зачем тебе выбирать из базы всех юзеров, когда тебе важно знать только, есть ли в ней текущий?
 

BeatBox

Guest
хм.. а если убираю цикл, и оставляю
PHP:
cookiedecode($user);
$username = $cookie[1];
$vote_id = stripslashes($vote_id);
$sql = "SELECT user_voted FROM ".$prefix."_vote WHERE vote_id='$vote_id' AND vote_act='game'";
$result2 = $db->sql_query($sql);
$rowvote2 = $db->sql_fetchrow($result2);
$uservtd = $rowvote2['user_voted'];
if ($username!==$uservtd) {
$vote_mark = intval($vote_mark);
$uname_voted = $username;
$db->sql_query("INSERT INTO ".$prefix."_vote (vote_act, vote_mark, vote_id, user_voted) VALUES ('game', '$vote_mark', '$vote_id', '$uname_voted')");
echo "<script>javascript:history.go(-1)</script>";
}
echo "<script>javascript:history.go(-1)</script>";
}
то дубляжи принимаються :(
 

SelenIT

IT-лунатик :)
BeatBox

добавь еще одно условие в SELECT. Ты даже уже приводил пример правильного условия - в самом начале топика.
 

BeatBox

Guest
О! да блин конкретно протупил! Я же в селекте мог сразу указать какого мы юзера ищем.. просто я думал что если этого юзера там неокажеться. то весь селект облометься и код перестанет работать. Вот кажется так работает:
PHP:
cookiedecode($user);
$username = $cookie[1];
$vote_id = stripslashes($vote_id);
$sql = "SELECT user_voted FROM nuke_vote WHERE user_voted='$username' AND vote_id='$vote_id' AND vote_act='game'";
$result2 = $db->sql_query($sql);
$rowvote2 = $db->sql_fetchrow($result2);
$uservtd = $rowvote2['user_voted'];
if ($username!==$uservtd) {
$vote_mark = intval($vote_mark);
$uname_voted = $username;
$db->sql_query("INSERT INTO nuke_vote (vote_act, vote_mark, vote_id, user_voted) VALUES ('game', '$vote_mark', '$vote_id', '$uname_voted')");
echo "<script>javascript:history.go(-1)</script>";
}
 

SelenIT

IT-лунатик :)
Чтобы код не обламывался:
PHP:
$sql = "SELECT COUNT(user_voted) AS voted FROM nuke_vote WHERE user_voted='$username' AND vote_id='$vote_id' AND vote_act='game'";
$result2 = $db->sql_query($sql);
$rowvote2 = $db->sql_fetchrow($result2);
$uservtd = $rowvote2['voted'];
if (0 == $uservtd) {
// добавление голоса
Надеюсь, разберешься без дополнительных пояснений?
 

BeatBox

Guest
SelenIT
да разобрался, спасибо! Нужно будет действительно книгу купить. :)
А что скажете по самому голосованию? Нормально сдлеано?
 

SelenIT

IT-лунатик :)
Если работает - пусть себе работает.
А на вопрос "нормально сделано или нет" попробуй ответить сам после прочтения книги)
 

BeatBox

Guest
ну скажем так - не загнуться ли БД, если предположить что всего будет (в течение года) около 4000 материалов, за которые можно голосовать, и за каждый из них в среднем проголосуют 250-300 раз? :)
тоесть будет в той таблице 1200000 записей.
 

SiMM

Новичок
BeatBox, я думаю в течении года ты книжку вполне осилишь. И сам сможешь решить, что будет и как надо.
 
Сверху