PDA

Просмотр полной версии : [Вопрос] Сохранение домов в таблицу MySQL



Jackal
09.01.2016, 23:49
Здравствуйте. Система домов на MySQL.

Проблема: При вызове паблика OnHouseSave, не заносятся данные в ячейки таблицы (ник игрока, номер дома).
При этом данные (координаты входа, выхода, класс, интерьер), при создании домов командой, заносятся в эту таблицу.

mysql_log:


[02:38:12] [ERROR] CMySQLQuery::Execute[] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

(Количество таких строк зависит от количества домов на сервере, т.к. работает цикл).


CMD:savh(playerid)
{
for(new i = 1; i <= TOTALHOUSES; i++) OnHouseSave(i);
SCM(playerid,COLOR_GREEN,"OnHouseSave");
return 1;
}


Работает:


CMD:chouse(playerid,params[])
{
new string[256];
new Float:X,Float:Y,Float:Z;
new Float:ExitX,Float:ExitY,Float:ExitZ,Interior;
if(sscanf(params,"iii",params[0],params[1],params[2])) return SCM(playerid,COLOR_WHITE,"Введите: /chouse [Класс] [Цена] [Интерьер]");
if(!GetPlayerVehicleID(playerid))
{
if(params[2] < 1 || params[2] > 26) return SCM(playerid,COLOR_GREY,"Неверный номер интерьера. Используйте /tpint");
GetPlayerPos(playerid,X,Y,Z);
switch(params[2])
{
case 1: { ExitX = 2233.6423; ExitY = -1115.2604; ExitZ = 1050.8828; Interior = 5; }
case 2: { ExitX = 2259.3833; ExitY = -1135.7765; ExitZ = 1050.6403; Interior = 10; }
case 3: { ExitX = 221.7961; ExitY = 1140.1957; ExitZ = 1082.6094; Interior = 4; }
case 4: { ExitX = 2218.4016; ExitY = -1076.3292; ExitZ = 1050.4844; Interior = 1; }
case 5: { ExitX = -42.6558; ExitY = 1405.4763; ExitZ = 1084.4297; Interior = 8; }
case 6: { ExitX = 260.7471; ExitY = 1237.5288; ExitZ = 1084.2578; Interior = 9; }
case 7: { ExitX = 2237.4856; ExitY = -1081.6361; ExitZ = 1049.0234; Interior = 2; }
case 8: { ExitX = -68.8527; ExitY = 1351.1975; ExitZ = 1080.2109; Interior = 6; }
case 9: { ExitX = 223.1055; ExitY = 1287.0765; ExitZ = 1082.1406; Interior = 1; }
case 10: { ExitX = 226.7857; ExitY = 1239.9708; ExitZ = 1082.1406; Interior = 2; }
case 11: { ExitX = 447.0353; ExitY = 1397.0632; ExitZ = 1084.3047; Interior = 2; }
case 12: { ExitX = 295.2918; ExitY = 1472.2563; ExitZ = 1080.2578; Interior = 15; }
case 13: { ExitX = 295.1453; ExitY = 1472.2563; ExitZ = 1080.2578; Interior = 15; }
case 14: { ExitX = 22.8414; ExitY = 1403.3251; ExitZ = 1084.4370; Interior = 5; }
case 15: { ExitX = 2365.2424; ExitY = -1135.5955; ExitZ = 1050.8826; Interior = 8; }
case 16: { ExitX = 2807.7151; ExitY = -1174.7552; ExitZ = 1025.5703; Interior = 8; }
case 17: { ExitX = 235.2912; ExitY = 1186.6814; ExitZ = 1080.2578; Interior = 3; }
case 18: { ExitX = 23.9711; ExitY = 1340.1598; ExitZ = 1084.3750; Interior = 10; }
case 19: { ExitX = 83.0452; ExitY = 1322.2833; ExitZ = 1083.8662; Interior = 9; }
case 20: { ExitX = -283.4403; ExitY = 1470.9785; ExitZ = 1084.3750; Interior = 15; }
case 21: { ExitX = -260.4859; ExitY = 1456.6578; ExitZ = 1084.3672; Interior = 4; }
case 22: { ExitX = 2317.7705; ExitY = -1026.7661; ExitZ = 1050.2178; Interior = 9; }
case 23: { ExitX = 234.1428; ExitY = 1063.7218; ExitZ = 1084.2123; Interior = 6; }
case 24: { ExitX = 140.2813; ExitY = 1365.9230; ExitZ = 1083.8594; Interior = 5; }
case 25: { ExitX = 2324.3484; ExitY = -1149.5460; ExitZ = 1050.7101; Interior = 12; }
case 26: { ExitX = 226.2991; ExitY = 1114.3654; ExitZ = 1080.9929; Interior = 5; }
}
format(string,sizeof(string),"INSERT INTO `TABLE_HOUSES` (`hEnterX`,`hEnterY`,`hEnterZ`,`hExitX`,`hExitY`,`hExitZ`,`hPrice`,`hInt`,`hClass`) VALUES ('%f','%f','%f','%f','%f','%f','%i','%i','%i')", X,Y,Z,ExitX,ExitY,ExitZ,params[1],Interior,params[0]);
mysql_function_query(ConnectMySQL,string,false,"","");
SCM(playerid,COLOR_GREEN,"Дом успешно создан");
SCM(playerid,COLOR_GREEN,"Созданный дом появится после рестарта");
}
return true;
}


Не работает:


publics OnHouseSave(houseid)
{
new string[128],query[320];
format(string,sizeof(string),"UPDATE `TABLE_HOUSES` SET "),strcat(query,string);
format(string,sizeof(string),"`hOwned` = '%i', ",HouseInfo[houseid][hOwned]),strcat(query,string);
format(string,sizeof(string),"`hOwner` = '%s', ",HouseInfo[houseid][hOwner]),strcat(query,string);
format(string,sizeof(string),"`hEnterX` = '%f', ",HouseInfo[houseid][hEnterX]),strcat(query,string);
format(string,sizeof(string),"`hEnterY` = '%f', ",HouseInfo[houseid][hEnterY]),strcat(query,string);
format(string,sizeof(string),"`hEnterZ` = '%f', ",HouseInfo[houseid][hEnterZ]),strcat(query,string);
format(string,sizeof(string),"`hExitX` = '%f', ",HouseInfo[houseid][hExitX]),strcat(query,string);
format(string,sizeof(string),"`hExitY` = '%f', ",HouseInfo[houseid][hExitY]),strcat(query,string);
format(string,sizeof(string),"`hExitZ` = '%f', ",HouseInfo[houseid][hExitZ]),strcat(query,string);
format(string,sizeof(string),"`hLevel` = '%i', ",HouseInfo[houseid][hLevel]),strcat(query,string);
format(string,sizeof(string),"`hPrice` = '%i', ",HouseInfo[houseid][hPrice]),strcat(query,string);
format(string,sizeof(string),"`hLock` = '%i', ",HouseInfo[houseid][hLock]),strcat(query,string);
format(string,sizeof(string),"`hTakings` = '%i', ",HouseInfo[houseid][hTakings]),strcat(query,string);
format(string,sizeof(string),"`hInt` = '%i', ",HouseInfo[houseid][hInt]),strcat(query,string);
format(string,sizeof(string),"`hHel` = '%i', ",HouseInfo[houseid][hHel]),strcat(query,string);
format(string,sizeof(string),"`hClass` = '%i' ",HouseInfo[houseid][hClass]),strcat(query,string);
format(string,sizeof(string),"WHERE `hID` = '%i'",HouseInfo[houseid][hID]),strcat(query,string);
mysql_function_query(ConnectMySQL,query,false,"","");
return true;
}

