Страница 2 из 3

Re: сенсорная фаланга версия 32a7

Добавлено: 24 ноя 2011, 21:12
Gorlum
Да-да. Просто форсировать последнее обновление - это слишком сложно для цирка. Надо шаманить. Понимаю.

Re: сенсорная фаланга версия 32a7

Добавлено: 24 ноя 2011, 21:27
Gorlum
Ах, да. И тонкий намек - если одно из прошлых обновлений провалилось при установке constraint, в будующем вас могут (и будут!) ожидать определенные сюрпризы (неприятные). Поэтому внимательно читайте логи апдейтов. И применяйте ручками или форсируйте абдейты.

И напоминаю:
Disclaimer aka Отмазка
======================
ВНИМАНИЕ! Проект находится в стадии альфа-версии! В настоящее время он не
предназначен для production-использования! Код предоставляется "as-is". Вы
используете его на свой страх и риск! Автор не несет ответственности за
материальный, моральный, кармический, душевный и любой другой ущерб,
причиненный вам от использования, неиспользования, самим фактом существования
этого кода или любым другим способом.

Предуведомления о необходимости наличия квалификации
====================================================
Данные инструкции предполагают умение самостоятельно настроить или использовать
сторонний веб-хостинг, знакомство с MySQL и PHP, доступ к инструментам
управленя MySQL и хостингом. Если вы не обладаете опытом самостоятельной
настройки сайтов - этот дистрибутив вам не подойдет

ВНИМАНИЕ! Я не могу протестировать все возможные комбинации и версии MySQL &
PHP & XCache & веб-серверов! Это означает, что при некоторых комбинациях и
настройках среды движок может не работать. Именно для этого нужны навыки
настройки и конфигурации веб-серверов.

Re: сенсорная фаланга версия 32a7

Добавлено: 25 ноя 2011, 07:24
DarkKnight
Форсировать обновление с нуля

Код: Выделить всё

Обновление сервера.

Altering error for table `users`: Can't create table './x20/#sql-faa_1c413b.frm' (errno: 121)

array(2)
	0 => string(126) ADD∴CONSTRAINT∴`FK_users_ally_id`∴FOREIGN∴KEY∴(`ally_id`)∴REFERENCES∴`sn_alliance`∴(`id`)∴ON∴DELETE∴SET∴NULL∴ON∴UPDATE∴CASCADE
	1 => string(137) ADD∴CONSTRAINT∴`FK_users_ally_name`∴FOREIGN∴KEY∴(`ally_name`)∴REFERENCES∴`sn_alliance`∴(`ally_name`)∴ON∴DELETE∴SET∴NULL∴ON∴UPDATE∴CASCADE 
Повторить предыдущее обновление

Код: Выделить всё

Обновление сервера.

Altering error for table `users`: Can't create table './x20/#sql-faa_1c41c5.frm' (errno: 121)

array(1)
	0 => string(134) ADD∴CONSTRAINT∴`FK_users_ally_tag`∴FOREIGN∴KEY∴(`ally_tag`)∴REFERENCES∴`sn_alliance`∴(`ally_tag`)∴ON∴DELETE∴SET∴NULL∴ON∴UPD

Re: сенсорная фаланга версия 32a7

Добавлено: 25 ноя 2011, 07:34
DarkKnight
killer писал(а):
DarkKnight писал(а):
killer писал(а): скинь файл: includes/functions/sys_stat_functions.php
похоже в нём проблема ;)
Это файл из 32а7.
прошу прощения,ступил....

решением думаю будет следующее:
Выполните запрос в бд:

Код: Выделить всё

DROP TABLE IF EXISTS `sn_statpoints`;
CREATE TABLE `sn_statpoints` (
  `id_owner` int(11) NOT NULL DEFAULT '0',
  `id_ally` int(11) NOT NULL DEFAULT '0',
  `stat_type` int(2) NOT NULL DEFAULT '0',
  `stat_code` int(11) NOT NULL DEFAULT '0',
  `tech_rank` int(11) NOT NULL DEFAULT '0',
  `tech_old_rank` int(11) NOT NULL DEFAULT '0',
  `tech_points` bigint(20) NOT NULL DEFAULT '0',
  `tech_count` int(11) NOT NULL DEFAULT '0',
  `build_rank` int(11) NOT NULL DEFAULT '0',
  `build_old_rank` int(11) NOT NULL DEFAULT '0',
  `build_points` bigint(20) NOT NULL DEFAULT '0',
  `build_count` int(11) NOT NULL DEFAULT '0',
  `defs_rank` int(11) NOT NULL DEFAULT '0',
  `defs_old_rank` int(11) NOT NULL DEFAULT '0',
  `defs_points` bigint(20) NOT NULL DEFAULT '0',
  `defs_count` int(11) NOT NULL DEFAULT '0',
  `fleet_rank` int(11) NOT NULL DEFAULT '0',
  `fleet_old_rank` int(11) NOT NULL DEFAULT '0',
  `fleet_points` bigint(20) NOT NULL DEFAULT '0',
  `fleet_count` int(11) NOT NULL DEFAULT '0',
  `total_rank` int(11) NOT NULL DEFAULT '0',
  `total_old_rank` int(11) NOT NULL DEFAULT '0',
  `total_points` bigint(20) NOT NULL DEFAULT '0',
  `total_count` int(11) NOT NULL DEFAULT '0',
  `stat_date` int(11) NOT NULL DEFAULT '0',
  `res_rank` int(11) DEFAULT '0' COMMENT 'Rank by resources',
  `res_old_rank` int(11) DEFAULT '0' COMMENT 'Old rank by resources',
  `res_points` bigint(20) DEFAULT '0' COMMENT 'Resource stat points',
  `res_count` bigint(20) DEFAULT '0' COMMENT 'Old rank by resources',
  KEY `TECH` (`tech_points`),
  KEY `BUILDS` (`build_points`),
  KEY `DEFS` (`defs_points`),
  KEY `FLEET` (`fleet_points`),
  KEY `TOTAL` (`total_points`),
  KEY `i_stats_owner` (`id_owner`,`stat_type`,`stat_code`,`tech_rank`,`build_rank`,`defs_rank`,`fleet_rank`,`total_rank`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

UPDATE  `sn_config` SET  `config_value` =  '30' WHERE  `sn_config`.`config_name` =  'db_version';
В общем проблема из-за таблицы бд...
Все выполнил через phpmyadmin, ошибок нет, но это не помогло. Снова при обновлении статы вылазиет:

Код: Выделить всё

Адрес страницы	/scheduler.php
Тип	500 SQL Error
Текст ошибки	
Cannot add or update a child row: a foreign key constraint fails (`x20/sn_statpoints`, CONSTRAINT `FK_stats_id_ally` FOREIGN KEY (`id_ally`) REFERENCES `sn_alliance` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
INSERT INTO sn_statpoints SET `id_owner` = '2', `id_ally` = '', `stat_type` = '1', `stat_code` = '1', `tech_points` = '15099487.2', `tech_count` = '63', `build_points` = '849287.038608', `build_count` = '129', `defs_points` = '2174189.5', `defs_count` = '592668', `fleet_points` = '18', `fleet_count` = '1', `res_points` = '41574.4679111', `res_count` = '41574467.9111', `total_points` = '18164556.2065', `total_count` = '42167328.9111', `stat_date` = '1322198151';
Отладочная информация	

backtrace = array(2)
	2 => array(4)
		file => string(94) /home/supernova/domains/x20.supernova.uz/public_html/includes/functions/sys_stat_functions.php
		line => integer 250
		function => string(7) doquery
		args => array(1)
			0 => string(466) INSERT∴INTO∴{{statpoints}}∴SET∴`id_owner`∴=∴'2',∴`id_ally`∴=∴'',∴`stat_type`∴=∴'1',∴`stat_code`∴=∴'1',∴`tech_points`∴=∴'15099487.2',∴`tech_count`∴=∴'63',∴`build_points`∴=∴'849287.038608',∴`build_count`∴=∴'129',∴`defs_points`∴=∴'2174189.5',∴`defs_count`∴=∴'592668',∴`fleet_points`∴=∴'18',∴`fleet_count`∴=∴'1',∴`res_points`∴=∴'41574.4679111',∴`res_count`∴=∴'41574467.9111',∴`total_points`∴=∴'18164556.2065',∴`total_count`∴=∴'42167328.9111',∴`stat_date`∴=∴'1322198151';  
	3 => array(4)
		file => string(66) /home/supernova/domains/x20.supernova.uz/public_html/scheduler.php
		line => integer 54
		function => string(17) SYS_statCalculate
		args => array(0)   

Re: сенсорная фаланга версия 32a7

Добавлено: 25 ноя 2011, 12:09
Gorlum
DarkKnight писал(а):Форсировать обновление с нуля

Код: Выделить всё

Обновление сервера.

Altering error for table `users`: Can't create table './x20/#sql-faa_1c413b.frm' (errno: 121)

array(2)
	0 => string(126) ADD∴CONSTRAINT∴`FK_users_ally_id`∴FOREIGN∴KEY∴(`ally_id`)∴REFERENCES∴`sn_alliance`∴(`id`)∴ON∴DELETE∴SET∴NULL∴ON∴UPDATE∴CASCADE
	1 => string(137) ADD∴CONSTRAINT∴`FK_users_ally_name`∴FOREIGN∴KEY∴(`ally_name`)∴REFERENCES∴`sn_alliance`∴(`ally_name`)∴ON∴DELETE∴SET∴NULL∴ON∴UPDATE∴CASCADE 
Повторить предыдущее обновление

Код: Выделить всё

Обновление сервера.

Altering error for table `users`: Can't create table './x20/#sql-faa_1c41c5.frm' (errno: 121)

array(1)
	0 => string(134) ADD∴CONSTRAINT∴`FK_users_ally_tag`∴FOREIGN∴KEY∴(`ally_tag`)∴REFERENCES∴`sn_alliance`∴(`ally_tag`)∴ON∴DELETE∴SET∴NULL∴ON∴UPD
Вот поэтому и не меняются тэги/названия альянсов при переименовании. Какая-то рассинхронизация в структуре/данных таблицы. Какие - сказать невозможно, нужно смотреть по месту. Погугли - в инете полно инфы по этому поводу.

Re: сенсорная фаланга версия 32a7

Добавлено: 25 ноя 2011, 12:58
DarkKnight
Gorlum писал(а):Решение проблемы с констраинтами на примере таблицы users и поля ally_tag

Нам нужно добавить вот такой constraint:

Код: Выделить всё

ADD CONSTRAINT `FK_users_ally_tag` FOREIGN KEY (`ally_tag`) REFERENCES `{$config->db_prefix}alliance` (`ally_tag`) ON DELETE SET NULL ON UPDATE CASCADE
Он связывает поле ally_tag таблицы users (подчиненная) с полем ally_tag таблицы alliance (главная). Когда поле ally_tag изменяется в таблице alliance, то связанное поле автоматически изменяется в таблице users. Если запись удаляется из таблицы users - поле ally_tag d соответствующей записи удаляется из таблицы users.

Что бы можно было сделать такую связь, нужна логическая целостность обоих таблиц. Это означает, что
  1. Типы и кодировка связываемых полей должны совпадать.
  2. В подчиненной таблице в свойствах поля должно стоять DEFAULT NULL
  3. Для всех связываемых полей должны существовать индексы во всех используемых таблицах
  4. На момент связывания в подчиненной таблице НЕ ДОЛЖНО быть таких значений в связываемом поле, которых нет в главной таблице. В нашем случае (самый сложный) нужно: во-первых обновить все значения ally_tag до текущих

    Код: Выделить всё

    doquery("UPDATE {{users}} AS u LEFT JOIN {{alliance}} AS a ON a.id = u.ally_id SET u.ally_tag = a.ally_tag;");
    во-вторых - для тех записей, для которых Альянсы не существуют, установить соответствующее поле в NULL

    Код: Выделить всё

    doquery("UPDATE {{users}} AS u LEFT JOIN {{alliance}} AS a ON a.id = u.ally_id SET u.ally_id = NULL, u.ally_tag = NULL WHERE a.id is NULL;");
  5. Если бы в constraint стояло бы ON DELETE CASCADE, а не ON DELETE SET NULL, то нужно было бы просто удалить из подчиненной таблицы все записи, для которых нет соответствия в главной таблице. На примере constraint для таблицы shortcut:

    Код: Выделить всё

    ADD CONSTRAINT `FK_shortcut_planet_id` FOREIGN KEY (`shortcut_planet_id`) REFERENCES `{$config->db_prefix}planets` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    соответствующий запрос:

    Код: Выделить всё

    doquery('DELETE FROM {{shortcut}} WHERE shortcut_planet_id NOT IN (SELECT id FROM {{planets}});');
  6. ??????
  7. PROFIT!
Собственно, апдейтер сам делает все нужные изменения. НО ТОЛЬКО если ранее все апдейты проходили нормально! Если, например, ранее сбился constraint на ally_id, то апдейтер НЕ СМОЖЕТ нормально отработать constraint на ally_tag.

Мануал для курения:
http://dev.mysql.com/doc/refman/5.5/en/ ... aints.html

И совсем продвинутый мануал:
http://dev.mysql.com/doc/refman/5.5/en/constraints.html

А если я например очищу полностью таблицу альянсов и заново будем регать, проблема решится?
Ну и сделаю ADD CONSTRAINT `FK_users_ally_tag` FOREIGN KEY (`ally_tag`) REFERENCES `{$config->db_prefix}alliance` (`ally_tag`) ON DELETE SET NULL ON UPDATE CASCADE

Re: сенсорная фаланга версия 32a7

Добавлено: 25 ноя 2011, 13:32
Gorlum
DarkKnight писал(а):А если я например очищу полностью таблицу альянсов и заново будем регать, проблема решится?
Ну и сделаю ADD CONSTRAINT `FK_users_ally_tag` FOREIGN KEY (`ally_tag`) REFERENCES `{$config->db_prefix}alliance` (`ally_tag`) ON DELETE SET NULL ON UPDATE CASCADE
Ты читал вообще то, что я написал? Проблема - не в таблице Альянсов (главная таблица), а в таблице users (подчиненная таблица). Нужно обработать таблицу users, что бы поле ally_tag не содержало значений, которых нет в таблице alliances. Как вариант - можешь дропнуть все поля, относящиеся к Альянсам в таблице пользователей (ally_*) и создать их заново.

Re: сенсорная фаланга версия 32a7

Добавлено: 25 ноя 2011, 17:12
killer
Gorlum, спасибо за инфу :)

Re: сенсорная фаланга версия 32a7

Добавлено: 25 ноя 2011, 17:47
Gorlum
killer писал(а):Gorlum, спасибо за инфу :)
Народ, но это же элементарнейшие вещи по SQL! Чем несколько дней фигней страдать - могли бы за пол-часа найти ошибку в гугле и прочитать все то же самое в инете! И сами все поправить.

Re: сенсорная фаланга версия 32a7

Добавлено: 25 ноя 2011, 18:23
DarkKnight
Спасибо, или шаманство, или последний сегодняшний апдейт, но проблема решилась)