Unity + PHP + MySQL

Попробуем разобраться на простом примере, как взаимодействовать с базой данных на сервере. Сделаем регистрацию и авторизацию пользователя. В базу данных мы вносим: логин, пароль и email. А при авторизации, будем запрашивать только логин и пароль. Для удобства, тестировать будем на локальном сервере. Поэтому для начала, научимся создавать такой сервер на своем компьютере, чтобы иметь возможность работать с базой данных, вне зависимости, есть у нас доступ к интернету или же нет. Для доступа к базе сервера и функций регистрации/авторизации, напишем несколько простых php скриптов.

Итак, для создания локального сервера, нам нужно скачать Denwer, и установить его, следуя инструкциям. После запуска сервера, идем по адресу http://localhost/ и переходим в утилиту phpMyAdmin:

Unity + PHP + MySQL

Теперь, создаем новую базу данных под именем main:

Unity + PHP + MySQL

В левой панели появится наша база, выбираем ее:

Unity + PHP + MySQL

Добавим таблицу пользователей, выполняем SQL запрос:

Unity + PHP + MySQL

Код запроса:

create table users (
`name` varchar(40) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`email` varchar(50) NOT NULL default '',
UNIQUE KEY `name` (`name`),
UNIQUE KEY `email` (`email`)
);

Нажимаем кнопочку ОК и всё, таблица готова.

Далее, добавим локальный сайт (пример на Windows) идем по адресу C:\WebServers\home и создаем папку site.ru а в ней папку www и уже в нее, мы можем закидывать php файлы для работы. Создадим необходимые файлы.

Файл database.php для доступа к базе данных:

<?php
$db = mysql_connect('localhost', 'root', '') or ("Cannot connect: "  . mysql_error());

if (!$db)
	die('Could not connect: ' . mysql_error());
	
mysql_select_db('main', $db) or die ("Could not load the database: " . mysql_error());
?>

Файл login.php для авторизации:

<?PHP
$name = $_POST['name'];
$pass = $_POST['password'];

require_once('database.php');

$check = mysql_query("SELECT * FROM users WHERE `name`='".$name."'");

$numrows = mysql_num_rows($check);

if ($numrows == 0)
{
	die ("Username does not exist!");
}
else
{
	$pass = md5($pass);
	while($row = mysql_fetch_assoc($check))
	{
		if ($pass == $row['password'])
			die("Success!");
		else
			die("Password does not match!");
	}
}
?>

Файл register.php для регистрации пользователя:

<?PHP
$name = $_POST['name'];
$pass = $_POST['password'];
$email = $_POST['email'];

require_once('database.php');

$check = mysql_query("SELECT * FROM users WHERE `name`='".$name."'");

$numrows = mysql_num_rows($check);

if ($numrows == 0)
{
	$pass = md5($pass);
	
	$ins = mysql_query("INSERT INTO  users ( `name` ,  `password` ,  `email` ) VALUES ( '".$name."' ,  '".$pass."' ,  '".$email."') ; ");
	
	if ($ins)
		die ("Succesfully Created User!");
	else
		die ("Error: " . mysql_error());
}
else
{
	die("User allready exists!");
}
?>

Все эти файлы у нас должны быть по адресу C:\WebServers\home\site.ru\www

Дополнительно в папку www закинем файл index.html с кодом:

<html><body>

<table width=100% height=100%>
<tr><td align=center>
<h2 align=center>site.ru</h2>
</td></tr>
</table>

</body></html>

Готово.

Теперь нужно перезапустить Denwer и наш локальный сайт будет доступен по адресу http://site.ru/

Переходим в Unity, создаем новую сцену и добавляем на нее скрипт MysqlConnect:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Text.RegularExpressions;

public class MysqlConnect : MonoBehaviour {

	[SerializeField] private InputField userName;
	[SerializeField] private InputField userPass;
	[SerializeField] private InputField userEmail;
	[SerializeField] private Text messageText;
	[SerializeField] private Button register;
	[SerializeField] private Button login;
	[SerializeField] private string loginURL = "http://site.ru/login.php";
	[SerializeField] private string registerURL = "http://site.ru/register.php";