DeimoS
10.01.2016, 00:05
publics OnHouseSave(houseid)
{
new string[128],query[320];
format(string,sizeof(string),"UPDATE `TABLE_HOUSES` SET "),strcat(query,string);
format(string,sizeof(string),"`hOwned` = '%i', ",HouseInfo[houseid][hOwned]),strcat(query,string);
format(string,sizeof(string),"`hOwner` = '%s', ",HouseInfo[houseid][hOwner]),strcat(query,string);
format(string,sizeof(string),"`hEnterX` = '%f', ",HouseInfo[houseid][hEnterX]),strcat(query,string);
format(string,sizeof(string),"`hEnterY` = '%f', ",HouseInfo[houseid][hEnterY]),strcat(query,string);
format(string,sizeof(string),"`hEnterZ` = '%f', ",HouseInfo[houseid][hEnterZ]),strcat(query,string);
format(string,sizeof(string),"`hExitX` = '%f', ",HouseInfo[houseid][hExitX]),strcat(query,string);
format(string,sizeof(string),"`hExitY` = '%f', ",HouseInfo[houseid][hExitY]),strcat(query,string);
format(string,sizeof(string),"`hExitZ` = '%f', ",HouseInfo[houseid][hExitZ]),strcat(query,string);
format(string,sizeof(string),"`hLevel` = '%i', ",HouseInfo[houseid][hLevel]),strcat(query,string);
format(string,sizeof(string),"`hPrice` = '%i', ",HouseInfo[houseid][hPrice]),strcat(query,string);
format(string,sizeof(string),"`hLock` = '%i', ",HouseInfo[houseid][hLock]),strcat(query,string);
format(string,sizeof(string),"`hTakings` = '%i', ",HouseInfo[houseid][hTakings]),strcat(query,string);
format(string,sizeof(string),"`hInt` = '%i', ",HouseInfo[houseid][hInt]),strcat(query,string);
format(string,sizeof(string),"`hHel` = '%i', ",HouseInfo[houseid][hHel]),strcat(query,string);
format(string,sizeof(string),"`hClass` = '%i' ",HouseInfo[houseid][hClass]),strcat(query,string);
format(string,sizeof(string),"WHERE `hID` = '%i'",HouseInfo[houseid][hID]),strcat(query,string);
mysql_function_query(ConnectMySQL,query,false,"","");
printf("%s",query);
return true;
}И лог запросов сюда

Jackal
10.01.2016, 00:54
[03:51:42] UPDATE `TABLE_HOUSES` SET `hOwned` = '0', `hOwner` = '', `hEnterX` = '593.357971', `hEnterY` = '-1825.180053', `hEnterZ` = '15.332300', `hExitX` = '2233.639892', `hExitY` = '-1115.260009', `hExitZ` = '1050.880004', `hLevel` = '0', `hPrice` = '100', `hLock` = '0', `hTakings` = '0', `hInt` = '5', `hHel` = '0', `hClass`
[03:51:42] UPDATE `TABLE_HOUSES` SET `hOwned` = '0', `hOwner` = '', `hEnterX` = '585.067016', `hEnterY` = '-1827.449951', `hEnterZ` = '15.354299', `hExitX` = '2259.379882', `hExitY` = '-1135.780029', `hExitZ` = '1050.640014', `hLevel` = '0', `hPrice` = '200', `hLock` = '0', `hTakings` = '0', `hInt` = '10', `hHel` = '0', `hClass`
[03:51:42] UPDATE `TABLE_HOUSES` SET `hOwned` = '0', `hOwner` = '', `hEnterX` = '572.918029', `hEnterY` = '-1829.099975', `hEnterZ` = '15.361499', `hExitX` = '221.796005', `hExitY` = '1140.199951', `hExitZ` = '1082.609985', `hLevel` = '0', `hPrice` = '300', `hLock` = '0', `hTakings` = '0', `hInt` = '4', `hHel` = '0', `hClass` =

Desulaid
10.01.2016, 01:00
Ну вот, массив маловат. Увеличить!

Jackal
10.01.2016, 01:02
Ну вот, массив маловат. Увеличить!

Хм... не понял.

Desulaid
10.01.2016, 01:06
Массив query увеличьте, для теста возьмите 1024, я так всегда делаю :D

Jackal
10.01.2016, 01:24
Массив query увеличьте, для теста возьмите 1024, я так всегда делаю :D

Вот блин.. Увеличивал же, оказывается недостаточно было.

Только вот при покупке дома у меня все 5 домов в таблице принадлежат одному игроку и все данные этого дома копируются на остальные дома..



[04:19:29] UPDATE `TABLE_HOUSES` SET `hOwned` = '1', `hOwner` = 'Jason_A', `hEnterX` = '581.232971', `hEnterY` = '-1837.209960', `hEnterZ` = '15.361499', `hExitX` = '2218.399902', `hExitY` = '-1076.329956', `hExitZ` = '1050.479980', `hLevel` = '0', `hPrice` = '400', `hLock` = '0', `hTakings` = '500', `hInt` = '1', `hHel` = '0', `hClass` = '4' WHERE `hID` = '0'


