Вы не зашли.
ikv777vlg, На счет скобок всё правильно.
$userROW['id'] так же как и $ip лучше обернуть, intval($userROW['id']) и db_squote($ip) они являются глобальными и их можно подменить другими значениями с другого плагина и лучше обезопасится.
[hr /]
И по тому что я предлогаю:
$news = array();
foreach ($mysql->select('select * from '.prefix.'_rating') as $row)
{
$news[$row['news_id']] = $row;
}
И делать проверку для каждый новости:
$news[$newsID] = и тут весь массив тех кто голосовал за эту новость;
и через условия проверять.
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
ikv777vlg, На счет скобок всё правильно.
$userROW['id'] так же как и $ip лучше обернуть, intval($userROW['id']) и db_squote($ip) они являются глобальными и их можно подменить другими значениями с другого плагина и лучше обезопасится.
Понятно
Не в сети
ikv777vlg, Я своё сообщение дополнил.
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
И делать проверку для каждый новости:
$news[$newsID] = и тут весь массив тех кто голосовал за эту новость;
и через условия проверять.
А как обеспечишь атомарность операции "добавить проголосовавшего"?
Что будет если двое одновременно проголосуют за новость?
Не в сети
ROZARD пишет:И делать проверку для каждый новости:
$news[$newsID] = и тут весь массив тех кто голосовал за эту новость;
и через условия проверять.А как обеспечишь атомарность операции "добавить проголосовавшего"?
Что будет если двое одновременно проголосуют за новость?
Так это же на вывод для тех кто уже голосовал, при голосовании уже делать проверку. Я привел такой пример чтобы не делать отдельно каждый запрос к каждой новости...
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
ikv777vlg, Я своё сообщение дополнил.
Да я вижу Но непонятно что-то, массив, цикл... Конструкция незнакомая, знаний PHP не хватает ..
Покурю мануал, попробую, отпишусь...
Не в сети
ikv777vlg, Хотя нет, такое не получится, забудь что я написал
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
ikv777vlg, Не получится, для такого нужно чтобы id_новости не повторялся в таблице, а в таблице на одну новость можно прилагаться много проголосовавших...
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
ikv777vlg, Делай лучше через join как vitaly написал. Запрос тогда получится как:
select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='1' and news_id='2' and news_id='5'
Пример реализации есть в плагине lastnews...
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
ikv777vlg, Делай лучше через join как vitaly написал. Запрос тогда получится как:
select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='1' and news_id='2' and news_id='5'
Пример реализации есть в плагине lastnews...
А как понять and news_id='1' and news_id='2' and news_id='5', а если у меня 100 новостей, 500?
А за один раз как по всем новостям пройти, как запрос должен выглядеть? Чувствую такая реализация мне не по силам
Посмотрю что там в lastnews...
Не в сети
ikv777vlg, По всем не нужно проходить, а только по тем новостям которые показались юзеру, если ты конечно по 100 новостей на страницу не показываешь))
xmpp://ngcms@conf.ngcms.ru
Настройка клиента для подключения к конференции
Не в сети
На странице у тебя отображается не 100 новостей, а пять, например. Вопрос в том, как получить список ID этих новостей, отображаемых на данной странице, чтобы засунуть их в глобальную переменную для последующего решения давать голосовать или нет. Вроде как штатно такая информация нигде не содержится...
Не в сети
Вопрос в том, как получить список ID этих новостей, отображаемых на данной странице, чтобы засунуть их в глобальную переменную для последующего решения давать голосовать или нет.
Вот это я и хотел сказать
Не в сети
Надо vitaly спрашивать о внедрении такой возможности в news_showone, которая отображает все новости. Данные нужные там есть, осталось из записать в какую-нить глобальную переменную, типа $SYSTEM_FLAGS
Не в сети
Надо vitaly спрашивать о внедрении такой возможности в news_showone, которая отображает все новости. Данные нужные там есть, осталось из записать в какую-нить глобальную переменную, типа $SYSTEM_FLAGS
А это ключ к успеху
Функция news_showone находится в news.php, нашел я ее, а как она работает, интересно...
Но она большая конечно
Не в сети
Надо vitaly спрашивать о внедрении такой возможности в news_showone, которая отображает все новости. Данные нужные там есть, осталось из записать в какую-нить глобальную переменную, типа $SYSTEM_FLAGS
Ты хотел сказать news_showlist()?
Не прокатит, т.к. новости рендерятся по мере получения данных... хотя.. $mysql->select() ведь сразу всё в память выгружает.
В принципе можно сделать сканирование массива перед отрисовкой данных и всем плагинам сразу же давать список ID новостей, которые будут показаны в этом цикле.
Подумаю над идеей.
Не в сети
Wolverine пишет:Надо vitaly спрашивать о внедрении такой возможности в news_showone, которая отображает все новости. Данные нужные там есть, осталось из записать в какую-нить глобальную переменную, типа $SYSTEM_FLAGS
Ты хотел сказать news_showlist()?
Не прокатит, т.к. новости рендерятся по мере получения данных... хотя.. $mysql->select() ведь сразу всё в память выгружает.
В принципе можно сделать сканирование массива перед отрисовкой данных и всем плагинам сразу же давать список ID новостей, которые будут показаны в этом цикле.
Подумаю над идеей.
Точно. Ради интереса попробовал... Я в news.php в функции news_showlist() объявил глобальную переменную $list_id,
и после
foreach ($mysql->select($query['result']) as $row) {
$i++;
$nCount++;
вставил
$list_id=$list_id.$row['id'].";";
а в начало функции ipcheck() в rating.php вставил
global $list_id;
echo $list_id."<br />";
И за 6 обращений к функции, вывод в браузер получается такой:
1;
1;
1;2;
1;2;
1;2;5;
1;2;5;
по 2 обращения на каждую новость
Vitaly, ты уж придумай что-нибудь
Изменено ikv777vlg (2011-10-16 21:56:14)
Не в сети
И за 6 обращений к функции, вывод в браузер получается такой:
1;
1;
1;2;
1;2;
1;2;5;
1;2;5;по 2 обращения на каждую новость
Вот именно, поэтому у тебя и запросы с дубликатами. Зачем у тебя два раза отрабатывает логика на каждую новость?
Не в сети
ikv777vlg, в твоей реализации полный список новостей ты получаешь на самой последней новости, при этом даже не знаешь какая из них будет последней
А несколько вызовов - скорее всего у тебя активен плагин lastnews или подобный ему, плагины тоже могут использовать (и используют) news_showlist() для своих целей.
Так что смотри значение $callingParams['plugin'] - если там что-то есть, то вызов идёт через плагин и ты можешь сам решать что тебе делать (можно из обработчика твоего плагина сделать сразу же return).
Не в сети
ikv777vlg, в твоей реализации полный список новостей ты получаешь на самой последней новости, при этом даже не знаешь какая из них будет последней
По идее надо делать
global $TemplateCache;
if(!isset($TemplateCache['plugin']['rating']['info']))
$TemplateCache['plugin']['rating']['info'] = получаем_данные_для всех_новостей;
Потом используем здесь же в новости, как if($TemplateCache['plugin']['rating'][$newsID] == true) Ну в зависимости от структуры данных на предыдущем этапе. Нам и знать не надо в какой из новостей получается список, данные получили при первом вызове, а во всех остальные они уже будут доступны без запросов.
Не в сети
Wolverine, проблема в том, что полный список ID'шников ты узнаёшь в самом конце
Мысли на самом деле есть, возможно успею сделать до релиза
Не в сети
ikv777vlg пишет:И за 6 обращений к функции, вывод в браузер получается такой:
1;
1;
1;2;
1;2;
1;2;5;
1;2;5;по 2 обращения на каждую новость
Вот именно, поэтому у тебя и запросы с дубликатами. Зачем у тебя два раза отрабатывает логика на каждую новость?
Долгая история...
Давно еще делал разные блоки голосования для короткой и полной новости, нужно было вывести в шаблон еще одно значение... и функция rating_show($newsID, $rating, $votes) вызывалась 2 раза..
Уже пофиксил, обошелся одним вызовом функции на одну новость, немного в ущерб дизайну(которого нет ), но суть дела не меняет:
1;
1;2;
1;2;5;
или
SQL queries:
[ 0.0003 ] select * from `ng_category` order by posorder asc
[ 0.0002 ] select * from ng_users where authcookie = '599386dbeb6845f459b6e226045a07c3' limit 1
[ 0.0005 ] SELECT * FROM ng_news WHERE (`approve` = '1') AND (`mainpage` = '1') order by ratesort desc, postdate desc limit 0,3
[ 0.0003 ] select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='1'
[ 0.0002 ] select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='2'
[ 0.0002 ] select * from ng_rating where (user_id='1' or ip='127.0.0.1') and news_id='5'
[ 0.0002 ] SELECT count(*) as count FROM ng_news WHERE (`approve` = '1') AND (`mainpage` = '1')
Теперь по одному запросу на новость. Например - если 20 новостей на странице - плюс 20 запросов в БД
Изменено ikv777vlg (2011-10-16 23:54:52)
Не в сети