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

В теме 2 сообщения

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

Спойлер


#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)

 

Отредактировано пользователем Cawfee

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Отредактировано пользователем Доналдо Фарекелка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • От AndreyMarkelov

       
      Laravel — это современный PHP-фреймворк, который позволяет быстро и эффективно создавать веб-приложения. Его мощные инструменты и простая структура делают его идеальным выбором для разработки личного кабинета для вашего SAMP сервера. В этой статье мы создадим авторизацию для личного кабинета, которая будет работать с существующей базой данных SAMP сервера.
       
      Мы настроим три страницы:
      1. Главная: / — основная страница сайта.
      2. Авторизация: /auth — форма для ввода никнейма и пароля.
      3. Личный кабинет: /profile — страница с информацией об игроке после авторизации.
       
      Для начала давайте установим Laravel и подготовим базовое окружение.
       
       
       
      Установка Laravel
      1. Убедитесь, что ваш компьютер соответствует системным требованиям Laravel: 
      PHP версии 8.2 или выше Composer (менеджер зависимостей PHP)  
      2. Скачайте Laravel с помощью Composer 
      Откройте терминал и выполните следующую команду, чтобы создать новый проект Laravel: composer create-project laravel/laravel samp 
      Здесь samp — это название папки для проекта. Вы можете указать свое. 
       
      3. Перейдите в папку проекта: cd samp
       
      4. Настройте подключение к базе данных. 
      Laravel использует файл .env для хранения конфигурации. Найдите строки, отвечающие за подключение к базе данных, и укажите данные вашей SAMP базы:
      DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=название_базы DB_USERNAME=имя_пользователя DB_PASSWORD=пароль  
      5. Запустите встроенный сервер разработки Laravel: php artisan serve
      После запуска вы увидите сообщение, что сервер работает, например, на 127.0.0.1:8000. Перейдите по этой ссылке в браузере.
       
       
       
      Настройка роутов
      Откройте файл routes/web.php, который отвечает за определение роутов вашего сайта. Добавим туда наши роуты:
      <?php use Illuminate\Support\Facades\Route; // Главная страница Route::get('/', function () {     return view('welcome'); // Страница для главной }); // Страница авторизации Route::get('/auth', function () {     return view('auth'); // Отдельный шаблон для авторизации }); // Личный кабинет Route::get('/profile', function () {     return view('profile'); // Страница для личного кабинета });  
      Для каждого роута нам понадобятся базовые HTML-шаблоны. Создадим их в папке resources/views:
      1. Главная страница. Создайте файл resources/views/welcome.blade.php:
      <!DOCTYPE html> <html lang="ru"> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <title>Главная</title> </head> <body>     <h1>Добро пожаловать на ваш сайт!</h1>     <a href="/auth">Войти</a> </body> </html>  
      2. Страница авторизации. Создайте файл resources/views/auth.blade.php:
      <!DOCTYPE html> <html lang="ru"> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <title>Авторизация</title> </head> <body>     <h1>Вход в личный кабинет</h1>     <form action="/auth" method="POST">         @csrf         <label for="nickname">Ник:</label>         <input type="text" id="nickname"  data-cke-saved-name="nickname" name="nickname" required>         <br>         <label for="password">Пароль:</label>         <input type="password" id="password"  data-cke-saved-name="password" name="password" required>         <br>         <button type="submit">Войти</button>     </form> </body> </html>  
      3. Личный кабинет. Создайте файл resources/views/profile.blade.php:
      <!DOCTYPE html> <html lang="ru"> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <title>Личный кабинет</title> </head> <body>     <h1>Добро пожаловать в личный кабинет!</h1>     <p>Здесь будет отображаться информация о вашем аккаунте.</p>     <a href="/">Вернуться на главную</a> </body> </html>  
      Тестирование роутов. Теперь вы можете проверить роуты в браузере:
      Перейдите на 127.0.0.1:8000 — главная страница. Нажмите "Войти" и перейдите на 127.0.0.1:8000/auth — страница авторизации. Для /profile пока просто введите 127.0.0.1:8000/profile в адресной строке. Позже мы защитим эту страницу.  
       
      Миграции
      Миграции в Laravel позволяют выполнять определённые действия с базой данных, такие как создание таблиц, добавление, изменение или удаление колонок. Все манипуляции с базой данных происходят через миграции, что делает процесс удобным и структурированным.
       
      Вот несколько основных команд для работы с миграциями:
      Создание таблицы: php artisan make:migration create_news_table
      Проверка статуса миграций: php artisan migrate:status
      Откат последней миграции: php artisan migrate:rollback
       
      Откройте файл database/migrations/create_users_table.php. Если такого файла нет, создайте его с помощью команды в терминале: php artisan make:migration create_users_table
       
      Откройте файл и добавьте следующую структуру таблицы в метод up:
      Schema::create('users', function (Blueprint $table) {     $table->id(); // Автоматический ID     $table->string('nickname')->unique(); // Уникальный никнейм пользователя     $table->string('email')->unique(); // Уникальный email     $table->timestamp('email_verified_at')->nullable(); // Подтверждения email     $table->unsignedBigInteger('player_money')->default(0); // Деньги пользователя     $table->unsignedBigInteger('player_donate')->default(0); // Донат пользователя     $table->unsignedInteger('player_skin')->default(0); // ID скина     $table->string('password'); // Пароль     $table->rememberToken(); // Токен для "запомнить меня"     $table->timestamps(); // created_at и updated_at });  
      После того как вы добавили необходимые поля в файл миграции, выполните следующую команду: php artisan migrate.
       
      По завершении выполнения команды таблица будет создана. Вы можете открыть phpMyAdmin или любой другой инструмент для работы с базой данных и убедиться, что таблица появилась с нужными полями.
       
       
      Настройка модели
      Если у вас таблица называется accounts, то в Laravel рекомендуется создать модель с именем Account, чтобы придерживаться стандартов. Laravel автоматически связывает название модели во множественном числе с таблицей, если это возможно. Например:
      Модель Account по умолчанию будет связана с таблицей accounts.  Модель Player будет связана с таблицей players. Если ваше название модели совпадает с названием таблицы (во множественном числе), дополнительных настроек не требуется. Однако, если название отличается, нужно будет явно указать таблицу в модели: protected $table = 'my_users'; 
       
      Если ваша таблица называется accounts — создайте модель Account: php artisan make:model Account 
      Если ваша таблица называется users — откройте файл app/Models/User.php и добавьте все поля в $fillable, которые будут использоваться на сайте:
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable {     use HasFactory, Notifiable;     // Поля, которые будут использоваться на сайте.     protected $fillable = [         'nickname',         'email',         'player_money',         'player_donate',         'player_skin',         'password',     ];     // Поля, которые скрываются при сериализации модели.     protected $hidden = [         'password',     ]; }  
       
       
      Реализация логики авторизации
      1. Создание контроллера. Создадим контроллер для обработки роутов авторизации и личного кабинета. Назовём его AuthController: php artisan make:controller AuthController 
       
      2. Реализация методов в контроллере. Откройте файл app/Http/Controllers/AuthController.php и реализуйте методы:
       
      Отображение формы авторизации:
      public function showLoginForm() {     return view('auth'); }  
      Обработка авторизации:
      public function login(Request $request) {     // Валидируем данные     $request->validate([         'nickname' => 'required|string',         'password' => 'required|string',     ]);     // Получаем никнейм и пароль     $nickname = $request->input('nickname');     $password = $request->input('password');     // Хэшируем пароль в MD5     $hashedPassword = md5($password);     // Проверяем пользователя в базе данных     $user = User::where('nickname', $nickname)                 ->where('password', $hashedPassword)                 ->first();     if ($user) {         // Сохраняем пользователя в сессии         $request->session()->put('user', $user);         // Редирект в личный кабинет         return redirect()->route('profile');     }     // Возвращаем обратно с ошибкой     return back()->withErrors(['message' => 'Неверный никнейм или пароль']); }  
      Если в вашей базе данных пароли хранятся в формате bcrypt:
      public function login(Request $request) {     // Валидируем данные     $request->validate([         'nickname' => 'required|string',         'password' => 'required|string',     ]);     // Получаем никнейм и пароль     $nickname = $request->input('nickname');     $password = $request->input('password');     // Проверяем пользователя в базе данных     $user = User::where('nickname', $nickname)->first();     if ($user && Hash::check($password, $user->password)) {         // Сохраняем пользователя в сессии         $request->session()->put('user', $user);         // Редирект в личный кабинет         return redirect()->route('profile');     }     // Возвращаем обратно с ошибкой     return back()->withErrors(['message' => 'Неверный никнейм или пароль']); }  
      Личный кабинет:
      public function profile(Request $request) {     // Проверяем, авторизован ли пользователь     $user = $request->session()->get('user');     if (!$user) {         return redirect()->route('auth.form')->withErrors(['message' => 'Сначала войдите в систему']);     }     return view('profile', ['user' => $user]); }  
      Выход из аккаунта:
      public function logout(Request $request) {     // Удаляем данные из сессии     $request->session()->forget('user');     return redirect('/'); }  
      AuthController.php:
       
      3. Настройка роутов. Обновим routes/web.php, чтобы все роуты ссылались на методы контроллера:
      <?php use App\Http\Controllers\AuthController; use Illuminate\Support\Facades\Route; // Главная страница Route::get('/', function () {     return view('welcome'); }); // Авторизация Route::get('/auth', [AuthController::class, 'showLoginForm'])->name('auth.form'); Route::post('/auth', [AuthController::class, 'login'])->name('auth.login'); // Личный кабинет Route::get('/profile', [AuthController::class, 'profile'])->name('profile'); // Выход Route::get('/logout', [AuthController::class, 'logout'])->name('auth.logout');  
       
       
      Обновление шаблонов
      Чтобы пользователи видели сообщения об ошибках, добавим их в шаблон авторизации resources/views/auth.blade.php:
      <!DOCTYPE html> <html lang="ru"> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <title>Авторизация</title> </head> <body>     @if ($errors->any())         <div style="color: red;">             @foreach ($errors->all() as $error)                 <p>{{ $error }}</p>             @endforeach         </div>     @endif     <h1>Вход в личный кабинет</h1>     <form action="/auth" method="POST">         @csrf         <label for="nickname">Ник:</label>         <input type="text" id="nickname"  data-cke-saved-name="nickname" name="nickname" required>         <br>         <label for="password">Пароль:</label>         <input type="password" id="password"  data-cke-saved-name="password" name="password" required>         <br>         <button type="submit">Войти</button>     </form> </body> </html>  
      Отображение данных пользователя в личном кабинете. В файле resources/views/profile.blade.php выведем данные из базы:
      <!DOCTYPE html> <html lang="ru"> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <title>Личный кабинет</title> </head> <body>     <h1>Добро пожаловать, {{ $user->nickname }}!</h1>     <p>Ваш email: {{ $user->email }}</p>     <p>Игровой баланс: {{ $user->player_money }}</p>     <p>ID скина: {{ $user->player_skin }}</p>     <p>Донат счет: {{ $user->player_donate }}</p>     <a href="/">Вернуться на главную</a> </body> </html>  
      Скриншот:
       
       
      Дополнительно про Blade:
       
      В принципе, это базовая и максимально простая настройка авторизации. Вам остается только добавить собственную вёрстку. Также рекомендую использовать Middleware для защиты роутов, например, роута личного кабинета. Надеюсь, у вас всё получилось! Желаю успешной и продуктивной разработки ваших проектов!
       
      Готовый сайт для SAMP проекта: https://pawno-rus.ru/topic/8225-gotovyy-sayt-dlya-samp-proekta/
       
       
       
    • От Andrey_Markelov

       
      Описание проекта
      Готовая регистрация UCP. Регистрация и авторизация как в личный кабинет пользователя, так и в административную панель. В административной панели администратор может подтвердить или отменить регистрацию. Также имеется возможность редактировать данные пользователя. Поле «Сообщение» является необязательным, но если необходимо что-то отметить, можно оставить сообщение, которое будет отображено в письме пользователя. Проект включает только регистрацию с авторизацией, без дополнительного функционала, такого как донат или новости. Также присутствует минимальная верстка от Bootstrap. Этот проект является базой для вашего сайта.
       
      Требования для запуска
      PHP версии 8.2+ Composer Node.js (npm) MySQL версии 8.0  
      Инструкция по запуску
      1. Скачивание проекта:
      Скачайте архив с проектом и распакуйте его. 2. Создание базы данных:
      Создайте пустую базу данных в MySQL. 3. Настройка .env
      В корне проекта должен находиться файл .env. Если его нет, скопируйте файл env.example и переименуйте его в .env. 4. Генерация ключа приложения:
      В терминале выполните команду: php artisan key:generate 5. Настройка .env файла:
      Откройте файл .env и укажите свои настройки:
       
      Данные проекта:
      SAMP_SERVER_NAME="Samp Role Play" SAMP_SERVER_IP=127.0.0.1:7777  
      Подключение к базе данных:
      DB_HOST=localhost DB_PORT=3306 DB_DATABASE=samp-ucp DB_USERNAME=root DB_PASSWORD=  
      Суперадмин и контактная почта:
      SUPER_ADMIN_NAME="Super_Admin" SUPER_ADMIN_PASSWORD=6Hm2Q74JW3vXnYE4rWEy7JrC CONTACT_EMAIL=support@samp-rp.ru  
      Настройка почтового клиента:
      MAIL_MAILER=smtp MAIL_HOST=sandbox.smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=dd754ec54ff399 MAIL_PASSWORD=1b87f0d6cf1841 MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS="hello@example.com"  
      6. Установка зависимостей:
      Установите зависимости с помощью следующих команд:
      composer install npm install  
      7. Очистка кеша:
      Выполните команды для очистки кеша:
      php artisan cache:clear php artisan route:clear php artisan config:clear php artisan view:clear  
      8. Сборка проекта:
      Соберите проект с помощью команды:
      npm run build  
      9. Добавление пользовательских полей (опционально):
      Если необходимо добавить новые поля в таблицу пользователей, откройте файл миграции: database/migrations/0001_01_01_000000_create_users_table.php.
      Например, чтобы добавить поле "донат" после email, добавьте строку:
      $table->integer('donate')->default(0); Объяснение: integer — тип данных, default(0) — значение по умолчанию.
       
      Затем откройте файл app/Models/User.php и добавьте новое поле в массив $fillable:
      protected $fillable = [     'name',         // Никнейм пользователя     'birth_date',   // Дата рождения     'gender',       // Пол     'skin',         // ИД скина     'email',        // Адрес электронной почты     'donate',       // Донат     'password',     // Пароль     'status',       // Статус пользователя ];  
      10. Миграция и сидеры:
      Выполните миграцию и примените сидеры (сидер создаёт суперадмина, без которого вход в админку невозможен):
      php artisan migrate:fresh --seed  
      11. Запуск проекта:
      Для запуска локального сервера выполните команду:
      php artisan serve  
      Дополнительная информация
      Более подробную информацию о структуре проекта и настройке вы можете найти по ссылке: > Готовый сайт для SAMP проекта <
       
      Скачать: samp-ucp.zip
      Скриншоты:
       
    • От MrNARTI
      Всем привет делал команду /astats, с шаблона.
       
       
      сделал как в шаблоне, но появились ошибки.
       
       
      Помогите решить пожалуйста.
       
      Заранее спасибо кто помог.
    • От 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
       
       
       
       
      что не так?

    • От 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
       
      Прошу вас помогите мне