Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


 

**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 100руб/мес, Текстовая 50руб/мес.
Показано с 1 по 8 из 8
  1. #1
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    2,994
    Репутация:
    1195 ±

    Поиск наименьшего свободного значения для столбца [GetFreeTableNumber]

    Описание:
    Функция отправляет запрос в указанную таблицу и возвращает наименьшее свободное значение указанного столбца.
     Пояснение:
    Возьмём в пример таблицу с аккаунтами "account", в которой есть столбец "id", хранящий в себе порядковый номер аккаунта и имеющий атрибут "AUTO_INCREMET".

    Сейчас в таблице имеются 5 аккаунтов:

      Открыть/закрыть
    id player_name
    1 Vasya_Pupkin
    2 Nagibator_1337
    4 My_Name_Is_Skrillex
    5 SuperScripter
    7 MamaHeXotelLa_5a5aHeCtapalLc9


    Если мы попробуем создать новый аккаунт, он автоматически создастся под ID 8 (если Вы не трогали настройки AUTO_INCREMENT).
    Но представим, что нам, по какой-либо причине, аккаунт нужно создать под свободным ID (3 и 6), а не под самым большим.
    Вот тут и пригодится эта функция, которая в как раз и вернёт значение "3".

    Параметры:
    const tablename[20] - Название таблицы, в которой будет происходить поиск (по умолчанию, максимальный размер - 20 символов. Можно увеличить/уменьшить)
    const columnname[20] - Имя столбца, в котором будет происходить поиск свободного ID (по умолчанию, максимальный размер - 20 символов. Можно увеличить/уменьшить)

    Возвращаемое значение:
    Первое свободное значение, начиная с 1.

    Код:
      Открыть/закрыть
    PHP код:
    stock GetFreeTableNumber(const tablename[20], const columnname[20])  
    {  
        new 
    query_string[106+(sizeof(columnname)*4)+(sizeof(tablename)*2)+1],  
            
    free_id;  
              
        
    format(query_stringsizeof(query_string), "SELECT MIN(%s) AS free_id FROM %s"columnnametablename);  
        new 
    Cache:result mysql_query(mysql_connect_IDquery_string);  
        
    cache_get_value_name_int(0"free_id"free_id);  
        
    cache_delete(result);  
          
        if(
    free_id != 1)   
            return 
    1;  
        else  
        {  
            
    format(query_stringsizeof(query_string), "SELECT %s+1 AS free_id FROM %s AS a1 WHERE (SELECT 1 FROM %s AS a2 WHERE a2.%s=a1.%s+1) IS NULL ORDER BY a1.%s LIMIT 1"columnnametablenametablenamecolumnnamecolumnnamecolumnname); 
            
    result mysql_query(mysql_connect_IDquery_string);  
            
    cache_get_value_name_int(0"free_id"free_id);  
            
    cache_delete(result);  
            return 
    free_id;  
        }  


    Примечание:
    Крайне НЕ рекомендуется использовать данную функцию для больших таблиц (таблиц, с большим числом строк).
    Поиск свободного ID производится путём перебора значений от минимального к максимального и, допустим, если у Вас в таблице более миллиона записей, сами понимаете, запрос может обрабатываться приличное количество времени.
    Поэтому если и потребуется использовать данную функцию для больших таблиц, постарайтесь минимизировать частоту вызовов этой функции (не стоит её пихать в секундный таймер, если не хотите проблем).

    Автор:
    DeimoS
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

  2. 4 пользователя(ей) сказали cпасибо:
    Blood (29.12.2016)Geebrox (30.12.2016)Salik_Davince (29.12.2016)[ForD] (30.12.2016)
  3. #2
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    33
    Репутация:
    0 ±
    Большое спасибо, уж очень долго сам перечитывал документацию но не находил выход для A_I.

  4. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    756
    Репутация:
    567 ±
    Но представим, что нам, по какой-либо причине, аккаунт нужно создать под свободным ID (3 и 6), а не под самым большим.
    Вот тут и пригодится эта функция, которая в как раз и вернёт значение "3".
    Честно говоря, ума не приложу кому такое может придти в голову. Если кто-то будет использовать - напишите для чего, интересно.

  5. Пользователь сказал cпасибо:
    Guldan (30.12.2016)
  6. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    2,994
    Репутация:
    1195 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Честно говоря, ума не приложу кому такое может придти в голову. Если кто-то будет использовать - напишите для чего, интересно.
    Это был лишь пример, который первый в голову пришёл. Не самый удачный, но самый понятный для большинства, как мне кажется :)

    Я писал эту функцию для таблицы с рангами для админов.
    Точнее, я писал систему, позволяющую создавать ранги прямо из игры и номер строки в таблице означал уровень админки.
    Но чтоб каждый раз не писать этот уровень самостоятельно и не держать существующие номера в голове, я добавил возможность не указывать его и тогда уже эта функция сама подберёт свободный ID.
    Если просто использовать AUTO_INCREMENT, то будет как-то глупо выглядеть, если всего будет 10 рангов, но их уровни будут, например, "1", "5", "13", "14", "22" и т.п.
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

  7. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    756
    Репутация:
    567 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Точнее, я писал систему, позволяющую создавать ранги прямо из игры и номер строки в таблице означал уровень админки.
    Но чтоб каждый раз не писать этот уровень самостоятельно и не держать существующие номера в голове, я добавил возможность не указывать его и тогда уже эта функция сама подберёт свободный ID.
    Если просто использовать AUTO_INCREMENT, то будет как-то глупо выглядеть, если всего будет 10 рангов, но их уровни будут, например, "1", "5", "13", "14", "22" и т.п.
    Как по мне ID (private key) - это исключительно внутренняя информация, и его вообще нигде не нужно отображать. Можно было просто создать поле для обозначения уровней.

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,178
    Репутация:
    100 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Честно говоря, ума не приложу кому такое может придти в голову. Если кто-то будет использовать - напишите для чего, интересно.
    Авто удалению старых аккаунтов на глобальном проекте и их заменой на новые такая система пригодилась бы.
    Не всегда же охота ковыряться в бд с несколькими тысячами аккаунтов и перебирать их отсеивать там удалять,
    вот она автоматизированная система, не много нагрузки только прибавится.
    [Античит] Invisible Fly Hack
    [Античит] Weapon/Ammo Hack
    [Function] ResetPlayerWeaponSlot
    [Function] FIX_SetPlayerAmmo

  9. #7
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,489
    Репутация:
    2035 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Авто удалению старых аккаунтов на глобальном проекте и их заменой на новые такая система пригодилась бы.
    Не всегда же охота ковыряться в бд с несколькими тысячами аккаунтов и перебирать их отсеивать там удалять,
    вот она автоматизированная система, не много нагрузки только прибавится.
    Что мешает просто периодически удалять все аккаунты, с которых заходили более N дней назад?
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

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

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    2,994
    Репутация:
    1195 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Как по мне ID (private key) - это исключительно внутренняя информация, и его вообще нигде не нужно отображать. Можно было просто создать поле для обозначения уровней.
    Я изначально немного солгал, ибо забыл как всё было устроено :D
    Как раз столбец, обозначающий номер строки, никак не "фильтруется" со стороны сервера и его определяет лишь БД.
    Для номера ранга имеется отдельный столбец, который я как раз и форматировал этой функцией.
     Как-то так выглядела первая версия таблицы для этой системы

    Потом придумал совсем дугой алгоритм работы админки, а тот скрипт забросил.
    Форматировался столбец с именем "rank_id"


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

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Что мешает просто периодически удалять все аккаунты, с которых заходили более N дней назад?
    Так он про это и говорит, как я понимаю. Просто он хочет либо отсортировать все аккаунты по новой (что странно, ибо придётся править и другие таблицы), либо новые аккаунты записать на место удалённых (от чего польза лишь в том, что глазу приятнее. Да и то не каждому)
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

 

 

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

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

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

Ваши права

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