|
WSPro
Артем Зуев
Зарегистрирован: 2009-12-16
Сообщений: 3
|
Может быть и немного баян, но когда столкнулся с ситуацией, не нашел на форуме ответа на свой вопрос и решения проблемы, пришлось варганить самому.
Суть: многие разработчики работают под ОС Windows и нередко начинают работу с чистой CMS на локальной системе. MySql-сервер под Win не различает регистра в названиях таблиц и, как следствие, при инсталляции NetCat приводит все имена таблиц к нижнему регистру. А вот при переносе дампа БД на *nix-ы получаем тот самый головняк, когда CMS не находит таблиц ввиду различия регистров.
Решение вопроса: закинуть прилагаемый скрипт в корень CMS-ки (рядом с vars.inc.php) и запустить его на выполнение после заливки дампа БД и скриптов самой NetCat.
Чуток комментариев: в прилагаемом варианте не все возможные таблицы, т.к. разбирал только свою редакцию Business - дополнить просто по аналогии, простой массив из правильных имен таблиц. Переменная $skey для ограничения возможности запуска сторонним пользователем, своеобразный пароль на запуск. Правильный ключ при запуске можно передать в параметре адресной строки. В случае, если скрипт будет удален после корректировки имен таблиц $skey можно оставить пустым ($skey = '';). В процессе выполнения, если выводятся ошибки, нужно просто обратить внимание на их текст, если таблица уже имеет корректное имя или просто не существует для Вашей конфигурации, то сообщение вида "Таблица название_в_малом_регистре не найдена" не является ошибкой.
Ну и собственно сам код скрипта:
Код:<?php
$skey = 'secure-code';
if($skey != $_REQUEST['skey']) die('Not valid secure code!');
$tbls = array(
'Auth_ExternalAuth',
'Auth_Pseudo',
'Auth_Token',
'Auth_UserRelation',
'Classificator_Country',
'Classificator_Gallery',
'Classificator_Manufacturer',
'Classificator_MinishopDelivery',
'Classificator_MinishopPayment',
'Classificator_MinishopStatus',
'Classificator_Region',
'Classificator_Sex',
'Minishop_OrderGoods',
'Search_BrokenLink',
'Search_Document',
'Search_Extension',
'Search_Field',
'Search_Link',
'Search_LinkReferrer',
'Search_Log',
'Search_Query',
'Search_Rule',
'Search_Schedule',
'Search_Stopword',
'Search_Synonym',
'Search_Task',
'Cache_Audit',
'Cache_Clear',
'Cache_Settings',
'Calendar_Settings',
'Captchas',
'Captchas_Settings',
'Catalogue',
'Class',
'Classificator',
'Classificator_ActionsAdmTtl',
'Classificator_BlockTypes',
'Classificator_TypeOfData',
'Classificator_TypeOfEdit',
'Classificator_TypeOfModeration',
'Classificator_TypeOfRight',
'Classificator_UserGroup',
'Classificator_WspMethods',
'CronTasks',
'Field',
'Filetable',
'MailTmp',
'Mail_Queue',
'Module',
'mymfavorites',
'Patch',
'Permission',
'PermissionGroup',
'Redirect',
'Session',
'Settings',
'SQLQueries',
'Subdivision',
'Sub_Class',
'SystemMessage',
'System_Table',
'Template',
'Trash_Data',
'User',
'User_Group',
'Widget',
'Widget_Class',
'Widget_Field'
);
// подключение к БД
include_once('vars.inc.php');
$hd = mysql_connect($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, true);
if(!$hd) die('Not connected : ' . mysql_error());
if(!mysql_selectdb($MYSQL_DB_NAME, $hd)) die('Not select base : '.mysql_error($hd));
// дополнение таблицами компонентов
$r = mysql_query('show tables;', $hd);
if(mysql_num_rows($r) > 0) {while($row = mysql_fetch_array($r, MYSQL_NUM)){
if(preg_match('#^Message(\d+)$#i', $row[0], $arr)) $tbls[] = 'Message'.$arr[1];};};
echo '<div><b>Tables:</b> '.implode(', ', $tbls).'</div>';
// собственно сам процесс приведения таблиц в порядок
foreach($tbls as $set)
{
$win = strtolower($set); echo '<div style="padding-left:20px">'.$win.' -> '.$set.' : ';
$ok = mysql_query('alter table `'.$win.'` rename `'.$set.'`;', $hd);
echo ($ok ? '<span style="color:#00FF00">OK</span>' :
'<span style="color:#FF0000">Err ['.mysql_error($hd).']</span>').'</div>';
};?>
wspro
|