Правильный способ модификации enum в плагинах.

Проблема заключается в том, что некоторые плагины заменяют поле target_type таблицы comment, тем самым создавая свои новые типы комментариев, но затирая при этом уже добавленные. Разработчики упрощают себе жизнь, ограничиваясь строкой в dump.sql (пример из плагина «компании»)
ALTER TABLE `prefix_comment` 
	MODIFY target_type enum('topic','talk','company','clan') 
	DEFAULT 'topic';

В список риска попадает практически всё, где используется target_type enum: favourite, vote, comment_online.

При установки нескольких таких плагинов начинается бардак. Такие недоработки я заметил в следующих плагинах: «Компании», «Объявления», «Вопросы и ответы», «Места и события». Так делать нельзя. Программист разберется и исправит ошибку, но что делать обычным людям, далеким от php и sql, которые просто используют движок и несколько таких плагинов?

Тру кодером оказался Алексей Волков, разработчик «Комментариев для статических страниц». При установке плагина он в функции Activate проверяет target_type и добавляет новое поле только если его там нет, сохраняя при этом его старое содержимое. Не спросясь разрешения Алексея (надеюсь он меня простит — за правое дело радею) выкладываю часть кода, отвечающего за это.

$oDb = $this->Database_GetConnect();
$sql = 'SHOW COLUMNS FROM  `'.Config::Get('db.table.comment').'`';
$aRows = $oDb->select($sql);
foreach ($aRows as $aRow) {
	if ($aRow['Field'] == 'target_type') break;
}

if (strpos($aRow['Type'], "'page'") === FALSE)
{
	// - Вносим изменение в поле target_type в таблице prefix_comment
	$aRow['Type'] =str_ireplace('enum(', "enum('page',", $aRow['Type']);
	$sql = "ALTER TABLE `".Config::Get('db.table.comment')."` 
		CHANGE `target_type` `target_type` " . $aRow['Type'] . " 
		NOT NULL DEFAULT 'topic'";
	$oDb->query($sql);
} 


Уважаемые разработчики, не поленитесь обновить свои плагины и внести изменения.

Хотел опубликовать в тематическом блоге, например в «Дополнительные модули и доработки для LiveStreet», но видимо не хватает кармы, это мой первый пост/комментарий вообще на livestreet.ru

PS. в sql запросах типа ALTER проще использовать MODIFY вместо CHANGE, т.к. первый не требует указывать название поля два раза.

Помощь с доработкой функционала движка

Прошу помочь мне с SQL запросом.
Сижу уже 4ый час, перековырял практически весь гугл, и не нашел ответа на поставленный вопрос, либо упустил его из-за незнания оного языка.

Суть в том, что в таблице prefix_blog есть поле blog_genre (жанр игры).
Я хочу сделать вывод игр по жанрам, но в этом поле есть такие значения как Action — с этим проблем не было, а есть значения MMO, RPG — вот тут я встал в ступор.
Т.е. если жанр обозначен просто как MMO выводятся все блоги с этим жанром, а если обозначен как MMO, RPG то этот блог не выводится.

Читать дальше →

Проблема,помогите решить!!!!

Поставил я сайт, поставил модуль кланвары, перехожу на команды или кланвары выдается ошибка — SQL Error: Table 'san-ast_asd.prefix_clans' doesn't exist at сайт/modules/clans/mapper/Clans.mapper.class.php line 211
Array ( [code] => 1146 [message] => Table 'san-ast_asd.prefix_clans' doesn't exist [query] => SELECT * FROM prefix_clans WHERE owner_id = 1 [context] => сайт/classes/modules/clans/mapper/Clans.mapper.class.php line 211 )

Как исправить не могу найти!!!

Проблема.

При заходе на сайт, пишет ошибку
SQL Error: Table 'cssocial_social.prefix_user' doesn't exist at /home/cssocial/public_html/classes/modules/user/mapper/User.mapper.class.php line 145
Array ( [code] => 1146 [message] => Table 'cssocial_social.prefix_user' doesn't exist [query] => SELECT u.*, IF(ua.user_id IS NULL,0,1) as user_is_administrator, IF(cm.moderator_id IS NULL,0,1) as user_is_moderator FROM prefix_user as u LEFT JOIN prefix_user_administrator AS ua ON u.user_id=ua.user_id LEFT JOIN prefix_clans_moderators AS cm ON u.user_id=cm.moderator_id WHERE u.user_key = 'ce29f0541b95be0db9b853ad2a8158a8' [context] => /home/cssocial/public_html/classes/modules/user/mapper/User.mapper.class.php line 145 )


Помогите, что делать.Делал бэкап файла User.mapper.class.php не помогло, насколько я понимаю, ошибка в phpmyadmin.

Обновил LS из SVN

После обновления ls из svn Полезло куча ошибок:
1)При попытке зайти в мои веши вишу это
SQL Error: Table 'xxx_ls.prefix_topic_commented' doesn't exist at /var/www/xxx.ru/plugins/mystuff/classes/modules/mystuff/mapper/Mystuff.mapper.class.php line 98
Array ( [code] => 1146 [message] => Table 'xxx_ls.prefix_topic_commented' doesn't exist [query] => SELECT topic_id FROM prefix_topic_commented WHERE user_id IN ('3', '4', '5', '8', '26', '40', '17', '22', '25', '23', '1') AND created >= DATE_SUB(NOW(), INTERVAL 4 WEEK) [context] => /var/www/xxx.ru/plugins/mystuff/classes/modules/mystuff/mapper/Mystuff.mapper.class.php line 98 )

2)При попытке посмотреть поток вижу это
L Error: Unknown column 't.topic_last_update' in 'order clause' at /var/www/xxx.ru/classes/modules/topic/mapper/Topic.mapper.class.php line 169
Array ( [code] => 1054 [message] => Unknown column 't.topic_last_update' in 'order clause' [query] => SELECT SQL_CALC_FOUND_ROWS t.topic_id	 FROM prefix_topic as t,	 prefix_blog as b WHERE 1=1	 AND t.topic_publish = 1 AND ((b.blog_type='personal') OR (b.blog_type='open') OR (b.blog_type='close' AND t.blog_id IN ('3','4','5','10','17','18','22','26','29','30','33','34','44','54'))) AND t.blog_id=b.blog_id	 ORDER BY t.topic_last_update desc LIMIT 0, 10 [context] => /var/www/xxx.ru/classes/modules/topic/mapper/Topic.mapper.class.php line 169 )

3)При попытке деактивировать плагин Stream Plugin вижу это:
Ошибка: Системная ошибка, повторите позже
4) при нажатии в прямом эфире на «публикации» вижу это
Error
Please try again later

