Просмотр полной версии : [Вопрос] Проблема, связанная с работоспособностью функции в новой версии 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);
Нужно смотреть запрос и 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:
Зачем Вы поставили размер константой?
Вставьте мой код и проверьте. Должно работать.
Причём тут вообще макрос и последний параметр? Если даже его не указывать, всё равно сработает sizeof.
Автор, покажи полный код, начиная от того, как ты узнаёшь ID, и заканчивая тем, как ты извлекаешь данные.
Столкнулся с подобной проблемой при попытке записать данные с кэшка (cache_get_value_name_int), в переменную типа char. Компилятор выкидывает ошибку, указывая на третий аргумент
cache_get_value_name_int(0, !"exp", source_exp{playerid});
Потому что cache_get_value_name_int работает с ячейками и не умеет работать с конкретными байтами.
Делай так
new exp_buff;
cache_get_value_name_int(0, !"exp", exp_buff);
source_exp{playerid} = exp_buff;
Потому что 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).
Удостоверься, что данные в таблице имеются.
И покажи структуру таблицы
PawnoNoob
12.11.2016, 13:50
Удостоверься, что данные в таблице имеются.
И покажи структуру таблицы
Я же писал, что выводится всё, кроме имени администратора, выдавшего наказание. Если MAX_PLAYER_NAME поменять на цифровое значение, то выводится и имя администратора.
Вот структура:
http://i.imgur.com/VHvMJWr.png
Причину, например, выводит.
Макрос MAX_PLAYER_NAME никак не изменён?
PawnoNoob
12.11.2016, 16:16
Макрос MAX_PLAYER_NAME никак не изменён?
Да вроде нет.
http://i.imgur.com/sQtVNQG.png
Всё же перепроверь наличие данных в таблице, ибо код рабочий.
Вот даже сам протестировал
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'", "", "");
в коде, который ты предоставил ранее, ты записывал значение из бд в переменную 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 сообщении.
Вот ссылка (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:
а MAX_PLAYER_NAME точно не изменен? попробуй логировать
PawnoNoob
13.11.2016, 21:17
а MAX_PLAYER_NAME точно не изменен? попробуй логировать
Точно-точно, я даже скриншот a_samp.inc кидал, а в самом .pwn файле даже и не думал менять :boredom:
ну тогда не настраивай значение 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) и так не помогало
перед созданием переменного 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;
Неа, не помогло.
Неа, не помогло.
Тут проблема в кодировке скорее всего, меня смутило вот это
mysql_set_charset("cp1251_general_ci", MySQL);
При том что в БД у поля стоит cp1251_general_cs. Поменяй кодировку и вообще юзай utf-8, а то задолбаешься потом перекодировать вечно.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot