PDA

Просмотр полной версии : [Вопрос] Потеря данных при передаче в MySQL callback



vladivanovx
10.01.2017, 13:53
Еще раз приветствую.
Знаю открываю много тем, может и не нужных.
Но по крайне мере ответа на просторах интернета не нашел, может не там искал? :fool:
В общем, проблема в следующем.
Есть следующий функционал:

CMD:banip(playerid, params[]) {
new query[72];
new t_ip[18];
GetPlayerIp(playerid, t_ip, sizeof(t_ip));
mysql_format(MySQL, query, sizeof(query), "SELECT * FROM `banned_ip` WHERE `ip` = '%s'", t_ip);
mysql_tquery(MySQL, query, "OnBanIPGet", "ds", playerid, t_ip);
// mysql_tquery(MySQL, query, "OnBanIPGet"); <- Результат идентичен верхенму
return 1;
}

forward OnBanIPGet(playerid, ip);
public OnBanIPGet(playerid, ip) {
new rows = cache_num_rows();
if(rows) {
// Он есть
// Но не показывает не в printf и не в простой SendClientMessage
} else {
// Эго нет + тоже не показывает IP
}
}
Как правильно передать данные в этот callback? Что бы они отобразились при проверке в определенном случае.


И еще один вопросик, допустим если этот адрес найден, и он имеет в БД значение active=1, то как получить это значение, не зная номера строки?

P.S.: Используется версия мускула R41-2
P.P.S.: Как-то не охота использовать PVar

StevenH
10.01.2017, 14:50
Попробуй:



forward OnBanIPGet(playerid, ip);
public OnBanIPGet(playerid, ip) {

new rows;
cache_get_row_count(rows);
if(rows) {
// ip должен быть найден
} else {
// ip не найден
}
}

DeimoS
10.01.2017, 14:58
И еще один вопросик, допустим если этот адрес найден, и он имеет в БД значение active=1, то как получить это значение, не зная номера строки?

cache_get_value_name
cache_get_value_name_int
cache_get_value_name_float

vladivanovx
10.01.2017, 15:00
Попробуй:



forward OnBanIPGet(playerid, ip);
public OnBanIPGet(playerid, ip) {

new rows;
cache_get_row_count(rows);
if(rows) {
// ip должен быть найден
} else {
// ip не найден
}
}

IP он находит, проблема в том что не отображает его. Даже сохраняет в БД, если его нет. Только вот значение всегда разное (какие-то иероглифы).

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

cache_get_value_name
cache_get_value_name_int
cache_get_value_name_float
Это я знаю, но ведь нужно указать номер строки:
cache_get_value_name_int
(row_idx, const column_name[], &destination)

Geebrox
10.01.2017, 15:10
указываешь 0 ид для строки, а если строк больше, чем 1, то через цикл пробираешь их всех



forward OnBanIPGet(playerid, ip);
public OnBanIPGet(playerid, ip) {

new rows;
cache_get_row_count(rows);
if(rows)
{
// если 1 строка то ид будет 0
// а если больше
for(new i = 0; i < rows; i++)
{
//в этом случае ид строки равен i
}
}
else
{
// если нет строк
}
}

DeimoS
10.01.2017, 15:10
Это я знаю, но ведь нужно указать номер строки:
cache_get_value_name_int
(row_idx, const column_name[], &destination)

Тут указывается ID строки у возвращённых данных.
Он всегда начинается с нуля.
Если по запросу вернётся, например, 10 строк, то они займут ID с 0 по 9.

vladivanovx
10.01.2017, 15:16
DeimoS,
Geebrox,
Аа, большое спасибо.

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

Тогда вернусь к вопросу, по передаче значения ип адреса. Есть ли у кого предположения?

Geebrox
10.01.2017, 15:19
OnBanIPGet(playerid, ip);

ты передаешь строку для целочисленного значение???

OnBanIPGet(playerid, ip[]);

так будет правильно

vladivanovx
10.01.2017, 15:22
OnBanIPGet(playerid, ip);

ты передаешь строку для целочисленного значение???

OnBanIPGet(playerid, ip[]);

так будет правильно

Переменная ip имеет значение string.
Попробую ваш вариант, то есть данный тип записи (ip[]) имеет ввиду что передается строка?

DeimoS
10.01.2017, 15:23
Переменная ip имеет значение string.
Попробую ваш вариант, то есть данный тип записи (ip[]) имеет ввиду что передается строка?

Передаётся массив. А что уже в нём хранится - без разницы

vladivanovx
10.01.2017, 15:41
Ясно, всем спасибо.
Закройте, пожалуйста.