Доступ к архиву

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

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

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

Не сохраняются данные в БД

Статус
В этой теме нельзя размещать новые ответы.

Brazillec13

Умник
Доброго времени суток. Следовал по уроку, ссылку не буду, давать, воспримите как рекламу (возможно Ваш конкурент pawno-info), но если попросите дам. В общем, делал используя урок по созданию регистрации mysql и при тестировании вычислил, что данные при регистрации не сохраняются в БД. До этого я убрал одну строку и стока - mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS); потому что возникал error:
Код:
D:\Server\gamemodes\Roleplay.pwn(408) : error 029: invalid expression, assumed zero
D:\Server\gamemodes\Roleplay.pwn(408) : error 035: argument type mismatch (argument 4)
Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase


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

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

stock CheckMySQLConnection() { // Этот сток мы будем использовать для проверки, подключена ли БД перед её использованием.
        if(mysql_ping() == -1) mysql_reconnect();
        return 1;
}
Код:
stock CreateAccount(playerid, password[]) {
        new
            query[128], // Для запроса.
                sqlname[MAX_PLAYER_NAME],
            sqlpassword[32];
        mysql_real_escape_string(playerVariable[playerid][aName], sqlname); // Защитит от sql inject
        mysql_real_escape_string(password, sqlpassword); // Защитит от sql inject
        format(query, sizeof(query), "INSERT INTO `Accounts` (`Nickname`, `Password`) VALUE ('%s', '%s')", sqlname, sqlpassword); // Добавляем в таблицу запись.
        // INSERT - добавление записи в таблицу, 1. () - поля. 2. VALUE - значения этих полей.
        mysql_query(query); // Отправляем запрос.
    GetAccountID(playerid); // Узнаём ИД аккаунта, будет использоваться для сохранения и прочих операций.
    strmid(playerVariable[playerid][aPassword], password, 0, 64, 255); // Внедряем в массив аккаунта введенный игроком пароль.
        playerVariable[playerid][aLogged] = true; // Мы авторизованы.
        return 1;
}
stock LoadAccount(playerid, password[]) {
        new
                query[128],
                sqlpass[32],
                result[5+24+64],
                dialog[128];
        mysql_real_escape_string(password, sqlpass); // Защита от SQL Inject, шифрует кодировку.
        format(query, sizeof(query), "SELECT * FROM `Accounts` WHERE `Password` = '%s' AND `ID` = '%i'", sqlpass, playerVariable[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(playerid, COLOR_LIGHTRED, "Вы 3 раза ввели неверный пароль и были отключены от сервера.");
                        Kick(playerid);
                        return 1;
                }
                format(dialog, sizeof(dialog),
                        "Вы ввели неверный пароль.\n\
                        У Вас осталось %i/3 попыток ввода.", 3 - playerVariable[playerid][aWrongPassword]);
                ShowPlayerDialog(playerid, DIALOG_WRONGPAS, DIALOG_STYLE_MSGBOX, "Ошибка.", dialog, "Повтор", "Отмена");
        }
        return 1;
}
stock GetAccountID(playerid) {
        new
                query[128];
        format(query, sizeof(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;
}

stock 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(query, sizeof(query), "UPDATE `Accounts` SET `Nickname` = '%s', `Password` = '%s' WHERE `ID` = '%i'", sqlname, sqlpass, playerVariable[playerid][aID]);
                mysql_query(query); // Отправляем запрос
        }
        return 1;
}
Код:
stock RemovePlayerVariables(playerid) {
        playerVariable[playerid][aWrongPassword] = 0;
        playerVariable[playerid][aID] = 0;
        playerVariable[playerid][aLogged] = false;
        return 1;
}
Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
        switch(dialogid) {
                case DIALOG_LOGIN: { // Диалог авторизации.
                    if(!response) { // Если нажал "Отмена".
                                SendClientMessage(playerid, COLOR_YELLOW, "* Введите /q(uit), чтобы выйти из игры.");
                                Kick(playerid);
                                return 1;
                        }
                    if(!strlen(inputtext)) { // Если поле ввода пустое.
                        new dialog[134+MAX_PLAYER_NAME];
                            format(dialog, sizeof(dialog),
                                        "Добро пожаловать на Сервер!\n\
                                        Этот аккаунт зарегистрирован.\n\n\
                                        Логин: %s\n\
                                        Введите пароль:",
                                        playerVariable[playerid][aName]);
                                ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Авторизация.", dialog, "Войти", "Отмена");
                                return 1;
                        }
                        LoadAccount(playerid, inputtext); // Пробуем его авторизовать.
                }
                case DIALOG_REGISTER: { // Диалог регистрации.
                    if(!response) { // Если нажал "Отмена".
                                SendClientMessage(playerid, COLOR_YELLOW, "* Введите /q(uit), чтобы выйти из игры.");
                                Kick(playerid);
                                return 1;
                        }
                        if(!strlen(inputtext) || strlen(inputtext) < 6 || strlen(inputtext) > 64) { // Если пустое поле ввода или пароль имеет меньше 6 или больше 64 символов
                                new dialog[380+24+10];
                                format(dialog, sizeof(dialog),
                                        "Добро пожаловать на Сервер!\n\
                                    Этот аккаунт не зарегистрирован.\n\n\
                                    Логин: %s\n\
                                        Введите пароль и нажмите \"Далее\".\n\n\
                                        Примечания:\n\
                                - Пароль чувствительный к регистру.\n\
                                    - Длина пароля от 6 до 32 символов.\n\
                                    - В пароле можно использовать символы на кириллице и латинице.\n", playerVariable[playerid][aName]);
                                ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Регистрация.", dialog, "Далее", "Отмена");
                                return 1;
                        }
                        CreateAccount(playerid, inputtext); // Создаём аккаунт.
                        playerVariable[playerid][aLogged] = true; // Авторизуем игрока. :)
                }
                case DIALOG_WRONGPAS: { // Если неверный пароль.
                        if(response) {
                                new dialog[134+MAX_PLAYER_NAME];
                                format(dialog, sizeof(dialog),
                                        "Добро пожаловать на Сервер!\n\
                                        Этот аккаунт зарегистрирован.\n\n\
                                        Логин: %s\n\
                                        Введите пароль:",
                                        playerVariable[playerid][aName]);
                                ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Авторизация.", dialog, "Войти", "Отмена");
                                return 1;
                        }
                        else { // Если нажал "Отмена".
                                Kick(playerid);
                                return 1;
                        }
                }
        }
        return 1;
}
Код:
public OnPlayerText(playerid, text[])
{
        if(playerVariable[playerid][aLogged] == false) return 0;
        return 1;
}
Код:
public OnPlayerConnect(playerid)
{
        RemovePlayerVariables(playerid);
//------------------------------------------------------------------------------
        GetPlayerName(playerid, playerVariable[playerid][aName], MAX_PLAYER_NAME);
//------------------------------------------------------------------------------
        if(GetAccountID(playerid)) { // Аккаунт зарегистрирован
                new dialog[128+MAX_PLAYER_NAME];
                format(dialog, sizeof(dialog),
                        "Добро пожаловать на Сервер!\n\
                        Этот аккаунт зарегистрирован.\n\n\
                        Логин: %s\n\
                        Введите пароль:",
                        playerVariable[playerid][aName]);
                ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Авторизация.", dialog, "Войти", "Отмена");
        }
        else { // Аккаунт не зарегистрирован (return 0, в функции GetAccountID, т.е. не нашло записи с аккаунтом).
                new dialog[344+MAX_PLAYER_NAME];
                format(dialog, sizeof(dialog),
                        "Добро пожаловать на Сервер!\n\
                    Этот аккаунт не зарегистрирован.\n\n\
                    Логин: %s\n\
                        Введите пароль и нажмите \"Далее\".\n\n\
                        Примечания:\n\
                        - Пароль чувствительный к регистру.\n\
                    - Длина пароля от 6 до 32 символов.\n\
                    - В пароле можно использовать символы на кириллице и латинице.\n", playerVariable[playerid][aName]);
                ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Регистрация.", dialog, "Далее", "Отмена");
        }
        return 1;
}

База данных:
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу