Обработка и сохранение данных на сервере




Давайте посмотрим, как передаются данные, заполненной пользователем анкеты в нашу таблицу users на стороне сервера. Как вы наверно заметили, в HTML коде описывающем форму ключевой параметр action имеет значение testreg.phtml.

<form name=regform action="testreg.phtml" method=POST>

Это означает лишь одно - файл с этим названием осуществляет прием и сохранение в таблицу users значений из заполненной пользователем анкеты. Так как передача значений осуществляется методом Post (method=POST), то и наша программа на языке PHP должна принимать их этим методом. Делается это в файле testreg.phtml так:

<?php $aNickName = $_POST['nickname']; $aPass = $_POST['pass']; $aFIO = $_POST['fio']; $aMail = $_POST['email']; $aYear = $_POST['year']; $aMonth = $_POST['month']; $aDay = $_POST['day']; $aDate = $aYear."-".$aMonth."-".$aDay; /*Собираем в формат yyyy-mm-dd*/ $aAnswer = $_POST['answer']; $aGender = $_POST['gender']; if ($aGender=='Мужской'){ $aUserGender = 1; }else{ $aUserGender = 2; } $aCity = $_POST['city']; $aICQ = $_POST['icq'];?>

Как Вы успели заметить, - это имена элементов формы в файле reg.phtml. Все они принимаются в специальный служебный массив $_POST и мы для удобства сохраняем эти значения в переменные $aNickName,$aPass,$aFIO. и т.д.
После этой процедуры мы должны сделать проверку, не используется ли введенный регистрирующимся пользователем логин? Если нет, сохраняем все значения к нам в таблицу users. Следующий фрагмент кода реализует это действие:

$mysql_host = 'localhost'; $mysql_user = 'root'; $mysql_password = ''; $my_database = 'mmclub'; $link = mysql_connect($mysql_host, $mysql_user, $mysql_password) or die("Could not connect: ". mysql_error()); mysql_select_db($my_database) or die("Could not select database"); $query = "SELECT * from users where Nick_Name = '$aNickName'"; $result = mysql_query($query,$link) or die("Query failed: ". mysql_error()); $num_rows = mysql_num_rows($result); if($num_rows == 0){ $query = "INSERT INTO users(Nick_Name,User_Pass,Full_Name,User_Birth_Day,User_EMail, Character_Birth_Day,Security_Answer,User_Gender,User_City,ICQ_Number)"; $query.= "Values ('$aNickName','$aPass','$aFIO',Now(),'$aMail','$aDate','$aAnswer','$aUserGender','$aCity','$aICQ')"; $result = mysql_query($query,$link) or die("Query failed: ". mysql_error()); print("Юзер: $aNickName, с паролем: $aPass, именем: $aFIO, Датой рождения: $aDate добавлен в базу!"); } else { print("Юзер: $aNickName уже есть в игре, выберите другой логин!"); } mysql_close($link);

Если Вы делаете только первые шаги в программировании на PHP, то мы сделаем беглый осмотр этого простого кода. В языке PHP есть целый набор встроенных функций для работы с базой данных MySQL. Для того чтоб подключиться к базе данных MySQL, нам нужно использовать четыре параметра: хост, логин и пароль пользователя в базе данных и имя базы данных. За это отвечают соответственно переменные $mysql_host,$mysql_user, $mysql_password и $my_database, которые мы инициализировали в начале выше приведенного фрагмента кода.
Затем мы используем функции mysql_connect и mysql_select_db для подключения и выбора базы MySQL, куда передаем в качестве аргументов наши переменные с названием хоста ('localhost'), логина('root'), пароля('') и имени базы данных ('mmclub')
Если подключение не удачно, конструкция кода... or die("Could not connect: ". mysql_error()); выдаст в окно браузера сообщение об ошибке.
Теперь, когда мы подключились к базе, мы можем делать к ней запросы на языке SQL. Первым нашим запросом будет попытка сделать выборку из таблицы users на предмет существования в ней логина, под которым хочет зарегистрироваться новый пользователь.
Запрос имеет вид: "SELECT * from users where Nick_Name = '$aNickName'"
После выполнения функции mysql_query, которой мы в качестве аргумента передали эту строку запроса (в переменной $query), мы вызываем функцию mysql_num_rows, которая служит для возвращения количества строк результата предыдущего запроса. То есть если таких строк 0 (if($num_rows == 0)), значит пользователя с именем, содержащимся в переменной $aNickName нет и мы можем его спокойно зарегистрировать в нашей таблице users.
Этот запрос вставляет в таблицу users все переданные поля из формы регистрации
INSERT INTO users(Nick_Name,User_Pass...)values('$aNickName','$aPass'..)

Если количество строк отлично от 0 - значит пользователь с таким логином уже есть в таблице users и мы отказываем новому пользователю в регистрации, печатая в окно браузера:
print("Юзер: $aNickName уже есть в игре, выберите другой логин!");
Вот собственно и все! Файл testreg.phtml вы можете увидеть здесь.

Теперь, когда пользователь занесен в таблицу users он может в ходить в игру. Собственно пока что игровых файлов у нас пока нет, но форму ввода логина и пароля для входа в наш игровой мир мы сделать должны. Это обычно форма с двумя полями (логин, пароль) и кнопкой (Войти)
Выглядит наша форма примерно так:


Ссылка Зарегистрироваться ведет на нашу страницу регистрации. Так как форма входа в игру обычно располагается на самой первой страничке игровых проектов, чтоб пользователь не искал ее долго, разместим HTML код с этой формой в файле index.phml - стартовом файле нашего проекта.

<FORM name=log_in action=login.phtml method=post> <p><img border="0" src="img/logo.gif"><br> &nbsp;</p> <TABLE width=200 cellSpacing=5 cellPadding=0 border=0 style="border-style: dashed; border-width: 1px" bgcolor="#FFE5B6"> <TR> <TD>Логин:</TD> <TD><INPUT name=login></TD> </TR> <TR> <TD>Пароль:</TD> <TD><INPUT type=password name=pass> </TD> </TR> <TR> <TD> <INPUT class=loginButton type=submit value=Вход name=sbm></p> </TD> <TD style="PADDING-BOTTOM: 10px" width="99%"><A href="reg.phtml">Зарегистрироваться</A> </TD> </TR> </TABLE> </FORM>

Полный код странички index.phtml - смотрите здесь.
Как видно из из самой первой строки кода, после ввода логина и пароля, эти данные передаются в файл login.phtml, методом POST.
Логика обработка переданных в файл login.phtml данных выглядит следующим образом:

<?php $mysql_host = 'localhost'; $mysql_user = 'root'; $mysql_password = ''; $my_database = 'mmclub'; if ((!empty($_POST['login'])) && (!empty($_POST['pass']))) { $aNickName = $_POST['login']; $aUserPass = $_POST['pass']; $link = mysql_connect($mysql_host, $mysql_user, $mysql_password) or die("Could not connect: ". mysql_error()); mysql_select_db($my_database) or die("Could not select database"); $query = "SELECT * FROM users where Nick_Name='$aNickName' and User_Pass='$aUserPass'"; $result = mysql_query($query) or die("Query failed: ". mysql_error()); $line = mysql_fetch_array($result); $aRes = $line["Nick_Name"]; if($aRes === $aNickName) { $aRandVal = rand(0,1000000000); $query = "UPDATE users SET SessionID='$aRandVal' WHERE Nick_Name='$aNickName'"; $result = mysql_query($query) or die("Query failed: ". mysql_error()); print('<SCRIPT>setCookie("MMCLUB_NICK_NAME","'.$aNickName.'");</SCRIPT>'); print('<SCRIPT>setCookie("MMCLUB_SESSION","'.$aRandVal.'");</SCRIPT>'); print('<SCRIPT>location.href="main.phtml?NickName='.$aNickName.'";</SCRIPT>'); } else print('<SCRIPT>location.href="login_error.html";</SCRIPT>'); } else print('<SCRIPT>location.href="login_error.html";</SCRIPT>');?>

Здесь Вам уже много знакомо. В начале мы проверяем, не пустые ли значения переданных скрипту параметров логина и пароля и затем, подключившись к нашей базе mmclub узнаем при помощи SQL запросов - есть ли такой пользователь и пароль для него в таблице users.
Если такой пользователь есть, создаем случайный параметр сессии и пишем его в cookie и в специально подготовленное для этих целей поле в таблице users для этого пользователя, после чего переадресуем его на главную страницу нашей игры main.phtml (которой пока что нет, но мы ее сделаем в нашем следующем уроке):

$aRandVal = rand(0,1000000000); $query = "UPDATE users SET SessionID='$aRandVal' WHERE Nick_Name='$aNickName'"; $result = mysql_query($query) or die("Query failed: ". mysql_error()); print('<SCRIPT>setCookie("MMCLUB_NICK_NAME","'.$aNickName.'");</SCRIPT>'); print('<SCRIPT>setCookie("MMCLUB_SESSION","'.$aRandVal.'");</SCRIPT>'); print('<SCRIPT>location.href="main.phtml?NickName='.$aNickName.'";</SCRIPT>');

setCookie - эта функция написана на JavaScript и служит для записи cookie для данного открытого окна браузера.

<SCRIPT> function setCookie(name, value) { document.cookie = name+"="+escape(value)+"; path=/"; } </SCRIPT>

Для чего все это нужно? При входе в игру, мы будем проверять совпадение нашего (SessionID) в таблице users для игрока со значением в cookie MMCLUB_SESSION чтоб проверить правильность входа пользователя в игру. Конечно мы могли бы использовать механизм сессий встроенный в PHP, но так проще.
В случае несовпадений, программа переадресует пользователя на страницу ошибки: login_error.html
Смотрите полный код скрипта, который отвечает за вход в игру login.phtml здесь.

1.5. Добавление правил безопасности.

Для того, чтоб немного защитить нашу игру от частых регистраций при помощи разного рода программ автоматической регистрации на веб-ресурсах сделаем очень простое добавление цифрового кода, который должен ввести пользователь при регистрации. Для того чтоб не углубляться в эту тему (а таких методов с применением как ввода цифрового кода, так и других сходных способов защиты существует великое множество) мы сделаем с вами самый примитивный вариант ввода цифрового кода.
И так нам понадобится кусочек кода на PHP который по переданной ему строке с цифрами, сделает нам из нее картинку в формате.gif. В PHP есть специальная библиотечка php_gd2.dl l которая как раз и занимается работой с графическими данными. Эта библиотека поставляется вместе с пакетом Denwer и находится в папке: C:\WebServers\usr\local\php\extensions\
Для начала заготовим файл формата.gif в который специальные функции из библиотеки php_gd2.dl l будут дорисовывать цифры. Вот этот файл: code.gif - то есть это обычный прямоугольник черного цвета.
Теперь напишем маленький фрагмент кода на PHP, который будет рисовать в этот прямоугольник цифры:

<?phpif (!empty($_GET['code'])){ $code = $_GET['code']; } Header("Pragma: no-cache"); $pic = ImageCreateFromgif("img/code.gif"); Header("Content-type: image/gif"); $color=ImageColorAllocate($pic, 255, 125, 255); ImageString($pic,4,12,1,$code,$color); Imagegif($pic); ImageDestroy($pic);?>

Как мы уже говорили этот фрагмент кода, который мы поместим в файл code.php принимает методом GET строку из четырех цифр (например 1234) и затем при помощи функции ImageString рисует их в виде графики в наш заранее подготовленный черный прямоугольник файла code.gif. Строка Header("Content-type: image/gif"); информирует браузер, что ему передаются данные в виде рисунка и он их должен отобразить как рисунок и никак иначе.
Теперь давайте немного изменим нашу регистрационную форму, находящуюся в файле reg.phtml, добавив туда показ этой картинки. Сделаем это так:

<INPUT TYPE="text" NAME="digits" size=10 maxlength=40> Введите код с картинки <font color="#FF0000">*</font> <?php $code = ''.mt_rand(1000,9999); $md5code = md5($code); echo "<img src=code.php?code=$code><p>";?> <input type="hidden" name="check" class=inup size="20" value="<?php echo $md5code?>"

Как видно из кода, мы создаем случайное 4-хзначное число функцией mt_rand из диапазона 1000-9999 и кодируем его при помощи функции PHP md5 и затем помещаем в скрытое поле с именем check (<input type="hidden" name="check" class=inup size="20" value="<?php echo $md5code?>"). Картинка с цифрами отображается при помощи кода: (<img src=code.php?code=$code>) После того, как пользователь ввел цифры с картинки в добавленное поле digits нашей формы регистрации, вся эта информация обрабатывается скриптом, содержащимся в файле testreg.phtm в который мы внесем тоже небольшое изменение, добавив проверки ввода цифрового кода:

$md5code = $_POST['check']; // кодированные md5 цифры $code = $_POST['digits']; // реальные цифры if ($md5code === md5($code)){...... // тут идет ранее используемый код } else { print("Вы ввели неправильные цифры с картинки!"); }

Смотрите полный код с учетом произведенных изменений в файлах reg.phtml и testreg.phtml
Теперь наша регистрационная анкета выглядит так:

Каждое обновление страницы с в браузере с регистрационной анкетой будет вызывать изменение цифрового кода на картинке. Это конечно пустяковая защита, но все же лучше чем ничего.
Как Вы уже знаете из урока 1, нам следует собрать все написанные нами файлы в папке C:\WebServers\home\mmclub\www и картинки собрать в подкаталог img вышеназванной папки. или скопируйте из папки WWW второго урока все файлы в папку C:\WebServers\home\mmclub\www если вы не сделали этого ранее.
Теперь все готово для теста написанного нами проекта.
Набрав в строке браузера

мы попадем на стартовую страницу нашей игры, где вы можете проверить вход в систему или перейти на страницу регистрации нового пользователя в нашем проекте.

В следующем уроке мы создадим главный фрейм игры, а также слагающие его элементы
Страницу нашего персонажа, страницу перечня игроков в игровой локации, страницу управления и чата.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: