PDA

Просмотр полной версии : [Вопрос] MYSQL



grc
22.02.2017, 20:23
CMD:offban(playerid, params[])
{
if(!pInfo[playerid][pAdmin]) return 1;
if(sscanf(params, "s[24]is[30]", params[0], params[1], params[2])) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Используйте: /offban [имя игрока] [кол-во дней] [причина]");
if(params[1] < 1 || params[1] > 30) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Количество дней может быть от 1 до 30");
new format_string[200];
format(format_string, 200, "SELECT * FROM `ban_list` WHERE `name` = '%s'", params[0]);
return mysql_tquery(connectionHandle, format_string, "Offban", "iiss", playerid, params[1], params[0], params[2]);
}


forward Offban(playerid, days, str[], tmp[]);
public Offban(playerid, days, str[], tmp[])
{
new rows;
cache_get_row_count(rows);
if(rows) return SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Данный аккаунт уже заблокирован");
new format_string[200];
format(format_string, 140, "Администратор %s оффлайн забанил игрока %s на %i дней. Причина: %s", pInfo[playerid][pName], str, days, tmp);
SendClientMessageToAll(COLOR_LIGHTRED, format_string);
format(format_string, 200, "INSERT INTO `ban_list` (`name`, `date`, `reason`, `unbandate`, `aname`) VALUES ('%s', NOW(), '%s', %i, '%s')", str, tmp, gettime() + 86400 * days, pInfo[playerid][pName]);
return mysql_tquery(connectionHandle, format_string, "", "");
}

В итоге смешивается str и tmp и в имени игрока получается что-то вроде *первая буква str пробел tmp*

К примеру:
// Введенные данные: params[0] = test, params[1] = 1, params[2] = Бан
// Вывод в SendClientMessageToAll -> "Администратор name забанил игрока t Бан на 1 дней. Причина: Бан
// Ну и соответственно в имя игрока в таблицу выводится t Бан

С чем это связано? Как решить эту проблему?

Seviel
22.02.2017, 20:44
С таймером похожий баг был. Лучше передавай текст PVar-ом или переменной

//DeimoS: Да, проблема именно в таймере. Не умеет он нормально передавать несколько строк

//Seviel: Вот так ошибаются люди, я не прав.

123
23.02.2017, 05:03
Не слушай бред выше. Вроде уже много раз обсуждалось, что использование params[0], params[1], ничем не оправдывает себя, только запутывает код, да и доступ к одному массиву проигрывает в скорости. Так по поводу одного массива - как ты хочешь в одном массиве записать две текстовые переменные?

Код команды должен быть примерно таким:


CMD:offban(playerid, params[])
{
if(!pInfo[playerid][pAdmin])
return 1;

extract params -> new string:user[24+1], days, string:reason[144]; else
return SendClientMessage(playerid, COLOR_GREY, !"[Ошибка] Используйте: /offban [имя игрока] [кол-во дней] [причина]");

if(days < 1 || days > 30)
return SendClientMessage(playerid, COLOR_GREY, !"[Ошибка] Количество дней может быть от 1 до 30");

new format_string[42+24+1];
format(format_string, sizeof(format_string), "SELECT * FROM `ban_list` WHERE `name` = '%s'", user);
return mysql_tquery(connectionHandle, format_string, "Offban", "iiss", playerid, days, user, reason);
}

Long-
23.02.2017, 13:13
Не слушай бред выше. Вроде уже много раз обсуждалось, что использование params[0], params[1], ничем не оправдывает себя, только запутывает код, да и доступ к одному массиву проигрывает в скорости. Так по поводу одного массива - как ты хочешь в одном массиве записать две текстовые переменные?

Код команды должен быть примерно таким:


CMD:offban(playerid, params[])
{
if(!pInfo[playerid][pAdmin])
return 1;

extract params -> new string:user[24+1], days, string:reason[144]; else
return SendClientMessage(playerid, COLOR_GREY, !"[Ошибка] Используйте: /offban [имя игрока] [кол-во дней] [причина]");

if(days < 1 || days > 30)
return SendClientMessage(playerid, COLOR_GREY, !"[Ошибка] Количество дней может быть от 1 до 30");

new format_string[42+24+1];
format(format_string, sizeof(format_string), "SELECT * FROM `ban_list` WHERE `name` = '%s'", user);
return mysql_tquery(connectionHandle, format_string, "Offban", "iiss", playerid, days, user, reason);
}

А exctract ни как не запутывает код?
И что в твоем варианте изменилось что у него заработает код, кроме как ты обращение сделал к объявленным массивам, а не params[0], params[1]?
Я бы тоже параметры лучше передавал PVar'ами

$continue$
23.02.2017, 13:38
Научитесь пользоваться поисковыми системами и поиском на форуме. (http://pro-pawn.ru/showthread.php?12472-%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C-%D1%81-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BE%D0%B9&p=62459&viewfull=1#post62459)

grc
23.02.2017, 16:36
Я не знал в чем корень проблемы, как я мог найти данную тему?
Разве форумы не созданы для того, чтобы люди могли указывать на корень проблемы и ее решение?

Спасибо за указанную тему, премного благодарен.

grc
23.02.2017, 22:14
Научитесь пользоваться поисковыми системами и поиском на форуме. (http://pro-pawn.ru/showthread.php?12472-%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C-%D1%81-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BE%D0%B9&p=62459&viewfull=1#post62459)

Мммде уж, прикол в том, что ничего не изменилось

grc
23.02.2017, 22:46
Не слушай бред выше. Вроде уже много раз обсуждалось, что использование params[0], params[1], ничем не оправдывает себя, только запутывает код, да и доступ к одному массиву проигрывает в скорости. Так по поводу одного массива - как ты хочешь в одном массиве записать две текстовые переменные?

Код команды должен быть примерно таким:


CMD:offban(playerid, params[])
{
if(!pInfo[playerid][pAdmin])
return 1;

extract params -> new string:user[24+1], days, string:reason[144]; else
return SendClientMessage(playerid, COLOR_GREY, !"[Ошибка] Используйте: /offban [имя игрока] [кол-во дней] [причина]");

if(days < 1 || days > 30)
return SendClientMessage(playerid, COLOR_GREY, !"[Ошибка] Количество дней может быть от 1 до 30");

new format_string[42+24+1];
format(format_string, sizeof(format_string), "SELECT * FROM `ban_list` WHERE `name` = '%s'", user);
return mysql_tquery(connectionHandle, format_string, "Offban", "iiss", playerid, days, user, reason);
}

Использование отдельных переменных для каждого из params позволило решить данную проблему. Спасибо за подсказку.

Тему можно закрывать.