Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#76 2011-10-17 08:17:04

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

vitaly пишет:

Wolverine, проблема в том, что полный список ID'шников ты узнаёшь в самом конце smile
Мысли на самом деле есть, возможно успею сделать до релиза smile

По идее можно сделать в showlist не     

foreach ($mysql->select($query['result']) as $row) {
		$i++;
		$nCount++;

а

$blablabla = $mysql->select($query['result']); # запихивам информацию о всех новостях

в global пишем ID'шники 

foreach($blablabla as $row) $global_var[] = $row['id'];

а дальше уже проходиться по каждой новости, генерируя её отображение, но в каждом вызове showNews уже будет доступна $global_var

foreach ($blablabla as $row) {
		$i++;
		$nCount++;

Не в сети

#77 2011-10-19 08:55:26

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

vitaly пишет:

Доступна для скачивания версия 0.9.3 Release Candidate 1 [SVN 856]

Ооо, это хорошо smile
vitaly, а список ID'шников всех новостей на странице в RC 1, до загрузки плагинов никак не получить?
Не реализовал ты эту фичу?
А то у меня уже функция почти готова, ей нужен только глобальный массив со всеми ID'шниками новостей на текущей странице, она делает один запрос и записывает в глобальный массив ID всех новостей за которые юзер голосовал, а при последующем обращении к функции запрашиваемый ID новости, не ищется в БД делая лишний запрос и создавая нагрузку, а ищется в глобальном массиве. Ну как-то так tongue

Изменено ikv777vlg (2011-10-19 08:56:13)

Не в сети

#78 2011-10-19 09:59:19

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

А вот, собственно обновленный код, который заменяет старую функцию ipcheck():

global $ip, $mysql, $userROW, $rating_array; /* в $list_id массив со всеми News ID  на странице */  global $list_id; $list_id =array(7,5,2,1,6);


if(is_array($list_id) && count($list_id)){  // проверяем что $list_id  - это массив, в нем что-то есть =)
for ($a = 1; $a <= count($list_id); $a++) {
$out_db=$out_db."news_id='".$list_id[$a-1]."' or ";  // создаем кусок запроса к БД: "news_id=xx or news_id=xx ...."
 }
$rating_out_db=$mysql->select("select news_id from  ".prefix."_rating WHERE (user_id='".intval($userROW['id'])."' or ip=".db_squote($ip).") and (".substr($out_db, 0, strlen($out_db)-3).")"); // ищем все новости из списка ID`шников, за которые голосовал этот IP
for ($a = 1; $a <= count($rating_out_db); $a++) {
$rating_array[$a]=$rating_out_db[$a-1]['news_id'];  // создаем массив (глобальный) с ID`шниками новостей за которые голосовал этот IP
 }
}


/* А эта функция, теперь тупо ищет ID запрашиваемой новости в глобальном массиве и возвращает true или false,
в зависимости от того, найдет ли в массиве ID запрашиваемой новости. Параметр $upd - как обычно, позволяет записать
голос в БД + удалить старые записи  из БД(если прошло 24 часа после прошлого удаления)
*/
function ipcheck ($news_id, $upd) { 
global $rating_array, $ip, $mysql, $userROW;
if(is_array($rating_array)){
$temp=intval(array_search($news_id, $rating_array));
}
if (is_array($rating_array) && isset($temp) && $temp) {
return true; // возвращаем скрипту истину - этот IP уже голосовал за новость
} else {
// не найдено - можно голосовать
if($upd) {
/* Сохраняем голос в базу данных : START */
$mysql->query("INSERT INTO ".prefix."_rating set user_id='".intval($userROW['id'])."', vote_date=".time().", ip=".db_squote($ip).", news_id=".db_squote($news_id));
/* Сохраняем голос в базу данных : END */
/* Удаляем старые записи : START */
if(intval(pluginGetVariable('rating', 'last_clear')) <= time()) {  // проверяем промежуток времени очистки таблицы
$mysql->query('DELETE FROM `'.prefix.'_rating` WHERE `vote_date` < '.(time()-5184000).';'); // удаляем старые записи
pluginSetVariable('rating', 'last_clear', (time()+86400));
pluginsSaveConfig();
}
/* Удаляем старые записи : END */
}
return false; // возвращаем скрипту ложь - этот IP еще не голосовал за новость
}
}

и оно как-то работает big_smile
с условием того что $list_id - это глобальный массив со всеми идентификаторами новостей на текущей странице, и скрипт должен получить его в самом начале...

Не в сети

#79 2011-10-19 10:15:54

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Жесть конечно

if(is_array($list_id) && count($list_id)){  // проверяем что $list_id  - это массив, в нем что-то есть =)
for ($a = 1; $a <= count($list_id); $a++) {
$out_db=$out_db."news_id='".$list_id[$a-1]."' or ";  // создаем кусок запроса к БД: "news_id=xx or news_id=xx ...."
 }
$rating_out_db=$mysql->select("select news_id from  ".prefix."_rating WHERE (user_id='".intval($userROW['id'])."' or ip=".db_squote($ip).") and (".substr($out_db, 0, strlen($out_db)-3).")"); // ищем все новости из списка ID`шников, за которые голосовал этот IP
for ($a = 1; $a <= count($rating_out_db); $a++) {
$rating_array[$a]=$rating_out_db[$a-1]['news_id'];  // создаем массив (глобальный) с ID`шниками новостей за которые голосовал этот IP
 }

вместо этого можно написать

$ids = array();
foreach($list_id as $id)
  $ids[] = "news_id = {$id}"; 

$rating_out_db=$mysql->select("select news_id from  ".prefix."_rating WHERE (user_id='".intval($userROW['id'])."' or ip=".db_squote($ip).") and (".implode(' OR  ', $ids).")");

$rating_array = array();
foreach($rating_out_db as $id)
  $rating_array[] = $id;

Не в сети

#80 2011-10-19 10:20:51

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Обновил выше весь кусок

Не в сети

#81 2011-10-19 10:22:01

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Wolverine пишет:

Обновил выше весь кусок

OK, спасибо, изучаю smile

Не в сети

#82 2011-10-19 10:23:28

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Wolverine пишет:

о можно написать

$ids = array();
foreach($list_id as $id)
  $ids[] = "news_id = {$id}"; 
...

А если $list_id не определён или в нём какая-то фигня? Будут варнинги smile
Так что проверка с is_array() крайне желательна.

Не в сети

#83 2011-10-19 10:37:50

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

vitaly пишет:
Wolverine пишет:

о можно написать

$ids = array();
foreach($list_id as $id)
  $ids[] = "news_id = {$id}"; 
...

А если $list_id не определён или в нём какая-то фигня? Будут варнинги smile
Так что проверка с is_array() крайне желательна.

Это да, тоже надо, так и делал по началу . Тем-более не внутри функции, мало-ли когда rating.php выполнится.
А мой вопрос остается в силе, как этот самый $list_id получить... smile

Не в сети

#84 2011-10-19 10:38:20

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

vitaly, is_array оставить конечно

Правда function ipcheck будет работать кривовато в итоге при таком подходе, на главной странице или в любом месте где выводится список новостей через news_showlist все будет ОК, а вот в полной новости список $list_id мы уже не будем иметь на руках. Так что нужно проверять еще в showNews если новость короткая, то есть $mode['style'] == 'short' , то использовать глобальный массив, который мы надеемся заполнен, а если полная ( $mode['style'] == 'full' ), то нужно делать другой запрос к таблице рейтига самостоятельно.

Не в сети

#85 2011-10-20 16:21:30

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Игнорируете меня уже? И за что, если не секрет? Что не так?! yikes

Не в сети

#86 2011-10-20 23:05:58

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Раз никто не отвечает, вопрос задавал 2 раза, от безысходности я полез в news.php и нашел ответ на свой вопрос... Всё понятно smile

Далее...

Wolverine пишет:
vitaly пишет:

Wolverine, проблема в том, что полный список ID'шников ты узнаёшь в самом конце smile
Мысли на самом деле есть, возможно успею сделать до релиза smile

По идее можно сделать в showlist не     

foreach ($mysql->select($query['result']) as $row) {
		$i++;
		$nCount++;

а

$blablabla = $mysql->select($query['result']); # запихивам информацию о всех новостях

в global пишем ID'шники 

foreach($blablabla as $row) $global_var[] = $row['id'];

а дальше уже проходиться по каждой новости, генерируя её отображение, но в каждом вызове showNews уже будет доступна $global_var

foreach ($blablabla as $row) {
		$i++;
		$nCount++;

А кстати этот способ работает smile
И в news_showone() тоже можно id получить, а почему нет? smile Проверил, всё работает на главной и в категориях, мы имеем полный список ID`шников новостей, и при просмотре полной новости мы имеем в $list_id[0] - ID полной новости.

[ 0.0003 ] select * from `ng_category` order by posorder asc
[ 0.0003 ] select * from ng_users where authcookie = '31bc5f0c2354144ef5d3ab2823c9b5b7' limit 1
[ 0.0005 ] SELECT * FROM ng_news WHERE (`approve` = '1') AND (`mainpage` = '1') order by ratesort desc, postdate desc limit 0,3
[ 0.0002 ] select news_id from ng_rating WHERE (user_id='1' or ip='127.0.0.1') and (news_id=6 or news_id=7 or news_id=2)
[ 0.0002 ] SELECT count(*) as count FROM ng_news WHERE (`approve` = '1') AND (`mainpage` = '1')

Wolverine пишет:

Правда function ipcheck будет работать кривовато в итоге при таком подходе, на главной странице или в любом месте где выводится список новостей через news_showlist все будет ОК, а вот в полной новости список $list_id мы уже не будем иметь на руках. Так что нужно проверять еще в showNews если новость короткая, то есть $mode['style'] == 'short' , то использовать глобальный массив, который мы надеемся заполнен, а если полная ( $mode['style'] == 'full' ), то нужно делать другой запрос к таблице рейтига самостоятельно.

А вот тут я ничего не понял... Работает же, а причем тут showNews, ты мне объясни smile

Не в сети

#87 2011-10-20 23:16:45

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Фильтр вешается на showNews, то есть когда рендерится новость. Ты в полную новость зайди и увидишь все, что нифига рейтинг твой работать не будет smile

Не в сети

#88 2011-10-20 23:27:03

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Wolverine пишет:

Фильтр вешается на showNews, то есть когда рендерится новость. Ты в полную новость зайди и увидишь все, что нифига рейтинг твой работать не будет smile

Я захожу - http://domain_name/категория/новость.html:
SQL queries:
[ 0.0003 ] select * from `ng_category` order by posorder asc
[ 0.0003 ] select * from ng_users where authcookie = '31bc5f0c2354144ef5d3ab2823c9b5b7' limit 1
[ 0.0003 ] select * from ng_news where approve=1 and alt_name='testovaya_novost'
[ 0.0002 ] select news_id from ng_rating WHERE (user_id='1' or ip='127.0.0.1') and (news_id=5)
[ 0.0002 ] update ng_news set views=views+1 where id = '5'

работает же tongue

А в чем подвох тогда?

Не в сети

#89 2011-10-20 23:28:19

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Я уже на подсознательном уровне выдаю правильные решения smile

news_showlist вызывается из showNews, поэтому работает

Не в сети

#90 2011-10-20 23:40:39

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Wolverine пишет:

Я уже на подсознательном уровне выдаю правильные решения smile

Это твое подсознание выдало пост #76?! big_smile Мне бы так smile
А я сначала не стал лезть в news.php а потом уже пришлось, и все получилось tongue

Теперь надо оптимизировать процесс голосования, записи информации в БД, сортировки по рейтингу, и т.д.
Мысли у меня есть по этому поводу... wink

Не в сети

#91 2011-10-21 01:26:04

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Забежал чуть вперед, и сделал в конфиге выбор [IP+UserID+Cookie или UserID+Cookie или Только Cookie] пусть админ сам выбирает делать лишний запрос в БД или нет, и нужна-ли ему вообще защита от накруток, может кукисов будет достаточно, правда в rating.php еще не реализовал, но это будет не трудно сделать с помощью IF'ов smile...

А я вот думаю, наверное еще стоит дать админу выбор, на какой промежуток времени ставить куки в браузер, и через какой промежуток времени стоит удалять голоса пользователей из БД - 1 месяц ... 1 год.
Правильно же? Мало-ли для каких целей может использоваться плагин и движок smile

Не в сети

#92 2011-10-21 08:20:10

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Ага.. А как задать в конфиге плагина значение по умолчанию в выпадающем меню
<select>
  <option>Пункт 1</option>
  <option>Пункт 2</option>
  <option>Пункт 3</option>
</select>
?
По умолчанию, после установки CMS и/или плагина, в extra_get_param($plugin,'PluginVarable') нули, и выбирается первый пункт меню<option>Пункт 1</option>, а как задать другое значение по умолчанию? Чтобы там был не "0", а например "3"?
Возможно такое сделать, или нет?
Если нет, то придется придумывать другое решение..

* пардон, не меню, а элементы списка smile

Изменено ikv777vlg (2011-10-21 08:24:53)

Не в сети

#93 2011-10-21 08:55:47

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

1. extra_get_param не нужно использовать, вместо него pluginGetVariable
2. С использованием тернарного оператора

pluginGetVariable($plugin, 'var') ? pluginGetVariable($plugin, 'var') : '3'

Не в сети

#94 2011-10-21 10:23:52

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Wolverine пишет:

1. extra_get_param не нужно использовать, вместо него pluginGetVariable
2. С использованием тернарного оператора

pluginGetVariable($plugin, 'var') ? pluginGetVariable($plugin, 'var') : '3'

Понял, реализовал. Пришлось кое-чего поменять, но не зря, всё работает.
+ заменил везде в плагине extra_get_param на pluginGetVariable, это после того как я заглянул в файл extras.inc.php:

// OLD
function extra_get_param($module, $var) { return pluginGetVariable($module, $var); }

Если "OLD", то убрать ее надо, хотя тут я промолчу, я же работаю с NG CMS 0.9.2 Release [SVN646] smile
На новую версию пока руки не доходят сайт перенести..

Не в сети

#95 2011-10-21 10:24:58

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Не надо пока ничего убирать smile

Не в сети

#96 2011-10-21 10:39:15

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

А сортировать новости по рейтингу вот так можно - "(rating / votes) desc"? Вроде сортирует... smile
А то я поначалу создавал дополнительное поле, куда записывал итоговый рейтинг, и сортировал по нему, а теперь думаю это поле убрать tongue

Не в сети

#97 2011-10-21 10:41:45

Wolverine
Модератор
Откуда Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3,538
Рейтинг :   160 
Сайт

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Зачем ты спрашиваешь, если уже проверил и убедился что можно? cool

Не в сети

#98 2011-10-21 10:46:44

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

На всякий случай. MySQL - это не халам-балам, тут осторожно надо big_smile
А сортировки по рейтингу на главной странице не было, значит теперь будет. cool

Не в сети

#99 2011-10-21 22:24:20

ikv777vlg
Участник
Откуда Волгоград
Зарегистрирован: 2011-10-10
Сообщений: 137
Рейтинг :   

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

Забавно... Я изменил конфиги и теперь из админки доступна сортировка новостей на главной по (rating / votes) desc и asc.
А вот мне интересно, сортировка новостей в категориях доступна по полю rating, а какой смысл по rating сортировать?
Ведь rating надо же на votes делить, и результат и будет рейтингом, положительным или отрицательным, и по нему сортировать.
Разве нет? roll

Изменено ikv777vlg (2011-10-21 22:26:03)

Не в сети

#100 2011-10-21 22:30:14

vitaly
Администратор
Откуда Россия
Зарегистрирован: 2008-10-08
Сообщений: 2,823
Рейтинг :   118 

Re: Защита от накруток в плагине rating, запись IP-адреса юзера в БД

ikv777vlg, и то верно smile
Это артефакты из прошлого, работой с рейтингом никто всерьёз не занимался.

Не в сети

Подвал раздела

Работает на FluxBB