Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Использование BlueG MySQL plugin R7\R8

Tracker1

Эксперт
Пользователь
Регистрация
1 Июл 2011
Сообщения
1,752
Лучшие ответы
0
Репутация
871
Йо

С тех пор как плагин Mysql BlueG обновился до версии R7 в начале февраля, оказалось много людей, которые не смогли понять смысл новых запросов и как использовать кэш-функции.

Итак изменения в R7:
*Однопотоковые запросы больше не поддерживаются
*Реализация кэша через функции cache_get_row, cache_get_field, cache_get_data, cache_get_field_content.
*Новая фукнция mysql_function_query которая, в отличии от старой mysql_query_callback, позволяет скриптерам задавать переменные как параметры коллбека

Преимущества использования кэша:
* Он быстрее! Кэш функции заметно работают быстрее чем реализация через mysql_fetch_row.
* Больше не придется сохранять/отчищать результат выполнения запроса mysql_store_result() mysql_free_result() больше не нужны. Стоит заметить что эти функции вызывали множество проблем
у новичков

Функции:

mysql_function_query(идподключения, запрос[], bool:кэширование, паблик_для_обработки[], формат[], Параметры... )
* Заменяет mysql_query и mysql_query_callback из старых версий
* Позволяет скриптерам пускать в паблик_для_обработки с форматом[] параметров (очень похоже на )

PHP:
mysql_function_query(dbHandle, "SELECT ... FROM ...", true, "OnQueryFinished", "siii", "Andre", 1, 2, 3);
forward OnQueryFinished(name[], number_1, number_2, number_3);
public OnQueryFinished(name[], number_1, number_2, number_3)
{
    printf("Data: %s %i %i %i", name, number_1, number_2, number_3);
    // выведет в консоль: Data: Andre 1 2 3
}
Как вы можете заметить в использовании mysql_function_query , "siii" значит "string integer integer integer"(строка число число число), что обозначает данные "Andre 1 2 3", которые заданы в паблике.
Больше не надо использовать глобальные переменные.

* Скриптер сам выбирает в каких запросах стоит использовать кэширование а в каких нет. (3 аргумент функции)

PHP:
// SELECT запросы
mysql_function_query(dbHandle, "SELECT * FROM players", true, "OnPlayerListLoad", "");
// Мы задаем кэширование этому запросу и выполняем паблик "OnPlayerListLoad" после выполнения - этот паблик вызовется без параметров (пустые кавычки сигнализируют об этом)

// Остальные (UPDATE и другие) запросы
mysql_function_query(dbHandle, "UPDATE players SET kills = 10 WHERE id = 1", false, "", "");
// Кэширование не задаем и паблик не вызываем.
cache_get_data(&переменная_количества_строк, &переменная_количества_стобцов, ид подключения = 1)

В большинстве случаев, после запросов на выборку, следует вызывать эту функцию(конечно же если в запросе включено кэширование), чтобы узнать точное количество столбцов и строк, полученных из базы
Пример очень прост:
PHP:
mysql_function_query(dbHandle, "SELECT * FROM players WHERE name = 'Andre' LIMIT 0,1", true, "OnPlayerDataLoad", "s", "Andre");
forward OnPlayerDataLoad(name[]);
public OnPlayerDataLoad(name[])
{
    new rows, fields;
    cache_get_data(rows, fields);
    if(!rows)
    {
        printf("%s не зарегистрирован на этом сервере!",name);
    }
    else
    {
        printf("%s зарегистрирован (1 строка с %d столбцами)",name, fields);
    }
}
cache_get_row(строка, индекс, строка_записи[], ид подключения = 1)
Самая простейшая функция получения данных из запроса. В большинстве случаев она и применяется. Функция берет индекс строки, индекс столбца и записывает данные в строку записи(обязательно string)
Подсчет индексов в базе идет с 0. Т.е.
представим что в базе 3 стобца
1. ID - индекс 0
2. имя - индекс 1
3. уровень - индекс 2

PHP:
new temp[12];
cache_get_row(0, 0, temp);
pritnf("ID - %d", strval(temp));
cache_get_row(0, 2, temp);
printf("Уровень - %d", strval(temp));
Так как 3 параметр обязательно должен быть строкой, то для переноса значения в енам игрока(к примеру) следует делать следущее
PHP:
cache_get_row(0, 2, temp);
PlayerInfo[playerid][pLevel] = strval(temp);
cache_get_field(индекс_столбца, строка_записи[], идподключения = 1)
Ничего интересного. Функция просто записывает в строку записи название столбца.


cache_get_field_content(строка, название столбца[], строка записи[], идподключения = 1)
Функция похожа на cache_get_row, но здесь вместо ида столбца задается его название.
Стоит заметить тот факт, что cache_get_row выполняется чуточку быстрее, однако, он бесполезен в ситуациях, когда мы не знаем необходимые иды столбцов.

Пример
PHP:
new temp[12];
cache_get_field_content(0, "level", temp);
printf("Уровень - %d", strval(temp));

Конвертация мода с НЕмногопоточных запросов на многопоточные запросы

Так как немногопоточные запросы больше не поддерживаются в плагине, стоит рассказать, как же сделать запросы многопоточными.
Типичный пример СТАРОЙ(!!!) загрузки игрока:
PHP:
format(query, sizeof(query), "SELECT name,level,kills,deaths FROM players WHERE name = %s LIMIT 0,1", PlayerName);
mysql_query(query);
mysql_store_result();
if(mysql_num_rows())
{
    mysql_fetch_row(data);
    sscanf(data, "p<|>s[24]iii", name, level[playerid], kills[playerid], deaths[playerid]);
}
mysql_free_result();
А теперь реализация той же самой загрузки через многопоточный запрос:
PHP:
format(query, sizeof(query), "SELECT name,level,kills,deaths FROM players WHERE name = '%s' LIMIT 0,1", PlayerName);
mysql_function_query(dbHandle, query, true, "OnPlayerDataLoad", "i", playerid);

// Где-нибудь в скрипте
forward OnPlayerDataLoad(playerid);
public OnPlayerDataLoad(playerid)
{
    // получаем количество строк и столбцов, полученных в результате запроса
    new rows, fields;
    cache_get_data(rows, fields);
    if(rows)
    {
        cache_get_row(0, 0, name); // записываем данные из столбца name в строку name
        new temp[12]; // создаем временную строку для перевода числовых значений
        cache_get_row(0, 1, temp); // записываем данные из столбца с уровнем в строку temp
        level[playerid] = strval(temp); // записываем в массив 
        // Тоже самое делаем с двумя следующими полями
        cache_get_row(0, 2, temp), kills[playerid] = strval(temp);
        cache_get_row(0, 3, temp), deaths[playerid] = strval(temp);
    }
    return 1; 
    // возвращаем 1 для отчистки кэша в плагине.
}
Самый большой плюс от многопоточности заключается в том, что ваш сервер больше не зависает во время выполнения запроса. Это значит
пока идет запрос, сервер будет заниматься другими делами. Благодаря возможностям R7, вам больше не придется отчищать память после запроса, и в итоге вы избегаете утечек памяти.

На этом всё.
 
Последнее редактирование модератором:
Сверху Снизу