Вот команда покупки дома:



CMD:buyhouse(playerid,params[])
{
new string[128];
if(PlayerInfo[playerid][pHouseKey] != -1) return SCM(playerid,COLOR_GREY," У вас уже есть дом. Введите /sellhouse, чтобы его продать");
for(new h = 1; h <= TOTALHOUSES; h++)
{
if(IsPlayerInRangeOfPoint(playerid,2.0,HouseInfo[h][hEnterX],HouseInfo[h][hEnterY],HouseInfo[h][hEnterZ]))
{
if(HouseInfo[h][hOwned] == 1) SCM(playerid,COLOR_GREY,"В этом доме уже кто-то проживает");
if(PlayerInfo[playerid][pMoney] < HouseInfo[h][hPrice]) return SCM(playerid,COLOR_GREY," У вас недостаточно денег на покупку дома");
PlayerInfo[playerid][pHouseKey] = h;
HouseInfo[h][hOwned] = 1;
HouseInfo[h][hHel] = 0;
HouseInfo[h][hTakings] = 50*(HouseInfo[h][hClass]+1)*2;
strmid(HouseInfo[h][hOwner], PlayerInfo[playerid][pName], 0, strlen(PlayerInfo[playerid][pName]), 255);
PlayerInfo[playerid][pMoney] -= HouseInfo[h][hPrice];
SetPlayerPos(playerid,HouseInfo[h][hExitX],HouseInfo[h][hExitY],HouseInfo[h][hExitZ]);
SetPlayerInterior(playerid,HouseInfo[h][hInt]);
SetPlayerVirtualWorld(playerid,h+50);
SCM(playerid,COLOR_WHITE," Поздравляем с покупкой!");
f(" Внимание! Теперь каждый час со счёта вашего дома будут снимать комунальные платежи в размере %i долларов", 50*(HouseInfo[h][hClass]+1));
SCM(playerid, COLOR_YELLOW, string);
SCM(playerid,COLOR_YELLOW," Если на счету недостаточно денег, вас выселят");
SCM(playerid,COLOR_YELLOW," Пополнить домашний счёт или узнать баланс можно через банк/банкомат (помощь: /help -> команды)");
Update3DTexts();
OnHouseSave(h);
break;
}
}
return true;
}


И посмотрите в конец лога, там WHERE `hID` = '0', а дом покупался №4.

Jackal
10.01.2016, 10:35
Обнаружил возможное решение проблемы. Вручную расставил в таблице номера домов (ячейка hID).

Как сделать, чтобы при создании домов, порядковые номера сразу записывались в ячейку hID?



