Когда я только начинал писать свой первый недокод, появилась проблема с MySQL, а точнее системой аккаунтов — регистрацией и входом.
Эту тему создал специально для новичков, постараюсь объяснить всё понятно. Если будут вопросы — обращайтесь. Ну что же, начнём.
[size=150]1. Сама БД.[/size]
Если у вас есть хост с MySQL и PhpMyAdmin, можете исполосовать его. Если же нет — воспользуйтесь [url=www.denwer.ru]Denwer[/url] или OpenServer.
Установка проста, ну или чекайте в инете ибо я ленивый.
Если у Вас есть хостинг с MySQL (MySQLi или MariaDB) и PhpMyAdmin, конечно же, можете исполосовать его. Если всё-таки нет — воспользуйтесь популярной программкой [url=www.denwer.ru]Denwer[/url] или OpenServer.
[size=150]2. Создаём таблицу в базе данных.[/size]
Создайте базу данных, а в ней воткнём новую таблицу (нажмите левой кнопкой мыши по ссылке «Создать таблицу») и введите следующие данные о таблице:
Название — «accounts»
Количество столбцов — 3
[b]Столбец №1[/b]
[list]

  • [*]Имя: id

  • [*]Тип: INT

  • [*]Длина: 11

  • [*]A_I (Auto Increment) — поставьте галочку
  • [/list]
    Все остальные значения не трогаем. Одинаковых идентификаторов, как Вы сами наверняка догадались, в таблице быть не может. Да, в общем, оно и не нужно.
    [b]Второй столбик[/b]
    [list]
  • [*]Имя: player_name.

  • [*]Тип: VARCHAR.

  • [*]Длина: 24 (так как длина ника в San Andreas Multiplayer/Criminal Russia Multiplayer не может превышать 24 символа).
  • [/list]

    Все остальные значения также не трогаем.
    [b]Третий столб[/b]
    [list]
  • [*]Имя: password

  • [*]Тип: VARCHAR

  • [*]Длина: 30 (ограничу длину пароля игрока 30 символами, ну а Вы можете сделать меньше или больше)
  • [/list]

    [size=150]3. Программируем сервер[/size]
    [size=125]1. Данные для подключения[/size]
    В начало нашего скрипта (под #include) добавим:
    [code]#include
    #define DB_HOST «localhost»// Адрес сервера, на котором расположена база. Если он локальный (OpenServer/Denwer), оставьте localhost или замените его на 127.0.0.1, как хотите.
    #define DB_USER «root»//Имя пользователя, через которого мы будем коннектиться с базой данных. Я взял root.
    #define DB_DATABASE «myserver»// Имя базы данных, которую Вы создали
    #define DB_PASSWORD «15021980»// Пасс от пользователя
    new MySQL:mysql_connect_ID; // Переменная типа MySQL, в которой будет храниться ид подключения к БД
    enum dIDs { // IDs диалогов
    dKickMessage, //Автоматически займёт ID0
    dRegister, //ID1
    dLogin //ID2
    }
    enum pInfo {
    pID, // айди аккаунта
    pName[MAX_PLAYER_NAME], // ник клиента
    pPassword[31] // Пароль
    }
    new Player[MAX_PLAYERS][pInfo]; // через pInfo[ID_ИГРОКА][enum]; будем обращаться к значению enum из enum pInfo
    forward FindPlayerInTable(playerid);
    forward UploadPlayerAccountNumber(playerid);
    forward UploadPlayerAccount(playerid);[/code]

    [size=125]2. Подключение к базе.[/size]
    В [color=#0000FF]public[/color] OnGameModeInit():
    [code]mysql_connect_ID = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);[/code]
    [b]3. Поиск игрока в БД и запись ника в массив Player[ID_ИГРОКА][pName][/b]
    В [color=#0000FF]public[/color] OnPlayerConnect():
    [code]GetPlayerName(playerid, Player[playerid][pName], MAX_PLAYER_NAME); // Определяем ник игрока ID_ИГРОКА и записываем его в Player[ID_ИГРОКА][pName]
    new query_string[75]; // Этого нам должно хватить
    format(query_string, sizeof(query_string), «SELECT * FROM `accounts` WHERE `player_name` = ‘%s'», Player[playerid][pName]); // Ищем строку таблицы accounts, в которой ячейка player_name равна значению Player[ID_ИГРОКА][pName], то есть нику нашего игрока
    mysql_tquery(mysql_connect_ID, query_string, «FindPlayerInTable»,»i», playerid);[/code]

    В конец мода:
    [code]public FindPlayerInTable(playerid) {
    new rows;
    cache_get_row_count(rows);
    if(!rows) {
    ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, «Вход», «Аккаунт не зарегистрирован, введите пароль», «Зарегать», «Выход»);
    } else {
    ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, «Вход», «Аккаунт зарегистрирован, введите пароль», «Вход», «»);
    cache_get_value_name(0, «password», pInfo[playerid][pPassword], 31);
    }
    return true;
    }[/code]

    [b]5. Действия для диалогов[/b]
    Почти вся система работает, замечательно! Даже диалоговые окна есть! Правда, пока они не работают. Давайте же исправим этот страшный недочёт! Для этого в [color=#0000FF]public[/color] OnDialogResponse(playerid, dialogid, response, inputtext[], listitem) вставим вот такой код:
    [code]if(dialogid == dRegister) {
    if(!response) {
    ShowPlayerDialog(playerid, dKickMessage, DIALOG_STYLE_MSGBOX, «Перезайдите», «{FFFFFF}Вы были отключены от сервера.
    {FF0000}Причина: нарушение правил Сервера (отказ от обязательной регистрации)
    {FFFFFF}Для выхода с сервера введите «/q»» в чат»»

    От danilasar

    Это я

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *