PDA

Просмотр полной версии : [Вопрос] Проблема, связанная с работоспособностью функции в новой версии MySQL [R41]



PawnoNoob
06.11.2016, 23:47
Привет всем. Недавно я спрашивал у Вас о версии MySQL и всё же решил перевести мод на новейшую версию плагина, но столкнулся с проблемой. В одной из систем требуется вывод имени игрока из базы данных, но чтобы получить этот ник, необходимо отправить запрос. На версии R39-4 всё работало стабильно, но теперь работает как-то... не очень, точнее вообще не работает.
Как было на R39-4: (для примера)

new nick[MAX_PLAYER_NAME];
cache_get_field_content(0, "nick", MySQL, MAX_PLAYER_NAME);
При этом всё нормально выводилось.
После того, как я перевёл (почти...) мод на новую версию, я снова же решил проверить эту систему, но ничего не выводилось.
Я сделал почти так же:

new nick[MAX_PLAYER_NAME];
cache_get_value_name(0, "nick", nick, MAX_PLAYER_NAME);
Потом сделал вот так:

new nick[32];
cache_get_value_name(0, "nick", nick, 32);
И всё снова встало на свои места. Из-за чего это может быть? :dash2:

$continue$
07.11.2016, 02:20
Можно сделать так:


new nick[MAX_PLAYER_NAME + 1];
cache_get_value_name(0, "nick", nick);

DeimoS
07.11.2016, 13:07
Нужно смотреть запрос и mysql_log.

PawnoNoob
07.11.2016, 14:17
Можно сделать так:


new nick[MAX_PLAYER_NAME + 1];
cache_get_value_name(0, "nick", nick);



new nick[MAX_PLAYER_NAME+1];
cache_get_value_name_(0, "nick", nick, MAX_PLAYER_NAME);
Не помогло. :sad:

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


Нужно смотреть запрос и mysql_log.

[13:15:18] [WARNING] mysql_connect: no password specified

Не думаю, что это как-то относится к моей проблеме :blush2:
"SELECT * FROM.... WHERE `id` = '%i'" - запрос. Выгружает всё кроме ника.

$continue$
07.11.2016, 19:05
Зачем Вы поставили размер константой?
Вставьте мой код и проверьте. Должно работать.

PawnoNoob
07.11.2016, 22:16
Зачем Вы поставили размер константой?
Вставьте мой код и проверьте. Должно работать.

Странно, но всё равно не работает :fool:

DeimoS
07.11.2016, 23:10
Зачем Вы поставили размер константой?
Вставьте мой код и проверьте. Должно работать.

Причём тут вообще макрос и последний параметр? Если даже его не указывать, всё равно сработает sizeof.


Автор, покажи полный код, начиная от того, как ты узнаёшь ID, и заканчивая тем, как ты извлекаешь данные.

Item
08.11.2016, 16:13
Столкнулся с подобной проблемой при попытке записать данные с кэшка (cache_get_value_name_int), в переменную типа char. Компилятор выкидывает ошибку, указывая на третий аргумент

cache_get_value_name_int(0, !"exp", source_exp{playerid});

DeimoS
08.11.2016, 16:29
Потому что cache_get_value_name_int работает с ячейками и не умеет работать с конкретными байтами.
Делай так

new exp_buff;
cache_get_value_name_int(0, !"exp", exp_buff);
source_exp{playerid} = exp_buff;

Item
08.11.2016, 16:48
Потому что cache_get_value_name_int работает с ячейками и не умеет работать с конкретными байтами.
Делай так

new exp_buff;
cache_get_value_name_int(0, !"exp", exp_buff);
source_exp{playerid} = exp_buff;

Благодарю

PawnoNoob
11.11.2016, 21:05
Причём тут вообще макрос и последний параметр? Если даже его не указывать, всё равно сработает sizeof.


Автор, покажи полный код, начиная от того, как ты узнаёшь ID, и заканчивая тем, как ты извлекаешь данные.

Прошу.
OnPlayerConnect:

GetPlayerIp(playerid, PlayerInfo[playerid][pIP], 16);
OnPlayerRequestClass

format(query, sizeof(query), "SELECT * FROM `banip` WHERE `banip` LIKE '%s'", PlayerInfo[playerid][pIP]);
mysql_tquery(MySQL, query, "checkbanip", "i", playerid);
checkbanip:

new rows;
cache_get_row_count(rows);
if(rows)
{
new bandate, unbandate, administrator[MAX_PLAYER_NAME], reason[40];
cache_get_value_name(0, "administrator", administrator, MAX_PLAYER_NAME);
cache_get_value_name(0, "reason", reason, 41);
cache_get_value_name_int(0, "bandate", bandate);
cache_get_value_name_int(0, "unbandate", unbandate);
// Тут выводим информацию о блокировке
}
Выгружается всё кроме имени администратора, выдавшего наказание. Если выводить эту информацию в чат, то выйдет пустая строка (даже если включён /timestamp).

DeimoS
12.11.2016, 02:03
Удостоверься, что данные в таблице имеются.
И покажи структуру таблицы

PawnoNoob
12.11.2016, 13:50
Удостоверься, что данные в таблице имеются.
И покажи структуру таблицы

Я же писал, что выводится всё, кроме имени администратора, выдавшего наказание. Если MAX_PLAYER_NAME поменять на цифровое значение, то выводится и имя администратора.
Вот структура:
http://i.imgur.com/VHvMJWr.png
Причину, например, выводит.

DeimoS
12.11.2016, 16:03
Макрос MAX_PLAYER_NAME никак не изменён?

