8721 sujets

Développement web côté serveur, CMS

Hello !

Je débute en php et je suis sur la réalisation de ma première page d'enregistrement d'un membre.



Ma page ne retourne aucune erreur et n'ajoute pas non plus l'utilisateur dans la bdd.



Quelqu'un a une idée ?



Voici mon code :

register.php
<?php
session_start();
include("includes/db.php");
include("includes/functions.php");
include("header.php");

//Si pas valider
if (empty($_POST['valider'])) {

echo '<form method="post" action="register.php">
<p>
Nom d\'utilisateur : <input type="text" name="username" /><br />
Email : <input type="text" name="email" /><br />
Mot de passe : <input type="password" name="password" /><br />
Mot de passe (vérification) : <input type="password" name="password_verification" /><br />
<input type="submit" value="Valider" />
</p>
</form>'; }

else {
//Variables
$username = isset($_POST['username']) ? $_POST['username'] : 'nousername';
$email = isset($_POST['email']) ? $_POST['email'] : 'noemail';
$password = isset($_POST['password']) ? $_POST['password'] : 'nopassword';
$i = 0;
$pseudo_erreur1 = NULL;
$pseudo_erreur2 = NULL;
$pseudo_erreur3 = NULL;
$email_erreur1 = NULL;
$email_erreur2 = NULL;
$email_erreur3 = NULL;
$password_erreur1 = NULL;


	
// Check empty username
if(empty($username)) {
$pseudo_erreur1 = 'Vous n\'avez pas remplis de pseudo !'; 
$i++; }

// Check username size
if(strlen($username) <= 5) {
$pseudo_erreur2 = 'Votre pseudo dois comporter au moins 5caractères'; 
$i++; }

//Check if username is already in DB
$query=$db->prepare('SELECT COUNT(*) AS nbr FROM users WHERE username =:username');
$query->bindValue(':username',$username, PDO: [langue]ARAM_STR);
$query->execute();
$pseudo_free=($query->fetchColumn()==0)?1:0;
$query->CloseCursor();

    if(!$pseudo_free)
    {
        $pseudo_erreur3 = 'Votre pseudo est déjà utilisé par un membre';
        $i++;
    }
	
//Check email

if(empty($email)) {
$email_erreur1 = 'Email manquant'; 
$i++; }


if (checkmail(!$email)) {
$email_erreur2 = 'Adresse email incorecte !';
$i++; }

//Check if email is already in DB
$query=$db->prepare('SELECT COUNT(*) AS nbr FROM users WHERE email =:email');
$query->bindValue(':email',$email, PDO: [langue]ARAM_STR);
$query->execute();
$email_free=($query->fetchColumn()==0)?1:0;
$query->CloseCursor();

    if(!$email_free)
    {
        $email_erreur3 = 'Votre email est déjà utilisé par un membre';
        $i++;
    }
	
//Check Password

if($password != $password_verif || empty($nopassword) || empty($nopassword_verif)) {
$password_erreur1 = 'Votre mot de passe et votre confirmation sont différentes ou sont vides';
$i++; }



// Si tous est ok
if ($i==0) {
// Hachage du mot de passe
$pass_hache = sha1(isset ($_POST['password']));
 
// Insertion SQL
$req = $bdd->prepare('INSERT INTO users(username, password, email) VALUES(:username, [langue]assword, :email)');

$req->execute(array(
    'username' => $username,
    'password' => $pass_hache,
	'email' => $email
    ));
	
	echo "Inscription Valid&eacute;e !<br />Vous pouvez vous identifer<br />Redirection en cours";
	
}
	
// Sinon
else {

if(!empty($pseudo_erreur1)) {
echo $pseudo_erreur1;
echo '<br />'; }

if(!empty($pseudo_erreur2)) {
echo $pseudo_erreur2;
echo '<br />'; }

if(!empty($pseudo_erreur3)) {
echo $pseudo_erreur3;
echo '<br />'; }

if(!empty($email_erreur1)) {
echo $email_erreur1;
echo '<br />'; }

if(!empty($email_erreur2)) {
echo $email_erreur2;
echo '<br />'; }

if(!empty($email_erreur3)) {
echo $email_erreur3;
echo '<br />'; }
 
if(!empty($password_erreur1)) {
echo $password_erreur1;
echo '<br />'; } 

  }
	}

include("footer.php");
?>


functions.php
<?php

function checkmail($email)  
{  
   $Syntaxe='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$#';  
   if(preg_match($Syntaxe,$email))  
      return true;  
   else  
     return false;  
}

?>


Ma table
--
-- Structure de la table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pseudo` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Merci d'avance pour votre aide Smiley smile
Salut,

$pass_hache = sha1(isset ($_POST['password']));

va faire un sha1 de "true" ou "false", je ne pense pas que ce soit ce que tu souhaites Smiley cligne

Tu utilises PDO ?
D'où vient la variable "$db" ?
//Check if username is already in DB
$query=$db->prepare('SELECT COUNT(*) AS nbr FROM users WHERE username =:username');
Elle n'est pas initialisée dans ta page...
yoleouf a écrit :
Salut,

$pass_hache = sha1(isset ($_POST['password']));

va faire un sha1 de &quot;true&quot; ou &quot;false&quot;, je ne pense pas que ce soit ce que tu souhaites Smiley cligne


J'avais pas vus !
Ceci semble t'il correcte ?

$pass_hache = sha1($password);


yoleouf a écrit :

Tu utilises PDO ?
D'où vient la variable &quot;$db&quot; ?
//Check if username is already in DB
$query=$db-&gt;prepare('SELECT COUNT(*) AS nbr FROM users WHERE username =:username');
Elle n'est pas initialisée dans ta page...


J'utilise ce que je trouve xD D'après ce que j'ai compris PDO est bien plus sécurisé que les requête mysql non ?

Effectivement c'est pas $db mais $bdd qui est dans db.php que voici :


<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=gamehost', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
?>
Bonjour,

Dans ton formulaire tu n'as pas de champ dont le nom est "valider".
La condition empty($_POST['valider']) est donc toujours vrai.
iloveelearning a écrit :

J'utilise ce que je trouve xD D'après ce que j'ai compris PDO est bien plus sécurisé que les requête mysql non ?
Oui absolument Smiley smile
if(empty($username)) {
$pseudo_erreur1 = 'Vous n\'avez pas remplis de pseudo !'; 
$i++; }

À quoi sert ce $i ? Pourquoi tu ne sors pas directement s'il y a un problème ?
Par contre, par mesure de sécurité il est préférable de ne pas dire pourquoi il y a eu un problème de connexion. Tu peux garder une trace pour toi et afficher "erreur de connexion" par exemple...
salut,
un conseil, quand tu construit une page de traitement PHP, utilise la fonction var_dump() qui renvoie le contenu des variables ( sessions, post, get et autres....)
Cela te permettras d'éviter certaines erreurs et de cibler d'autres problèmes.
benj a écrit :
Bonjour,

Dans ton formulaire tu n'as pas de champ dont le nom est &quot;valider&quot;.
La condition empty($_POST['valider']) est donc toujours vrai.

Merci !!!!

Mon script fonctionne maintenant Smiley smile

J'ai une question sur la fonction exit() maintenant Smiley langue

Je pense avoir compris a quoi elle sert et surtout quand l"utiliser, pouvez vous juste me dire si c'est pas bon ou pas?

Actuellement mon script register est exécuté comme dans cette ordre la :


Si formulaire remplis:

-définitions des variables
-vérification si le pseudo est vide
-vérification si le pseudo ne fait pas moins de 5caractères
-vérification si le pseudo n'est pas déjà dans la bdd
-vérification si l'email est vide
-vérification si l'email n'est pas déjà dans la bdd
-vérification du password (vide et s'ils correspondent)
-si tous est ok on ajoute l'user dans la bdd


Je n'ai jamais mis d'exit dans mon code !

Voici comment je pense qu'il faut l'utiliser :

-définitions des variables ($p=0)
-vérification si le pseudo est vide (je rajoute 1 a la variable $p et je rajoute une variable pour indiquer que le pseudo est vide)
-vérification si l'email est vide (idem)
-vérification si le password est vide (idem)
-Si $p > 0 alors on affiche les variables d'erreur puis je finit par un exit();

Dans le but déviter de lui faire exécuter le reste du code puisqu'il en a pas besoin.

exit sert bien à cela ?

Si je met exit(); le script va s’arrêter au niveau du exit (mais il va quand même exécuter le code avant, pour afficher les erreurs et rediriger vers la page)

Voila le code finit :

<?php
session_start();
include("includes/db.php");
include("includes/functions.php");
include("header.php");

//Si Post
if (empty($_POST['username'])) {

echo '<form method="post" action="register.php">
<p>
Nom d\'utilisateur : <input type="text" name="username" /><br />
Email : <input type="text" name="email" /><br />
Mot de passe : <input type="password" name="password" /><br />
Mot de passe (vérification) : <input type="password" name="password_verification" /><br />
<input type="submit" value="valider" />
</p>
</form>'; }

else {
//Variables
$username = isset($_POST['username']) ? $_POST['username'] : 'nousername';
$email = isset($_POST['email']) ? $_POST['email'] : 'noemail';
$password = isset($_POST['password']) ? $_POST['password'] : 'nopassword';
$password_verif = isset($_POST['password_verification']) ? $_POST['password_verification'] : 'nopassword';
$i = 0;
$p = 0;
$pseudo_erreur1 = NULL;
$pseudo_erreur2 = NULL;
$pseudo_erreur3 = NULL;
$email_erreur1 = NULL;
$email_erreur2 = NULL;
$email_erreur3 = NULL;
$password_erreur1 = NULL;


	
// Check empty username
if(empty($username)) {
$pseudo_erreur1 = 'Vous n\'avez pas remplis de pseudo !'; 
$p++; }

//Check empty email

if(empty($email)) {
$email_erreur1 = 'Email manquant'; 
$p++; }

//Check empty password/password_verif
if(empty($password) OR empty($password_verif)) {
$password_erreur1 = 'Vous n\'avez pas remplis une des deux cases mot de passe'; 
$p++;}

//Si pseudo/email/password vide alors exit 
if ($p>0) {
echo ''.$pseudo_erreur1.'<br />'.$email_erreur1.'<br />'.$password_erreur1.'<br />Redirection en cours ...';
header ("Refresh: 3;URL=register.php");
include("footer.php");
exit(); }


// Check username size
if(strlen($username) <= 5) {
$pseudo_erreur2 = 'Votre pseudo dois comporter au moins 5caractères'; 
$i++; }

//Check if username is already in DB
$query=$bdd->prepare('SELECT COUNT(*) AS nbr FROM users WHERE username =:username');
$query->bindValue(':username',$username, PDO: [langue]ARAM_STR);
$query->execute();
$pseudo_free=($query->fetchColumn()==0)?1:0;
$query->CloseCursor();

    if(!$pseudo_free)
    {
        $pseudo_erreur3 = 'Votre pseudo est d&eacute;j&#224; utilis&eacute; par un membre';
        $i++;
    }


if (checkmail(!$email)) {
$email_erreur2 = 'Adresse email incorecte !';
$i++; }

//Check if email is already in DB
$query=$bdd->prepare('SELECT COUNT(*) AS nbr FROM users WHERE email =:email');
$query->bindValue(':email',$email, PDO: [langue]ARAM_STR);
$query->execute();
$email_free=($query->fetchColumn()==0)?1:0;
$query->CloseCursor();

    if(!$email_free)
    {
        $email_erreur3 = 'Votre email est d&eacute;jà utilis&eacute; par un membre';
        $i++;
    }
	
//Check Password

if($password != $password_verif) {
$password_erreur2 = 'Votre mot de passe et votre confirmation sont diff&eacute;rentes';
$i++; }



// Si tous est ok
if ($i==0) {
// Hachage du mot de passe
$pass_hache = sha1($password);
 
// Insertion SQL
$req = $bdd->prepare('INSERT INTO users(username, password, email) VALUES(:username, [langue]assword, :email)');

$req->execute(array(
    'username' => $username,
    'password' => $pass_hache,
	'email' => $email
    ));
	
	echo "Inscription Valid&eacute;e !<br />Vous pouvez vous identifer<br />Redirection en cours";
	header ("Refresh: 3;URL=mon_compte.php");
	
}
	
// Sinon
else {

if(!empty($pseudo_erreur2)) {
echo $pseudo_erreur2;
echo '<br />'; }

if(!empty($pseudo_erreur3)) {
echo $pseudo_erreur3;
echo '<br />'; }

if(!empty($email_erreur2)) {
echo $email_erreur2;
echo '<br />'; }

if(!empty($email_erreur3)) {
echo $email_erreur3;
echo '<br />'; }
 
if(!empty($password_erreur2)) {
echo $password_erreur2;
echo '<br />'; } 

  }
	}

include("footer.php");
?>



Autre question, a la fin de mon script je lui demande d'afficher les erreurs si la variable n'est pas vide. Il y a t'il une autre méthode pour le faire ? Pour éviter de faire plins de saut a la ligne? Afficher un echo si est uniquement si non vide.

Merci d'avance Smiley smile )
Modifié par iloveelearning (27 Mar 2013 - 11:45)