Mieszanie się rekordów mysql.
Black004
03.08.2019
Cześc, mój problem polega na tym, że zapis sql w ogóle nie działa lub jak już zadziała to mieszają się rekordy, że moge dostać zapis szlugow innego gracza... Nie wiem jak to jest możliwe, w 1 bazie mysql mam 5 tabel, a w nich różne zapisy od pluginów. A to od banku, szlugów, gangów itd...
Daję tu kod zapisu szlugów, może jak tu się dowiem o co chodzi to w pozostałych też to poprawie:
tak tworzę, tabele. Task jest ustawiony dlatego, że jak kilka pluginów mam, że tworzą tabele i się łączą z bazą danych to serwer się nie włącza
public plugin_cfg() { set_task(1.0, "Wczytaj", TASK_POBIERZ); } public Wczytaj(){ info = SQL_MakeDbTuple("xxx", "xxx", "ccc", "xxx"); new len_full, temp_full[2024]; len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "CREATE TABLE IF NOT EXISTS `szlugid` (`name` VARCHAR(48), `szlugi` FLOAT(10), PRIMARY KEY (`name`));)"); SQL_ThreadQuery(info, "ConnectSql_Handler", temp_full); remove_task(TASK_POBIERZ) }
public ConnectSql_Handler(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { connected = false; return PLUGIN_CONTINUE; } connected = true; return PLUGIN_CONTINUE; }
public client_putinserver(id) { get_user_name(id, nazwa_gracza, 63) resetData(id); readData(id); } public client_disconnect(id) { saveData(id); resetData(id); } public resetData(id) { ilosc_jbpack[id] = 0.00 } public saveData(id) { if(!connected || is_user_bot(id) || is_user_hltv(id)) return PLUGIN_CONTINUE; new len_full, temp_full[2048]; mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza)); len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "UPDATE `szlugid` SET `szlugi` = '%.2f' WHERE `name` = ^"%s^";", ilosc_jbpack[id], nazwa_gracza); SQL_ThreadQuery(info, "saveDataHandler", temp_full); return PLUGIN_CONTINUE; } public saveDataHandler(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; } public readData(id) { if(!connected || is_user_bot(id) || is_user_hltv(id)) return PLUGIN_CONTINUE; new data[1], temp[2048], name[33]; data[0] = id; mysql_escape_string(name, charsmax(name)); formatex(temp, charsmax(temp), "SELECT * FROM `szlugid` WHERE `name` = '%s'", nazwa_gracza); SQL_ThreadQuery(info, "readDataHandler", temp, data, sizeof(data)); return PLUGIN_CONTINUE; } public readDataHandler(failstate, Handle:query, error[], errnum, data[], size) { new id = data[0]; if(failstate != TQUERY_SUCCESS) { log_amx("Error %s", error) return PLUGIN_CONTINUE; } new Float:ilosc_pre; if(SQL_MoreResults(query)) { SQL_ReadResult(query, 1, ilosc_pre) ilosc_jbpack[id] = ilosc_pre } else { new data[1]; data[0] = id; if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id)) return PLUGIN_CONTINUE; new temp[2048]; mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza)); format(temp, charsmax(temp), "INSERT INTO `szlugid` (`name`, `szlugi`) VALUES ('%s', '0')", nazwa_gracza); SQL_ThreadQuery(info, "readDataHandler2", temp, data, sizeof(data)); return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; } public readDataHandler2(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { log_amx("Wczytywanie dla %s blad %s", nazwa_gracza, error); return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; } stock mysql_escape_string(output[], len) { static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" }; static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" }; for(new i; i < sizeof szReplaceIn; i++) replace_all(output, len, szReplaceIn[i], szReplaceOut[i]); }
Nie wiem już sam o co chodzi, już trochę z tym się męczę. Z góry dzięki za pomoc
Użytkownik Black004 edytował ten post 03.08.2019 17:19
Robiin
03.08.2019
W ReadData robisz escape string na pustej zmiennej 'name', a używasz nazwa_gracza, która jeszcze nie jest 'przerobiona', bo ReadData wykonuje się od razu po połączeniu. Jeśli to nie to, będziemy szukać dalej.
Zmienna nazwa_gracza jest tablicą jednowymiarową - przechowa najwyżej jeden napis.
Zmień deklaracje z
new nazwa_gracza[64]
na
new nazwa_gracza[33][64]
a przy pobieraniu nazwy rób
get_user_name(id, nazwa_gracza[id], charsmax(nazwa_gracza[]));
public saveDataHandler(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; }
^ empty statement / bezsensowny statement
Użytkownik aSiorr edytował ten post 03.08.2019 19:54
Rivit
03.08.2019
Nie musisz tak robić:
new len_full, temp_full[2048]; len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "UPDATE `szlugid` SET `szlugi` = '%.2f' WHERE `name` = ^"%s^";", ilosc_jbpack[id], nazwa_gracza);
wystarczy:
new temp_full[2048]; formatex(temp_full, charsmax(temp_full), "UPDATE `szlugid` SET `szlugi` = '%.2f' WHERE `name` = ^"%s^";", ilosc_jbpack[id], nazwa_gracza);
Black004
04.08.2019
hmm Chyba działa, ale długo się ładują te zapisy da się jakoś to przyśpieszyć? Jak gracz wchodzi na serwer to mija z około 3 sekundy zanim się wszystko załaduję
Rivit
04.08.2019
No to może być problem ze słabym połączeniem do bazy lub obciążeniem serwera.
normalnie wczytywanie tez ma opoznienie, ale aż 3 sekundowe to raczej nie.
Spróbuj lokalnie sobie baze postawić i do niej się łączyć i zobaczysz czy to wina kodu czy bazy
Black004
04.08.2019
Rivit
04.08.2019
Tak, task + zmiana mapy, ale to nie ma znaczenia chyba, bo i tak zdąży sie z baza polaczyc zanim gracze wejda
Black004
04.08.2019
Jednak czasami zapis znowu nie działa sam sie przekonałem, wbiłem na serwer i nie dostałem moich zapisanych szlugów
Kod:
public client_putinserver(id) { get_user_name(id, nazwa_gracza[id], charsmax(nazwa_gracza[])); resetData(id); readData(id); } public client_disconnect(id) { saveData(id); resetData(id); } public resetData(id) { ilosc_jbpack[id] = 0.00 } public saveData(id) { if(!connected || is_user_bot(id) || is_user_hltv(id)) return PLUGIN_CONTINUE; new temp_full[2048]; mysql_escape_string(nazwa_gracza[id], charsmax(nazwa_gracza)); formatex(temp_full, charsmax(temp_full), "UPDATE `szlugid` SET `szlugi` = '%.2f' WHERE `name` = ^"%s^";", ilosc_jbpack[id], nazwa_gracza[id]); SQL_ThreadQuery(info, "saveDataHandler", temp_full); return PLUGIN_CONTINUE; } public saveDataHandler(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; } public readData(id) { if(!connected || is_user_bot(id) || is_user_hltv(id)) return PLUGIN_CONTINUE; new data[1], temp[2048]; data[0] = id; mysql_escape_string(nazwa_gracza[id], charsmax(nazwa_gracza)); formatex(temp, charsmax(temp), "SELECT * FROM `szlugid` WHERE `name` = '%s'", nazwa_gracza[id]); SQL_ThreadQuery(info, "readDataHandler", temp, data, sizeof(data)); return PLUGIN_CONTINUE; } public readDataHandler(failstate, Handle:query, error[], errnum, data[], size) { new id = data[0]; if(failstate != TQUERY_SUCCESS) { log_amx("Error %s", error) return PLUGIN_CONTINUE; } new Float:ilosc_pre; if(SQL_MoreResults(query)) { SQL_ReadResult(query, 1, ilosc_pre) ilosc_jbpack[id] = ilosc_pre } else { new data[1]; data[0] = id; if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id)) return PLUGIN_CONTINUE; new temp[2048]; mysql_escape_string(nazwa_gracza[id], charsmax(nazwa_gracza)); format(temp, charsmax(temp), "INSERT INTO `szlugid` (`name`, `szlugi`) VALUES ('%s', '0')", nazwa_gracza[id]); SQL_ThreadQuery(info, "readDataHandler2", temp, data, sizeof(data)); return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; } public readDataHandler2(failstate, Handle:query, error[], errnum, data[], size) { new id = data[0]; if(failstate != TQUERY_SUCCESS) { log_amx("Wczytywanie dla %s blad %s", nazwa_gracza[id], error); return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; } stock mysql_escape_string(output[], len) { static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" }; static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" }; for(new i; i < sizeof szReplaceIn; i++) replace_all(output, len, szReplaceIn[i], szReplaceOut[i]); }
Rivit
04.08.2019
pozakładaj sobie logi na wczytywanie zapisywanie i śledź zmienne, wtedy zobaczysz co nie tak jest.
PAtrz też w baze danych czy dobrze zapisało.
Samodzielności troche...
Black004
04.08.2019
pozakładaj sobie logi na wczytywanie zapisywanie i śledź zmienne, wtedy zobaczysz co nie tak jest.
PAtrz też w baze danych czy dobrze zapisało.
Samodzielności troche...
Logi zrobiłem i wszystko dobrze wypisuję, dodam jeszcze, że usunęło mi nie tylko szlugi, ale wszędzie gdzie robiłem ten właśnie zapis
Użytkownik Black004 edytował ten post 04.08.2019 16:29
Black004
17.08.2019
To pokaż te logi z przypadku gdy wystąpił bug
Bug występuję podczas wczytywania szlugów, rzadko występuję, ale jak już wystąpi to usuwa zapis gracza z innych pluginów, gdzie właśnie używam tego kodu.
Mój kod się troche zmienił wygląda on teraz tak:
public client_authorized(id) { resetData(id); set_task(0.1, "readData", id + TASK_DATA); }
public readData(id) { if (!connected) { set_task(1.0, "readData", id); return; } id -= TASK_DATA; if(!connected || is_user_bot(id) || is_user_hltv(id)) return; new data[1]; data[0] = id; new nazwa_gracza[33]; get_user_name(id, nazwa_gracza, charsmax(nazwa_gracza)); mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza)); new temp[512]; formatex(temp, charsmax(temp), "SELECT * FROM `szlugid` WHERE `name` = '%s'", nazwa_gracza); SQL_ThreadQuery(info, "readDataHandler", temp, data, sizeof(data)); return; } public readDataHandler(failstate, Handle:query, error[], errnum, data[], size) { new id = data[0]; if(failstate != TQUERY_SUCCESS) { log_amx("Error %s", error) return PLUGIN_CONTINUE; } new Float:ilosc_pre; new nazwa = SQL_FieldNameToNum(query,"szlugi") if(SQL_MoreResults(query)) { SQL_ReadResult(query, nazwa, ilosc_pre) ilosc_jbpack[id] = ilosc_pre log_amx("LOAD %.2f", ilosc_jbpack[id]) } else { if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id)) return PLUGIN_CONTINUE; new data[1]; data[0] = id; new nazwa_gracza[33]; get_user_name(id, nazwa_gracza, charsmax(nazwa_gracza)); mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza)); new temp[512]; format(temp, charsmax(temp), "INSERT INTO `szlugid` (`name`, `szlugi`) VALUES ('%s', '0')", nazwa_gracza); SQL_ThreadQuery(info, "readDataHandler2", temp, data, sizeof(data)); return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; }
Dziwne to jest, kompletnie nie mam pojęcia o co chodzi
Rivit
17.08.2019
no musisz logi dodać sobie i popatrzec co sie dzieje w momencie gdy bug występuje.
Obloguj sobie każdą zmienną, każdego ifa i szukaj, bo tak to szukanie na ślepo.
Black004
17.08.2019
no musisz logi dodać sobie i popatrzec co sie dzieje w momencie gdy bug występuje.
Obloguj sobie każdą zmienną, każdego ifa i szukaj, bo tak to szukanie na ślepo.
Nie ma szybszego sposobu ? Bo w sumie jak patrzyłem na inne kody mysql z zapisywanie i wczytywanie wygląda prawie identycznie co u mnie, więc dlaczego tam działa, a mi nie ?
Hiko
17.08.2019
no musisz logi dodać sobie i popatrzec co sie dzieje w momencie gdy bug występuje.
Obloguj sobie każdą zmienną, każdego ifa i szukaj, bo tak to szukanie na ślepo.
Nie ma szybszego sposobu ? Bo w sumie jak patrzyłem na inne kody mysql z zapisywanie i wczytywanie wygląda prawie identycznie co u mnie, więc dlaczego tam działa, a mi nie ?
nie ma szybszego i ten jest najlepszy