Работа с MySQL | Урок

Добро пожаловать!

Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.

Зарегистрироваться!
  • Если Вы желаете помогать развитию проекта, готовы заполнять раздел(-ы) и подсказывать другим пользователям на портале, есть возможность попасть в команду редакторов. Для этого следует обратиться в техническую поддержку
Пользователь
Регистрация
8 Янв 2025
Сообщения
35
Здравствуйте,эта статья - посвящение,тем кто уже освоил MxINI или Dini,тем кто гонится за оптимизацией,скоростью или просто-же за знаниями в том или ином языке.
MySQL - свободная система управления базами данных (СУБД). MySQL является решением для малых и средних приложений.Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты.

Теперь к делу.

MySQL - имеет три основные действия ,то есть Чтение,Запись,Обновление(перезапись данных).

Пример чтения данных из таблицы :


Пример:
format(qwery,256,"SELECT * FROM `playerinfo` WHERE `name` = '%s' LIMIT 1",PlayerInfo[playerid][pName]);
mysql_query(qwery);//Посылает запрос к самой БД,точнее мы проверяем есть ли такой пользователь с именем X.
mysql_store_result();//Эта функция пере конвертирует данные MYSQL в язык pawno,что-то в этом роде,то есть подготавливает к работе

Что-же теперь делать нам с полученными данным,а получили-ли мы их спросите вы?

Теперь мы воспользуемся функцией:

Пример:
GetPlayerName(playerid,PlayerInfo[playerid][pName],24);
format(qwery,256,"SELECT * FROM `playerinfo` WHERE `name` = '%s' LIMIT 1",PlayerInfo[playerid][pName]);
mysql_query(qwery);
mysql_store_result();
if(!mysql_fetch_row_format(qwery))
{
ShowPlayerDialog(playerid,1,1,"Pawn-Wiki.Ru"","Регистрация на сервера SaMP Pawn-Wiki.Ru","Далее","");
//Показываем диалог регистрации,если такого имени нету в БД
}
else
{
//показываем окно авторизации или чего-либо другого,если это имя найдено в бд.
}

Теперь рассмотрим функции записи данных в БД.Не удивляетесь,что информации так мало,тк всё еще впереди ...

Пример:
format(qwery,256,"INSERT INTO `playerinfo` (`name`,`password`,`sex`,`skin`,`money`,`lvl`,`adminlvl`,`team`,`rank`) VALUES ('%s','%s','%d','%d','%d','%d',0,0,0)",PlayerInfo[playerid][pName],PlayerInfo[
playerid][pPass],PlayerInfo[playerid][pSex],PlayerInfo[playerid][pSkin],PlayerInfo[playerid][pMoney]
,PlayerInfo[playerid][pLevel]);
mysql_query(qwery);

Через формат мы вставляет-записываем данные в таблицу "playerinfo",точнее если на языке Мускула ,то в таблицу `playerinfo`,далее мы записываем данные в определенные ячейки с определенными значениями - VALUES.Ячейки БД мы тоже пишем в таких-же скобка,что и сама таблица:

Теперь можно рассмотреть функцию обновления данных в БД:


Пример:
format(qwery,256,"UPDATE `playerinfo` SET `lvl`='%d',`money`='%d' WHERE `name`='%s' LIMIT 1",PlayerInfo[playerid][pLevel],PlayerInfo[playerid][pMoney],PlayerInfo[playerid][pName]);
mysql_query(qwery);

Здесь мы обновляем уровень игрока и количество денег в БД с именем игрока - X ,которых может быть не больше одного.

Как-бы вступление закончилось окунемся по-глубже.

Что нам нужно для содержания сервера у себя на компьютере ?
Для начало нам нужен MySQL сервер,PhpMyAdmin.Кому как удобно,можете скачать Denwer или ,что душе угодно.
Далее нам нужны будут Mysql плагин и инклуд,так-же mysql клиент для SAMP сервера.

Далее перейдем к Pawno,нам нужно как-то же подключаться к БД.

Для этого используем данные от MYSQL от вашего MYSQL-сервера.

Пример:
#include <a_samp>
#include <a_mysql>
#include <sscanf2>
#define SQL_HOST "localhost"
#define SQL_USER "sent"
#define SQL_PASS "sent"
#define SQL_DB "sent"
#pragma tabsize 0
new qwery[512];
enum pInfo
{
pName[24],
pPass[18],
pSex,
pSkin,
pMoney,
pLevel,
pAdminLevel,
pTeam,
pRank,
pNumber
};
new PlayerInfo[MAX_PLAYERS][pInfo],pLogged[MAX_PLAYERS];
new RandomFemaleSkins[][] =
{
        {9},{10},{11},{38},{39},{40},{54},{55},{56},{63},{64},{75},{76},{77},
        {85},{87},{88},{90},{93},{131},{130},{138},{139},{141},{145},{148},{149},
        {152},{157},{169},{172},{178},{190},{192},{193},{194},{199},{198},{201},
        {207},{211},{215},{219},{225},{226},{233},{237},{244},{246},{251},{257},
        {263}
};
new RandomMaleSkins[][] =
{
    {7},{18},{19},{20},{21},{23},{27},{29},{30},{37},{44},{49},{52},{57},
        {60},{62},{66},{70},{73},{78},{82},{94},{96},{100},{111},{127},{132},
        {135},{137},{142},{144},{147},{154},{158},{164},{167},{170},{177},{181},
        {184},{185},{188},{200},{203},{212},{217},{223},{228},{230},{236},{240},
        {247},{248},{252},{254},{259},{260},{264}
};


public OnGameModeInit()
{
mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
if(mysql_ping() == 1)
        {
        mysql_debug(1);
        printf("[MYSQL]: подключение успешно", SQL_DB);
        }
else printf("[MYSQL]: [ERROR]: не удалось подключиться к бд", SQL_DB);
for(new i = 0;i < 300;i++){AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);}
return 1;
}

public OnGameModeExit()
{
        mysql_close();
        return 1;
}
Выделить и скопировать код

Далее мы попробуем создать простую регистрацию с random-скинами.

Пример:
public OnPlayerConnect(playerid)
{
        pLogged[playerid] = 0;
        PlayerInfo[playerid][pSex] = 0;
        PlayerInfo[playerid][pSkin] = 200;
        PlayerInfo[playerid][pMoney] = 2500;
        PlayerInfo[playerid][pLevel] = 1;
        GetPlayerName(playerid,PlayerInfo[playerid][pName],24);
        format(qwery,256,"SELECT * FROM `playerinfo` WHERE `name` = '%s' LIMIT 1",PlayerInfo[playerid][pName]);
        mysql_query(qwery);
        mysql_store_result();
        if(!mysql_fetch_row_format(qwery))
        {
        ShowPlayerDialog(playerid,1,1,"Регистрация на \"Pawn-Wiki.Ru\"","Здравствуйте,добро пожаловать на \"Pawn-Wiki.Ru\"!\nЧто-бы начать играть вам нужно:\n1.Зарегестрироваться;\n2.Заполнить анкету;\n3.Пройти обучение.\nЧто-бы зарегестрироваться,\nпожалуйте введите пароль ниже!\n\t\tPawn-Wiki.Ru","Далее","");
        }
        else
        {
        ShowPlayerDialog(playerid,4,0,"Последние новости","Новости сервера:","Далее","");
        }
        return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
        if(dialogid == 1){
        if(!strlen(inputtext)) ShowPlayerDialog(playerid,1,1,"Регистрация на \"Pawn-Wiki.Ru\"","Вы не ввели пароль!\nЧто-бы начать играть вам нужно:\n1.Зарегестрироваться;\n2.Заполнить анкету;\n3.Пройти обучение.\nЧто-бы зарегестрироваться,\nпожалуйте введите пароль ниже!\n\t\tPawn-Wiki.Ru","Далее","");
        else {mysql_real_escape_string(inputtext,PlayerInfo[playerid][pPass]);ShowPlayerDialog(playerid,2,0,"Выбор пола","Пожалуйста выберите пол,\nчто-бы продолжить регистрацию.\nВы мужчина или женщина?","Мужчина","Женщина");}}
        if(dialogid == 2){
        new SeX[64];PlayerInfo[playerid][pMoney] = 2500; PlayerInfo[playerid][pLevel] = 1;GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
        if(response == 1){new RandomMale = random(sizeof(RandomMaleSkins));PlayerInfo[playerid][pSex] = 1;PlayerInfo[playerid][pSkin] = RandomMaleSkins[RandomMale][0];SetSpawnInfo(playerid,0,PlayerInfo[playerid][pSkin],2233.7,-1165.5,1030,180,0,0,0,0,0,0);
SetPlayerInterior(playerid,15);SpawnPlayer(playerid);}
        else{new RandomFemale = random(sizeof(RandomFemaleSkins));PlayerInfo[playerid][pSex] = 2;SetPlayerSkin(playerid, RandomFemaleSkins[RandomFemale][0]);PlayerInfo[playerid][pSkin] = GetPlayerSkin(playerid);SetSpawnInfo(playerid,0,PlayerInfo[playerid][pSkin],2245,-1164,1030,0,0,0,0,0,0,0);SetPlayerInterior(playerid,15);
SpawnPlayer(playerid);}
        if(PlayerInfo[playerid][pSex] == 1){SeX="Мужчина";}
        if(PlayerInfo[playerid][pSex] == 2){SeX="Женщина";}
        format(qwery,256,"Вы прошли все этапы регистрации!\nСпасибо за регистрацию.\nПриятной игры.\nВаше имя на сервере:%s,\nВаш пароль:%s,\nВаш пол:%s,\nВаша наличность:%d",PlayerInfo[playerid][pName],PlayerInfo[playerid][pPass],SeX,PlayerInfo[playerid][
pMoney]);
        ShowPlayerDialog(playerid,3,0,"Конец регистрации",qwery,"Завершить","");
        }
        if(dialogid == 3)
        {
        pLogged[playerid] = 1;
    format(qwery,256,"INSERT INTO `playerinfo` (`name`,`password`,`sex`,`skin`,`money`,`lvl`,`adminlvl`,`team`,`rank`) VALUES ('%s','%s','%d','%d','%d','%d',0,0,0)",PlayerInfo[playerid][pName],PlayerInfo[
playerid][pPass],PlayerInfo[playerid][pSex],PlayerInfo[playerid][pSkin],PlayerInfo[playerid][pMoney]
,PlayerInfo[playerid][pLevel]);
        mysql_query(qwery);
        }
        if(dialogid == 4)
        {
        BaseGet("password",PlayerInfo[playerid][pPass]);//Берем пароль из БД
        BaseGetInt("sex",PlayerInfo[playerid][pSex]);//Берем пол из БД
        BaseGetInt("skin",PlayerInfo[playerid][pSkin]);//Берем скин из БД
        BaseGetInt("money",PlayerInfo[playerid][pMoney]);//Берем наличку из БД
        BaseGetInt("lvl",PlayerInfo[playerid][pLevel]);//Берем уровень из БД
        BaseGetInt("adminlvl",PlayerInfo[playerid][pAdminLevel]);//Берем адми уровень из БД
        BaseGetInt("team",PlayerInfo[playerid][pTeam]);//Берем фракцию из БД
        BaseGetInt("rank",PlayerInfo[playerid][pRank]);//Берем ранк из БД
        new SeX[64];
        if(PlayerInfo[playerid][pSex] == 1){SeX="Мужчина";}
        if(PlayerInfo[playerid][pSex] == 2){SeX="Женщина";}
        format(qwery,512,"\tСтатистика аккаунта\n\tКоличество лет в штате:%d\n\tВаша наличность:%d\n\tВаш пол:%s\n\tВаша работа:в разработке\n\tВы состоите в:в разработке\nЗдравствуйте,добро пожаловать на \"Pawn-Wiki.Ru\"!\nЭто имя уже уже зарегестрированно,\nвозможно вы у нас уже играете,или это имя занято.\nПожалуйста введите паароль ниже,\nесли вы у нас играете!\nЕсли вы у нас впервые,то смените имя на другое и\nпройдите регистрацию!\n\t\tPawn-Wiki.Ru",PlayerInfo[playerid][pLevel],
        PlayerInfo[playerid][pMoney],
        SeX);
        ShowPlayerDialog(playerid,5,1,"Аторизаация на \"Pawn-Wiki.Ru\"",qwery,"Далее","");
        }
        if(dialogid == 5)
        {
        if(!strcmp(inputtext, PlayerInfo[playerid][pPass], false))
        {
        if(PlayerInfo[playerid][pSex] == 1 && PlayerInfo[playerid][pTeam] == 0) {SetSpawnInfo(playerid,0,PlayerInfo[playerid][pSkin],2233.7,-1165.5,1030,0,0,0,0,0,0,0);SetPlayerInterior(playerid,15);SpawnPlayer(playerid);
}
        if(PlayerInfo[playerid][pSex] == 2 && PlayerInfo[playerid][pTeam] == 0) {SetSpawnInfo(playerid,0,PlayerInfo[playerid][pSkin],2245,-1164,1030,0,0,0,0,0,0,0);SetPlayerInterior(playerid,15);SpawnPlayer(playerid);
}
        SendClientMessage(playerid, 0xFFFFFFFF, "Вы успешно авторизовались");
        SetPlayerScore(playerid, PlayerInfo[playerid][pLevel]);
        GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
        pLogged[playerid] = 1;
        }
        else ShowPlayerDialog(playerid,4,1,"Аторизаация на \"Pawn-Wiki.Ru\"","Вы не правильно ввели пароль!\nПожалуйста введите его сново!","Далее","");
        }

        return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
        format(qwery,256,"UPDATE `playerinfo` SET `lvl`='%d',`money`='%d' WHERE `name`='%s' LIMIT 1",PlayerInfo[playerid][pLevel],PlayerInfo[playerid][pMoney],PlayerInfo[playerid][pName]);
        mysql_query(qwery);
        mysql_free_result();
//При выходе игрока с сервера мы сохраняем его уровень и количество денег на сервере,тк скин и пол мы сохранили при регистрации,зачем-же посылать лишние запросы?
        return 1;
}

//Ниже функции которые облегчат нам жизнь и работу с БД
BaseGet(fields[],perms[])//Функция взятия String-а из бд
{
        new fetch[256];
        mysql_fetch_field_row(fetch,fields);
        strmid(perms, fetch, 0, strlen(fetch), 255);
}
BaseGetInt(fieldi[],&permi)//Функция взятия цифрового значения из бд
{
        new fetch[256];
        mysql_fetch_field_row(fetch,fieldi);
        permi = strval(fetch);
}
BaseGetFloat(fieldf[],&Float:permf)//Функция взятия Float-а из бд
{
        new fetch[256];
        mysql_fetch_field_row(fetch,fieldf);
        permf = floatstr(fetch);
}
BaseSet(base[],fields[],perms[],opredelitel[],name[])//Функция записи String-а в бд
{
        mysql_real_escape_string(perms,perms);
        new query[512];
        format(query,512,"UPDATE `%s` SET `%s` = '%s' WHERE `%s` = '%s'",base,fields,perms,opredelitel,name);
        mysql_query(query);

}
BaseSetFloat(base[],fields[],Float:perms,opredelitel[],name[])//Функция записи Float-а в бд
{
        new query[512];
        format(query,512,"UPDATE `%s` SET `%s` = '%f' WHERE `%s` = '%s'",base,fields,perms,opredelitel,name);
        mysql_query(query);

}
BaseSetInt(base[],fields[],perms,opredelitel[],name[])//Функция записи цифрового значения в бд,но она мне не понадобилась пока,что
{
        new query[512];
        format(query,512,"UPDATE `%s` SET `%s` = '%d' WHERE `%s` = '%s'",base,fields,perms,opredelitel,name);
        mysql_query(query);
}

Так-же не забывайте писать после запроса:

НЕ ЗАБУДЬ ЗАРАЗА:
mysql_free_result();//очистка запросов в бд
 
Сверху