Вход

Просмотр полной версии : [Вопрос] Почему не считывает цвет из базы данных после перезапуска сервера?



McGetto
21.05.2015, 23:58
Короче вот мой код записи цвета игрока в базу данных:

new query_string[1000] = "UPDATE `accounts` SET";
format(query_string, sizeof(query_string), "%s `Color` = '%06x'", query_string, PlayerInfo[playerid][pColor] >>> 8);
format(query_string, sizeof(query_string), "%s WHERE `Nick` = '%s'", query_string, PlayerInfo[playerid][pName]);
mysql_function_query(mysql_connect_ID, query_string, false, "", "");

А вот код считывания:
new query_string_get[52+MAX_PLAYER_NAME];
format(query_string_get, sizeof(query_string_get), "SELECT * FROM `accounts` WHERE `Color` = %x", PlayerInfo[playerid][pColor]);
mysql_query(mysql_connect_ID, query_string_get);

Все работает нормально до перезапуска сервера, после перезапуска - цвет из базы данных не считывается, т.е в переменную записывается значение 0 (черный цвет). Как исправить?

Daniel_Cortez
22.05.2015, 10:55
Не очень разбираюсь в SQL, но всё же попробую помочь.

Во-первых, в коде сохранения указан цвет PlayerInfo[playerid][pColor] >>> 8, а в коде загрузки - PlayerInfo[playerid][pColor]. Либо делайте такой же сдвиг на 8 бит вправо в коде загрузки, либо убирайте его из сохранения. Я бы выбрал второй вариант, поскольку метки на радаре могут быть и прозрачными, а при сдвиге значение прозрачности теряется.

Во-вторых, для цвета используется в сохранении используется спецификатор "%06x", а в загрузке - "%x", они могут дать разные результаты, если градация красного в цвете равна нулю. Советую использовать "%06x" в обоих вариантах либо "%08x", если вы убрали сдвиг вправо (см. выше).

В-третьих (хоть это и не относится к проблеме), что будет, если я зарегистрирую игрока с ником "Daniel ') DROP TABLE `accounts`;--" ?
Подсказка. (http://xkcd.ru/327/)
И ещё. (http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_format)

$continue$
22.05.2015, 19:20
Не очень разбираюсь в SQL, но всё же попробую помочь.

Во-первых, в коде сохранения указан цвет PlayerInfo[playerid][pColor] >>> 8, а в коде загрузки - PlayerInfo[playerid][pColor]. Либо делайте такой же сдвиг на 8 бит вправо в коде загрузки, либо убирайте его из сохранения. Я бы выбрал второй вариант, поскольку метки на радаре могут быть и прозрачными, а при сдвиге значение прозрачности теряется.

Во-вторых, для цвета используется в сохранении используется спецификатор "%06x", а в загрузке - "%x", они могут дать разные результаты, если градация красного в цвете равна нулю. Советую использовать "%06x" в обоих вариантах либо "%08x", если вы убрали сдвиг вправо (см. выше).

В-третьих (хоть это и не относится к проблеме), что будет, если я зарегистрирую игрока с ником "Daniel ') DROP TABLE `accounts`;--" ?
Подсказка. (http://xkcd.ru/327/)
И ещё. (http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_format)

А будет SQL инъекция

Mazzilla
22.05.2015, 19:21
В-третьих (хоть это и не относится к проблеме), что будет, если я зарегистрирую игрока с ником "Daniel ') DROP TABLE `accounts`;--" ?
Подсказка. (http://xkcd.ru/327/)
И ещё. (http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_format)
http://cs621917.vk.me/v621917707/272a9/24PDUmOecR8.jpg

Daniel_Cortez
22.05.2015, 21:14
Так и знал, что напишут что-то в этом роде.
Да, трюк не сработает, но дело даже не в длине ника.

http://breedpmnr.ru/i/0C6BFB

$continue$
23.05.2015, 19:54
Так и знал, что напишут что-то в этом роде.
Да, трюк не сработает, но дело даже не в длине ника.

http://breedpmnr.ru/i/0C6BFB
Можно не ставить в клиент такой ник, просто при регистрации (если такова имеется), в диалог вводим Daniel ') DROP TABLE `accounts`;--
Но правда если не стоит, mysql_format

McGetto
24.05.2015, 17:05
Daniel_Cortez, так?:
Код записи:
new query_string[1000] = "UPDATE `accounts` SET";
format(query_string, sizeof(query_string), "%s `Color` = '%06x'", query_string, PlayerInfo[playerid][pColor]);
format(query_string, sizeof(query_string), "%s WHERE `Nick` = '%s'", query_string, PlayerInfo[playerid][pName]);
mysql_function_query(mysql_connect_ID, query_string, false, "", "");

Код считывания:
new query_string_get[52+MAX_PLAYER_NAME];
format(query_string_get, sizeof(query_string_get), "SELECT * FROM `accounts` WHERE `Color` = %06x", PlayerInfo[playerid][pColor]);
mysql_query(mysql_connect_ID, query_string_get);

Все равно не работает :( А вот если записывать в Int и считывать так:
cache_get_field_content_int(0, "Skin", mysql_connect_ID);
То работает отлично, но цвет сохраняется целочисленными числами, типа этого: 65579 или -16554789, а мне это не нравиться, ибо читать цвет в таком формате я не могу, гораздо удобнее читать например зеленый цвет как: 00FF00.