CMD:chouse(playerid,params[])
{
new string[256];
new Float:X,Float:Y,Float:Z;
new Float:ExitX,Float:ExitY,Float:ExitZ,Interior;
if(sscanf(params,"iii",params[0],params[1],params[2])) return SCM(playerid,COLOR_WHITE,"Введите: /chouse [Класс] [Цена] [Интерьер]");
if(!GetPlayerVehicleID(playerid))
{
if(params[2] < 1 || params[2] > 26) return SCM(playerid,COLOR_GREY,"Неверный номер интерьера. Используйте /tpint");
GetPlayerPos(playerid,X,Y,Z);
switch(params[2])
{
case 1: { ExitX = 2233.6423; ExitY = -1115.2604; ExitZ = 1050.8828; Interior = 5; }
case 2: { ExitX = 2259.3833; ExitY = -1135.7765; ExitZ = 1050.6403; Interior = 10; }
case 3: { ExitX = 221.7961; ExitY = 1140.1957; ExitZ = 1082.6094; Interior = 4; }
case 4: { ExitX = 2218.4016; ExitY = -1076.3292; ExitZ = 1050.4844; Interior = 1; }
case 5: { ExitX = -42.6558; ExitY = 1405.4763; ExitZ = 1084.4297; Interior = 8; }
case 6: { ExitX = 260.7471; ExitY = 1237.5288; ExitZ = 1084.2578; Interior = 9; }
case 7: { ExitX = 2237.4856; ExitY = -1081.6361; ExitZ = 1049.0234; Interior = 2; }
case 8: { ExitX = -68.8527; ExitY = 1351.1975; ExitZ = 1080.2109; Interior = 6; }
case 9: { ExitX = 223.1055; ExitY = 1287.0765; ExitZ = 1082.1406; Interior = 1; }
case 10: { ExitX = 226.7857; ExitY = 1239.9708; ExitZ = 1082.1406; Interior = 2; }
case 11: { ExitX = 447.0353; ExitY = 1397.0632; ExitZ = 1084.3047; Interior = 2; }
case 12: { ExitX = 295.2918; ExitY = 1472.2563; ExitZ = 1080.2578; Interior = 15; }
case 13: { ExitX = 295.1453; ExitY = 1472.2563; ExitZ = 1080.2578; Interior = 15; }
case 14: { ExitX = 22.8414; ExitY = 1403.3251; ExitZ = 1084.4370; Interior = 5; }
case 15: { ExitX = 2365.2424; ExitY = -1135.5955; ExitZ = 1050.8826; Interior = 8; }
case 16: { ExitX = 2807.7151; ExitY = -1174.7552; ExitZ = 1025.5703; Interior = 8; }
case 17: { ExitX = 235.2912; ExitY = 1186.6814; ExitZ = 1080.2578; Interior = 3; }
case 18: { ExitX = 23.9711; ExitY = 1340.1598; ExitZ = 1084.3750; Interior = 10; }
case 19: { ExitX = 83.0452; ExitY = 1322.2833; ExitZ = 1083.8662; Interior = 9; }
case 20: { ExitX = -283.4403; ExitY = 1470.9785; ExitZ = 1084.3750; Interior = 15; }
case 21: { ExitX = -260.4859; ExitY = 1456.6578; ExitZ = 1084.3672; Interior = 4; }
case 22: { ExitX = 2317.7705; ExitY = -1026.7661; ExitZ = 1050.2178; Interior = 9; }
case 23: { ExitX = 234.1428; ExitY = 1063.7218; ExitZ = 1084.2123; Interior = 6; }
case 24: { ExitX = 140.2813; ExitY = 1365.9230; ExitZ = 1083.8594; Interior = 5; }
case 25: { ExitX = 2324.3484; ExitY = -1149.5460; ExitZ = 1050.7101; Interior = 12; }
case 26: { ExitX = 226.2991; ExitY = 1114.3654; ExitZ = 1080.9929; Interior = 5; }
}
format(string,sizeof(string),"INSERT INTO `TABLE_HOUSES` (`hEnterX`,`hEnterY`,`hEnterZ`,`hExitX`,`hExitY`,`hExitZ`,`hPrice`,`hInt`,`hClass`) VALUES ('%f','%f','%f','%f','%f','%f','%i','%i','%i')", X,Y,Z,ExitX,ExitY,ExitZ,params[1],Interior,params[0]);
mysql_function_query(ConnectMySQL,string,false,"","");
SCM(playerid,COLOR_GREEN,"Дом успешно создан");
SCM(playerid,COLOR_GREEN,"Созданный дом появится после рестарта");
}
return true;
}

DeimoS
10.01.2016, 11:27
Кря (http://pro-pawn.ru/showthread.php?10548-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B-%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BD%D0%B0-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0-MySQL-R39-2)
Вам понадобится спойлер с названием "F.A.Q. <Создание базы данных в phpMyAdmin>", а там - пункт №4. Для столбца "hID" установите параметр "Auto Increment"

Jackal
10.01.2016, 11:40
Вам понадобится спойлер с названием "F.A.Q. <Создание базы данных в phpMyAdmin>", а там - пункт №4. Для столбца "hID" установите параметр "Auto Increment"

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key - вот что выдаёт таблица при изменении столбца

"Неправильное определение таблицы - только одна колонка может иметь автоинкремент, и она должна быть определена как ключ".

Что с этим делать, не пойму..

Desulaid
10.01.2016, 11:57
Какой столбец ты еще автоинкрементируешь?

Jackal
10.01.2016, 11:58
Создал таблицу заново, поставил галочку. Спасибо DeimoS.