	void Awake()
	{
		userPass.contentType = InputField.ContentType.Password;
		register.onClick.AddListener(() => {Register();});
		login.onClick.AddListener(() => {Login();});
	}

	bool IsValidEmail(string email) // валидация email
	{
		return Regex.IsMatch(email, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);
	}

	bool IsValid(string value, int min, int max, string field) // валидация имени и пароля
	{
		if(value.Length < min)
		{
			Message("В поле [ " + field + " ] недостаточно символов, нужно минимум [ " + min + " ]");
			return false;
		}
		else if(value.Length > max)
		{
			Message("В поле [ " + field + " ] допустимый максимум символов, не более [ " + max + " ]");
			return false;
		}
		else if(Regex.IsMatch(value, @"[^\w\.@-]"))
		{
			Message("В поле [ " + field + " ] содержаться недопустимые символы.");
			return false;
		}

		return true;
	}

	void Message(string text)
	{
		messageText.text = text;
		Debug.Log(this + " --> " + text);
	}

	void Login()
	{
		if(!IsValid(userName.text, 3, 15, "Имя") || !IsValid(userPass.text, 6, 20, "Пароль")) return;

		WWWForm form = new WWWForm();
		form.AddField("name", userName.text);
		form.AddField("password", userPass.text);
		WWW www = new WWW(loginURL, form);
		StartCoroutine(LoginFunc(www));
	}

	void Register()
	{
		if(!IsValidEmail(userEmail.text))
		{
			Message("Email адрес указан не верно!");
			return;
		}

		if(!IsValid(userName.text, 3, 15, "Имя") || !IsValid(userPass.text, 6, 20, "Пароль")) return;

		WWWForm form = new WWWForm();
		form.AddField("name", userName.text);
		form.AddField("password", userPass.text);
		form.AddField("email", userEmail.text);
		WWW www = new WWW(registerURL, form);
		StartCoroutine(RegisterFunc(www));
	}

	IEnumerator LoginFunc(WWW www)
	{
		yield return www;

		if(www.error == null)
		{
			if(string.Compare(www.text, "Success!") == 0) // получаем в ответе слово-ключ из файла login.php
			{
				Message("Успешный вход!");
			}
			else
			{
				Message(www.text);
			}
		}
		else
		{
			Message("Error: " + www.error);
		}
	}

	IEnumerator RegisterFunc(WWW www)
	{
		yield return www;

		if(www.error == null)
		{
			Message("Пользователь успешно добавлен в базу.");
		}
		else
		{
			Message("Error: " + www.error);
		}
	}
}

Заполняем поля UI необходимыми элементами и можно приступать к тестированию.

Отметим, что представленные php скрипты очень простые и не рекомендуются для использования в реальных проектах. Данный материал представлен как рабочий пример, для общего ознакомления и тестирования.

Скачать все скрипты:

У вас нет доступа!
Тестировалось на: Unity 5.4.1

Комментариев 6

Офлайн
Урок хороший, но одно.
У МЕНЯ НЕТ UNITY 5.4.1!
Офлайн
siriusspark 29 сентября 2016
это все работает даже на 4-й версии, на любой 5-й тем более.
Офлайн
Akcent 5 октября 2016
Спасибо за статью. И все же есть парочка ремарок. OpenServer лучше денвера во всех смыслах. И можно было бы ещё рассмотреть вариант: дергать данные сразу напрямую из БД по ipшнику.
(не сочтите за критику , просто недавно писал кое что подобное)
Офлайн
evan 5 ноября 2016
mysql_real_escape_string не? Защита от sql иньекций как минимум должна быть
Офлайн
Light 5 ноября 2016
evan, должна быть. А это просто демо, посмотреть как и что работает. Для каких-то серьезных проектов, нужно и код более серьезный писать/изучать или обращаться к спецам по PHP.
Офлайн
Красивый код!
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Дешевый хостинг
  • Яндекс.Метрика