[PHP] Inscription SAOP + Connection
Bonjours,

Je vous propose un script d'inscription (1er Parti) et un de connexion (2eme Parti).

Parti 1 :


Je vais commencé par la fin ! Pourquoi ? Car je pense que c'est la meilleur façon pour vous de décomposé et de comprendre le code. En effet la 1er partie est un Partage de jeutie's et de Chocochaos La seconde partie en revanche est du fait mains, il s'agit d'un script de connexion Pouce haut

<?php
// ce que vous avez besoins
require_once("config.php");
require_once("SOAPRegistration.php");

// Initialisé les sessions et variables
$messages = Array();
$showForm = true;

// Quand il soumet ses identifiants....
if(!empty($_POST["submit"]))
{
    $reg = new SOAPRegistration();
    $messages = $reg -> getMessages();
    $showForm = $reg -> showForm();
}

$messagesDisplay = '';
foreach($messages as $msg)
{
    $messagesDisplay .= '<div class="errors">'.$msg.'</div>';
}

?>

<!DOCTYPE html> //le formulaire d’enregistrement libre à vous de l’amélioré
<html>
    <head>
        // Vos métas
        <title>Votre TITLE</title>
    </head>
    <body>
        <table class="reg">
            <tr>
                <td>
                    <?php
                    echo $messagesDisplay;
                    
                    if ($showForm)
                    { ?>
                    <form action="" method="post" name="reg">
                        <table class="form">
                            <tr>
                                <td align="right">
                                    Account name:
                                </td>
                                <td align="left">
                                    <input name="accountname" type="text" maxlength="32" />
                                </td>
                            </tr>
                            <tr>
                                <td align="right">
                                    Password:
                                </td>
                                <td align="left">
                                    <input name="password" type="password" maxlength="16" />
                                </td>
                            </tr>
                            <tr>
                                <td align="right">
                                    Confirm password:
                                </td>
                                <td align="left">
                                    <input name="password2" type="password" maxlength="16" />
                                </td>
                            </tr>
                            <tr>
                                <td align="right">
                                    E-mail address:
                                </td>
                                <td align="left">
                                    <input name="email" type="text" maxlength="254" />
                                </td>
                            </tr>
                            <tr>
                                <td align="right">
                                    Expansion:
                                </td>
                                <td align="left">
                                    <select name="expansion">
                                        <option value="0">Vanilla</option>
                                        <option value="1">The Burning Crusade</option>
                                        <option selected value="2">Wrath Of The Lich King</option>
                                    </select>
                                </td>
                            </tr>
                            <tr>
                                <td colspan="2" align="center">
                                    <input type="submit" class="sbm" value="Register" name='submit' />
                                </td>
                            </tr>
                        </table>
                    </form>
                    <?php
                    }
                    ?>
                </td>
            </tr>
        </table>
    </body>
</html>

Maintenant passons au choses sérieuse ! Les fichiers indispensables à l'enregistrement, SOAPRegistration.php.

<?php

class SOAPRegistration
{
    protected $messages = Array();
    protected $db;
    protected $soap;
    protected $showForm = true;
    
    public function __construct()
    {
        try
        {
            $this -> dbConnect();
            if ($this -> validateInput())
            {
                $this -> soapConnect();
                $this -> showForm = false;
                $this -> soapCommand('account create '.$_POST["accountname"].' '.$_POST["password"]);
				$this -> soapCommand('account set gmlevel '.$_POST["accountname"].' 0 -1');
                $stmt = $this -> db -> prepare("UPDATE `account` SET `email` = ?, `expansion` = ? WHERE `username` = ?;");
                $stmt -> bind_param('sis', $_POST["email"], $_POST["expansion"], $_POST["accountname"]);
                $stmt -> execute();
				//je pensé ajouté une redirection une fois l'enregistrement fini
            }
        }
        catch (Exception $e)
        {
            $this -> addMessage($e -> getMessage());
        }
    }
    
    protected function validateInput()
    {
        if (empty($_POST["accountname"]))
        {
            $this -> addMessage('Please fill in an account name.');
        }
        elseif (!preg_match('/^[a-z0-9]{5,32}$/i', $_POST["accountname"]))
        {
            $this -> addMessage('Your account name must be between 5 and 32 characters long and may only contain letters and numbers.');
        }
        else
        {
            $stmt = $this -> db -> prepare("SELECT `username` FROM `account` WHERE `username` = ?;");
            $stmt -> bind_param('s', $_POST["accountname"]);
            $stmt -> execute();
            $stmt -> store_result();
            if ($stmt->num_rows > 0)
            {
                $this -> addMessage('Un autre compte utilise ce pseudo, merci de choisir un autre pseudo');
            }
        }
        
        if (empty($_POST["password"]))
        {
            $this -> addMessage('Please fill in a password.');
        }
        else
        {
            if (!preg_match('/^[a-z0-9!"#$%]{8,16}$/i', $_POST["password"]))
            {
                $this -> addMessage('Le mot de passe doit contenir entre 8 et 16 caractères et ne peut contenir que des lettres, des chiffres et les caractères spéciaux suivants:! "# $%');
            }
            
            if (empty($_POST["password2"]))
            {
                $this -> addMessage('Please confirm your password.');
            }
            elseif ($_POST["password"] !== $_POST["password2"])
            {
                $this -> addMessage('The two passwords do not match.');
            }
        }
        
        if (empty($_POST["email"]))
        {
            $this -> addMessage('Please fill in an e-mail address.');
        }
        elseif (!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))
        {
            $this -> addMessage('You have entered an invalid e-mail address.');
        }
        elseif (strlen($_POST["email"]) > 254)
        {
            $this -> addMessage('The e-mail address can not be longer than 254 characters long.');
        }
        elseif (CHECK_FOR_DUPLICATE_EMAIL)
        {
            $stmt = $this -> db -> prepare("SELECT `email` FROM `account` WHERE `email` = ?;");
            $stmt -> bind_param('s', $_POST["email"]);
            $stmt -> execute();
            $stmt -> store_result();
            if ($stmt->num_rows > 0)
            {
                $this -> addMessage('There is already an account with that e-mail address. Please use a different e-mail.');
            }
        }
        
        if (!isset($_POST["expansion"]) || $_POST["expansion"] != intval($_POST["expansion"]) || intval($_POST["expansion"]) < 0 || intval($_POST["expansion"]) > 2)
        {
            $this -> addMessage('Please select your expansion.');
        }
        
        return empty($this -> messages);
    }
    
    protected function dbConnect()
    {
        $this -> db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
        if (mysqli_connect_errno())
        {
            throw new Exception("Database connection failed: ". mysqli_connect_error());
        }
        return true;
    }
    
    protected function soapConnect()
    {
        $this -> soap = new SoapClient(NULL, Array(
            'location'=> 'http://'. SOAP_IP .':'. SOAP_PORT .'/',
            'uri' => 'urn:TC',
            'style' => SOAP_RPC,
            'login' => SOAP_USER,
            'password' => SOAP_PASS,
            'keep_alive' => false //keep_alive only works in php 5.4.
        ));
    }
    
    protected function soapCommand($command)
    {
        $result = $this -> soap -> executeCommand(new SoapParam($command, 'command'));
        $this -> addMessage($result);
        return true;
    }
    
    protected function addMessage($message)
    {
        $this -> messages[] = $message;
        return true;
    }
    
    public function getMessages()
    {
        return $this -> messages;
    }
    
    public function showForm()
    {
        return $this -> showForm;
    }
    
    public function __destruct()
    {
        $this -> db -> close();
    }
}

Enfin le fichier de configuration, bien évidement libre à vous de le modifié et de l'utilisé comme bon vous semble. Config.php

<?php
// Database settings
define('DB_HOST', '127.0.0.1');
define('DB_USER', 'username'); //compte de la base de donnée MySQL
define('DB_PASS', 'password'); //Mots de passe correspondant
define('DB_NAME', 'auth');

// Soap settings
define('SOAP_IP', '127.0.0.1');
define('SOAP_PORT', '7878');
define('SOAP_USER', 'username'); //compte admin lvl 4 à 5
define('SOAP_PASS', 'Password'); //mots de passe correspondant

// Misc settings
define('CHECK_FOR_DUPLICATE_EMAIL', true);
define('REALMLIST', "Votre Realmlist");

Parti 2


Maintenant il ne vous restent plus qu'à vous connectez à votre serveur.
Je précise que j'ai crée ce code à l'aide de JustyDark, totomakers, Crisou. J'ai amélioré mon code depuis MAIS IL RESTE ENCORE DES RETOUCHE A FAIRE, donc considéré ces codes comme des aides pour débuté.

<?php session_start(); ?>
<?php
	if (isset($_SESSION['active'])){
 
	// Le visiteur est connecté, il n'as pas besoin de ce connecté il retourne en enfer ... à l'accueil.
	header('Location: ../index.php');
	}
	else
	{
	echo '<h1>Login</h1>
						<form method="post" action="connexion.php">
							<p><input type="text" name="login" value="pseudo" placeholder="Pseudo"></p>
							<p><input type="password" name="password" value="password" placeholder="Password"></p>
							<p class="remember_me">
						<label>
						<label>
							<input type="checkbox" name="remember_me" id="remember_me">
							Remember me on this computer
						</label>
						</label>
							</p>
							<p class="submit"><input type="submit" name="commit" value="Login"></p>
						</form>';
	
	}
 
/* Connexion a la base de données */
// il est néanmoins possible d'utilisé le config.php fourni plus tôt !
$serveur = 'IP';
$user = 'Username';
$pass = 'Password';
$bdd = 'auth';
$port = '3306';
 
try {
    $pdo_option[PDO::ATTR_ERRMODE]=PDO::ERRMODE_EXCEPTION;
    $bdd_auth=new PDO('mysql:host='.$serveur.';port='.$port.';dbname='.$bdd, $user, $pass, $pdo_option);
 
}
catch (Exception $e)
{
    die('Erreur : ' . $e->getMessage());
}	
	
	//hachage !
    $sql = sha1(strtoupper($pseudo).':'.strtoupper($password));

	//connection, prepare la bdd, deffinie pass + pseudo
	$req = $bdd_auth -> prepare('SELECT * FROM account WHERE username = username AND sha_pass_hash = sha_pass_hash');
	$req->execute(array(
		"username" => $pseudo, "sha_pass_hash" => $password,
		));
 
	//utilise les valeurs récuperé pour la connexion
	$resultat = $req -> rowCount();
	
	//stock tout les valeur dans un tableu de façon à recurer les infos plustard
	$informations = $req -> fetch();
		
	$req->closeCursor();

	// Déconnexion de la BDD
	unset( $bdd_auth );

if (!$resultat)
{
     echo '<p>Les identifiants sont incorects<p>';
} else
	session_start();
	$_SESSION['active'] = true;
?>

Voilà ! Vous avez dès à présent de quoi commencé votre site/travail. J’espère que mon partage vous plairas il n'as pas la meilleur conception mais il est fonctionnel, c'est déjà ça ^^.
Sans rentrer dans le détail du programme, pourquoi utiliser SOAP pour l'inscription?

Tu demandes le nom de compte ainsi que le mot de passe mais aussi l'email.

Or une inscription via "account create" demande simplement un nom de compte et un mot de passe... Tu sera obliger d'utiliser une requête SQL pour y ajouter l'email.

Donc, autant faire tout en SQL ! D'autant plus que si pour une raison X, le serveur de jeu tombe, impossible de s'inscrire...

Je fais abstraction de l'extension car pour moi c'est inutile de le demander.
comme je l'est précisé le script d'inscription n'est pas de moi, je n'est pas encore fait le miens Smile
Et le script de connexion Smile ?

Car il ne marchera pas a mon avie.
Les variables $pseudo et $password ne sont pas déclaré, etc...

Retourner en haut WoW-Emu