PawnoNoob
12.11.2016, 16:16
Макрос MAX_PLAYER_NAME никак не изменён?

Да вроде нет.
http://i.imgur.com/sQtVNQG.png

DeimoS
13.11.2016, 00:06
Всё же перепроверь наличие данных в таблице, ибо код рабочий.

Вот даже сам протестировал

http://i.imgur.com/pUMoTlZ.png
http://i.imgur.com/GVqIwD6.png
http://i.imgur.com/Igap5GJ.png

PawnoNoob
13.11.2016, 01:52
Всё же перепроверь наличие данных в таблице, ибо код рабочий.

Вот даже сам протестировал

http://i.imgur.com/pUMoTlZ.png
http://i.imgur.com/GVqIwD6.png
http://i.imgur.com/Igap5GJ.png

Вывод в консоль:
http://i.imgur.com/zsqHvBQ.png
Код:
http://i.imgur.com/WREAp1H.png
База данных:
http://i.imgur.com/ZJGC4Cu.png
Вывод информации в игре:
http://i.imgur.com/CM7hbuM.png

Ну и вывод остальной информации:
http://i.imgur.com/yLtIwvV.png
http://i.imgur.com/OWuGcBU.png
http://i.imgur.com/GFd6gG6.png

Может в кодировке проблема?
При запуске

mysql_set_charset("cp1251_general_ci", MySQL);
mysql_tquery(MySQL, "SET NAMES 'cp1251'", "", "");
mysql_tquery(MySQL, "SET CHARACTER SET 'cp1251'", "", "");

Geebrox
13.11.2016, 02:20
в коде, который ты предоставил ранее, ты записывал значение из бд в переменную nick. А выше ты используешь administrator. Можешь показать код как ты записываешь значение в переменную administartor?

PawnoNoob
13.11.2016, 13:02
в коде, который ты предоставил ранее, ты записывал значение из бд в переменную nick. А выше ты используешь administrator. Можешь показать код как ты записываешь значение в переменную administartor?

В первом сообщении пример был, а остальной код ПОЛУЧЕНИЯ есть немного выше.

$continue$
13.11.2016, 14:02
Если не трудно, то выложи дамп таблицы + код загрузки (с запросом)

PawnoNoob
13.11.2016, 14:22
Если не трудно, то выложи дамп таблицы + код загрузки (с запросом)

Вот ссылка (http://rgho.st/private/7kZwRcv9N/df99d021984f03c468cc3434785b8b00) на дамп, а код находится в 11 сообщении.

Geebrox
13.11.2016, 18:40
Вот ссылка (http://rgho.st/private/7kZwRcv9N/df99d021984f03c468cc3434785b8b00) на дамп, а код находится в 11 сообщении.



CREATE TABLE IF NOT EXISTS `banip` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`banip` varchar(16) NOT NULL,
`bandate` int(11) NOT NULL,
`unbandate` int(11) NOT NULL,
`administrator` varchar(24) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL,
`reason` varchar(40) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;


Попробуй создать эту таблицу

PawnoNoob
13.11.2016, 19:08
CREATE TABLE IF NOT EXISTS `banip` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`banip` varchar(16) NOT NULL,
`bandate` int(11) NOT NULL,
`unbandate` int(11) NOT NULL,
`administrator` varchar(24) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL,
`reason` varchar(40) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;


Попробуй создать эту таблицу

Как бы странно ни звучало, но не помогло :sad:

Geebrox
13.11.2016, 21:08
а MAX_PLAYER_NAME точно не изменен? попробуй логировать

PawnoNoob
13.11.2016, 21:17
а MAX_PLAYER_NAME точно не изменен? попробуй логировать

Точно-точно, я даже скриншот a_samp.inc кидал, а в самом .pwn файле даже и не думал менять :boredom:

Geebrox
13.11.2016, 21:27
ну тогда не настраивай значение max_len он возьмет размер массива сам (только если массив не был создан в энуменаторе или это не многомерный массив)


измени код на это:

new administator[MAX_PLAYER_NAME];
cache_get_value_name(0, "administator", administator);

PawnoNoob
13.11.2016, 22:02
ну тогда не настраивай значение max_len он возьмет размер массива сам (только если массив не был создан в энуменаторе или это не многомерный массив)


измени код на это:

new administator[MAX_PLAYER_NAME];
cache_get_value_name(0, "administator", administator);

Это (http://pro-pawn.ru/showthread.php?14487-%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81%D0%B2%D1%8F%D0%B7%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F-%D1%81-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BE%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-%D0%B2-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B9-%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8-MySQL-R41&p=79027&viewfull=1#post79027) и так не помогало

Geebrox
13.11.2016, 22:14
перед созданием переменного administrator просто для проверки сделай:



#if defined MAX_PLAYER_NAME
#undef MAX_PLAYER_NAME
#endif
const MAX_PLAYER_NAME = 24;

PawnoNoob
14.11.2016, 11:15
перед созданием переменного administrator просто для проверки сделай:



#if defined MAX_PLAYER_NAME
#undef MAX_PLAYER_NAME
#endif
const MAX_PLAYER_NAME = 24;


Неа, не помогло.

qwezert
14.11.2016, 12:52
Неа, не помогло.

Тут проблема в кодировке скорее всего, меня смутило вот это
mysql_set_charset("cp1251_general_ci", MySQL);
При том что в БД у поля стоит cp1251_general_cs. Поменяй кодировку и вообще юзай utf-8, а то задолбаешься потом перекодировать вечно.