PDA

Просмотр полной версии : [Вопрос] Небольшая проблема с авторизацией



PawnoNoob
16.04.2016, 00:30
Приветствую Вас. Не буду загружать Вас большим количеством лишней информации, а сразу перейду к делу:
Столкнулся с небольшой проблемой, а именно с командой авторизации администратора (Назовём команду "/logadm").
Описание проблемы: команда выполнена не на диалоге, а просто ввод текста в чат (/logadm qwerty), но, если ты вводишь любые символы и даже превышаешь выделенное количество символов для пароля от панели, тебя всё равно авторизует, как администратора, при этом не срабатывает кик при вводе неверного пароля. Пароль от панели администратора может содержать буквы английского алфавита и цифры, кодировка в базе данных: cp1251_bin, тип varchar(12 символов) и по умолчанию установлено 0.
Сам код (не копировал из своего кода, но суть та же)

CMD:logadm(playerid, params[])
{
// проверка на уровень администратора.
new pass[12];
if(sscanf(params, "s[12]", pass)) return SendClientMessage(playerid, cGray, "текст использования команды");
// здесь показываем информацию о том, что пароль должен быть не больше 12 символов (если введёт больше 12)
if(strcmp(pass, info[playerid][admpass], false))
{
// выводим сообщение администрации о том, что администратор ввёл неверный пароль с помощью format.
// кикаем администратора, который неверно ввёл пароль.
}
else
{
// авторизуем администратора, даём доступ ко всем командам (назовём это "admlog[playerid] = true;")
// оповещаем администраторов о том, что игрок авторизовался с помощью format.
}
return 1;
}
Не нужно задавать вопрос "А почему нету переменной new string?" и тому подобные вопросы. Я повторюсь, что не копировал из своего кода, а написал так, как выглядит команда в нём, изменяя почти всё.

Решил я проверить свой пароль от панели администратора и сделал небольшую команду (назовём её "/daipass"). Выделил ей string размером 13 символов и сделал так, чтобы при вводе команды выводило сообщение с паролем от панели администратора в чат.

CMD:daipass(playerid)
{
new string[13];
format(string, sizeof(string), "%s", info[playerid][admpass]);
SendClientMessage(playerid, цвет, string);
return 1;
Но после ввода данной команды мне выводило лишь пустое сообщение, в котором вообще ничего не было написано.
Примечание: после ввода пароля от аккаунта, при загрузке аккаунта игрока, загружает пароль от панели администратора:

info[playerid][admpass] = cache_get_field_content_int(0, "название столбца", название переменной подключения);
(пароль сохраняется в базе данных)

TheMallard
16.04.2016, 04:42
А почему cache_get_field_content_int?

PawnoNoob
16.04.2016, 12:51
А почему cache_get_field_content_int?

А что кроме этого использовать можно? Я уже не раз говорил, что в этом ещё "так себе" разбираюсь :scratch_one-s_head:

StevenH
16.04.2016, 13:05
А что кроме этого использовать можно? Я уже не раз говорил, что в этом ещё "так себе" разбираюсь :scratch_one-s_head:

Используй:

native cache_get_field_content(row, const field_name[], destination[], connectionHandle = 1, max_len = sizeof(destination));

PawnoNoob
16.04.2016, 14:35
То есть функция cache_get_field_content_int используется для поиска чисел в базе данных, а cache_get_field_content и числа и буквы, верно? Просто я редко захожу в mysql_log, а тут решил глянуть, что да как, а мне ошибку выбило... больше 20 раз одну и ту же (cache_get_field_content_int - invalid datatype), ну я и "вбил" в поисковик этот запрос и прочитал информацию.

DeimoS
16.04.2016, 16:32
Минутка самопиара, но вот в этой теме (http://pro-pawn.ru/showthread.php?10548-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B-%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D0%BD%D0%B0-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0-MySQL-R39-2) я описывал предназначения всех видов функций работы с данными в MySQL R-39 и подобных R-39-ой версии.
Тебе нужен пункт №6, а именно спойлер "Разбор кода:" после "Загрузка аккаунта:".

PawnoNoob
16.04.2016, 18:46
Оу, спасибо :blush:
Ещё вот вопрос появился относительно авторизации и регистрации в целом.
Если ты выходишь из игры во время выбора внешности, то при следующем входе у тебя будет скин CJ.
Я пробовал сделать следующее:
В OnPlayerSpawn вставлял код

if(!pinfo[playerid][skin])
{
// код выбора внешности.
}
Всё это "дело" работало, но вот при авторизации или регистрации вместо камеры в небе меня телепортировало в интерьер и предлагало выбрать внешность, но при этом я видел окно авторизации/регистрации. Что в данном случае можно сделать? :mda: