2 posts in this topic
Create an account or sign in to comment
You need to be a member in order to leave a comment
-
Recently Browsing 0 members
No registered users viewing this page.
-
Similar Content
-
By INewBRO
Хотел записать в базу данные об игроке (пароль, ник и т.д) Но происходит ошибка и оно не записывается. Я написал чтобы ошибки сохранялись в файл. Комментарием отметил где ошибка
Лог:
-
By viktor666
Приветствую
Ищу веб разраба что бы заказать смену дизайна на сайте(дизайн есть)(сайт есть)
Сайт на пхп
Нужно просто поставить новый дизайн и изменить все под него(все для этого есть)
Если вы предоставляете услуги веб разработчика то отпишите пожалуйста.
-
By viktor666
<?php include 'engine/template/ext/head.php'; ?> <link href="/assets/css/toastr.css" rel="stylesheet"/> <script src="/assets/js/toastr.js"></script> <section class="bg-primary" id="statistic-section"> <div class="container"> <div class="row"> <div class="statistic"> <div class="inner"> <h1>Настройки аккаунта</h1> <div class='col-md-6' style='margin-top:300px;'> Смена пароля<br><br> <form method='post'> <input name='last' placeholder="Старый пароль..." class='form-control' type='text' required/><br> <input name='new' placeholder="Новый пароль..." class='form-control' type='text' required/> <br><button type='sumbit' name="changepass" class='btn btn-red'><font color='white'>Изменить пароль</font></button></form> </div> <div class='col-md-6' style='margin-top:300px;'> <?php if($a['EmailStatus'] == '0') { echo " Привязка Email<br><br> <form method='post'> <input name='email' type='email' placeholder='Укажите Email для привязки...' class='form-control' required/><br><img src='/acaptcha.php' /> <div class='col-md-9'><input type='login' name='acaptcha' class='form-control' placeholder='Код Captcha' required></div><br> <br><button type='sumbit' name='addemail' class='btn btn-red'><font color='white'>Привязать Email</font></button></form>"; } sscanf($a['EmailStatus'], "%d|%s", $type,$hash); if($type == '1') { echo " Подтверждени Email<br><br> <form method='post'> <input name='email' type='email' value='Почта » ".$a['pEmail']."' disabled class='form-control'/><br> <input name='codeemail' type='text' placeholder='Код из письма...' class='form-control' required><br> <button type='sumbit' name='addcode' class='btn btn-red'><font color='white'>Привязать Email</font></button></form> <br> Отправить повторное письмо<br><br> <form method='post'> <input name='email' type='email' placeholder='Укажите Email' class='form-control'/><br> <img src='/acaptcha.php' /> <div class='col-md-9'><input type='login' name='acaptcha' class='form-control' placeholder='Код Captcha' required></div> <button type='sumbit' name='addemail' class='btn btn-red'><font color='white'>Привязать Email</font></button></form> "; } if($a['EmailStatus'] == '2') { echo " Смена Email<br><br> <form method='post'> <input name='email' type='email' value='Текущая » ".$a['pEmail']."' disabled class='form-control'/><br> <input name='newemail' type='email' placeholder='Новая почта..' class='form-control' required><br><br><img src='/acaptcha.php' /> <div class='col-md-9'><input type='login' name='acaptcha' class='form-control' placeholder='Код Captcha' required></div><br> <button type='sumbit' name='newaddemail' class='btn btn-red'><font color='white'>Сменить Email</font></button></form> <br> "; } ?> </div> </div> </div> </div> </div> </section> <?php if (isset($msg)): ?> <?=$msg;?> <?php endif;?> <?php if($_SESSION['getmsg']) { echo $_SESSION['getmsg']; unset($_SESSION['getmsg']); }?> <?php include 'engine/template/ext/footer.php';?> Работает только часть с сменой пароля
Как исправить?
-
By Antoxa39
Дратути,я научился делать регистрацию, и хочу поделится со всеми как это сделать им самим.
1.Нам потребуется: Denwer или Open Server. ( Урок про подключение я делал ранее, так что обьяснять сейчас что и как делать для подключения не буду, но урок можно посмотреть тут)
2.MySQL R39-6.
3. Прямые руки.
4. Переходим к процессу.
//P.S БД - База Данных
Делаем подключение к БД.
main(){} #include <a_samp> #include <a_mysql> #include <Pawn.CMD> #include <sscanf2> #include <streamer> #include <time> //-------------- SQL ---------------------- new dbHandle; #define MYSQL_HOST "127.0.0.1" #define MYSQL_USER "mysql" #define MYSQL_BD "urok" #define MYSQL_PASSWORD "mysql" //------------------------ public OnGameModeInit() { dbHandle = mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_BD,MYSQL_PASSWORD); CheckConnectSQL(); return 1; } public OnGameModeExit() { return 1; } stock CheckConnectSQL() { if(mysql_errno()) printf("Подключение к БД %s прервалось. Код ошибки: %d",MYSQL_BD,mysql_errno()) else printf("Подключение к БД %s успешно!",MYSQL_BD) return 1; }
Подключение сделано.
Далее мы должны сделать такое: Когда игрок заходит на сервер, нужно проверить есть ли игрок с таким Никнеймом в БД.
Делаем массив,который будет хранить в себе пароль,имя игрока. ( сделаем еще и уровень ).
// перед -------------- SQL ---------------------- создаем enum //Enum - это вещь, позволяющая создавать большее количество адресов одной переменной enum pInfo{ pID, pNick[24], pPassword[32], pLevel } new Player[MAX_PLAYERS][pInfo];//Мы обьявили переменную,которая будет хранить в себе наш Enum. Идем создавать БД.
1.
2.
3.
4.
5. Идем обратно к скриптингу
И вот тут, мы сделаем проверку есть ли в БД аккаунт с таким никнеймом.
public OnPlayerConnect(playerid) { GetPlayerName(playerid,Player[playerid][pNick],MAX_PLAYER_NAME);//Мы записали ник игрока в массив pNick. new query[100];//создаем переменную с запросом. format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//Форматируем запрос, SELECT * FROM, то есть //загружаем всю информацию о игроке с ником, записаным в pNick. mysql_function_query(dbHandle,query,true,"CheckPlayerBD","i",playerid);//Посылаем запрос в БД, указываем ИД подключение - dbHandle. true - потому что мы хотим получить информацию. И вызываем следующим паблик "CheckPlayerBD" return 1; } //в конец мода forward CheckPlayerBD(playerid); public CheckPlayerBD(playerid) { new rows,fields; cache_get_data(rows,fields);//Проверили есть ли строка с таким именем. if(!rows)//если нет такого игрока то показываем регистрацию { ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Приветствуем Вас! Вы еще не зарегистрированы,введите свой пароль ниже.", "Далее", ""); } else { ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Рады видеть Вас снова на Urok. Авторизуйтесь.", "Далее", ""); cache_get_field_content(0,"pPassword",Player[playerid][pPassword],dbHandle);//Загружаем пароль игрока из БД. } return 1; } Я мог сделать ИД диалогов через енум, но для примера можно и так.
Далее идем в OnDialogResponse
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { //case 1 это регистрация case 1: { if(!response) return Kick(playerid); // если игрок отказывается от регистрации кикаем его. if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0) return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Длина пароля от 4 до 32 символов.\n Вы также не можете продолжить не указав пароль", "Далее", ""); //это была проверка на длину пароля for(new i; i < strlen(inputtext); i++) { switch(inputtext[i]) { case 'A'..'Z','a'..'z','0'..'9':continue; default: return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация", "Пароль может быть только: a-z, A-Z,0-9", "Далее", ""); } } //это проверка на символы,если игрок будет писать пароль на русском, или какие нибудь другие символы //например \*? то ему будет возвращатся этот же диалог,а если все отлично то регистрация продолжится. new query[120 + MAX_PLAYER_NAME];//также создали запрос format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext); /*Мы отформатировали строку,сделав в ней запрос: Добавить строку в таблице account, со столбцами pNick = '%s', %s значит строка в данном случае эта строка, это массив который хранит в себе никнейм игрока,inputtext это введеный текст игроком, pLevel это уровень игрока,изначально в бд он будет 1.*/ mysql_query(dbHandle,query); //теперь делаем запрос на загрузку акканута. new query1[100]; format(query1,sizeof(query1),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//отфарматироваали новый запрос mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid); } } case 2: { if(!response) return Kick(playerid); // если игрок отказывается от авторизации также кикаем его. if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0) return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Неверный пароль", "Далее", "");//Делаем проверку на длину пароля, т.к при регистрации у нас пароль был от 4 до 32, тут тоже самое должно быть for(new i; i < strlen(inputtext); i++) { switch(inputtext[i]) { case 'A'..'Z','a'..'z','0'..'9': continue;//если он также вводит правильные символы продолжаем выполнение кода для игрока. default: return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация", "Не верный пароль!", "Далее", "");// при вводе спец.символов ему будет возвращать диалог авторизации } } new query[120]; format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s' AND `pPassword` = '%s'",Player[playerid][pNick],inputtext)//Загрузить информацию о игроке,и проверить совпадает введеный пароль игроком,с тем который в БД. mysql_function_query(dbHandle,query,true,"CheckPass","i",playerid); } return 1; } //создаем паблик LoadAcc forward LoadAcc(playerid); public LoadAcc(playerid) { Player[playerid][pID] = cache_get_field_content_int(0,"pID",dbHandle);// 0 потому что в БД может быть только одна строка с таким именем или ИД Player[playerid][pLevel] = cache_get_field_content_int(0,"pLevel",dbHandle);// приравнение, то есть записываем Левел и ИД игрока в наши массивы. //Пароль и никнейм загружать не надо } forward CheckPass(playerid); public CheckPass(playerid) { new rows,fields; cache_get_data(rows,fields);//сверяем пароль if(rows) { //если веденный пароль совпадает с паролем в БД то авторизуем игрока SpawnPlayer(playerid); SendClientMessage(playerid,-1,"Вы успешно авторизовались!"); } else { //если нет то считаем попытки ввода пароля SetPVarInt(playerid,"wrong_password",GetPVarInt(playerid,"wrong_password") + 1) ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Авторизация","Не верный пароль!","Далее",""); new str[64]; format(str,sizeof(str),"У вас осталось: %d попыток",GetPVarInt(playerid,"wrong_password")); SendClientMessage(playerid,-1,str);//форматируем строку, где говорим игроку сколько у него осталось попыток if(GetPVarInt(playerid,"wrong_password") >= 5) return Kick(playerid);//если игрок использовал больше 5 попыток, то кикаем его } } и в OnGameModeExit()
public OnGameModeExit() { mysql_close(dbHandle);//отключаемся от БД return 1; }
-