System logowania Unity z PHP i MySQL
W tym samouczku pokażę, jak utworzyć system logowania w Unity przy użyciu PHP i MySQL.
Ten samouczek wymaga serwera z cPanel wraz z PHP i MySQLi (ulepszona wersja MySQL).
Zachęcamy do sprawdzenia niedrogiego hostingu premium VPS lub tańszej alternatywy Shared Hosting.
Krok 1: Skonfiguruj bazę danych MySQL
- Zaloguj się do cPanelu
- Kliknij Bazy danych MySQL w sekcji BAZY DANYCH
- W sekcji "Create New Database" wpisz nazwę swojej bazy danych, a następnie kliknij "Create Database"
Po utworzeniu bazy danych należy utworzyć użytkownika, który będzie z nią powiązany:
- Wpisz nazwę użytkownika w sekcji "MySQL Users", a następnie wpisz hasło (lub najlepiej użyj generatora haseł, aby wygenerować silne hasło). Nie zapomnij zapisać gdzieś hasła, będzie ono potrzebne później.
Na koniec musimy przypisać użytkownika do bazy danych z określonym zestawem uprawnień.
- W sekcji "Add User To Database" wybierz nowo utworzonego użytkownika i bazę danych, a następnie kliknij "Add"
Po kliknięciu "Add" zostanie wyświetlona lista uprawnień. Zaznacz tylko te uprawnienia, z których planujesz skorzystać w przyszłości. Najpopularniejsze to DELETE, SELECT, INSERT i UPDATE:
- Kliknij "Make Changes", aby sfinalizować
Krok 2: Utwórz tabelę MySQL
Tabela MySQL będzie przechowywać wartości podane przez użytkowników, takie jak nazwa użytkownika, adres e-mail, hasło itp.
- Kliknij "phpMyAdmin" w sekcji BAZY DANYCH
- Kliknij nowo utworzoną bazę danych, a następnie kliknij zakładkę SQL
- Wklej poniższy kod do edytora zapytań, a następnie kliknij "Go"
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
--
-- Table structure for table `sc_users`
--
CREATE TABLE `sc_users` (
`user_id` int(11) NOT NULL,
`username` varchar(20) CHARACTER SET utf8 NOT NULL,
`email` varchar(254) CHARACTER SET utf8 NOT NULL,
`password` char(60) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`registration_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Indexes for table `sc_users`
--
ALTER TABLE `sc_users`
ADD PRIMARY KEY (`user_id`),
ADD UNIQUE KEY `username` (`username`),
ADD UNIQUE KEY `email` (`email`);
--
-- AUTO_INCREMENT for table `sc_users`
--
ALTER TABLE `sc_users`
MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
COMMIT;
Powyższe zapytanie utworzy nową tabelę 'sc_users', w której będą przechowywane dane użytkownika.
Krok 3: Zaprogramuj logikę po stronie serwera
Logika po stronie serwera będzie składać się ze skryptów PHP, które będą odbierać i przetwarzać dane Post z Unity.
Pierwszy plik to Database.php, który połączy się z bazą danych MySQL przy użyciu rozszerzenia PHP MySQLi.
baza danych.php
<?php
$host = "localhost"; // Host name
$db_username = "DATABASE_USER"; // Mysql username
$db_password = "USER_PASSWORD"; // Mysql password
$db_name = "DATABASE_NAME"; // Database name
$mysqli_conection = mysqli_connect($host, $db_username, $db_password, $db_name)or die("cannot connect");
?>
Zastąp DATABASE_USER, USER_PASSWORD, i DATABASE_NAME swoimi wartościami.
Drugi plik to Register.php. Ten plik otrzyma dane pocztowe z Unity i wstawi nowy rekord użytkownika do tabeli bazy danych.
zarejestruj się.php
<?php
if(isset($_POST["email"]) && isset($_POST["username"]) && isset($_POST["password1"]) && isset($_POST["password2"])){
$errors = array();
$emailMaxLength = 254;
$usernameMaxLength = 20;
$usernameMinLength = 3;
$passwordMaxLength = 19;
$passwordMinLength = 5;
$email = strtolower($_POST["email"]);
$username = $_POST["username"];
$password1 = $_POST["password1"];
$password2 = $_POST["password2"];
//Validate email
if(preg_match('/\s/', $email)){
$errors[] = "Email can't have spaces";
}else{
if(!validate_email_address($email)){
$errors[] = "Invalid email";
}else{
if(strlen($email) > $emailMaxLength){
$errors[] = "Email is too long, must be equal or under " . strval($emailMaxLength) . " characters";
}
}
}
//Validate username
if(strlen($username) > $usernameMaxLength || strlen($username) < $usernameMinLength){
$errors[] = "Incorrect username length, must be between " . strval($usernameMinLength) . " and " . strval($usernameMaxLength) . " characters";
}else{
if(!ctype_alnum ($username)){
$errors[] = "Username must be alphanumeric";
}
}
//Validate password
if($password1 != $password2){
$errors[] = "Passwords do not match";
}else{
if(preg_match('/\s/', $password1)){
$errors[] = "Password can't have spaces";
}else{
if(strlen($password1) > $passwordMaxLength || strlen($password1) < $passwordMinLength){
$errors[] = "Incorrect password length, must be between " . strval($passwordMinLength) . " and " . strval($passwordMaxLength) . " characters";
}else{
if(!preg_match('/[A-Za-z]/', $password1) || !preg_match('/[0-9]/', $password1)){
$errors[] = "Password must contain atleast 1 letter and 1 number";
}
}
}
}
//Check if there is user already registered with the same email or username
if(count($errors) == 0){
//Connect to database
require dirname(__FILE__) . '/database.php';
if ($stmt = $mysqli_conection->prepare("SELECT username, email FROM sc_users WHERE email = ? OR username = ? LIMIT 1")) {
/* bind parameters for markers */
$stmt->bind_param('ss', $email, $username);
/* execute query */
if($stmt->execute()){
/* store result */
$stmt->store_result();
if($stmt->num_rows > 0){
/* bind result variables */
$stmt->bind_result($username_tmp, $email_tmp);
/* fetch value */
$stmt->fetch();
if($email_tmp == $email){
$errors[] = "User with this email already exist.";
}
else if($username_tmp == $username){
$errors[] = "User with this name already exist.";
}
}
/* close statement */
$stmt->close();
}else{
$errors[] = "Something went wrong, please try again.";
}
}else{
$errors[] = "Something went wrong, please try again.";
}
}
//Finalize registration
if(count($errors) == 0){
$hashedPassword = password_hash($password1, PASSWORD_BCRYPT);
if ($stmt = $mysqli_conection->prepare("INSERT INTO sc_users (username, email, password) VALUES(?, ?, ?)")) {
/* bind parameters for markers */
$stmt->bind_param('sss', $username, $email, $hashedPassword);
/* execute query */
if($stmt->execute()){
/* close statement */
$stmt->close();
}else{
$errors[] = "Something went wrong, please try again.";
}
}else{
$errors[] = "Something went wrong, please try again.";
}
}
if(count($errors) > 0){
echo $errors[0];
}else{
echo "Success";
}
}else{
echo "Missing data";
}
function validate_email_address($email) {
return preg_match('/^([a-z0-9!#$%&\'*+-\/=?^_`{|}~.]+@[a-z0-9.-]+\.[a-z0-9]+)$/i', $email);
}
?>
Ostatnim plikiem jest login.php, który otrzyma dane uwierzytelniające i sprawdzi je w tabeli sc_users.
login.php
<?php
if(isset($_POST["email"]) && isset($_POST["password"])){
$errors = array();
$email = $_POST["email"];
$password = $_POST["password"];
//Connect to database
require dirname(__FILE__) . '/database.php';
if ($stmt = $mysqli_conection->prepare("SELECT username, email, password FROM sc_users WHERE email = ? LIMIT 1")) {
/* bind parameters for markers */
$stmt->bind_param('s', $email);
/* execute query */
if($stmt->execute()){
/* store result */
$stmt->store_result();
if($stmt->num_rows > 0){
/* bind result variables */
$stmt->bind_result($username_tmp, $email_tmp, $password_hash);
/* fetch value */
$stmt->fetch();
if(password_verify ($password, $password_hash)){
echo "Success" . "|" . $username_tmp . "|" . $email_tmp;
return;
}else{
$errors[] = "Wrong email or password.";
}
}else{
$errors[] = "Wrong email or password.";
}
/* close statement */
$stmt->close();
}else{
$errors[] = "Something went wrong, please try again.";
}
}else{
$errors[] = "Something went wrong, please try again.";
}
if(count($errors) > 0){
echo $errors[0];
}
}else{
echo "Missing data";
}
?>
- Prześlij wszystkie 3 pliki do folderu public_html.
Krok 4: Zaprogramuj logowanie klienta Unity
Logika klienta będzie składać się ze skryptu C#, który będzie wysyłał dane do skryptu PHP.
- Utwórz nowy skrypt w Unity i nazwij go SC_LoginSystem, a następnie wklej do niego poniższy kod:
SC_LoginSystem.cs
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class SC_LoginSystem : MonoBehaviour
{
public enum CurrentWindow { Login, Register }
public CurrentWindow currentWindow = CurrentWindow.Login;
string loginEmail = "";
string loginPassword = "";
string registerEmail = "";
string registerPassword1 = "";
string registerPassword2 = "";
string registerUsername = "";
string errorMessage = "";
bool isWorking = false;
bool registrationCompleted = false;
bool isLoggedIn = false;
//Logged-in user data
string userName = "";
string userEmail = "";
string rootURL = "http://YOUR_SITE.COM/"; //Path where php files are located
void OnGUI()
{
if (!isLoggedIn)
{
if (currentWindow == CurrentWindow.Login)
{
GUI.Window(0, new Rect(Screen.width / 2 - 125, Screen.height / 2 - 115, 250, 230), LoginWindow, "Login");
}
if (currentWindow == CurrentWindow.Register)
{
GUI.Window(0, new Rect(Screen.width / 2 - 125, Screen.height / 2 - 165, 250, 330), RegisterWindow, "Register");
}
}
GUI.Label(new Rect(5, 5, 500, 25), "Status: " + (isLoggedIn ? "Logged-in Username: " + userName + " Email: " + userEmail : "Logged-out"));
if (isLoggedIn)
{
if (GUI.Button(new Rect(5, 30, 100, 25), "Log Out"))
{
isLoggedIn = false;
userName = "";
userEmail = "";
currentWindow = CurrentWindow.Login;
}
}
}
void LoginWindow(int index)
{
if (isWorking)
{
GUI.enabled = false;
}
if (errorMessage != "")
{
GUI.color = Color.red;
GUILayout.Label(errorMessage);
}
if (registrationCompleted)
{
GUI.color = Color.green;
GUILayout.Label("Registration Completed!");
}
GUI.color = Color.white;
GUILayout.Label("Email:");
loginEmail = GUILayout.TextField(loginEmail);
GUILayout.Label("Password:");
loginPassword = GUILayout.PasswordField(loginPassword, '*');
GUILayout.Space(5);
if (GUILayout.Button("Submit", GUILayout.Width(85)))
{
StartCoroutine(LoginEnumerator());
}
GUILayout.FlexibleSpace();
GUILayout.Label("Do not have account?");
if (GUILayout.Button("Register", GUILayout.Width(125)))
{
ResetValues();
currentWindow = CurrentWindow.Register;
}
}
void RegisterWindow(int index)
{
if (isWorking)
{
GUI.enabled = false;
}
if (errorMessage != "")
{
GUI.color = Color.red;
GUILayout.Label(errorMessage);
}
GUI.color = Color.white;
GUILayout.Label("Email:");
registerEmail = GUILayout.TextField(registerEmail, 254);
GUILayout.Label("Username:");
registerUsername = GUILayout.TextField(registerUsername, 20);
GUILayout.Label("Password:");
registerPassword1 = GUILayout.PasswordField(registerPassword1, '*', 19);
GUILayout.Label("Password Again:");
registerPassword2 = GUILayout.PasswordField(registerPassword2, '*', 19);
GUILayout.Space(5);
if (GUILayout.Button("Submit", GUILayout.Width(85)))
{
StartCoroutine(RegisterEnumerator());
}
GUILayout.FlexibleSpace();
GUILayout.Label("Already have an account?");
if (GUILayout.Button("Login", GUILayout.Width(125)))
{
ResetValues();
currentWindow = CurrentWindow.Login;
}
}
IEnumerator RegisterEnumerator()
{
isWorking = true;
registrationCompleted = false;
errorMessage = "";
WWWForm form = new WWWForm();
form.AddField("email", registerEmail);
form.AddField("username", registerUsername);
form.AddField("password1", registerPassword1);
form.AddField("password2", registerPassword2);
using (UnityWebRequest www = UnityWebRequest.Post(rootURL + "register.php", form))
{
yield return www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
errorMessage = www.error;
}
else
{
string responseText = www.downloadHandler.text;
if (responseText.StartsWith("Success"))
{
ResetValues();
registrationCompleted = true;
currentWindow = CurrentWindow.Login;
}
else
{
errorMessage = responseText;
}
}
}
isWorking = false;
}
IEnumerator LoginEnumerator()
{
isWorking = true;
registrationCompleted = false;
errorMessage = "";
WWWForm form = new WWWForm();
form.AddField("email", loginEmail);
form.AddField("password", loginPassword);
using (UnityWebRequest www = UnityWebRequest.Post(rootURL + "login.php", form))
{
yield return www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
errorMessage = www.error;
}
else
{
string responseText = www.downloadHandler.text;
if (responseText.StartsWith("Success"))
{
string[] dataChunks = responseText.Split('|');
userName = dataChunks[1];
userEmail = dataChunks[2];
isLoggedIn = true;
ResetValues();
}
else
{
errorMessage = responseText;
}
}
}
isWorking = false;
}
void ResetValues()
{
errorMessage = "";
loginEmail = "";
loginPassword = "";
registerEmail = "";
registerPassword1 = "";
registerPassword2 = "";
registerUsername = "";
}
}
Zastąp http://YOUR_SITE.COM/ swoją wartością (powinna to być ścieżka główna, do której przesłałeś pliki PHP). Upewnij się także, że korzystasz z protokołu HTTPS, jeśli Twój serwer ma zainstalowany certyfikat SSL.
- Utwórz nowy obiekt GameObject i nadaj mu nazwę "LoginSystem"
- Dołącz do SC_LoginSystem do obiektu LoginSystem
Naciśnij Odtwórz, a następnie kliknij Zarejestruj, aby utworzyć nowe konto lub podać dane logowania.
Mamy kontynuację tego samouczka na temat tworzenia tabeli liderów online.