Ошибка при записи в базу

2 posts in this topic

Хотел записать в базу данные об игроке (пароль, ник и т.д) Но происходит ошибка и оно не записывается. Я написал чтобы ошибки сохранялись в файл. Комментарием отметил где ошибка

Спойлер


#include <a_samp>

#include <fix>
#include <a_mysql>
#include <streamer>
#include <Pawn.CMD>
#include <sscanf2>
#include <foreach>
#include <Pawn.Regex>
#include <crashdetect>

#define     MYSQL_HOST  "localhost"
#define     MYSQL_USER  "root"
#define     MYSQL_PASS  ""
#define     MYSQL_BASE  "inewrp"

#define SCM     SendClientMessage
#define SCMTA   SendClientMessageToAll
#define SPD     ShowPlayerDialog

#define COLOR_WHITE 0xFFFFFFFF
#define COLOR_RED   0xFF0000FF



main()
{
    print("\n----------------------------------");
    print("-------NEW PROJECT STARTED--------");
    print("----------------------------------\n");
}

new MySQL:dbHandle;


enum player
{
    ID,
    NAME[MAX_PLAYER_NAME],
    PASSWORD[65],
    SALT[10],
    EMAIL[65],
    REF,
    SEX,
    RACE,
    AGE,
    SKIN,
    REGDATA[13],
    REGIP[16],
}
new player_info[MAX_PLAYERS][player];

enum dialogs
{
    DLG_NONE,
    DLG_REG,
    DLG_REGEMAIL,
    DLG_REGREF,
    DLG_REGSEX,
    DLG_REGRACE,
    DLG_REGAGE,
    DLG_LOG,
}

public OnGameModeInit()
{
    ConnectMySQL();
    return 1;
}

stock ConnectMySQL()
{
    dbHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_BASE);
    switch(mysql_errno())
    {
        case 0: print("Подключение к MySQL успешно");
        default: print("MySQL не подключён");
    }
    mysql_log(ERROR | WARNING);
    mysql_set_charset("cp1251");
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    return 1;
}

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, player_info[playerid][NAME], MAX_PLAYER_NAME);
    static const fmt_query[] = "SELECT `id` FROM `users` WHERE `name` = '%s'";
    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)];
    format(query, sizeof(query), fmt_query, player_info[playerid][NAME]);
    mysql_tquery(dbHandle, query, "CheckRegistration""i", playerid);
    return 1;
}

forward CheckRegistration(playerid);
public CheckRegistration(playerid)
{
    new rows;
    cache_get_row_count(rows);
    if(rows) ShowLogin(playerid);
    else ShowRegistration(playerid);
    
}

stock ShowLogin(playerid)
{
    SCM(playerid, COLOR_WHITE, "Игрок зарегистрирован");
}

stock ShowRegistration(playerid)
{
    new dialog[386+(-2+MAX_PLAYER_NAME)];
    format(dialog, sizeof(dialog),
        "{FFFFFF}Уважаемый {0f97ff}%s{FFFFFF}, мы рады видеть вас на сервере {ffaa3b}INewRolePlay{FFFFFF}\n\
        Аккаунт с таким именем не зарегистрирован\n\
        Для начала игры пройдите регистрацию\n\n\
        Напишите пароль для вашего акккаунта и нажмите \"Готово\"\n\
        {ff6a00}\tУсловия:\n\
        \t•Пароль должен быть от 8 до 32-х символов\n\
        \t•Пароль должен быть только из цифр и латинских символов любого регистра",
    player_info[playerid][NAME]
    );
    SPD(playerid, DLG_REG, DIALOG_STYLE_INPUT, "{0f97ff}Регистрация{FFFFFF} • Введите пароль", dialog, "Готово""Назад");
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DLG_REG:
        {
            if(response)
            {
                if(!strlen(inputtext))
                {
                    ShowRegistration(playerid);
                    return SCM(playerid, COLOR_RED, "-Ошибка- {FFFFFF} Введите в поле ниже пароль");
                }
                if(strlen(inputtext) < 8 || strlen(inputtext) > 32)
                {
                    ShowRegistration(playerid);
                    return SCM(playerid, COLOR_RED, "-Ошибка- {FFFFFF} Длина пароля должна быть от 8 до 32-х символов");
                }
                new regex:rg_passwordcheck = regex_new("^[a-zA-Z0-9]{1,}$");
                if(regex_check(inputtext, rg_passwordcheck))
                {
                    new salt[11];
                    for(new i; i < 10; i++)
                    {
                        salt[i] = random(79) + 47;
                    }
                    salt[10] = 0;
                    SHA256_PassHash(inputtext, salt, player_info[playerid][PASSWORD], 65);
                    strmid(player_info[playerid][SALT], salt, 01111);
                    SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{0797FF}Регистрация{FFFFFF} • Введите EMAIL",
                        "{FFFFFF}Введите ваш Email адрес ниже и нажмите \"Готово\"\n\
                        Если вы потеряете доступ к аккаунту вы можете восстановить его",
                    "Готово","");
                }
                else
                {
                    ShowRegistration(playerid);
                    return SCM(playerid, COLOR_RED, "-Ошибка- {FFFFFF} Пароль может состоять только из латинских сиволов и чисел");
                }
                regex_delete(rg_passwordcheck);
            }
            else
            {
                SCM(playerid, COLOR_RED, "-Подсказка- {FFFFFF} Используйте \"/q\", для выхода");
                SPD(playerid, -10" "" "" """);
                return Kick(playerid);
            }
        }
        case DLG_REGEMAIL:
        {
            if(!strlen(inputtext))
            {
                SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{0797FF}Регистрация{FFFFFF} • Введите EMAIL",
                    "{FFFFFF}Введите ваш Email адрес ниже и нажмите \"Готово\"\n\
                    Если вы потеряете доступ к аккаунту вы можете восстановить его",
                "Готово","");
                return SCM(playerid, COLOR_RED, "-Ошибка- {FFFFFF} Введите в поле ниже ваш Email!");
            }
            new regex:rg_emailcheck = regex_new("^[a-zA-Z0-9.-_]{1,43}@[a-zA-Z]{1,12}.{1,8}$");
            if(regex_check(inputtext, rg_emailcheck))
            {
                strmid(player_info[playerid][EMAIL], inputtext, 0, strlen(inputtext), 64);
                SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{0797FF}Регистрация{FFFFFF} • Введите реферала",
                    "{ff6a00}Если вы зашли на сервер по приглашению{FFFFFF} \n\
                    укажите ник пригласившего.\n\
                    Если вы не желаете его вводить нажмите \"Пропустить\"",
                "Готово""Пропустить");
            }
            else
            {
                SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{0797FF}Регистрация{FFFFFF} • Введите EMAIL",
                    "{FFFFFF}Введите ваш Email адрес ниже и нажмите \"Готово\"\n\
                    Если вы потеряете доступ к аккаунту вы можете восстановить его",
                "Готово","");
                return SCM(playerid, COLOR_RED, "-Ошибка- {FFFFFF} Проверьте правильность вашего Email адреса");
            }
            regex_delete(rg_emailcheck);
        }
        case DLG_REGREF:
        {
            if(response)
            {
                new regex:rg_refcheck = regex_new("^[a-zA-Z_]{4,24}$");
                if(regex_check(inputtext, rg_refcheck))
                {
                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s'";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)];
                    format(query, sizeof(query), fmt_query, inputtext);
                    mysql_tquery(dbHandle, query, "CheckReferal""is", playerid, inputtext);
                }
                else
                {
                    SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{0797FF}Регистрация{FFFFFF} • Введите реферала",
                        "{ff6a00}Если вы зашли на сервер по приглашению{FFFFFF} \n\
                        укажите ник пригласившего.\n\
                        Если вы не желаете его вводить нажмите \"Пропустить\"",
                    "Готово""Пропустить");
                    return SCM(playerid, COLOR_RED, "-Ошибка- {FFFFFF} Проверьте ник пригласившего вас игрока и попробуйте снова");
                }
                regex_delete(rg_refcheck);
            }
            else
            {
                SPD(playerid, DLG_REGSEX, DIALOG_STYLE_MSGBOX, "{0797FF}Регистрация • {FFFFFF} Выберите пол персонажа",
                    "{FFFFFF}Пожалуйста, выберите пол вашего персонажа перед началом игры",
                "Мужской""Женский");
            }
        }
        case DLG_REGSEX:
        {
            if(response) player_info[playerid][SEX] = 1;
            else player_info[playerid][SEX] = 2;
            SPD(playerid, DLG_REGRACE, DIALOG_STYLE_LIST, "{0797FF}Регистрация{FFFFFF} • Выберите расу персонажа",
                "Негроидная\n\
                Европеоидная\n\
                Многолоидная/Азтатская",
            "Готово""");
        }
        case DLG_REGRACE:
        {
            switch(listitem)
            {
                case 0: player_info[playerid][RACE] = 1;
                case 1: player_info[playerid][RACE] = 2;
                case 2: player_info[playerid][RACE] = 3;
            }
            SPD(playerid, DLG_REGAGE, DIALOG_STYLE_INPUT, "{0797FF}Регистрация{FFFFFF} • Выберите возраст персонажа",
                "{FFFFFF}Выберите возраст вашего персонажа\n\
                {ff6a00}\t• Возраст должен быть от 18 до 60-и",
            "Готово""");
        }
        case DLG_REGAGE:
        {
            if(!strlen(inputtext))
            {
                SPD(playerid, DLG_REGAGE, DIALOG_STYLE_INPUT, "{0797FF}Регистрация{FFFFFF} • Выберите возраст персонажа",
                    "Выберите возраст вашего персонажа:\n\
                    {ff6a00}\t• Возраст должен быть от 18 до 60-и",
                "Готово""");
                return SCM(playerid, COLOR_RED, "-Ошибка- {FFFFFF} Введите ваш возраст в поле ниже");
            }
            if(strval(inputtext) < 18 || strval(inputtext) > 60)
            {
                SPD(playerid, DLG_REGAGE, DIALOG_STYLE_INPUT, "{0797FF}Регистрация{FFFFFF} • Выберите возраст персонажа",
                    "{FFFFFF}Выберите возраст вашего персонажа\n\
                    {ff6a00}\t•Возраст должен быть от 18 до 60-и",
                "Готово""");
                return SCM(playerid, COLOR_RED, "-Ошибка-{FFFFFF} Возраст должен быть от 18 до 60-и лет");
            }
            player_info[playerid][AGE] = strval(inputtext);
            new reqmaleskins[9][4] =
            {
                {19,21,22,28},
                {24,25,36,67},
                {14,142,182,184},
                {29,96,101,26},
                {2,37,72,202},
                {1,3,234,290},
                {23,60,170,180},
                {20,47,48,206},
                {44,58,132,229}
            };
            new reqfemaleskins[9][2] = 
            {
                {13,69},
                {9,190},
                {10,218},
                {41,56},
                {31,151},
                {39,89},
                {169,193},
                {207,225},
                {54,130}
            };
            new newskinindex;
            switch(player_info[playerid][RACE])
            {
                case 1: {}
                case 2: newskinindex+=3;
                case 3: newskinindex+=6;
            }
            switch(player_info[playerid][AGE])
            {
                case 18..29: {}
                case 30..45: newskinindex++;
                case 46..60: newskinindex+=2;
            }
            if(player_info[playerid][SEX] == 1) player_info[playerid][SKIN] = reqmaleskins[newskinindex][random(4)];
            else player_info[playerid][SKIN] = reqfemaleskins[newskinindex][random(2)];
            new Year, Month, Day;
            getdate(Year, Month, Day);
            new date[13];
            format(date, sizeof(date), "%02d.%02d.%d", Day, Month, Year);
            new ip[16];
            GetPlayerIp(playerid, ip, sizeof(ip));
            static const fmt_query[] = "INSERT INTO `users` (`name`, `password`, `salt`, `email`, `ref`, `sex`, `race`, `age`, `skin`, `regdata`, `regip`) VALUE ('%s', '%s', '%s', '%s', '%d', '%d', '%d', '%d', '%s', '%s')";
            new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+64)+(-2+10)+(-2+64)+(-2+8)+(-2+1)+(-2+1)+(-2+2)+(-2+3)+(-2+12)+(-2+15)];
            format(query, sizeof(query), fmt_query, player_info[playerid][NAME], player_info[playerid][PASSWORD], player_info[playerid][SALT], player_info[playerid][EMAIL], player_info[playerid][REF], player_info[playerid][SEX], player_info[playerid][RACE], player_info[playerid][AGE], player_info[playerid][SKIN], date, ip);
            mysql_query(dbHandle, query);//Пишет что ошибка тут
        }
    }
    return 1;
}

forward CheckReferal(playerid, referal[]);
public CheckReferal(playerid, referal[])
{
    new rows;
    cache_get_row_count(rows);
    if(rows)
    {
        new refid;
        cache_get_value_name_int(0"id", refid);
        player_info[playerid][REF] = refid;
        SPD(playerid, DLG_REGSEX, DIALOG_STYLE_MSGBOX, "{0797FF}Регистрация • {FFFFFF} Выберите пол персонажа",
            "{FFFFFF}Пожалуйста, выберите пол вашего персонажа перед началом игры",
        "Мужской""Женский");
    }
    else
    {
        SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{0797FF}Регистрация{FFFFFF} • Введите реферала",
            "{ff6a00}Если вы зашли на сервер по приглашению{FFFFFF} \n\
            укажите ник пригласившего.\n\
            Если вы не желаете его вводить нажмите \"Пропустить\"",
        "Готово""Пропустить");
        return SCM(playerid, COLOR_RED, "-Ошибка- {FFFFFF} Такого аккаунта не существует");
    }
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}


 

Лог:

Цитата

[19:56:45] [ERROR] error #1136 while executing query "INSERT INTO `users` (`name`, `password`, `salt`, `email`, `ref`, `sex`, `race`, `age`, `skin`, `regdata`, `regip`) VALUE ('iiiiiiiiiiiiiiii', '068B01339F1813D72687ED138959D32C4A876C55EFEEAC04683381F51211B686', 'Q]H:}pJXseisah@gsad', 'isah@gsad', '0', '1', '3', '18', 'ґ', '25.10.2024')": Column count doesn't match value count at row 1 (E:\Server\gamemodes\project.pwn:496)

 

Edited by Cawfee

Share this post


Link to post
Share on other sites

Здравствуйте, не знаю, как вы хотите это сделать, но в своём бы моде я записал бы так:

 

format(query, sizeof(query), "INSERT INTO `users` (`name`, `password`, `salt`, `email`, `ref`, `sex`, `race`, `age`, `skin`, `regdata`, `regip`) VALUES ('%s','%s','%s','%s','%d', '%d', '%d', '%d', '%d', '%s','%s')"player_info[playerid][NAME], player_info[playerid][PASSWORD], player_info[playerid][SALT], player_info[playerid][EMAIL], player_info[playerid][REF], player_info[playerid][SEX], player_info[playerid][RACE], player_info[playerid][AGE], player_info[playerid][SKIN], date, ip);
mysql_tquery(dbHandle, query);

Во-первых, твой способ +- муторный, а во-вторых, ошибка в том, что у вас неравное кол-во столбцов(11-10).
 

Цитата

Column count doesn't match value count at row 1 - Количество столбцов не соответствует количеству значений в строке 1

 

Edited by Доналдо Фарекелка

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By bogdan@gmail
      Regular Expression Plugin v0.2.1 loaded
      ______________________________________
       By: Fro (c) Copyright <TBG> 2009-2011
      ______________________________________
        Loaded.
       Loading plugin: sscanf
        Failed.
       Loading plugin: streamer
        Failed.
       Loaded 2 plugins.

      Started server on 127.0.0.1:1254, with maxplayers: 50 lanmode is OFF.

      Filterscripts
      ---------------
        Loaded 0 filterscripts.
      Script[gamemodes/russia.amx]: Run time error 19: "File or function is not found"
      Number of vehicle models: 0
       
      Плагины
      plugins crashdetect mysql mysql_static pawncmd pawnraknet regex sscanf streamer
       
       
       
       
      что не так?

    • By romanets111
      Вообщем не могу запустить сервер, ничего не регистрация , зашёл на сервер и всё, на хостинге пишет Unknown
      Помогите решить проблему, возникает в консоле такое
       
      [22:02:07] [debug] Run time error 19: "File or function is not found"[22:02:07] [debug]  BS_ReadValue
      [22:02:07] [debug]  PR_SendPacket[22:02:07] [debug]  PR_Init
      [22:02:07] [debug]  PR_RegHandler[22:02:07] [debug]  BS_IgnoreBits
      [22:02:07] [debug]  BS_New[22:02:07] [debug]  BS_WriteValue
      [22:02:07] [debug]  BS_Delete[22:02:07] [debug]  BS_GetNumberOfBytesUsed
       
      Прошу вас помогите мне
    • By Andrey Markelov

      Описание
      Готовый сайт для SAMP-проекта, разработанный на PHP-фреймворке Laravel. Проект полностью готов к запуску и включает следующие функции: раздел новостей, авторизация в личный кабинет, восстановление пароля, система донатов, история платежей, карта сервера, смена пароля. Сложный функционал намеренно не добавлялся, чтобы облегчить процесс изучения структуры проекта и работы с ним. Все реализовано максимально просто, чтобы новички могли быстро разобраться, где что находится. База данных содержит минимальный набор информации, поскольку у каждого SAMP-проекта своя уникальная структура и функционал. Это позволяет вам легко адаптировать сайт под ваш проект. Например, в личном кабинете вы самостоятельно можете подставить необходимые данные для отображения информации об аккаунте пользователя. Сайт также включает административную панель. Для доступа к админке перейдите по адресу /admin. Если вы уже авторизованы как администратор, система перенаправит вас на главную страницу админки. В противном случае откроется страница авторизации. Важно отметить, что авторизация в личном кабинете и в административной панели — это две разные системы, которые между собой не связаны. Проект создан с упором на простоту и функциональность, что делает его отличным стартовым решением для вашего SAMP-проекта.
       
       
       
      Структура страниц
      Публичный сайт
      1. Главная страница (/)
      Стандартная страница с базовой информацией о вашем проекте. Здесь размещены инструкции по началу игры, новости и контакты. Если в базе данных отсутствуют новости, блок с ними отображаться не будет — для отображения требуется как минимум одна новость.
       
      2. Новости (/news)
      Раздел, где отображаются все ваши новости. Используется пагинация: на одной странице выводится по 10 записей.
       
      3. О нас (/company/about)
      Раздел с более детальной информацией о вашем проекте.
       
      4. Пользовательское соглашение (/company/user-agreement)
      Раздел с текстом пользовательского соглашения.
       
      5. Политика обработки персональных данных (/company/privacy-policy)
      Страница, где размещена информация о политике обработки персональных данных.
       
      Профиль игрока
      1. Личный кабинет (/profile)
      Страница с общей информацией об аккаунте пользователя.
       
      2. История платежей (/profile/payment-history)
      Страница с историей всех платежей пользователя, независимо от их статуса. Используется пагинация: на одной странице отображается 10 записей.
       
      3. Карта сервера (/profile/map)
      Мониторинг карты сервера. На данный момент отображаются только дома и бизнесы, а также информация о них. Функционал можно расширить в зависимости от особенностей вашего SAMP-проекта.
       
      4. Настройки (/profile/settings)
      Страница с формой для смены пароля. При успешной смене пароля пользователю отправляется уведомление на почту. Функционал также может быть доработан в зависимости от ваших требований.
       
      Админка
      1. Главная страница (/admin)
      Основная информация для администратора. Сделано минималистично, функционал можно расширить при необходимости.
       
      2. Новости (/admin/news)
      Страница для управления новостями. Здесь отображаются все новости, независимо от их статуса. Реализованы кнопки для создания, редактирования и удаления новостей. Для редактирования контента используется QuillJS, что упрощает наполнение текстами. Изображения, добавленные в контент, сохраняются в базу данных в формате base64. Обложки новостей хранятся в каталоге public/storage/news_images. При редактировании или удалении новости ненужные файлы автоматически удаляются.
       
      3. Пользователи (/admin/users)
      Страница всех игроков вашего SAMP-проекта. Используется пагинация: на одной странице отображается по 10 записей. Неподтвержденные email-адреса выделяются красным цветом (подтвержденными считаются те, у которых в поле email_verified_at указана дата). На странице редактирования пользователя доступен раздел "Платежи", где выводятся все транзакции игрока, также с пагинацией (по 10 записей на странице).
       
      4. Администраторы (/admin/admins)
      Раздел для управления администраторами сайта (не игровыми). Используется пагинация: на одной странице выводится по 10 записей. По умолчанию в проекте существует супер-администратор (Super_Admin), который может создавать новых администраторов. Функционал включает создание, редактирование и удаление администраторов. Супер-админа удалить невозможно. Для разграничения прав администраторов рекомендуется использовать пакет spatie/laravel-permission, позволяющий добавлять роли (например, "модератор", "редактор").
       
      5. Личный кабинет администратора (/admin/profile)
      Простая страница с основной информацией о текущем администраторе. При необходимости функционал можно доработать.
       
       
       
      Пароль
      Насколько мне известно, большинство SAMP-проектов используют формат MD5 для хранения паролей. Однако Laravel и его пакеты для работы с авторизацией не поддерживают MD5 из-за его уязвимости. Поэтому было принято решение написать собственную реализацию авторизации. Функционал авторизации и смены пароля полностью работает с MD5. При этом авторизация в административную панель не использует MD5 и реализована с использованием более безопасных методов. Если в вашем проекте пароли хранятся не в формате MD5, вам потребуется немного изменить логику работы с паролями, чтобы адаптировать проект. Также настоятельно рекомендую добавить двухфакторную аутентификацию, если вы используете MD5 для хранения паролей, чтобы повысить уровень безопасности.
       
       
       
      Мои ожидания
      Исходя из структуры проекта, я предполагаю, что у вас уже настроена база данных с таблицами: users (пользователи — игроки), businesses (бизнесы), houses (дома).
       
      Таблица users:
      username — игровой ник;
      password — пароль;
      email — игровая почта;
      p_level — уровень;
      p_skin — ID скина;
      p_money — игровая валюта;
      p_donate — донат-счет;
      email_verified_at — дата подтверждения почты;
      created_at — дата создания аккаунта;
      updated_at — дата последнего обновления записи (обновляется автоматически).
       
      Таблицы houses и businesses:
      name — название;
      description — описание;
      price — государственная стоимость;
      entrance_x — координата входа по оси X;
      entrance_y — координата входа по оси Y;
      entrance_z — координата входа по оси Z;
      user_id — ID игрока, которому принадлежит дом или бизнес.
       
      Для карты в личном кабинете используются координаты X и Y. Если в вашей базе данных эти поля называются иначе, не забудьте внести изменения в контроллер MapController.php и файл map.blade.php.
       
       
       
      Структура проекта
      Для работы с проектом рекомендую использовать IDE PhpStorm. Вы можете навести курсор на любой метод, нажать Ctrl, чтобы перейти к его реализации, и таким образом разобраться, где и как вызывается код.
       
      Основные файлы и директории
      routes/web.php Здесь находятся роуты для публичной части сайта. Для каждой страницы и её логики создан отдельный роут.
      routes/admin.php Этот файл содержит роуты, относящиеся к админке.
       
      Проект построен по принципу MVC (Model-View-Controller): 
      Model — работа с базой данных.
      View — представления (HTML-шаблоны).
      Controller — логика, например, извлечение данных из базы и передача их в представления.
       
      app/Models В этой папке находятся модели, которые представляют таблицы базы данных. Например, app/Models/User связана с таблицей users.
      resources/views Здесь хранится вся верстка сайта, включая шаблоны административной панели. В любом шаблоне вам будут доступны две переменные: $serverName и $serverIP.
      app/Http/Controllers Содержит контроллеры. Для каждой части логики создается отдельный контроллер. Также есть папка Admin, где находятся контроллеры, относящиеся к админке.
       
      Middleware
      В проекте используются два Middleware:
      AuthenticateUser — проверяет авторизацию пользователя. Например, чтобы открыть страницу личного кабинета, используется этот Middleware. Если пользователь не авторизован, доступ к странице будет закрыт.
      AuthenticateAdmin — отвечает за авторизацию в админке. Например, для создания новости или входа в административную панель.
       
      В роутах они называются auth.user и auth.admin.
       
      Работа с базой данных
      database/seeders — Здесь находятся сидеры, которые используются для заполнения базы данных. Например, для разработки или тестирования можно заполнить таблицы фейковыми данными с помощью пакета fakerphp/faker.
       
      На данный момент в проекте есть три сидера: для домов, бизнесов и создания супер-администратора. По умолчанию используется DatabaseSeeder.
       
      Команды для работы с сидерами:
      Запуск всех сидеров: php artisan db:seed.
      Запуск конкретного сидера: php artisan db:seed --class=UserSeeder.
       
      database/migrations — Важная часть проекта. Все манипуляции с базой данных (создание, изменение, удаление таблиц) выполняются через миграции. Миграции можно отслеживать, откатывать и проверять их статус.
       
      Основные команды:
      Создание миграции: php artisan make:migration create_users_table.
      Применение миграции: php artisan migrate.
      Откат миграции: php artisan migrate:rollback (можно указать, сколько миграций откатить).
      Просмотр всех доступных команд: php artisan.
       
      Фронтенд
      public/assets — В этой директории находятся стили, JavaScript-код и изображения.
      resources — Файлы CSS и JS также находятся в этой папке. Если вы изменяете их, обязательно выполните сборку проекта командой: npm run build
       
       
       
      Донат
      Платежных систем достаточно, и каждый может выбрать подходящую по своему усмотрению. Однако в данном проекте не реализован полный функционал оплаты. Есть таблица с оплатами, в админке отображается статистика, а у пользователя — история платежей, но сам процесс оплаты не предусмотрен. Я лишь подготовил основу, и вам нужно выбрать платёжную систему и подключить её самостоятельно. В вашем распоряжении будет контроллер ShopController.php, в котором есть метод processPayment. В этом методе вы получаете информацию о пользователе, который совершает донат, сумму и email. Все данные для записи в таблицу о платеже уже есть, и создается запись со статусом waiting. Все возможные статусы можно найти в файле app/Enums/PaymentStatus. После того как платеж будет обработан, вам нужно изменить статус в таблице с waiting на success или error, в зависимости от результата. Если платёж успешен, также необходимо обновить поле p_donate в таблице users.
       
      Пример кода для изменения статуса и обновления данных пользователя:
      $payment->update(['status' => 'success']); $user->increment('p_donate', $validated['amount']);  
      В интернете есть множество статей о том, как подключить платёжные системы, а также существуют специализированные пакеты для Laravel, которые могут упростить этот процесс.
       
       
       
      Что нужно для запуска проекта
      Для пользователей Linux данная инструкция не требуется, так как предполагается, что вы уже знакомы с процессом настройки.
       
      1. Установите OpenServer или аналогичный инструмент
      2. Проверьте версии установленных инструментов, используя команды:
      2.1. php -v
      2.2. composer -V
      3. Установите Node.js. После установки убедитесь, что Node.js и npm работают корректно, выполнив команды:
      3.1. node -v
      3.2. npm -v
       
      PHP: версия 8.2 или выше. MySQL: у меня 8.0 на момент разработки.
       
       
       
      Первые шаги
      Скорее всего, вы скачали архив проекта, но инструкция составлена так, будто вы клонировали репозиторий с GitHub.
      Рекомендую для начала использовать предоставленные данные проекта, чтобы разобраться в его работе, вместо того чтобы сразу адаптировать вашу базу данных.
       
      1. Создание базы данных.
      Создайте пустую базу данных для проекта.
       
      2. Настройка файла .env. 
      В корневой директории проекта у вас должен быть файл .env. Если его нет, скопируйте файл env.example и переименуйте его, удалив .example:
       
      3. Далее выполните команду: php artisan key:generate
       
      4. Откройте файл .env и настройте его под свои параметры:
      APP_URL — Укажите адрес сайта (локально - локальный, на хостинге - ссылка сайта).
      SAMP_SERVER_NAME — Название вашего SAMP-проекта.
      SAMP_SERVER_IP — IP-адрес вашего SAMP-сервера.
      DB_HOST — Хост базы данных.
      DB_PORT — Порт базы данных.
      DB_DATABASE — Имя базы данных.
      DB_USERNAME — Имя пользователя базы данных.
      DB_PASSWORD — Пароль для базы данных (оставьте пустым, если не требуется).
      SUPER_ADMIN_PASSWORD — Задайте сложный пароль для супер-администратора (требуется минимум 8 символов).
      CONTACT_EMAIL — Почта проекта.
       
      Найдите переменную MAIL_MAILER и укажите настройки для вашего почтового сервиса. Без этого отправка писем на почту не будет работать. Для тестирования локально я использовал mailtrap.
       
      5. Установка зависимостей. 
      Установите зависимости PHP и Node.js:
      5.1. composer install
      5.2. npm install
       
      6. Очистка кеша. 
      На всякий случай очистите все кеши:
      6.1. php artisan cache:clear
      6.2. php artisan route:clear
      6.3. php artisan config:clear
      6.4. php artisan view:clear
       
      7. Сборка фронтенда. 
      Соберите проект: npm run build
       
      8. Файловое хранилище. 
      Чтобы изображения, которые вы загружаете, были видны в шаблонах, используйте команду: php artisan storage:link.
       
      9. Миграции и сидеры. 
      Выполните миграцию базы данных и запустите сидеры для начального заполнения: php artisan migrate:fresh --seed
       
      10. Запуск проекта. 
      Для запуска проекта выполните: php artisan serve
       
      Не пугайтесь большого количества шагов на первый взгляд — на самом деле все достаточно просто. Основные действия включают настройку файла .env и установку зависимостей. Это всего лишь первоначальная настройка. В дальнейшем для запуска проекта вам понадобится всего одна команда: php artisan serve
       
      Если все сделано правильно, сайт будет доступен по адресу: 127.0.0.1:8000
       
       
      Дополнительно:
      В архиве предоставлен дамп базы данных, использовавшийся на этапе разработки.
      Пароли в таблице users: 123123
      Пароли в таблице admins: 12345678
       
       
       
      Скачать: https://disk.yandex.by/d/UNdQVj-XATlvzw
       
      Скриншоты:






















    • By maYn
      Компилирую мод и вот что получилось:
      G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55306) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55327) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55327) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55348) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55348) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55363) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55363) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55386) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55386) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55397) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55397) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55533) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55533) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55544) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55544) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55565) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55565) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55662) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55662) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55678) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55678) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55724) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55724) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55783) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55783) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55831) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55831) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55887) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55887) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55950) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55950) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55973) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55973) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55998) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(55998) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56022) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56022) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56083) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56083) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56090) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56090) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56110) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56110) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56131) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56131) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56137) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56137) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56148) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56148) : error 014: invalid statement; not in switch G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56159) : warning 225: unreachable code G:\Сохраненные файлы\Gamemode\gamemodes\main.pwn(56159) : error 014: invalid statement; not in switch Используемый мод: Flin RP от Danya_White.
      Раньше было все нормально, пока не включил систему хеллоуинских квестов (большинство ошибок пофиксил, остались эти). Всю голову уже сломал в чём может быть проблема.
      Да, если отключить эту систему, то ошибок нет, но хотелось бы с этой системой поработать. Прошу помочь мне.
       
      P.S: Знаю, что на флине (Слово удалено системой)-код, но что поделать...
      Прикол в том, что эти ошибки у меня появляются на кейсах
      Только кейсы.
      Все кейсы выполнены одинаково (к примеру, case D_DUEL_MAP:)