MySql R8 Можно ли так делать?
#1

Можно ли использовать это так?
То есть внутри public`а обработки запроса, отправлять ещё несколько запросов?

PHP код:
format(querysizeof(query), "SELECT `Bank` FROM `players` WHERE `Name` = '%s'"Biznes2Info[i][b2Owner]);
mysql_function_query(g_CHquerytrue"ArrestAZSNEXT""dd"i,ppay);
forward ArrestAZSNEXT(i,ppay);
public 
ArrestAZSNEXT(i,ppay)
{
    static 
rowsfields;
    
cache_get_data(rowsfields);
    if(
rows)
    {
        new 
banksumm cache_get_field_int(rows"Bank"g_CH);
        
banksumm += ppay;
        
        
format(querysizeof(query),"UPDATE `players` SET `Bank`= '%i',`Biz2`= '-1',`SellMesage2`= 1 WHERE `Name`='%s'",banksumm,Biznes2Info[i][b2Owner]);
        
mysql_function_query(g_CHqueryfalse"""");//Запрос в базу
        
Biznes2Info[i][b2Cash] = 0,mysql_biz_update_int(i,"Cash",Biznes2Info[i][b2Cash]);//Запрос в базу
        
strdel(Biznes2Info[i][b2Owner],0,MAX_PLAYER_NAME),Biznes2Info[i][b2Owned] = 0;
        
Biznes2Info[i][b2Colonca][0] = 1244,Biznes2Info[i][b2Colonca][1] = 1244;
        
Biznes2Info[i][b2Colonca][2] = 1244,Biznes2Info[i][b2Colonca][3] = 1244;
        
Biznes2Info[i][b2Colonca][4] = 1244,Biznes2Info[i][b2Colonca][5] = 1244;
        
Biznes2Info[i][b2Cenapokupki] = 0,Biznes2Info[i][b2Cash] = 0;
        
UpdateBiz2(i);
        
SaveBiznes2(i);//Запрос в базу
    
}
    return 
true;

Reply
#2

Можно.
Reply
#3

PHP код:
    static rowsfields
    
cache_get_data(rowsfields); 
зачем тебе каждый раз оставлять данные? а не обнулять их через new?
Reply
#4

Спасибо, вот ещё одна проблема, вроде бы всё перевёл, стопарнулся на проверке паролей, если введёный (password) == полученному результату из базы (tmp) то продолжаем, но проблема в том что cache_get_field_content(rows,"Password", tmp, g_CH, 32); возвращает не пароль а NULL, что делать?
PHP код:
stock OnPlayerLogin(playerid,password[])
{
    new 
query2[2000];
    
format(query2,sizeof(query2),"SELECT * FROM `players` WHERE Name = '%s'",PlayerInfo[playerid][pName]);
    
mysql_function_query(g_CHquery2true"OnPlayerLoginPASS""ds"playerid,password);
    return 
true;

PHP код:
forward OnPlayerLoginPASS(playerid,password[]);
public 
OnPlayerLoginPASS(playerid,password[])
{
    new 
rowsfields,tmp[32],change;
    
cache_get_data(rowsfields);
    if(
rows)
    {
        
cache_get_field_content(rows,"Password"tmpg_CH32);
        if(
strcmp(tmp,passwordtrue ) == 0)
        { 
Reply
#5

Потому что ты вытаскиваешь не из той строки. rows - это количество найденных строк, а ты используешь это значение в качестве строки. Если аккаунт один, то номер строки всегда будет 0.

cache_get_field_content(0,"Password", tmp, g_CH, 32);
Reply
#6

Quote:
Originally Posted by James_Braga
Посмотреть сообщение
Спасибо, вот ещё одна проблема, вроде бы всё перевёл, стопарнулся на проверке паролей, если введёный (password) == полученному результату из базы (tmp) то продолжаем, но проблема в том что cache_get_field_content(rows,"Password", tmp, g_CH, 32); возвращает не пароль а NULL, что делать?
PHP код:
stock OnPlayerLogin(playerid,password[])
{
    new 
query2[2000];
    
format(query2,sizeof(query2),"SELECT * FROM `players` WHERE Name = '%s'",PlayerInfo[playerid][pName]);
    
mysql_function_query(g_CHquery2true"OnPlayerLoginPASS""ds"playerid,password);
    return 
true;

PHP код:
forward OnPlayerLoginPASS(playerid,password[]);
public 
OnPlayerLoginPASS(playerid,password[])
{
    new 
rowsfields,tmp[32],change;
    
cache_get_data(rowsfields);
    if(
rows)
    {
        
cache_get_field_content(rows,"Password"tmpg_CH32);
        if(
strcmp(tmp,passwordtrue ) == 0)
        { 
Выше есть ответ на твой вопрос, но я об остальном хочу тебе сказать:

1. Зачем сток? Можно просто задефайнить.
PHP код:
#define OnPlayerLogin(%0,%1) new query2[40+25]; mysql_format(id подключение,query2, sizeof(query2),"SELECT * FROM `players` WHERE Name = '%e'",PlayerInfo[%0][pName]); mysql_function_query(g_CH, query2, true, "OnPlayerLoginPASS", "ds", %0, %1) 
2. Зачем 2000 масива? Когда у нас запрос 40 масива + 25 ник итог
PHP код:
new query2[40+25]; 
3. Почему нету иньекции? Выше привел пример в дефайне, тебе только нужно указать ид подключение, и что нужно только изменять в mysql_format %s на %e и указывать ид подключенния ( переменная = mysql_connect.... )

4. Зачем узнавать пароль, а потом его проверять? Не проще?
PHP код:
"SELECT * FROM `players` WHERE Name = '%e' AND Password = `%e`",PlayerInfo[%0][pName], %1); 
И тогда будет:
PHP код:
if(rows)
{
//верно, выгружаем данные
}
else 
{
//не верный пароль 

5. rows - мы узнаем сколько получили данных под этим запросом, то есть если в твоем случаи мы получили 1 акк rows будет равно 1, можно так же сделать проверку - если аккаунтов больше 1-го xD - то что то делаем.
  • Но чтобы юзать, сколько мы получили данных если у нас rows = 1, то чтобы использувать нам нужно -1, т.е юзать 0.
PHP код:
forward OnPlayerLoginPASS(playerid,password[]); 
public 
OnPlayerLoginPASS(playerid,password[]) 

    new 
rowsfields,tmp[32],change
    
cache_get_data(rowsfields); 
    if(
rows 1
    {
    
// kod
    
}
    if(
rows
    { 
Вот и все
Reply
#7

Quote:
Originally Posted by Den_Bellik
Посмотреть сообщение
Выше есть ответ на твой вопрос, но я об остальном хочу тебе сказать:

1. Зачем сток? Можно просто задефайнить.
PHP код:
#define OnPlayerLogin(%0,%1) new query2[40+25]; mysql_format(id подключение,query2, sizeof(query2),"SELECT * FROM `players` WHERE Name = '%e'",PlayerInfo[%0][pName]); mysql_function_query(g_CH, query2, true, "OnPlayerLoginPASS", "ds", %0, %1) 
2. Зачем 2000 масива? Когда у нас запрос 40 масива + 25 ник итог
PHP код:
new query2[40+25]; 
3. Почему нету иньекции? Выше привел пример в дефайне, тебе только нужно указать ид подключение, и что нужно только изменять в mysql_format %s на %e и указывать ид подключенния ( переменная = mysql_connect.... )

4. Зачем узнавать пароль, а потом его проверять? Не проще?
PHP код:
"SELECT * FROM `players` WHERE Name = '%e' AND Password = `%e`",PlayerInfo[%0][pName], %1); 
И тогда будет:
PHP код:
if(rows)
{
//верно, выгружаем данные
}
else 
{
//не верный пароль 

5. rows - мы узнаем сколько получили данных под этим запросом, то есть если в твоем случаи мы получили 1 акк rows будет равно 1, можно так же сделать проверку - если аккаунтов больше 1-го xD - то что то делаем.
  • Но чтобы юзать, сколько мы получили данных если у нас rows = 1, то чтобы использувать нам нужно -1, т.е юзать 0.
PHP код:
forward OnPlayerLoginPASS(playerid,password[]); 
public 
OnPlayerLoginPASS(playerid,password[]) 

    new 
rowsfields,tmp[32],change
    
cache_get_data(rowsfields); 
    if(
rows 1
    {
    
// kod
    
}
    if(
rows
    { 
Вот и все
1. Тебя на п-и так "оптимизировать" научили?Полнейший бред

3.Нет инъекции??Мб защиты от нее, плюс там она не нужна
Reply
#8

Quote:
Originally Posted by Tumba
Посмотреть сообщение
1. Тебя на п-и так "оптимизировать" научили?Полнейший бред

3.Нет инъекции??Мб защиты от нее, плюс там она не нужна
Полный бред то что ты написал. Так как здесь помогают, а если ты в теме только умеешь критиковать и даже не можешь указать мои ошибки - тогда я вообще не вижу смысла в твоем посте. Я думаю не важно где и как меня учили, так как научили так и делаю. И да, защита от иньекция в mysql r8 есть, нужно юзать или mysql_real_escape_string или mysql_format. Так же не вижу дальнейшей дискуссии, здесь.

Извините за оффтоп.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)