siv1987 Posted April 16, 2019 Share Posted April 16, 2019 Если отбросить кликбейтное название, то код действительно "интересный" в кавычках естественно. $title = 'theme_'.$topic->tid; if (\IPS\Db::i()->select('*', 'core_sys_conf_settings', 'conf_key="'.$title.'"')->count()) { } else{ \IPS\Db::i()->insert('core_sys_conf_settings', array('conf_key' => $title, 'conf_value' => 0, 'conf_default' => 0, 'conf_app' => 'core')); } if ( !\IPS\Member::loggedIn()->member_id ) { $modPosts = 0; } else { $modPosts = \IPS\Db::i()->select('mod_posts', 'core_members', 'member_id="' . \IPS\Member::loggedIn()->member_id.'"')->first(); } if(\IPS\Db::i()->select('conf_value', 'core_sys_conf_settings', 'conf_key="theme_' . $topic->tid.'"')->first() == 1) { $topicMod = 1; } else { $topicMod = 0; } /* Show topic */ \IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'topics' )->topic( $topic, $comments, $question, $votes, $nextUnread, $pagination, $topicVotes, $topicMod, $modPosts ); Краткое описание.Плагин - Премодерация тем. Перегружен метод manage в классе \IPS\forums\modules\front\forums\topic. Естественно без вызова родителя с полным копированием кода от какой-то неизвестной уже версии. По логике код просто лютый писец. Оставим на совесть автора выбор реализации через manage (оно и понятно почему, человек из другой сферы), и то что он для каждой темы создает отдельную настройку theme_%id в таблице настроек, когда можно было просто указать все ид тем на премодерации в одну настройку. Но логика запросов это лютый треш - запрашиваем, если нету вставляем, потом опять запрашиваем. Он даже умудрился составить запрос на то, что уже есть в \IPS\Member::loggedIn(). Погодите. Далее не менее интересно.Настройка $themes = \IPS\Db::i()->select( array('tid', 'title', 'state'), 'forums_topics'); foreach($themes as $theme) { if($theme['state'] == 'open') { $title = 'theme_'.$theme["tid"]; $form->add( new \IPS\Helpers\Form\YesNo( $title, \IPS\Settings::i()->$title, false, array(), NULL, $theme['title']) ); if (\IPS\Db::i()->select('*', 'core_sys_conf_settings', 'conf_key="'.$title.'"')->count()) { continue; } else{ \IPS\Db::i()->insert('core_sys_conf_settings', array('conf_key' => $title, 'conf_value' => 0, 'conf_default' => 0, 'conf_app' => 'core')); } } } Как видно, здесь выводится весь список тем форума (естественно без пагинации) и, конечно же - селект в цикле. 1 Link to comment Share on other sites More sharing options...
newbie Posted April 17, 2019 Share Posted April 17, 2019 Запрос на запросе сидит и запросом погоняет. Link to comment Share on other sites More sharing options...
Dmitriy427 Posted April 17, 2019 Share Posted April 17, 2019 Да обычное же дело. Мне вот недавно прислали страничку топ-50 персонажей игрового сервера, для примера: // Получаем список $Result = $DB2->Query('SELECT TOP 50 * FROM Character WHERE CtlCode != 32 AND CtlCode != 8 AND CtlCode != 1 '.$Class.' order by MasterResetCount desc, ResetCount desc, cLevel desc'); // Если пусто if ($DB2->NumRows($Result) == 0) { echo '<tr><td colspan="7"><center>'.$Lang['RANKINGS_NULL'].'</center></td></tr>'; } // Инфо о персах while($Info = $DB2->FetchArray($Result)) { ++$Count; // Информация о персонаже $Name = $Info['Name']; $Class = $Engine->GetCharClass($Info['Class'],0); $Level = $Info['cLevel']; $ResetCount = $Info['ResetCount']; $MasterResetCount = $Info['MasterResetCount']; $GetGuild = $DB2->FetchRow($DB2->Query("SELECT G_Name FROM GuildMember where Name = '".$Info['Name']."'")); $Guild = $GetGuild[0]; // Статус $CheckStatus = $DB2->FetchRow($DB2->Query("SELECT ConnectStat FROM MEMB_STAT WHERE memb___id = '".$Info['AccountID']."'")); $GameIDC = $DB2->FetchRow($DB2->Query("Select GameIDC from AccountCharacter where Id = '".$Info['AccountID']."'")); if ($CheckStatus[0] == 1 && $GameIDC[0] == $Info['Name']) { $Status = 'font-weight:bold;color:#65b149;'; } else { $Status = ''; } // Выводим echo '<tbody> <tr> <td align="center" style="width:25px;height:20px;padding-left:1px;padding-right:1px;'.$Status.'">'.$Count.'</td> <td align="center"><a href="char/'.$SelectedServer.'/'.$Name.'">'.$Name.'</a></td> <td align="center">'.$Class.'</td> <td align="center">'.$Level.'</td> <td align="center">'.$ResetCount.'</td> <td align="center">'.$MasterResetCount.'</td> <td align="center"><a href="guild/'.$SelectedServer.'/'.$Guild.'">'.$Guild.'</a></td> </tr> </tbody>'; } Запрашиваем 50 строк и по результатам ещё 150 запросов в цикле... Там где достаточно было двух, и то из-за довольно странной структуры БД и требований к функционалу. Link to comment Share on other sites More sharing options...
siv1987 Posted April 17, 2019 Author Share Posted April 17, 2019 Тут тововарищ решил не усложнять запрос джоинами. ПС.Не понимаю стиль писать в пхп названия переменных заглавной буквой. Link to comment Share on other sites More sharing options...
Dmitriy427 Posted April 17, 2019 Share Posted April 17, 2019 Ладно бы только джойны и юнионы. Я для этой базы писал запросы со смещением и лимитами... Выглядит как-то так: $rows = mssql_query(" SELECT T1.G_Name, T1.G_Master, COUNT(*) AS count, T1.G_Score, T1.G_Mark, T1.G_Union, T1.Number, T3.G_Name AS U_Name FROM ( SELECT G_Name, G_Master, G_Score, G_Mark, G_Union, Number, ROW_NUMBER() OVER (ORDER BY {$order}) AS RowNum FROM {$settings['ms_sql_database']}.dbo.Guild ) AS T1 LEFT JOIN {$settings['ms_sql_database']}.dbo.Guild AS T3 ON T3.Number = T1.G_Union JOIN {$settings['ms_sql_database']}.dbo.GuildMember AS T2 ON T2.G_Name = T1.G_Name WHERE T1.RowNum BETWEEN {$start} AND {$end} GROUP BY T1.G_Name, T1.G_Master, T1.G_Score, T1.G_Mark, T1.G_Union, T1.Number, T3.G_Name ORDER BY {$tOrder} "); Суровая штука SQL Server. :) Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now