Страница 1 из 26 12311 ... ПоследняяПоследняя
Показано с 1 по 10 из 257

Тема: Создание системы регистрации

  1. #1
    Почетный пользователь LC Аватар для Snoowker
    Регистрация
    06.04.2010
    Адрес
    Kyiv
    Возраст
    28
    Сообщений
    1,952
    Репутация: 279

    Звание: как роза среди колючек

    Сообщение Создание системы регистрации

    В этой теме я расскажу Вам, как можно написать систему регистрации с нуля (можно и адаптировать под Ваш Godfather мод).

    Итак, для этого нам понадобятся следующие вещи:
    1. Denwer — через эту программу мы будем запускать и администрировать наш MySQL сервер.
    Скачать!
    2. MySQL Plugin от g-stylezzz — плагин для работы с базой данных.
    Это кинуть в папку Plugins
    Это кинуть в папку с сервером + в server.cfg добавить строку plugins mysql sscanf
    Это кинуть в папку Pawno\Includes
    3. Sscanf Plugin — плагин, при помощи которого нам будет удобней и быстрей извлекать данные из результата при выборке из таблицы.
    Скачать!

    Начнём.
    > Устанавливаем Denwer, запускаем сервер (на рабочем столе появится ярлык «Start Denwer»).
    > Заходим в браузер и в адресной строке вводим «localhost» (без кавычек).
    > Спускаемся ниже и переходим по ссылке: http://localhost/Tools/phpmyadmin/index.php
    > Итак, вы видите phpmyadmin, сейчас мы можем управлять базой данных.
    > Создаём таблицу:
    >> Примерно в центре есть «Create new database».
    >>> Я назвал свою БД «pawno», кодировку выбрал «cp1251_bin».

    >>> БД создана

    >>>> Теперь нам нужно создать таблицу для аккаунтов.

    Name — Название таблицы, Number of Fields — количество полей.
    Мы используем 3 поля,
    1. ID аккаунта, чтобы можно было его распознать в таблице, можно, конечно использовать ник, но с ИД удобней;
    2. Ник игрока, думаю тут всё ясно;
    3. Пароль игрока.
    >>>> Таблица создана, сейчас мы настроим наши поля.

    Нажимаем Save.
    Все нужное я выделил красным, теперь расскажу, что за что отвечает.
    Field — название поля;
    Type — тип данных, есть integer (целые числа), string (VARCHAR, TEXT), float, DATE, DATETIME, TIME и т.д., в общем как в павно, тут я использую VARCHAR для строк, и INT для целых чисел.
    Length/Values — сколько «ячеек» мы выделяем для поля, для ника 24 (MAX_PLAYER_NAME), для пароля — 64.
    Collation — кодировка.
    AUTO_INCREMENT — генерирует значения для ID игрока в порядке возрастания (1, 2, 3...).

    >>>> Так будет выглядеть пустая, без аккаунтов таблица:

    > Базу данных и таблицу мы подготовили, теперь перейдем к моду.

    >> Сверху мода, где вы подключаете все инклюды, добавляем эти строки:
    PHP код:
    #include <a_mysql> // SQL функции.
    #include <sscanf2> // Извлечение данных. 
    >> Чуть ниже задефайним парметры БД:
    PHP код:
    #define SQL_HOST     "localhost" // IP адресс БД.
    #define SQL_USER     "root" // Login БД.    
    #define SQL_DB       "pawno" // Название БД.         
    #define SQL_PASS     "" // Пароль БД. 
    >> Дефайны для ID'ов диалогов и цвета сообщений.
    PHP код:
    #define DIALOG_LOGIN         1
    #define DIALOG_REGISTER     2
    #define DIALOG_WRONGPAS     3
    #define COLOR_LIGHTRED         0xFF6347AA
    #define COLOR_YELLOW         0xFFFF00AA 
    >> Создадим массив для хранения данных аккаунта.
    PHP код:
    enum Variables {
        
    aID,
        
    aName[MAX_PLAYER_NAME],
        
    aPassword[64],
        
    boolaLogged,
        
    aWrongPassword,
    };
    new 
    playerVariable[100][Variables]; // 100 - моё кол-во слотов для игроков на сервере. 
    >> Создадим функцию для подключения и отключения к БД.
    PHP код:
    ConnectMySQL() { // В OnGameModeInIt вставьте ConnectMySQL();
        
    mysql_connect(SQL_HOSTSQL_USERSQL_DBSQL_PASS); // Тут мы используем все данные, которые мы дефайнили.
        
    switch(mysql_ping()) { // Проверка на то, что мы подключены к БД.
            
    case 1: print("MySQL connection: alive."); // Если подключена БД.
            
    case -1: print("MySQL connection: dead."); // Если не подключена БД.
        
    }
        return 
    1;
    }

    DisconnectMySQL() { // Вставьте DisconnectMySQL(); в OnGameModeExit, отключаемся от БД.
        
    mysql_close();
        print(
    "MySQL connection closed.");
    }

    CheckMySQLConnection() { // Этот сток мы будем использовать для проверки, подключена ли БД перед её использованием.
        
    if(mysql_ping() == -1mysql_reconnect();
        return 
    1;

    >> Тут у нас стоки для регистрации и логина.
    PHP код:
    CreateAccount(playeridpassword[]) {
        new
            
    query[128], // Для запроса.
            
    sqlname[MAX_PLAYER_NAME],
            
    sqlpassword[32];
        
    mysql_real_escape_string(playerVariable[playerid][aName], sqlname); // Защитит от sql inject
        
    mysql_real_escape_string(passwordsqlpassword); // Защитит от sql inject
        
    format(querysizeof(query), "INSERT INTO `Accounts` (`Nickname`, `Password`) VALUE ('%s', '%s')"sqlnamesqlpassword); // Добавляем в таблицу запись.
        // INSERT - добавление записи в таблицу, 1. () — поля. 2. VALUE — значения этих полей.
        
    mysql_query(query); // Отправляем запрос.
        
    playerVariable[playerid][aID] = mysql_insert_id(); // Узнаём ИД аккаунта, будет использоваться для сохранения и прочих операций.
        
    strmid(playerVariable[playerid][aPassword], password064255); // Внедряем в массив аккаунта введенный игроком пароль.
        
    playerVariable[playerid][aLogged] = true// Мы авторизованы.
        
    return 1;
    }
    LoadAccount(playeridpassword[]) {
        new
            
    query[128],
             
    sqlpass[32],
             
    result[5+24+64],
             
    dialog[128];
        
    mysql_real_escape_string(passwordsqlpass); // Защита от SQL Inject, шифрует кодировку.
         
    format(querysizeof(query), "SELECT * FROM `Accounts` WHERE `Password` = '%s' AND `ID` = '%i'"sqlpassplayerVariable[playerid][aID]);
        
    // SELECT * - выбрать, FROM - с таблицы, WHERE - где, пароль равен введенному паролю и ID равен иду ника человека.
         
    mysql_query(query); // Отправляем запрос.
         
    mysql_store_result(); // Смотрим записи, которые мы выбрали запросом выше.
         
    if(mysql_num_rows() == 1) { // Если выбрало только 1 аккаунт с таким паролем и ИД - успех, пароль введен верно, загружаем данные в массив.
            
    mysql_fetch_row_format(result"|"); // split, данные в результате записываются типо "1|Snoowker|parol"
            
    sscanf(result"p<|>is[24]s[32]"// i - ид (int), s[размер] - string, ник и пароль.
                
    playerVariable[playerid][aID],
                
    playerVariable[playerid][aName],
                
    playerVariable[playerid][aPassword]);
            
    playerVariable[playerid][aLogged] = true;
            
    mysql_free_result(); // Очищаем память.
            
    return 1;
        }
         else { 
    // Мы ввели неверный пароль.
             
    if(playerVariable[playerid][aWrongPassword] == 4) {
                
    SendClientMessage(playeridCOLOR_LIGHTRED"Вы 3 раза ввели неверный пароль и были отключены от сервера.");
                
    Kick(playerid);
                return 
    1;
            }
                    
    playerVariable[playerid][aWrongPassword] ++;
            
    format(dialogsizeof(dialog),
                
    "Вы ввели неверный пароль.\n\
                У Вас осталось %i/3 попыток ввода."
    playerVariable[playerid][aWrongPassword]);
            
    ShowPlayerDialog(playeridDIALOG_WRONGPASDIALOG_STYLE_MSGBOX"Ошибка."dialog"Повтор""Отмена");
         }
         return 
    1;
    }
    GetAccountID(playerid) {
        new
            
    query[128];
        
    format(querysizeof(query),"SELECT `ID` FROM `Accounts` WHERE `Nickname` = '%s'"playerVariable[playerid][aName]);
        
    // Выбираем ID, с таблицы Accounts, где Ник равен нику игрока.
        
    mysql_query(query); // Отправляем запрос.
        
    mysql_store_result(); // Видим
        
    if(mysql_num_rows() == 1) { // Если у нас в результате выбрало 1 запись, т.е. аккаунт игрока.
            
    playerVariable[playerid][aID] = mysql_fetch_int(); // ИД игрока равен номеру записи.
            
    mysql_free_result(); // Очищаем память.
            
    return playerVariable[playerid][aID]; // Возвращаем ИД игрока.
        
    }
        return 
    0;
    }

    SaveAccount(playerid) { // Сохранение аккаунта.
        
    if(playerVariable[playerid][aLogged] == true) { // Проверка, если аккаунт авторизован.
            
    CheckMySQLConnection(); // Проверяем, подключена ли БД.
            
    new 
                
    query[186],
                
    sqlname[MAX_PLAYER_NAME],
                
    sqlpass[64];
            
    mysql_real_escape_string(playerVariable[playerid][aName], sqlname);
            
    mysql_real_escape_string(playerVariable[playerid][aPassword], sqlpass);
            
    format(querysizeof(query), "UPDATE `Accounts` SET `Nickname` = '%s', `Password` = '%s' WHERE `ID` = '%i'"sqlnamesqlpassplayerVariable[playerid][aID]);
            
    mysql_query(query); // Отправляем запрос
        
    }
        return 
    1;

    Создадим сток для очистки массивов при коннекте/дисконнекте.
    PHP код:
    RemovePlayerVariables(playerid) {
        
    playerVariable[playerid][aWrongPassword] = 0;
        
    playerVariable[playerid][aID] = 0;
        
    playerVariable[playerid][aLogged] = false;
        return 
    1;

    Наши диалоги:
    PHP код:
    public OnDialogResponse(playeriddialogidresponselistiteminputtext[]) {
        switch(
    dialogid) {
            case 
    DIALOG_LOGIN: { // Диалог авторизации.
                
    if(!response) { // Если нажал «Отмена».
                    
    SendClientMessage(playeridCOLOR_YELLOW"* Введите /q(uit), чтобы выйти из игры.");
                    
    Kick(playerid);
                    return 
    1;
                }
                if(!
    strlen(inputtext)) { // Если поле ввода пустое.
                    
    new dialog[134+MAX_PLAYER_NAME];
                    
    format(dialogsizeof(dialog),
                        
    "Добро пожаловать на Сервер!\n\
                        Этот аккаунт зарегистрирован.\n\n\
                        Логин: %s\n\
                        Введите пароль:"
    ,
                         
    playerVariable[playerid][aName]);
                    
    ShowPlayerDialog(playeridDIALOG_LOGINDIALOG_STYLE_INPUT"Авторизация."dialog"Войти""Отмена");
                    return 
    1;
                }
                
    LoadAccount(playeridinputtext); // Пробуем его авторизовать.
            
    }
            case 
    DIALOG_REGISTER: { // Диалог регистрации.
                
    if(!response) { // Если нажал "Отмена".
                    
    SendClientMessage(playeridCOLOR_YELLOW"* Введите /q(uit), чтобы выйти из игры.");
                    
    Kick(playerid);
                    return 
    1;
                }
                if(!
    strlen(inputtext) || strlen(inputtext) < || strlen(inputtext) > 64) { // Если пустое поле ввода или пароль имеет меньше 6 или больше 64 символов
                     
    new dialog[380+24+10];
                    
    format(dialogsizeof(dialog),
                        
    "Добро пожаловать на Сервер!\n\
                        Этот аккаунт не зарегистрирован.\n\n\
                        Логин: %s\n\
                        Введите пароль и нажмите \"Далее\".\n\n\
                          Примечания:\n\
                        - Пароль чувствительный к регистру.\n\
                        - Длина пароля от 6 до 32 символов.\n\
                        - В пароле можно использовать символы на кириллице и латинице.\n"
    playerVariable[playerid][aName]);
                    
    ShowPlayerDialog(playeridDIALOG_REGISTERDIALOG_STYLE_INPUT"Регистрация."dialog"Далее""Отмена");
                    return 
    1;
                }
                
    CreateAccount(playeridinputtext); // Создаём аккаунт.
                
    playerVariable[playerid][aLogged] = true// Авторизуем игрока. :)
            
    }
            case 
    DIALOG_WRONGPAS: { // Если неверный пароль.
                
    if(response) {
                    new 
    dialog[134+MAX_PLAYER_NAME];
                    
    format(dialogsizeof(dialog),
                        
    "Добро пожаловать на Сервер!\n\
                        Этот аккаунт зарегистрирован.\n\n\
                        Логин: %s\n\
                        Введите пароль:"
    ,
                        
    playerVariable[playerid][aName]);
                    
    ShowPlayerDialog(playeridDIALOG_LOGINDIALOG_STYLE_INPUT"Авторизация."dialog"Войти""Отмена");
                    return 
    1;
                }
                else { 
    // Если нажал "Отмена".
                    
    Kick(playerid);
                    return 
    1;
                }
            }
        }
        return 
    1;

    >> Отключаем возможность писать в чат неавторизованному.
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        if(
    playerVariable[playerid][aLogged] == false) return 0;
        return 
    1;

    >> Наш OnPlayerConnect.
    PHP код:
    public OnPlayerConnect(playerid)
    {
        
    RemovePlayerVariables(playerid);
    //------------------------------------------------------------------------------
        
    GetPlayerName(playeridplayerVariable[playerid][aName], MAX_PLAYER_NAME);
    //------------------------------------------------------------------------------
        
    if(GetAccountID(playerid)) { // Аккаунт зарегистрирован
            
    new dialog[128+MAX_PLAYER_NAME];
            
    format(dialogsizeof(dialog),
                
    "Добро пожаловать на Сервер!\n\
                Этот аккаунт зарегистрирован.\n\n\
                Логин: %s\n\
                Введите пароль:"
    ,
                 
    playerVariable[playerid][aName]);
            
    ShowPlayerDialog(playeridDIALOG_LOGINDIALOG_STYLE_INPUT"Авторизация."dialog"Войти""Отмена");
        }
        else { 
    // Аккаунт не зарегистрирован (return 0, в функции GetAccountID, т.е. не нашло записи с аккаунтом).
            
    new dialog[344+MAX_PLAYER_NAME];
            
    format(dialogsizeof(dialog),
                
    "Добро пожаловать на Сервер!\n\
                Этот аккаунт не зарегистрирован.\n\n\
                Логин: %s\n\
                Введите пароль и нажмите \"Далее\".\n\n\
                  Примечания:\n\
                - Пароль чувствительный к регистру.\n\
                - Длина пароля от 6 до 32 символов.\n\
                - В пароле можно использовать символы на кириллице и латинице.\n"
    playerVariable[playerid][aName]);
            
    ShowPlayerDialog(playeridDIALOG_REGISTERDIALOG_STYLE_INPUT"Регистрация."dialog"Далее""Отмена");
        }
        return 
    1;

    >>> Наш OnPlayerDisconnect.
    PHP код:
    public OnPlayerDisconnect(playeridreason)
    {
        if(
    playerVariable[playerid][aLogged] == trueSaveAccount(playerid);
        return 
    1;

    Готово, у нас есть система регистрации.
    Вот так выглядит таблица с аккаунтами:


    Автор урока: Snoowker.

    Копирование материала на посторонние сайты без указания автора строго запрещено.

  2. #2
    Почетный пользователь LC Аватар для Snoowker
    Регистрация
    06.04.2010
    Адрес
    Kyiv
    Возраст
    28
    Сообщений
    1,952
    Репутация: 279

    Звание: как роза среди колючек

    Re: [SRC][ALL]Использование MySQL. (пример: Система регистрации)

    Блин, не там создал. Перенесите пожалуйста тему в Pawno Wiki, если она не подходит в этот раздел.

  3. #3
    ваш статус был снят систе Аватар для DeadLine
    Регистрация
    10.03.2011
    Адрес
    Казахстан, Алма-Ата
    Возраст
    28
    Сообщений
    2,449
    Репутация: 243

    Звание: - весьма и весьма положительная личность

    Re: [SRC][ALL]Использование MySQL. (пример: Система регистрации)

    Ухтыыы ЛоВи +иг Хороший Урок.




  4. #4
    Пользователь
    Регистрация
    04.12.2010
    Адрес
    IDK
    Возраст
    32
    Сообщений
    61
    Репутация: -7

    Звание: имеет немного плохого в прошлом

    Re: [SRC][ALL]Использование MySQL. (пример: Система регистрации)

    начнем критику

    MySQL Plugin R6-2 - плагин для работы с базой данных.
    плагин от gstylezzz это такое же медленное говно как и сервер GameWorld. Если не веришь - GetTickCount тебе в помощь. StrikenKid's plugin куда быстрее.

    else { // Если нажал "Отмена".
    Kick(playerid);
    return 1;
    }
    Что за прикол писать так?
    Тебе нравится проебывать закрывающие скобки? Что ты успешно сделал вооот здесь:
    enum Variables {
    aID,
    aName[MAX_PLAYER_NAME],
    aPassword[64],
    bool: aLogged,
    aWrongPassword;
    new playerVariable[100][Variables]; // 100 - моё кол-во слотов для игроков на сервере.
    ну и оптимизация как всегда убежала куда-то, учился бы уже писать на PVar'ках, чтобы не было этого позорного GFовского
    Создадим сток для очистки массивов при коннекте/дисконнекте.

  5. #5
    Почетный пользователь LC Аватар для Snoowker
    Регистрация
    06.04.2010
    Адрес
    Kyiv
    Возраст
    28
    Сообщений
    1,952
    Репутация: 279

    Звание: как роза среди колючек

    Re: [SRC][ALL]Использование MySQL. (пример: Система регистрации)

    Я не знаю, какой там плагин на ГВ, пока что использую этот, не было возможности протестировать другие, потом посмотрю от strikenkid.

    За енуменатор спасибо, щас подправлю. На вкус и цвет товарищей нет, мне нравится такое строение кода.

    Зачем мне тут PVar? В любом случае регистрация используется для всех игроков, PVar тоже, мне нравится его использовать в отдельных случаях, когда не надо создавать массив для всех игроков. Мне удобней использовать массив тут, у меня он один и для всех игроков, а PVar'ы я уже использую в других целях.

    P.S. что ж ты так за моими темами следишь то?

  6. #6
    Пользователь
    Регистрация
    04.12.2010
    Адрес
    IDK
    Возраст
    32
    Сообщений
    61
    Репутация: -7

    Звание: имеет немного плохого в прошлом

    Re: [SRC][ALL]Использование MySQL. (пример: Система регистрации)

    Зачем мне тут PVar?
    У тебя все 500 игроков регистрируются сразу что ты на них сколько памяти выделяешь?

  7. #7
    Почетный пользователь LC Аватар для Snoowker
    Регистрация
    06.04.2010
    Адрес
    Kyiv
    Возраст
    28
    Сообщений
    1,952
    Репутация: 279

    Звание: как роза среди колючек

    Re: [SRC][ALL]Использование MySQL. (пример: Система регистрации)

    Цитата Сообщение от Twats Посмотреть сообщение
    У тебя все 500 игроков регистрируются сразу что ты на них сколько памяти выделяешь?
    Размер массива смотри.

  8. #8
    Пользователь
    Регистрация
    04.12.2010
    Адрес
    IDK
    Возраст
    32
    Сообщений
    61
    Репутация: -7

    Звание: имеет немного плохого в прошлом

    Re: [SRC][ALL]Использование MySQL. (пример: Система регистрации)

    а у меня 500 онлайн. Вот поставил бы и погубил свой сервер :(
    да, и не енуменатор а енумератор

  9. #9
    Активный пользователь Аватар для SeNT_Styles
    Регистрация
    29.03.2011
    Адрес
    RND
    Возраст
    27
    Сообщений
    629
    Репутация: 140

    Звание: скоро придёт к известности

    Re: [SRC][ALL]Использование MySQL. (пример: Система регистрации)

    с samp-кома взял ?xD
    Код:
    [Pawn-услуги] - опытные скриптеры, быстро и качественно выполненная работа, приемлемые цены.
    Я работаю с
    -MYSQL, SQLite
    -Foreach
    -Sscanf
    -RegEx
    -ZCMD
    -rBits

  10. #10
    Почетный пользователь LC Аватар для Snoowker
    Регистрация
    06.04.2010
    Адрес
    Kyiv
    Возраст
    28
    Сообщений
    1,952
    Репутация: 279

    Звание: как роза среди колючек

    Re: [SRC][ALL]Использование MySQL. (пример: Система регистрации)

    Цитата Сообщение от {PFT}SeNTik Посмотреть сообщение
    с samp-кома взял ?xD
    Ты меня за кого принимаешь? Свой код.
    Цитата Сообщение от Twats Посмотреть сообщение
    а у меня 500 онлайн. Вот поставил бы и погубил свой сервер :(
    да, и не енуменатор а енумератор
    Сейчас тест проверу на ПВарики и массивы, чисто для себя, интересно стало.

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

Похожие темы

  1. Создание системы регистрации (MySQL ~R7~)
    от Jaws1 в разделе Скрипты для любого мода
    Ответов: 75
    Последнее сообщение: 06.08.2015, 06:01
  2. Ответов: 0
    Последнее сообщение: 07.04.2014, 16:24
  3. Проблема при написание системы регистрации.
    от Florens в разделе Вопросы по скриптингу
    Ответов: 16
    Последнее сообщение: 22.07.2013, 18:23
  4. создание системы g.p.s
    от SlideR в разделе Скрипты для любого мода
    Ответов: 8
    Последнее сообщение: 29.04.2012, 12:55

Ваши права

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