Регистрация
Регистрируясь, вы подтверждаете свое согласие с соглашением об использовании персональных данных.
Восстановление пароля

Перенос сайта с локальной Windows системы на *nix (регистры имен таблиц)

27.07.2011, 17:38
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
27.07.2011, 21:35
DiGGy
DiGGy
DiGGy

Зарегистрирован:
2005-04-04
Сообщений: 1546

Лучше использовать другой вариант, к которому вы рано или поздно, но однозначно прийдете!

Купите себе хостинг и делайте сайты сразу на юниксовой площадке хостера. Доступно с любого компьютера, заказчик видит этапы выполнения, да и на всякие возможные грабли наткнетесь сразу и не будете говорить, что мол под виндой у меня все работало, а тут ограничение на работу скрипта в 30 сек и т.п.

зы. я тоже начинал с локальной винды, но после 2го проекта стал умнее.

Temet nosce...
28.07.2011, 15:29
WSPro
Артем Зуев

Зарегистрирован:
2009-12-16
Сообщений: 3

Ну во-первых, я с удовольствием посмотрю на то, как Вы будете искать ошибку через псевдо-отладчик в каком-нибудь стороннем модуле на удаленном хостинге, который заказчик "кровь из носу" хочет интегрировать в CMS-ку, и в нем потребуется править код...
При варианте установки и обкатки на локальной системе, когда локальный сервер включает в себя необходимые компоненты (в том числе и модуль отладчика - лично по своему опыту рекомендую от NuSphere) + удобная среда разработки, тогда на эти грабли внимания не обращаешь =)

Поэтому во вторых:
Цитата:
зы. я тоже начинал с локальной винды, но после 2го проекта стал умнее.
Умнее, это понятие относительное... Я стал умнее именно после того, как пару раз задолбался подключать сторонние скрипты на удаленной площадке и стал работать в 2 этапа: локальная отладка -> выброс на внешнюю площадку (клиент видит ИМЕННО ЭТАПЫ работы, а не влетает на какую-то ошибку, если зашел именно в тот момент, когда работа программиста в самом разгаре).

wspro
28.07.2011, 16:58
Asiat
Аниматика
Asiat

Зарегистрирован:
2005-12-12
Сообщений: 576

Цитата:
Может быть и немного баян, но когда столкнулся с ситуацией...

А как вы столкнулись с таким, если не секрет?

Что-то такое когда-то было, но после настройки MySQL через lower_case_table_names ни разу не вспоминал.

Разработка сайтов на Netcat с 2006... хм-м ... или 2005 хммм года. В общем, обращайтесь.
198 196 2011-07-28 16:58:43 11477
Описание проекта