Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
siv1987

Очень интересный код. Давно я такого не встречал

Recommended Posts

Если отбросить кликбейтное название, то код действительно "интересный" в кавычках естественно.

 

	$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'));
				}
			}
		}

 

Как видно, здесь выводится весь список тем форума (естественно без пагинации) и, конечно же - селект в цикле.

  • Upvote 1

Share this post


Link to post
Share on other sites

Запрос на запросе сидит и запросом погоняет.

Share this post


Link to post
Share on other sites

Да обычное же дело. Мне вот недавно прислали страничку топ-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 запросов в цикле... Там где достаточно было двух, и то из-за довольно странной структуры БД и требований к функционалу.

Share this post


Link to post
Share on other sites

Тут тововарищ решил не усложнять запрос джоинами.

 

ПС.

Не понимаю стиль писать в пхп названия переменных заглавной буквой.

Share this post


Link to post
Share on other sites

Ладно бы только джойны и юнионы. Я для этой базы писал запросы со смещением и лимитами... Выглядит как-то так:

		$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. :)

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...