Извлечение данных из таблицы
#1

Добрый день. Столкнулся с проблемой при изготовлении команды /offlineadmins показывающей список админов и их уровни. Проблема в том что из базы извлекает и выводит в чат лишь первую строку из таблицы,а необходимо выводить всё содержимоё базы.
Имеется код:
Code:
if(strcmp(cmd, "/offlineadmins", true) == 0) 
{ 
                    if(PlayerInfo[playerid][pAdmin] <= 3) return SendClientMessage(playerid, COLOR_GREY, "Вам недоступна данная комманда"); 
					mysql_query("SELECT * FROM `Admins`");
mysql_store_result();
new nickadmin[32];
new lvladmin[1];
new Namea;
new result[1024];
new lvl;
	 if(mysql_fetch_row(result))
    { 
	mysql_get_field("Namea", nickadmin);
	mysql_get_field("lvl", lvladmin);
    format(string,64,"%s %d",nickadmin, lvladmin); 
SendClientMessage(playerid,-1,string); 
    }
	mysql_free_result();  
   return 1; 
   }
Требования: выводить все данные из таблицы "Admins" где есть поля "Namea" "lvl"
Reply
#2

PHP Code:
for(new 1<= mysql_num_rows(); i++)
{
   if(
mysql_fetch_row(result))
    { 
    
mysql_get_field("Namea"nickadmin);
    
mysql_get_field("lvl"lvladmin);
    
format(string,64,"%s %d",nickadminlvladmin); 
SendClientMessage(playerid,-1,string); 
    }

Reply
#3

Спасибо код заработал.




Не буду создавать новую тему дабы раздел не засорять.
Помогите ещё вот с данным кодом:
Code:
	if(strcmp(cmd, "/getip", true) == 0)
{
	tmp = strtok(cmdtext, idx);
			if(!strlen(tmp))  return SendClientMessage(playerid, COLOR_WHITE, "Введите: /getip [Ник]");
mysql_query("SELECT * FROM `Player` WHERE `Nick` = '%s'",(strlen(tmp)));
mysql_store_result();
new nickk[32],pipp[15],pipregg[15],lipp[15];
new query[256];
 if (mysql_num_rows() > 0)
	{
			mysql_fetch_row(query),
			sscanf(query, "p<|>s[32]s[15]s[15]s[15]",
			nickk,
			pipp,
			pipregg,
			lipp);
   format(string, sizeof(string), "- Ник: %s | [IP: %s] | R: [IP: %s] | L: [IP: %s]",nickk,pipp,pipregg,lipp);
SendClientMessage(playerid,COLOR_BLUE,string);
    }
    else
   {
   SendClientMessage(playerid,COLOR_BLUE,"Ошибка");
   return 1;
   }
   mysql_free_result();
   return true;
}
команда призвана дабы извлечь айпишники из базы следующего формата:
Code:
+-------------------+-----------------+-----------------+-----------------+
| Nick              | pIp             | pIpReg          | LIp             |
+-------------------+-----------------+-----------------+-----------------+
| Admin_tipo        | 127.0.0.1       | 127.0.0.1       | 127.0.0.1       |
| Mike_Tayler       | 127.0.0.1       | 127.0.0.1       | 127.0.0.1       |
| Misha_Demidov     | 127.0.0.1       | 127.0.0.1       | 127.0.0.1       |
+-------------------+-----------------+-----------------+-----------------+
Как я понял запрос в базу возвращает 0 значений..может стоит преобразовывать адреса при записи в базу,но как я незнаю(по крайней в языке pawno)....
Reply
#4

Преобразовать IP в INT можно так: https://sampforum.blast.hk/showthread.php?tid=374358
Reply
#5

Quote:
Originally Posted by -Stranger-
View Post
Преобразовать IP в INT можно так: https://sampforum.blast.hk/showthread.php?tid=374358
Просмотрел. Там система бана айпи адреса основанная на ручном добавлении в файл диапазона адреса(127.0.0.1-127.0.0.1),у меня автоматическое добавление в базу при входе/регистрации на сервер(е) одного адреса(127.0.0.1). Посмотрел способы преобразования айпи адреса,но так и не понял как адрес записывается. Можно наглядный пример увидеть?
Reply
#6

Добавляю адреса так:
Code:
public OnPlayerLogin(playerid,password[])
{
new Query[1024];
format(Query,sizeof(Query),"UPDATE `Player` SET `pIp`='%s' WHERE (`Nick`='%s');",playersip,sendername);
mysql_query(Query);
mysql_free_result();
if(PlayerInfo[playerid][pReg] == 0)
		{
new Query[1024];
format(Query,sizeof(Query),"REPLACE INTO `Player` (`Nick`,`pIp`,`pIpReg`,`LIp`) VALUES ('%s','%s','%s','%s');",sendername,playersip,playersip,playersip);
mysql_query(Query);
mysql_free_result();
}
}
Reply
#7

А что есть IP? это 4 цифры по 8 бит. А число int, как известно это 32 бита.
Так что мешает 4 числа по 8 бит перевести в одно 32 битное? - ничего.

PHP Code:
stock EncodeIP(ip[], size=sizeof(ip))
{
    new 
val=0acc=0s=3;
    for(new 
i=0sizei++)
    {
        switch(
ip[i])
        {
            case 
'.''\0':
            {
                
val += acc << (s*8);
                
acc 0;
                if ((
s--) == || ip[i] == '\0') break;
            }
            case 
'0'..'9':
            {
                
acc = (acc 10) + (ip[i] - '0');
            }
            case 
'*': continue;
            default: 
printf("WARNING: unknown character #%d in ip address '%s': %c"ip[i], ipip[i]);
        }
    }
    return 
val;
}
stock DecodeIP(value)
{
    new 
ip[16];
    
format(ip,sizeof(ip),"%i.%i.%i.%i",(value >> 24) & 0x000000FF,(value >> 16) & 0x000000FF,(value >> 8) & 0x000000FF,(value) & 0x000000FF);
    return 
ip;

И пример:
PHP Code:
new ip_str[16] = DecodeIP(134744072); // вернёт строку 8.8.8.8
new ip_int EncodeIP("8.8.8.8"); // вернёт число 134744072 
Reply
#8

Спасибо за пример,теперь понял как это сделать. Но вот в чём беда,всё хорошо и правильно работает в обе стороны пока не доходит до извлечения из базы по коду
Code:
	if(strcmp(cmd, "/getip", true) == 0)
{
	tmp = strtok(cmdtext, idx);
			if(!strlen(tmp))  return SendClientMessage(playerid, COLOR_WHITE, "Введите: /getip [Ник]");
mysql_query("SELECT * FROM `Player` WHERE `Nick` = '%s'",(strlen(tmp)));
mysql_store_result();
new nickk[32],pipp,pipregg,lipp;
new query[256];
 if (mysql_num_rows() > 0)
	{
			mysql_fetch_row(query),
			sscanf(query, "p<|>s[32]ddd",
			nickk,
			pipp,
			pipregg,
			lipp);
   format(string, sizeof(string), "- Ник: %s | [IP: %s] | R: [IP: %s] | L: [IP: %s]",nickk,DecodeIP(pipp),DecodeIP(pipregg),DecodeIP(lipp));
SendClientMessage(playerid,COLOR_BLUE,string);
    }
    else
   {
   format(string, sizeof(string), "Ошибка! Строк %d,",mysql_num_rows());
   SendClientMessage(playerid,COLOR_BLUE,string);
   }
   mysql_free_result();
   return true;
}
mysql_num_rows() возвращает данные "-1", пробывал по разному,но не получается никак..где ошибка?
Reply
#9

PHP Code:
mysql_query("SELECT * FROM `Player` WHERE `Nick` = '%s'",(strlen(tmp))); 
В запросе вместо ника указано его длина
Reply
#10

Всем спасибо за помощь( отметил). Теперь всё работает.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)