Нужно дать возможность незарегистрированым пользователям голосовать за статью
Совсем не актуально.....................
Это кому как
al955, проверьте в базе данных что там записалось id пользователя = 0 или i адрес.
В какой таблице это посмотреть?
item_id это id статьи.
После того как вы под гостем проголосовали за статью, можно посмотреть что в поле user_id
как я понял автор хака, предлагает для гостей вместо user_id записывать ip адрес, что бы другой гость с другим ip мог тоже голосовать. Если у вас там 0 то вероятно по каким то причинам туда записался 0 id гостя и другой гость не может проголосовать. Если там ip то вероятно проблема в том, что пытаетесь проголосовать повторно с того же ip
cms_ratings
item_id это id статьи.
После того как вы под гостем проголосовали за статью, можно посмотреть что в поле user_id
как я понял автор хака, предлагает для гостей вместо user_id записывать ip адрес, что бы другой гость с другим ip мог тоже голосовать. Если у вас там 0 то вероятно по каким то причинам туда записался 0 id гостя и другой гость не может проголосовать. Если там ip то вероятно проблема в том, что пытаетесь проголосовать повторно с того же ip
Посмотрел. Везде где голосовали гости, в поле user_id стоит 0
ну тогда логично, что другой гость (а у него тоже id 0 ) не может проголосовать.Посмотрел. Везде где голосовали гости, в поле user_id стоит 0
Проверьте верно ли вы сделали правки в lib.karma.php
По моему, вот это
if(cmsAlreadyKarmed($target, $item_id, $inUser->id)){ return false; } //вставляем новый голос $sql = "INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ('$item_id', '$points', '$ip', '$target', '{$inUser->id}', NOW())";
Нужно заменить на это
if ($inUser->id){ if(cmsAlreadyKarmed($target, $item_id, $inUser->id)){ return false; } //вставляем новый голос $sql = "INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ('$item_id', '$points', '$ip', '$target', '{$inUser->id}', NOW())"; } else { if(cmsAlreadyKarmed($target, $item_id, $ip)){ return false; } //вставляем новый голос $sql = "INSERT INTO cms_ratings (item_id, points, ip, target, user_id, pubdate) VALUES ('$item_id', '$points', '$ip', '$target', '$ip', NOW())"; }
По идее, для гостя должен писаться его ip, только вместо 127.0.0.0 запишется как 127000
И тогда с другого ip можно голосовать
Остальную часть правок в других файлах я не изучал. Как я понял проблема у вас только здесь.
Не проверял.
Только при таком подходе, если вы выводите или в будущем попытаетесь выводить список пользователей, кто голосовал за статью, возникнет путаница, так как будет по ip которое записывается в user_id искать пользователя с таким id. Это стоит сразу иметь ввиду
Понятно. Но этого я делать не планирую
только вместо 127.0.0.0 запишется как 127000
Не совсем так. Вместо 127.0.0.0 запишется 2130706433. Там есть функция, обрабатывающая айпи. php.net/ip2Long
Так что перед инсертом советую обработать айпи.
$ip = sprintf('%u', ip2long($ip));
Спасибо за помощь!
UPDATE `cms_ratings` SET `user_id`= '' WHERE `user_id` = '127000';
сначала бэкап таблицы
Вообще то глядя на это, ещё одна мысль.
Если когда нибудь у вас будет пользователь с таким же id как записанный ip, то он не сможет проголосовать потому что уже проголосовал)
Хотя вряд ли конечно id пользователя будет таким же длинным числом как ip, но если у вас 100000 пользователей и выше…