PDA

Просмотр полной версии : [Вопрос] Не сохраняет авто после перезагрузки сервера.



KrutoyKrosch
26.02.2016, 23:33
Всем привет! Щас постараюсь как можно подробней описать проблему.

Написал на сервер систему автомобилей. Так вот... Игрок купил автомобиль, указал ему спавн (где авто будет появляться после перезагрузки сервера), все что он сделал сохранилось в таблицу mySQL. Но стоит перезагрузить сервер, то если игрок захочет поменять авто спавн то он уже не сохранится... То есть после перезагрузки сервера перестает работать сохранение...

Вот такие ошибки появляются в mysql_log:

[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1997')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1997')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1997')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1997')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1998')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1998')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1998')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1998')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1998')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1998')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1998')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1998')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1999')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1999')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1999')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1999')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1999')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1999')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1999')
[22:07:15] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1999')

Это только небольшой кусок всех ошибок... Их там просто дох*ра....

Вот код загрузки авто:


public LoaginAuto()
{
new vehicleid[MAX_VEHICLES];
new query_string3[350];
for(new i; i < MAX_VEHICLES; i++)
{
pVehicle[i][pX] = cache_get_field_content_float(i, "X", mysql_connect_ID);
pVehicle[i][pY] = cache_get_field_content_float(i, "Y", mysql_connect_ID);
pVehicle[i][pZ] = cache_get_field_content_float(i, "Z", mysql_connect_ID);
pVehicle[i][pAngle] = cache_get_field_content_float(i, "Angle", mysql_connect_ID);
cache_get_field_content(i, "Name", pVehicle[i][pName], mysql_connect_ID, 24);
pVehicle[i][pID] = cache_get_field_content_int(i, "ID", mysql_connect_ID);
pVehicle[i][pStatus] = cache_get_field_content_int(i, "Status", mysql_connect_ID);
pVehicle[i][pColor] = cache_get_field_content_int(i, "Color", mysql_connect_ID);

if(pVehicle[i][pID] > 0)
{
if(pVehicle[i][pX] == 0 && pVehicle[i][pY] == 0 && pVehicle[i][pZ] == 0)
{
new query_string[200];
format(query_string, sizeof(query_string), "DELETE FROM `Auto` WHERE `X` = '%f'", pVehicle[i][pX]);
mysql_function_query(mysql_connect_ID, query_string , false, "", "");
}
else{
vehicleid{i} = AddStaticVehicle(pVehicle[i][pID], pVehicle[i][pX], pVehicle[i][pY], pVehicle[i][pZ], pVehicle[i][pAngle], pVehicle[i][pColor],pVehicle[i][pColor]);
mysql_format(mysql_connect_ID, query_string3, sizeof(query_string3), "UPDATE `accounts` SET `AutoID`='%d' WHERE `Name` = '%d'", vehicleid{i}, pVehicle[i][pName]);
mysql_function_query(mysql_connect_ID, query_string3, false, "", "");
}
}
}
return 1;
}

Вот код сохранения (вызывается каждые 20 секунд в таймере):


public SaveAuto()
{
for(new i; i < MAX_VEHICLES; i++)
{
if(pVehicle[i][pID] > 0)
{
new query_string1[500];
mysql_format(mysql_connect_ID,query_string1, sizeof(query_string1),"UPDATE `Auto` SET `ID`='%d', `Color`='%d', `Status`='%d', `X`='%f', `Y`='%f', `Z`='%f', `Angle`='%f' WHERE `Name`='%s'", pVehicle[i][pID] ,pVehicle[i][pColor], pVehicle[i][pStatus], pVehicle[i][pX], pVehicle[i][pY], pVehicle[i][pZ], pVehicle[i][pAngle], pVehicle[i][pName]);
mysql_function_query(mysql_connect_ID, query_string1, false, "", "");
}
}
return 1;
}

Код покупки авто:


public NewSpawnAutoServer(playerid, X, Y, Z)
{
if(pInfo[playerid][pMoney] < newzenaauto[playerid]) return SendClientMessage(playerid, -1, "{D40000}[Ошибка] Вы не смогли оплатить автомобиль!");

pInfo[playerid][pMoney] = pInfo[playerid][pMoney] - newzenaauto[playerid];
GivePlayerMoney(playerid, -newzenaauto[playerid]);

new vehicleid = CreateVehicle(newidauto[playerid], newXauto[playerid], newYauto[playerid], newZauto[playerid], newangleauto[playerid], newcolorauto[playerid], newcolorauto[playerid], -1);
SendClientMessage(playerid, -1, "{183DFF}[Оповещение] Автомобиль доставлен на место! Спасибо за покупку!");

pVehicle[vehicleid][pID] = newidauto[playerid];
pVehicle[vehicleid][pColor] = newcolorauto[playerid];
format(pVehicle[vehicleid][pName], 24, "%s", pInfo[playerid][pName]);
pInfo[playerid][pAuto] = vehicleid;

newidauto[playerid] = 0;
newcolorauto[playerid] = 0;
newzenaauto[playerid] = 0;
newXauto[playerid] = 0;
newYauto[playerid] = 0;
newZauto[playerid] = 0;
newangleauto[playerid] = 0;

new query_string1[500];
format(query_string1, sizeof(query_string1), "INSERT INTO `Auto` (`ID`, `Name`, `Color`, `Status`, `X`, `Y`, `Z`, `Angle`) VALUES ('%d', '%s', '%d', '%d', '%f', '%f', '%f', '%f')", pVehicle[vehicleid][pID], pVehicle[vehicleid][pName], pVehicle[vehicleid][pColor], pVehicle[vehicleid][pStatus], pVehicle[vehicleid][pX], pVehicle[vehicleid][pY], pVehicle[vehicleid][pZ], pVehicle[vehicleid][pAngle]);
mysql_function_query(mysql_connect_ID, query_string1 , false, "", "");
return 1;
}

Буду очень благодарен кто поможет!:smile:

DeimoS
26.02.2016, 23:41
Почему при загрузке используется MAX_VEHICLES? С помощью cache_get_data узнай сколько строк вернул запрос и уже исходя из этого значения запускай цикл.

Можно даже так:

new MAX_PLAYER_VEHICLES = 0;


public LoaginAuto()
{
new vehicleid[MAX_VEHICLES];
cache_get_data(mysql_connect_ID, MAX_PLAYER_VEHICLES, vehicleid[0]);
new query_string3[350];
for(new i; i < MAX_PLAYER_VEHICLES; i++)
{
//...



public SaveAuto()
{
new query_string1[500];
for(new i; i < MAX_PLAYER_VEHICLES; i++)
{
if(pVehicle[i][pID] > 0)
{
mysql_format(mysql_connect_ID,query_string1, sizeof(query_string1),"UPDATE `Auto` SET `ID`='%d', `Color`='%d', `Status`='%d', `X`='%f', `Y`='%f', `Z`='%f', `Angle`='%f' WHERE `Name`='%s'", pVehicle[i][pID] ,pVehicle[i][pColor], pVehicle[i][pStatus], pVehicle[i][pX], pVehicle[i][pY], pVehicle[i][pZ], pVehicle[i][pAngle], pVehicle[i][pName]);
mysql_function_query(mysql_connect_ID, query_string1, false, "", "");
}
}
return 1;
}


public NewSpawnAutoServer(playerid, X, Y, Z)
{
if(pInfo[playerid][pMoney] < newzenaauto[playerid]) return SendClientMessage(playerid, -1, "{D40000}[Ошибка] Вы не смогли оплатить автомобиль!");

pInfo[playerid][pMoney] = pInfo[playerid][pMoney] - newzenaauto[playerid];
GivePlayerMoney(playerid, -newzenaauto[playerid]);

new vehicleid = CreateVehicle(newidauto[playerid], newXauto[playerid], newYauto[playerid], newZauto[playerid], newangleauto[playerid], newcolorauto[playerid], newcolorauto[playerid], -1);
SendClientMessage(playerid, -1, "{183DFF}[Оповещение] Автомобиль доставлен на место! Спасибо за покупку!");

pVehicle[vehicleid][pID] = newidauto[playerid];
pVehicle[vehicleid][pColor] = newcolorauto[playerid];
format(pVehicle[vehicleid][pName], 24, "%s", pInfo[playerid][pName]);
pInfo[playerid][pAuto] = vehicleid;

newidauto[playerid] = 0;
newcolorauto[playerid] = 0;
newzenaauto[playerid] = 0;
newXauto[playerid] = 0;
newYauto[playerid] = 0;
newZauto[playerid] = 0;
newangleauto[playerid] = 0;

new query_string1[500];
format(query_string1, sizeof(query_string1), "INSERT INTO `Auto` (`ID`, `Name`, `Color`, `Status`, `X`, `Y`, `Z`, `Angle`) VALUES ('%d', '%s', '%d', '%d', '%f', '%f', '%f', '%f')", pVehicle[vehicleid][pID], pVehicle[vehicleid][pName], pVehicle[vehicleid][pColor], pVehicle[vehicleid][pStatus], pVehicle[vehicleid][pX], pVehicle[vehicleid][pY], pVehicle[vehicleid][pZ], pVehicle[vehicleid][pAngle]);
mysql_function_query(mysql_connect_ID, query_string1 , false, "", "");
MAX_PLAYER_VEHICLES++;
return 1;
}

И да, никогда не создавайте переменные (а уж, тем более, массивы) внутри циклов

KrutoyKrosch
26.02.2016, 23:57
Авто в mySQL таблице есть... Но почему то оно не заспаунилось при запуске мода... А еще не сохранились почему то координаты авто в таблицу... Команда установки спавна:


CMD:spawnauto(playerid)
{
new vehicleid = GetPlayerVehicleID(playerid);
if(pInfo[playerid][pAuto] <= 0) return SendClientMessage(playerid, -1, "{D40000}[Ошибка] У Вас нет автомобиля!");
if(pInfo[playerid][pAuto] == vehicleid)
{
GetVehiclePos(pInfo[playerid][pAuto], pVehicle[pInfo[playerid][pAuto]][pX], pVehicle[pInfo[playerid][pAuto]][pY], pVehicle[pInfo[playerid][pAuto]][pZ]);
GetVehicleZAngle(pInfo[playerid][pAuto], pVehicle[pInfo[playerid][pAuto]][pAngle]);
SendClientMessage(playerid, -1, "{04E100}[Оповещение] Координаты спавна авто установлены!");
}
return 1;
}

m1n1vv
27.02.2016, 00:20
Почему при загрузке используется MAX_VEHICLES? С помощью cache_get_data узнай сколько строк вернул запрос и уже исходя из этого значения запускай цикл.

Можно даже так:

new MAX_PLAYER_VEHICLES = 0;


А не так?

#define MAX_PLAYER_CARS number

DeimoS
27.02.2016, 01:08
Авто в mySQL таблице есть... Но почему то оно не заспаунилось при запуске мода... А еще не сохранились почему то координаты авто в таблицу... Команда установки спавна:


CMD:spawnauto(playerid)
{
new vehicleid = GetPlayerVehicleID(playerid);
if(pInfo[playerid][pAuto] <= 0) return SendClientMessage(playerid, -1, "{D40000}[Ошибка] У Вас нет автомобиля!");
if(pInfo[playerid][pAuto] == vehicleid)
{
GetVehiclePos(pInfo[playerid][pAuto], pVehicle[pInfo[playerid][pAuto]][pX], pVehicle[pInfo[playerid][pAuto]][pY], pVehicle[pInfo[playerid][pAuto]][pZ]);
GetVehicleZAngle(pInfo[playerid][pAuto], pVehicle[pInfo[playerid][pAuto]][pAngle]);
SendClientMessage(playerid, -1, "{04E100}[Оповещение] Координаты спавна авто установлены!");
}
return 1;
}

Покажи содержимое mysql_log


А не так?

#define MAX_PLAYER_CARS number

Нет, ибо при создании нового авто мы прибавляем к этой переменной единицу, дабы циклы работали верно

KrutoyKrosch
27.02.2016, 17:39
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('149')
[23:51:27] [ERROR] "cache_get_data" - invalid connection handle (ID = 0)

DeimoS
27.02.2016, 17:44
Покажи весь OnGameModeInIt

KrutoyKrosch
27.02.2016, 18:10
public OnGameModeInit()
{
mysql_connect_ID = mysql_connect(MYSQL_CONNECT_INFO);//Коннект к mySQL
SetGameModeText("RUS");//Имя мода
SendRconCommand("hostname •••••••California||RP||RUS•••••••");
SetTimer("PickupMapiconHaus", 1000, 0);
SetTimer("TimerGlobal",1000, 1);//Сохранение АКК
SetTimer("FuelCar", 20000, 1);
SetTimer("Speed", 100, 1);
SetTimer("Recklama",600000,1);
SetTimer("SaveHaus", 15000, 1);
SetTimer("SaveAuto", 20000, 1);

TaxiCall = 999;

DisableInteriorEnterExits();//Удаление входа выхода
EnableStuntBonusForAll(0);//Бонус 0
ManualVehicleEngineAndLights();

/*==========================ТЕКСТДРАВ SPEED==========================*/

Textdraw0 = TextDrawCreate(501.199981, 444.273345, "usebox");
TextDrawLetterSize(Textdraw0, 0.000000, -11.433704);
TextDrawTextSize(Textdraw0, 628.400024, 0.000000);
TextDrawAlignment(Textdraw0, 1);
TextDrawColor(Textdraw0, 0);
TextDrawUseBox(Textdraw0, true);
TextDrawBoxColor(Textdraw0, 102);
TextDrawSetShadow(Textdraw0, 0);
TextDrawSetOutline(Textdraw0, 0);
TextDrawFont(Textdraw0, 0);

Textdraw1 = TextDrawCreate(503.999908, 350.933441, "Speed:");
TextDrawLetterSize(Textdraw1, 0.449999, 1.600000);
TextDrawAlignment(Textdraw1, 1);
TextDrawColor(Textdraw1, 8388863);
TextDrawSetShadow(Textdraw1, 0);
TextDrawSetOutline(Textdraw1, 1);
TextDrawBackgroundColor(Textdraw1, 51);
TextDrawFont(Textdraw1, 1);
TextDrawSetProportional(Textdraw1, 1);

Textdraw2 = TextDrawCreate(506.399993, 370.346679, "Fuel:");
TextDrawLetterSize(Textdraw2, 0.449999, 1.600000);
TextDrawAlignment(Textdraw2, 1);
TextDrawColor(Textdraw2, 8388863);
TextDrawSetShadow(Textdraw2, 0);
TextDrawSetOutline(Textdraw2, 1);
TextDrawBackgroundColor(Textdraw2, 51);
TextDrawFont(Textdraw2, 1);
TextDrawSetProportional(Textdraw2, 1);

Textdraw3 = TextDrawCreate(504.799957, 390.506683, "Condition:");
TextDrawLetterSize(Textdraw3, 0.449999, 1.600000);
TextDrawAlignment(Textdraw3, 1);
TextDrawColor(Textdraw3, 8388863);
TextDrawSetShadow(Textdraw3, 0);
TextDrawSetOutline(Textdraw3, 1);
TextDrawBackgroundColor(Textdraw3, 51);
TextDrawFont(Textdraw3, 1);
TextDrawSetProportional(Textdraw3, 1);

Textdraw4 = TextDrawCreate(506.400238, 412.906768, "Engine:");
TextDrawLetterSize(Textdraw4, 0.449999, 1.600000);
TextDrawAlignment(Textdraw4, 1);
TextDrawColor(Textdraw4, 8388863);
TextDrawSetShadow(Textdraw4, 0);
TextDrawSetOutline(Textdraw4, 1);
TextDrawBackgroundColor(Textdraw4, 51);
TextDrawFont(Textdraw4, 1);
TextDrawSetProportional(Textdraw4, 1);
/*======================ВЫДАЧА БЕНЗИНА============*/
for(new veh; veh < MAX_VEHICLES; veh++){Fuel{veh} = 150;}

Interior();
Pickup();
Auto();
ObjectMove();

mysql_function_query(mysql_connect_ID,"SELECT * FROM `doma`", true, "LoaginHaus","");
mysql_function_query(mysql_connect_ID,"SELECT * FROM `Auto`", true, "LoaginAuto","");
return 1;
}

DeimoS
27.02.2016, 18:37
Хмм, странно... А логи точно свежие? Попробуй удалить файл с логами, запустить сервер и опять скинуть содержимое

KrutoyKrosch
27.02.2016, 18:51
Так я так и сделал... Все свежее...

- - - Добавлено - - -

Могу скинуть вообще весь код системы и таблицу mySQL в лс. Идет?

DeimoS
27.02.2016, 20:02
Так я так и сделал... Все свежее...

- - - Добавлено - - -

Могу скинуть вообще весь код системы и таблицу mySQL в лс. Идет?

Ну только если ты, в итоге, выложишь в эту тему решение проблемы, дабы другие, в случае чего, смогли по твоей проблеме решить и свою

BadPawn
27.02.2016, 21:55
При загрузке, была точная такая же проблема, исправил таким образом, пример сейчас быстренько накидаю:



for (new f = 0; f < max_vehicle; f++)
{
cInfo[f][cColor] = cache_get_field_content_int(f, "COLOR", mysql_connBD);//f - f
}
//исход таков:
//[23:51:27] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('1') Х6
//[23:51:27] [ERROR] "cache_get_data" - invalid connection handle (ID = 0)


А вот этот случай уже исправил мою проблему:


for (new f = 0; max_vehicles < rows; f++)
{
cInfo[f][cColor] = cache_get_field_content_int(max_vehicles, "COLOR", mysql_connBD);//f - max_vehicles
max_vehicles++;
}

Не знаю почему, пробовал разные варианты и удался этот. )

KrutoyKrosch
12.03.2016, 19:33
Я сделал все со всем по другому, теперь работает, всем спасиб!