SQL ошибка на рабочем сайте

Периодически на рабочем сайте выскакивает вот такая ошибка
SQL Error: Deadlock found when trying to get lock; try restarting transaction at /var/www/l2plus/data/www/l2plus.ru/classes/modules/user/mapper/User.mapper.class.php line 131
Array ( [code] => 1213 [message] => Deadlock found when trying to get lock; try restarting transaction [query] => REPLACE INTO prefix_session SET session_key = '575cddf423328af8a76809c344368b22' , user_id = '18' , session_ip_create = '78.110.60.210' , session_ip_last = '78.110.60.210' , session_date_create = '2010-06-30 11:57:20' , session_date_last = '2010-06-30 11:57:20' [context] => /var/www/l2plus/data/www/l2plus.ru/classes/modules/user/mapper/User.mapper.class.php line 131 )


Ошибка выскакивает редко, но при одинаковых условиях.
Вечером ушел спать после работ над сайтом, а утром открываю оперу и вижу эту ошибку. Ошибка вылазит не каждый раз и не особо часто, но она есть.
С чем она может быть связана? Могут быть какие-то негативные последствия, если пользователь ее будет видеть также как и я?

Восстановление базы из .ibd и .frm файлов

Имеется дамп файлов ibd и frm как из них восстановить базу?

Пробовал на локал хосте кинуть их в папку где лежат таблицы и сделать нормальный sql дамп — но не получается. выдаёт ошибку. Подскажите пожалуйста как восстановить базу.

Не понимаю логику

Ребята, вопрос такой:

есть база объявлений — образно id, user_id, type, title, text. Все отлично, все работает, т.е. модуль объявлений я сделал, добавляю, удаляю объявления, все ровно, все отлично, НО для каждого объявления есть поле type, оно содержит идентификатор строки из другой таблицы содержащей список типов, это type_id, type_name. Теперь проблема — я хочу получить название типа для объявления и вывести его пользователю. что у нас есть:

обработка экшена

        protected function EventAll() {
                $oResult=$this->Mytest_GetList();
		$this->Viewer_Assign('oResult',$oResult);
                return;
        }



класс:

	public function GetList() {
		$result=$this->oMapperMytest->GetList();
		return $result;
	}


маппер:

        public function GetList()
        {
                $sql = "SELECT ad_id, ad_type, user_id, ad_price, user_ip, ad_torg, ad_hot, ad_title, ad_date, ad_status from ".DB_TABLE_ADDESK." ORDER BY ad_price";
		$aRes=array();
                if ($aRow=$this->oDb->select($sql)) {
			foreach ($aRow as $aTopic) {
				$aRes[]=new MytestEntity_Mytest($aTopic);
			}
                }
		return $aRes;
        }


шаблон:

{foreach from=$oResult item=oR}
	<tr>
		<td>{date_format date=$oR->getDate()}</td>
		<td> ВОТ ТУТ ТО БЫ И НАДО ВЫВЕСТИ ТИП ОБЪЯВЛЕНИЯ </td>
		<td><a href='/addesk/show/{$oR->getId()}.html'>{$oR->getTitle()}</a></td>
		<td>{$oR->getPrice()} {$aLang.addesk_rub} {if $oR->getTorg()==1}
<small>{$aLang.addesk_can_torg}</small>{/if}</td>
	</tr>
{/foreach}

так вот как запросить тип я не понимаю. вроде как в экшене нужно обработать, добавить в класс функцию… но нифига не получается. в вообще уже запутался… :( вобщем помогайте :(

а движок может не плохим получиться

товарищи! прежде чем писать модули для LS и заниматься прочими украшательствами, оптимизируйте запросы в основных модулях. Там просто ужас творится, например вещи вроде JOIN (SELECT… )

для такого простого функционала слишком много тяжёлых запросов в движке.