[règlé]Système Inscription & POO php5 - blackduty - 06-10-2007
Hello,
Donc voila, j'ai fait une nouvelle tentative pour créer un formulaire d'inscription en POO (php5 enfin, je crois).
Notons que mon niveau est toujours très faible et j'ai donc essayer de comprendre a l'aide d'un script de news fait en POO php5 (source: ici). Je ne sais pas ce que vaut la programmation de l'auteur donc il se peut que j'ai fait plein de bêtises en essayant d'apprendre par imitation.
J'ai prit en compte la remarque de Joshua (cf ce Sujet) sur la séparation de l'analyse et de l'envoi des données.
Pour information, seule, une partie du script marche. (je vous dirais ce qui marche dans la suite du développement).
Voila ce que j'ai l'intention de donner (quand ça marchera et que ce sera tout bien, bien sûr) a la biblio jeuPhp.
Donc si ça ne vous dérange pas, on parlera d'optimisation & sécurité après la mise en marche du script.
Voici le code (ça va être un peu long, désolé), le nom de la page en gras.
Le Formulaire d'inscription: Inscription.php
Code PHP : <?php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title>Conquista</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" media="screen" type="text/css" title="design par defaut" href="css/europeO.css" />
</head>
<body>
<h1>Bienvenue !</h1>
<form method="post" action="TraitementInscription.php">
<fieldset>
<legend>Vos coordonnées</legend>
<p>
<label>Nom de compte <input type="text" name="compte" size="20" maxlength="20" tabindex="10" /></label>
<br />
<label>Adresse email <input type="text" name="mail" size="30" maxlength="25" tabindex="20" /></label>
<br />
<label>Mot de passe <input type="password" name="mot_de_passe" size="15" maxlength="15" tabindex="30" /></label>
</p>
</fieldset>
<fieldset>
<legend>Votre personnage</legend>
<p>
Veuillez choisir votre Nationalité :<br />
<label><input type="radio" name="camp" value="anglais" tabindex="40" /> <img src="../images/english.gif" alt="drapeau Anglais" /> (Anglais)</label><br />
<label><input type="radio" name="camp" value="espagnol" tabindex="50" /> <img src="../images/spain.gif" alt="drapeau Espagnol" /> (Espagnol)</label><br />
</p>
<p><em>Veillez a mettre des noms Roleplay. Tout nom litigieux entraînera la suppression du compte.</em></p>
<p><label>Nom de votre Capitaine <input type="text" name="nom_chef" size="50" maxlength="45" tabindex="80"/></label>
<br />
<label>Nom de votre Compagnie <input type="text" name="compagnie" size="70" maxlength="50" tabindex="90" /></label>
</p>
</fieldset>
<p>
<input type="submit" value="Valider" />
</p>
</form>
</body>
</html>
La Classe d'analyse des données: VerifInscription.class.php
Code PHP : <?php
class VerifInscription
{
public $compte;
public $mail;
public $mot_de_passe;
public $camp;
public $nom_chef;
public $compagnie;
private $link;
public function __construct($host, $user, $password, $database)
{
$this -> link = mysql_connect($host, $user, $password);
mysql_select_db($database, $this -> link);
}
public function VerificationRemplissageCompte ($compte)
{
if(empty($compte))
{
echo "Vous n'avez pas renseigner votre nom de compte !<br />";
exit();
}
}
public function VerificationRemplissageMail ($mail)
{
if(empty($mail))
{
echo "Vous n'avez pas renseigner votre adresse Email !<br />";
exit();
}
}
public function VerificationRemplissageMotdepasse ($mot_de_passe)
{
if(empty($mot_de_passe))
{
echo "Vous n'avez pas renseigner de mot de passe !<br />";
exit();
}
}
public function VerificationRemplissageCamp ($camp)
{
if(empty($camp))
{
echo "Vous n'avez pas renseigner votre nationalité !<br />";
exit();
}
}
public function VerificationRemplissageNomChef ($nom_chef)
{
if(empty($nom_chef))
{
echo "Vous n'avez pas renseigner le nom de votre Capitaine !<br />";
exit();
}
}
public function VerificationRemplissageCompagnie ($compagnie)
{
if(empty($compagnie))
{
echo "Vous n'avez pas renseigner le nom de votre compagnie !<br />";
exit();
}
}
public function VerificationValiditeMail ($mail)
{
if (isset($_POST['mail']))
{
if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail']))
{
}
}
else
{
echo 'L\'adresse email n\'est pas valide, veuillez recommencer !';
exit();
}
}
}
?>
La classe de traitement des données et envoi dans la BDD (on peut voir ici la composition de la table qui accueil les données): EnvoiInscription.class.php
Code PHP : <?php
class EnvoiInscription
{
public $compte;
public $mail;
public $mot_de_passe;
public $mot_de_passe_crypte;
public $camp;
public $nom_chef;
public $compagnie;
public $cle_cryptage = 'po1kuFz23ukDm4l';
private $link;
public function __construct($host, $user, $password, $database)
{
$this -> link = mysql_connect($host, $user, $password);
mysql_select_db($database, $this -> link);
}
public function CryptagePass($mot_de_passe)
{
$mot_de_passe_crypte = crypt($mot_de_passe, $cle_cryptage);
}
public function EnvoiDonneeVerifie ($compte, $mail, $mot_de_passe_crypte, $camp, $nom_chef, $compagnie)
{
$compte = htmlentities($compte, ENT_QUOTES);
$mail = htmlentities($mail, ENT_QUOTES);
$mot_de_passe_crypte = htmlentities($mot_de_passe_crypte, ENT_QUOTES);
$camp = htmlentities($camp, ENT_QUOTES);
$nom_chef = htmlentities($nom_chef, ENT_QUOTES);
$compagnie = htmlentities($compagnie, ENT_QUOTES);
$query = "INSERT INTO `joueur` (`id`, `compte` , `mail` , `mot_de_passe_crypte` , `camp` , `nom_chef`, `compagnie`, `statut` )
VALUES ('', '" . $compte . "', '" . $mail . "', '" . $mot_de_passe_crypte . "', '" . $camp . "', '" . $nom_chef . "', '" . $compagnie . "', '' )";
}
}
?>
Et enfin, la page de traitement du formulaire: TraitementInscription.php
Code PHP : <?php
// on inclut les fichiers de nos classes pour pouvoir les utiliser.
include 'VerifInscription.class.php';
include 'EnvoiInscription.class.php';
// On donne les identifiants pour une connexion a la base de donnée.
$host = 'localhost';
$user = 'root';
$password = '';
$database = 'conquista';
$VerifInscriptionObj = new VerifInscription($host, $user, $password, $database); // on construit l'objet pour la vérification des champs du formulaire.
// On utilise nos différentes fonctions contenu dans la classe VerifInscription pour vérifier le remplissage du formulaire.
$VerifInscriptionObj -> VerificationRemplissageCompte($_POST['compte']);
$VerifInscriptionObj -> VerificationRemplissageMail($_POST['mail']);
$VerifInscriptionObj -> VerificationValiditeMail($_POST['mail']);
$VerifInscriptionObj -> VerificationRemplissageMotdepasse($_POST['mot_de_passe']);
$VerifInscriptionObj -> VerificationRemplissageCamp($_POST['camp']);
$VerifInscriptionObj -> VerificationRemplissageNomChef($_POST['nom_chef']);
$VerifInscriptionObj -> VerificationRemplissageCompagnie($_POST['compagnie']);
$EnvoiInscriptionObj = new EnvoiInscription($host, $user, $password, $database); // on construit l'objet pour l'envoi des données du formulaire.
//Cryptage du mot de passe
$EnvoiInscriptionObj -> CryptagePass($_POST['mot_de_passe']);
// On envoie les données dans la BDD.
$EnvoiInscriptionObj -> EnvoiDonneeVerifie($_POST['compte'], $_POST['mail'], $mot_de_passe_crypte, $_POST['camp'], $_POST['nom_chef'], $_POST['compagnie']);
echo $mot_de_passe_crypte; // pour tester mes variables (a supprimer a la fin...
echo $mail;
?>
Notons que presque toute la classe d'analyse est fonctionnelle. Seule la vérification de la composition de l'adresse mail ne marche pas... (elle marchait quand je ne faisait pas mumuse avec la POO).
Le reste marche pas. Les données ne sont pas intégrée dans la BDD, le cryptage a l'air de marcher cependant.
Enfin, je sais que j'ai un problème avec les variables (ce qui est je pense, la base de tout le problème), mais je dois avouer que je ne comprend pas encore tout ce que je fais...
Par ailleurs, je recherche toujours quelqu'un pour m'apprendre la POO :p
Merci ^^
RE: Système Inscription & POO php5 - nemesis_elite - 06-10-2007
Salut, j'ai pas trop le temps, mais je te réponds quand même.
Je ne suis pas un pro des classes, donc c'est peut être faux ce qui je vais te dire
J'ai pas trop regarder le code, mais ce qui mon saute aux yeux dans ta classe EnvoiInscription
- pas mettre d'espace entre $this et -> et link:
Code PHP : <?php
$this -> link = mysql_connect($host, $user, $password);
- écrire [b]$this->mot_de_passe_crypte[b] au lieu de [b]$mot_de_passe_crypte[b]
Code PHP : <?php
public function CryptagePass($mot_de_passe)
{
$mot_de_passe_crypte = crypt($mot_de_passe, $cle_cryptage);
- pareil pour les autres
Code PHP : <?php
$compte = htmlentities($compte, ENT_QUOTES);
$mail = htmlentities($mail, ENT_QUOTES);
$mot_de_passe_crypte = htmlentities($mot_de_passe_crypte, ENT_QUOTES);
$camp = htmlentities($camp, ENT_QUOTES);
$nom_chef = htmlentities($nom_chef, ENT_QUOTES);
$compagnie = htmlentities($compagnie, ENT_QUOTES);
}[/php]
- pour les récupérer : $this-> + variable
Code PHP : <?php
$query = "INSERT INTO `joueur` (`id`, `compte` , `mail` , `mot_de_passe_crypte` , `camp` , `nom_chef`, `compagnie`, `statut` )
VALUES ('', '" . $compte . "', '" . $mail . "', '" . $mot_de_passe_crypte . "', '" . $camp . "', '" . $nom_chef . "', '" . $compagnie . "', '' )";
-pour récupérer les variables à partir de l'extérieur:
Code PHP : <?php
echo $EnvoiInscriptionObj->mot_de_passe_crypte; // pour tester mes variables (a supprimer a la fin...
echo $EnvoiInscriptionObj->mail;
au lieu de :
Code PHP : <?php
echo $mot_de_passe_crypte; // pour tester mes variables (a supprimer a la fin...
echo $mail;
Je dois partir, désoler de pas pouvoir expliquer plus.
NemeSiS_eliTe
RE: Système Inscription & POO php5 - blackduty - 07-10-2007
Bonjour,
Tout d'abord, merci d'avoir prit le temps de répondre a ce sujet.
Voici le résultat après modification:
Alors, je viens de trouver mon erreur qui empêchait l'inscription des données (c'etait vraiment très bête... j'ai oublié le mysql_query...)
La modification du nom des variables $mail à $this->mail (un exemple parmis tant d'autre) a eut son importance aussi. ^^
Par contre, j'ai toujours un problème sur la vérification de la validité du mail. Il semblerait que la fonction ne soit pas prise en compte. Je peux rentrer tout ce que je veux, ça inscrit dans la base et surtout ça ne me prévient pas de l'invalidité.
Merci
RE: Système Inscription & POO php5 - Shiwa - 07-10-2007
Ta fonction de vérification du mail, telle que tu l'as donnée plus haut, vérifie seulement si quelque chose a bien été envoyé dans $_Post[mail]. En effet ton else intervient seulement si isset($_POST[mail]) est faux... et il n'y a rien de fait lorsque le mail ne vérifie pas la regexp. Essaie avec ce code :
Code : if (isset($_POST['mail']))
{
if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail']))
{
}
else
{
echo 'L\'adresse email n\'est pas valide, veuillez recommencer !';
exit();
}
}
else
{
echo 'Remplissez le champ mail !';
exit();
}
RE: Système Inscription & POO php5 - nemesis_elite - 07-10-2007
Ou plus simplement :
Code PHP : <?php
if (isset($mail))
{
if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $mail))
{
echo 'L\'adresse email n\'est pas valide, veuillez recommencer !';
exit();
}
}
else
{
echo 'Remplissez le champ mail !';
exit();
}
Un petit conseil, (re)lis ce tutoriel, parceque j'ai l'impression que tu ne sais pas trop utiliser les variables, dans les classes.
Bonne chance
NemeSiS_eliTe
RE: Système Inscription & POO php5 - blackduty - 07-10-2007
nemesis_elite a écrit :Un petit conseil, (re)lis ce tutoriel, parceque j'ai l'impression que tu ne sais pas trop utiliser les variables, dans les classes.
Bonne chance
NemeSiS_eliTe
Merci pour l'aide et oui, tu as raison, je devrais de relire le tutos. Maintenant ce sera logiquement plus parlant pour moi.
Par contre, petite question, vous trouvez ça normal de faire une connexion a la BDD avec le __construct ? C'est l'élément que j'avais reprit du script du système de news mais je trouve ça bizarre...
RE: [règlé]Système Inscription & POO php5 - Shiwa - 07-10-2007
Bien vu Nemesis, j'avais corrigé un peu rapidement.
Dans une classe qui va communiquer avec la bdd ça peut être utile d'établir une connexion dans le constructeur, mais pour ta classe de vérification ça semble superflu, à moins que tu ne rajoutes un test pour savoir si le pseudo est déjà présent dans la bdd.
RE: [règlé]Système Inscription & POO php5 - nemesis_elite - 07-10-2007
Bon quand j'ai dis que tu comprennais pas, c'est pas méchant hein? J'en ai profité pour le relire moi aussi ^^.
Pour la connexion, tu peux faire une méthode (fonction) qui contient la connexion a la base de donnée, et l'appeler dans le __conrstruct. (Je sais ça change rien ^^)
Ou bien faire une classe spécialement pour la gestion de la base de donnée, et l'utiliser dans ta classe.
Genre avec une variable :
Genre dans ton __construct tu m'est :
Code PHP : <?php
$this->bdd=new bdd('localhost', '####', '####', '####');
et tu l'utilisera comme ca:
Code PHP : <?php
$this->bdd->requete('SELECT .....');
Bon j'dis ça, j'dis rien, hein ? ^^
NemeSiS_eliTe
RE: [règlé]Système Inscription & POO php5 - blackduty - 07-10-2007
Je ne suis pas sûr de te pardonner un jour pour la remarque... mais bon...
Enfin merci, pour vos réponses et ce petit éclaircissement et pour la petite astuce de l'utilisation d'une classe dans une classe (je dois avouer que je ne suis pas sûr que j'y aurais penser un jour tout seul :hahahaha
|