Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 13
  1. #1
    Аватар для Kucklovod00
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.12.2017
    Сообщений
    36
    Репутация:
    0 ±

    Запрос в базу на проверку одинаковых значений

    Доброго времени суток, уважаемая аудитория портала. При написании системы семьи, наткнулся на очень интересную вещь. В общем, мне нужно обнулить переменную у всех найденных аккаунтов в базе, которые совпадают с переменной определенного игрока.

    Пример вызываемого СЕЛЕКТ-запроса:
    PHP код:
    CMD:kleave(playerid)
    {
        
    mysql_query_string[0] = EOS;
        
    mysql_format(dbHandlemysql_query_string128"SELECT * FROM "T_ACCOUNTS" WHERE fam_m = %i LIMIT 1"pInfo[playerid][pFamilyMember]);
        
    mysql_tquery(dbHandlemysql_query_string"@CheckMemberFamily""i"pInfo[playerid][pFamilyMember]);  
        return 
    1;

    Колбэк:
    PHP код:
    @CheckMemberFamily(famid);
    @
    CheckMemberFamily(famid)
    {
        new 
    rows;
        
    cache_get_row_count(rows);
        if(
    rows)
        {
            
    mysql_query_string[0] = EOS;
            
    mysql_format(dbHandlemysql_query_string70"UPDATE "T_ACCOUNTS" SET fam_m = 0 WHERE fam_m = %i"famid);
            
    mysql_tquery(dbHandlemysql_query_string"""");
        }
        foreach(new 
    Player)
        {
            if(!
    gPlayerLogged[i]) continue;
            if(
    pInfo[i][pFamilyMember] != famid) continue;
            
    SendClientMessage(iCOLOR_RED"Создатель вашей семьи покинул семью по собственному желанию");
            
    SendClientMessage(iCOLOR_RED"Все участники были расформированы");
            
    pInfo[i][pFamilyMember] = 0;
        }
        
    mysql_query_string[0] = EOS;
        
    mysql_format(dbHandlemysql_query_string50"DELETE FROM "T_FAMILY" WHERE id = %i"famid);
        
    mysql_tquery(dbHandlemysql_query_string"""");
        return 
    1;

    Правильно ли я все написал, и если нет, то как лучше?
    Последний раз редактировалось Kucklovod00; 29.12.2017 в 19:39.

  2. #2
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Зачем проверять значение fam_m в базе? Если в моде правильно настроена загрузка и сохранение, то оно по сути и не надо..

    PHP код:
    CMD:kleave(playerid)
    {
        new 
    query[90];
        foreach(new 
    Player)
        {
            if(!
    gPlayerLogged[i]) continue;
            if(
    pInfo[i][pFamilyMember] != famid) continue;
            
    SendClientMessage(iCOLOR_RED"Создатель вашей семьи покинул семью по собственному желанию");
            
    SendClientMessage(iCOLOR_RED"Все участники были расформированы");
            
    pInfo[i][pFamilyMember] = 0;
        }
        
    mysql_format(dbHandlequerysizeof(query), "UPDATE "T_ACCOUNTS" SET fam_m = 0 WHERE fam_m = %i"famid);
        
    mysql_tquery(dbHandlequery"""");
        
    mysql_format(dbHandlequerysizeof(query), "DELETE FROM "T_FAMILY" WHERE id = %i"famid);
        
    mysql_tquery(dbHandlequery"""");
        return 
    1;


  3. #3
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Зачем ты сначала делаешь SELECT, если и так известно, состоит ли игрок в семье?
    И зачем используешь mysql_format, если не экранируешь символы?
    Так же итератор лучше создать отдельный для авторизированных игроков и отдельно для семей, а не лепить миллион проверок в итератор вех игроков.
    И обнулять массив mysql_query_string нужно только если ты собираешься скреплять строки с его помощью, а-ля
    PHP код:
    for(new i10i++)
    {
        
    format(mysql_query_stringsizeof(mysql_query_string), "Привет!\n%s"mysql_query_string);

    Ибо в этом случае старое содержимое массива попадёт в форматирование. В случае, когда ты просто записываешь в массив новые данные, обнулять ничего не нужно, ибо функция сама всё перезапишет, так как ты указываешь запись с нулевой ячейки

    Пробуй
    PHP код:
    CMD:kleave(playerid)
    {
        new 
    fam_id pInfo[playerid][pFamilyMember];
        if(
    fam_id == INVALID_FAMILY_ID)// Сюда ещё нужно на ранг добавить проверку, иначе люой участник может написать команду и удалить семью
        
    {
            
    SendClientMessage(playerid, -1"Вы не состоите в семье");
            return 
    1;
        }
        
    format(mysql_query_stringsizeof(mysql_query_string), "UPDATE "T_ACCOUNTS" SET fam_m = 0 WHERE fam_m = %d"fam_id);
        
    mysql_tquery(dbHandlemysql_query_string"""");
        
    format(mysql_query_stringsizeof(mysql_query_string), "DELETE FROM "T_FAMILY" WHERE id = %i"fam_id);
        
    mysql_tquery(dbHandlemysql_query_string"""");

        foreach(new 
    Player)
        {
            if(!
    gPlayerLogged[i] || pInfo[i][pFamilyMember] != fam_id)
            {
                continue;
            }
            
    SendClientMessage(iCOLOR_RED"Создатель вашей семьи покинул семью по собственному желанию");
            
    SendClientMessage(iCOLOR_RED"Все участники были расформированы");
            
    pInfo[i][pFamilyMember] = 0;
        }
        return 
    1;

    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. Пользователь сказал cпасибо:
    Kucklovod00 (29.12.2017)
  5. #4
    Аватар для Kucklovod00
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.12.2017
    Сообщений
    36
    Репутация:
    0 ±
    Про mysql_format. Я слышал, что это для мускула только и нужно, мол защита от SQL инъекций и прочее. Проверки есть, просто убрал, что бы не засорять тему. Всем спасибо.

  6. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Ну так у mysql_format для этого есть специальный спецификатор - %e
    Именно он экранирует спец-символы и его нужно использовать во всех случаях, когда игрок посылает какие-либо строковые данные в базу (вводить пароль/прописывает название семьи и т.п.).
    В остальных случаях использовать данную функцию не стоит, ибо она медленнее нативки, так как сначала сервер отправляет данные плагину, потом тот обрабатывает и только потом результат получает сервер.

    P.S. В 0.3.7 (вроде, R2) и в нативке появился спецификатор для экранирования спец-символов - %q. Так что, при желании, от mysql_format можно вообще отказаться.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. #6
    Аватар для Kucklovod00
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.12.2017
    Сообщений
    36
    Репутация:
    0 ±
    Можно подробнее об обнулении массива?

  8. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Что именно не понятно-то?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #8
    Аватар для Kucklovod00
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.12.2017
    Сообщений
    36
    Репутация:
    0 ±
    В каких случаях нужно, а в каких нет. Речь не только о SQL запросах.

  10. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, ну функция format записывает текст относительно той ячейки, какую ты указал, а не относительно первого нуль-символа.
    Когда ты прописываешь
    PHP код:
    format(stringsizeof(string), "Привет %s"pnayer_name); 
    Эта запись равносильна
    PHP код:
    format(string[0], sizeof(string), "Привет %s"pnayer_name); 
    То бишь, запись начнётся с нулевой ячейки независимо от того, есть ли в этих ячейках значение, отличное от нуля или нет (если вместо нуля указать, например, 5 - format начнёт записывать с пятой ячейки. Только тогда нужно учесть это во втором параметре, дабы выход за пределы массива не произошел при слишком длинном тексте). Соответственно, обнулять ничего не нужно, ибо format запишет текст и в конце поставит нуль-символ.

    В данном случае обнулять нужно лишь тогда, когда тебе в коде нужно скрепить несколько строк, как я показывал в примере:
    PHP код:
    for(new i10i++)
    {
        
    format(stringsizeof(string), "%sСтрока №%d\n"stringi);// Тут мы вставляем старое содержимое массива string в нашу новую строку, за счёт чего скрепляем их

    Тут если не обнулить значение заранее, получится, что информация, которая уже была в массиве (с прошлого раза, например. Речь о глобальном массиве, если что) вставится в строку, чего нам не нужно, исходя из логики кода.


    А вообще я советую тебе отказаться от глобального массива и перейти на локальные, дабы не усложнять код и предотвратить возможные ошибки из-за этого (например, можно начать писать код с использованием одного массива, а в коде, который уже будет выводить результат на экран, вставить не тот массив, с которым работал, а глобальный. В результате на экране появится совсем не то, что будет нужно, а код будет прекрасно компилироваться. И не факт, что сразу заметишь эту опечатку)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  11. #10
    Аватар для Kucklovod00
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.12.2017
    Сообщений
    36
    Репутация:
    0 ±
    Ты как понимающий в этом, используешь в своих модах/отдельных систем (для опенсурс, например) глобальные массивы?

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •