Connexion après inscription

Petit nouveau ! | 3 Messages

03 sept. 2013, 10:15

Bonjour tout le monde!

Je crée actuellement un site pour des potes et je suis tombé sur un problème ce matin.
Lorsque je fais l'inscription, nickel, ça entre dans la base de donnée etc. Je sais aussi me connecter avec le compte à partir de la page de connexion.

Voici mon code de la page inscription (Assez long, je sais pas si c'est la bonne méthode, mais je la trouve cool :3)
Quand je met le script, c'est bon
Si je met en plus un header location comme ceci :
header("location:$urlsite");
ça ne fonctionne. J'ai beau mettre n'importe quoi... Par contre si je retire le script et que je met : e
cho "Tu es inscrits";
ça fonctionne mais le header location ne fonctionne jamais.

Je ne sais pas d'où viens le problème car mon but est que lorsque je m'inscris, ça me connecte directement!
Voici mon code complet
<?php
ini_set("display_errors",0);error_reporting(0);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

	<head>
		<?php include("./includes/head.php"); ?>
		<title><?php echo $nomsite; ?> : Inscription</title>
		<?php $page = "inscription"; ?>
		
	</head>
		<?php
		$pseudo = $_POST['pseudo-c'];

		$req = $bdd->prepare("SELECT count(*) AS nb_ps FROM utilisateurs WHERE username = '$pseudo'");
		$req->execute(array('ip' => $_SERVER["REMOTE_ADDR"]));
		  
		$donnees = $req->fetch();
		$nb_ps = $donnees['nb_ps'];
		$req->closeCursor();
		?>
		<?php
		$mail = $_POST['mail-c'];

		$req = $bdd->prepare("SELECT count(*) AS nb_ma FROM utilisateurs WHERE email = '$mail'");
		$req->execute(array('ip' => $_SERVER["REMOTE_ADDR"]));
		  
		$donnees = $req->fetch();
		$nb_ma = $donnees['nb_ma'];
		$req->closeCursor();
		?>
	<body>
		<?php 
		if (isset($_SESSION['id']))
		{
			header("location:$urlsite");
		}
		?>
		<?php
		include("./includes/site/dedicasses.php"); 
		include("./includes/site/header.php");
		include("./includes/site/menu.php");
		?>
		
		<div class="corp2">
			<div class="section5">
				<h2>Crée gratuitement ton compte <?php echo $nomsite; ?></h2>

				<?php 
	$mail = $_POST['mail-c'];
	$mdp = $_POST['mdp-c'];
	$mdp2 = $_POST['mdp-c2'];
	$ps = $_POST['pseudo-c'];
	$nb_lettre_ps = strlen($_POST['pseudo-c']);
	$nb_lettre_mdp = strlen($_POST['mdp-c']);
	$email = stripslashes(htmlentities($_POST['mail-c']));
	
		if ((isset($_POST['pseudo-c'])) AND (isset($_POST['mail-c'])) AND (isset($_POST['mdp-c'])) AND (isset($_POST['mdp-c2'])))
		{	
			if ((empty($_POST['pseudo-c'])) OR (empty($_POST['mdp-c'])) OR (empty($_POST['mdp-c2'])) OR (empty($_POST['mail-c'])))
			{ ?>
				 <div class="redac-info10"><center>Un ou plusieurs champs ne sont pas completé(s).</center></div>
			<?php }
			else
			{
				if ($nb_ps > "0")
				{ ?>
					<div class="redac-info10"><center>Pseudo déjà utilisé.</center></div>
				<?php }
				else
				{ 
					if ($nb_lettre_ps > "15")
					{ ?>
						<div class="redac-info10"><center>Le pseudo est trop long.</center></div>
					<?php }
					
					if ($nb_lettre_ps < "3")
					{ ?>
						<div class="redac-info10"><center>Le pseudo est trop court.</center></div>
					<?php }
					
					if (!preg_match('#^\w{1,}$#D', $ps))
					{ ?>
						<div class="redac-info10"><center>Les pseudos ne peuvent contenir que des lettres et des chiffres.</center></div>
					<?php }
				}

				
				if ($nb_ma > "0")
				{ ?>
					<div class="redac-info10"><center>L'adresse email déjà utilisée.</center></div>
				<?php }
				else
				{
					if (!preg_match('#^(([a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+\.?)*[a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+)@(([a-z0-9-_]+\.?)*[a-z0-9-_]+)\.[a-z]{2,}$#i',str_replace('&','&',$email)))
					{ ?>
						<div class="redac-info10"><center>L'adresse email est invalide.</center></div>
					<?php }
				}
				
				if ($nb_lettre_mdp > "18")
				{ ?>
					<div class="redac-info10"><center>Le mot de passe est trop long.</center></div>
				<?php }
				
				if ($nb_lettre_mdp < "4")
				{ ?>
					<div class="redac-info10"><center>Le mot de passe est trop court.</center></div>
				<?php }
				
				if (strcmp($mdp, $mdp2) != 0)
				{ ?>
					<div class="redac-info10"><center>Les mots de passe ne correspondent pas.</center></div>
				<?php }
			}	
		}
		?>
			
			
				<form action="" method="post">
					<div class="ligne1">
						<input class="username-c" type="text" placeholder="Nom d'utilisateur" name="pseudo-c"/> <input class="mail-c" type="text" placeholder="Adresse e-mail" name="mail-c"/>
					</div><hr/>
					
					<div class="ligne1">
						<input class="username-c" type="password" placeholder="Mot de passe" name="mdp-c"/> <input class="mail-c" type="password" placeholder="Confirmation du mot de passe" name="mdp-c2"/>
					</div>
					
					<input class="submit-c" type="submit" value="Continuer" />
				</form>
				
				<?php
			if (strcmp($mdp, $mdp2) == 0)
			{
				if ($nb_lettre_mdp > "4")
				{
					if ($nb_lettre_mdp < "25")
					{
						if (!$nb_ma > "0")
						{
							if (preg_match('#^\w{1,}$#D', $ps))
							{
								if (!$nb_lettre_ps < "3")
								{
									if ($nb_lettre_ps < "18")
									{
										if (preg_match('#^(([a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+\.?)*[a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+)@(([a-z0-9-_]+\.?)*[a-z0-9-_]+)\.[a-z]{2,}$#i',str_replace('&','&',$email)))
										{
											if (!(empty($_POST['pseudo-c'])) OR (empty($_POST['mdp-c'])) OR (empty($_POST['mdp-c2'])) OR (empty($_POST['mail-c'])))
											{	
												if ($nb_ps == "0")
												{
													if (preg_match('#^(([a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+\.?)*[a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+)@(([a-z0-9-_]+\.?)*[a-z0-9-_]+)\.[a-z]{2,}$#i',str_replace('&','&',$email)))
													{
														$req = $bdd->prepare('INSERT INTO utilisateurs(email, mdp, username, ip, date_inscription, rang) VALUES(:email, :mdp, :username, :ip, NOW(), :rang)');
														$req->execute(array(
														'email' => htmlspecialchars($_POST['mail-c']),
														'mdp' => htmlspecialchars($_POST['mdp-c']),
														'username' => htmlspecialchars($_POST['pseudo-c']),
														'ip' => htmlspecialchars($_SERVER["REMOTE_ADDR"]),
														'rang' => "1"
														));
														header("location:$urlsite"); /* C'est CECI qui ne fonctionne pas*/
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
				
	?>
			</div>
		</div>
	</body>
	
	
	

	
</html>



Merci de votre aide!

Cordialement,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 sept. 2013, 10:27

Salut,

Il est impératif d'activer l'affichage des erreurs lorsque l'on est phase de développement.
Pour cela il faut mettre le paramètre display_error a on (dans le php.ini sur ton poste).
Il faut aussi paramétrer le niveau de rapport d'erreur (error_reporting) a E_ALL.

Pourquoi je dit ça ?
Parce qu'avec ton code tu dois avoir un message d'erreur indiquant le problème.
Si le parametrage est déjà comme indiqué regarde la source html ;)

Pour la solution :
Erreur classique d'utilisation de la fonction header après avoir affiché quelque chose.
Header, comme son nom l'indique, traite l'entête html or il n'est pas possible d'envoyé autre chose avant l'entête.
(Tu peux mettre ton jeans avant ton boxer mais c'est pas le plus simple XD).

Généralement les traitements de formulaire se font en premier dans le script avant tout affichage afin justement de pouvoir utiliser header sans problème et aussi de séparer l'affichage de la "logique métier".


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

03 sept. 2013, 10:41

Salut,

Il est impératif d'activer l'affichage des erreurs lorsque l'on est phase de développement.
Pour cela il faut mettre le paramètre display_error a on (dans le php.ini sur ton poste).
Il faut aussi paramétrer le niveau de rapport d'erreur (error_reporting) a E_ALL.

Pourquoi je dit ça ?
Parce qu'avec ton code tu dois avoir un message d'erreur indiquant le problème.
Si le parametrage est déjà comme indiqué regarde la source html ;)

Pour la solution :
Erreur classique d'utilisation de la fonction header après avoir affiché quelque chose.
Header, comme son nom l'indique, traite l'entête html or il n'est pas possible d'envoyé autre chose avant l'entête.
(Tu peux mettre ton jeans avant ton boxer mais c'est pas le plus simple XD).

Généralement les traitements de formulaire se font en premier dans le script avant tout affichage afin justement de pouvoir utiliser header sans problème et aussi de séparer l'affichage de la "logique métier".


@+

Et je dois donc faire quoi ? Changer mon script et le mettre tout en haut de la page avant tout ?

J'ai retirer le script qui cachait les erreurs.

Donc là, j'ai déplacé en haut mais l'erreur reste la meme!
EDIT : PAS REPARER j'ai pleins d'erreurs comme ceci : Notice: Undefined variable: mdp in /var/www/vhosts/green-radio.com/httpdocs/inscription.php on line 2 Notice: Undefined variable: mdp2 in /var/www/vhosts/green-radio.com/httpdocs/inscription.php on line 2 Notice: Undefined variable: nb_lettre_mdp in /var/www/vhosts/green-radio.com/httpdocs/inscription.php on line 4 Notice: Undefined index: pseudo_c in /var/www/vhosts/green-radio.com/httpdocs/inscription.php on line 57 Notice: Undefined index: mail_c in /var/www/vhosts/green-radio.com/httpdocs/inscription.php on line 67
etc

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 sept. 2013, 11:09

Oui le script de validation au début du fichier.

Les erreurs sont du au fait que tu as basé ta page sur la validation et que tu n'as pas du tout déplacer.

Ce que tu peux faire c'est enregistrer les erreurs dans un tableau et ensuite les afficher (tu peux utiliser un index alphabétique pour retrouver facilement le message d'erreur).
Et au final reproduire le comportement que tu as actuellement.

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

03 sept. 2013, 11:23

Oui le script de validation au début du fichier.

Les erreurs sont du au fait que tu as basé ta page sur la validation et que tu n'as pas du tout déplacer.

Ce que tu peux faire c'est enregistrer les erreurs dans un tableau et ensuite les afficher (tu peux utiliser un index alphabétique pour retrouver facilement le message d'erreur).
Et au final reproduire le comportement que tu as actuellement.

@+
ça ne change rien..
Regarde, je raccourcis le script et je met au début et ça me redirige quand meme pas!
Il faut savoir que j'ai un en-tete au dessus avec un script de connexion...

Regardez : http://green-radio.com

ViPHP
xTG
ViPHP | 7331 Messages

03 sept. 2013, 12:15

Il faut savoir que j'ai un en-tete au dessus avec un script de connexion...
Pour la solution :
Erreur classique d'utilisation de la fonction header après avoir affiché quelque chose.
Header, comme son nom l'indique, traite l'entête html or il n'est pas possible d'envoyé autre chose avant l'entête.
(Tu peux mettre ton jeans avant ton boxer mais c'est pas le plus simple XD).
;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 sept. 2013, 15:18

pour info, en regardant ton code source html je vois que tu mélange au moins deux versions de jquery coté front c'est une source d'emmerde :)

voici un exemple a partir de ton code
<?php
session_start();
// si l'on est déja connecté oust
if (isset($_SESSION['id'])) {
    header('Location: ' . $urlsite); // Attention de la provenance de cette variable
}

if (isset($_POST['pseudo-c']) && isset($_POST['mail-c']) && isset($_POST['mdp-c']) && isset($_POST['mdp-c2'])) {
    if ((empty($_POST['pseudo-c'])) || (empty($_POST['mdp-c'])) || (empty($_POST['mdp-c2'])) || (empty($_POST['mail-c']))) {
        $erreur['champ vide'] = 'Un ou plusieurs champs ne sont pas completé(s).';
    } else {
        // Il faut ajouter la connexion au sgbd
        $req = $bdd->prepare('SELECT count(*) AS nb_ps FROM utilisateurs WHERE username = :username');
        $req->bindValue(':username', $_POST['pseudo-c']);
        $req->execute();
        $donnees = $req->fetch();
        $nb_ps = $donnees['nb_ps'];
        $req->closeCursor();

        if ($nb_ps > 0) {
            $erreur['pseudo existant'] = 'Pseudo déjà utilisé.';
        } else {
            $req = $bdd->prepare('SELECT count(*) AS nb_ma FROM utilisateurs WHERE email = :email');
            $req->bindValue(':email', $_POST['mail-c']);
            $donnees = $req->fetch();
            $nb_ma = $donnees['nb_ma'];
            $req->closeCursor();
            if (strlen($_POST['pseudo-c']) > 15) {
                $erreur['pseudo long'] = 'Le pseudo est trop long.';
            } elseif (strlen($_POST['pseudo-c']) < 3) {
                $erreur['pseudo court'] = 'Le pseudo est trop court.';
            } elseif (!preg_match('#^\w{1,}$#D', $ps)) {
                $erreur['pseudo'] = 'les pseudos ne peuvent contenir que des lettres et des chiffres.';
            } elseif
            ($nb_ma > 0) {
                $erreur['emaile exist'] = 'L\'adresse email déjà utilisée.';
            } elseif (!preg_match('#^(([a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+\.?)*[a-z0-9!\#$%&\\\'*+/=?^_`{|}~-]+)@(([a-z0-9-_]+\.?)*[a-z0-9-_]+)\.[a-z]{2,}$#i', str_replace('&', '&', $email))
            ) {
                $erreur['email ko'] = 'L\'adresse email est invalide.';
            } elseif (strlen($_POST['mdp-c']) > 18) {
                $erreur['mdp trop long'] = 'Le mot de passe est trop long.';
            } elseif (strlen($_POST['mdp-c']) < 4) {
                $erreur['mdp sort'] = 'Le mot de passe est trop court.';
            } elseif (strcmp($mdp, $mdp2) != 0) {
                $erreur['mdp diff'] = 'Les mots de passe ne correspondent pas.';
            } else {
                // ok
                $req = $bdd->prepare('INSERT INTO utilisateurs(email, mdp, username, ip, date_inscription, rang)
                                      VALUES(:email, :mdp, :username, :ip, NOW(), 1)');
                $req->bindValue(':email', $_POST['mail-c']);
                $req->bindValue(':mdp', $_POST['mdp-c']);
                $req->bindValue(':username', $_POST['pseudo-c']);
                $req->bindValue(':ip', $_SERVER["REMOTE_ADDR"]);
                $req->execute();
                $req->closeCursor();
                header("location:$urlsite"); /* C'est CECI qui ne fonctionne pas*/
            }
        }
    }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <?php
    include("./includes/head.php");
    ?>
    <title><?php echo $nomsite; ?> : Inscription</title>
</head>
<body>
<?php
include("./includes/site/dedicasses.php");
include("./includes/site/header.php");
include("./includes/site/menu.php");
?>
<div class="corp2">
    <div class="section5">
        <h2>Crée gratuitement ton compte <?php echo $nomsite; ?></h2>

        <div class="redac-info10">
            <?php
            if(!empty($erreur) && is_array($erreur)){
                foreach($erreuras $e){
                    echo $e.'<br />';
                }
            }
            ?>
        </div>

        <form action="" method="post">
            <div class="ligne1">
                <input class="username-c" type="text" placeholder="Nom d'utilisateur" name="pseudo-c"/> <input
                    class="mail-c" type="text" placeholder="Adresse e-mail" name="mail-c"/>
            </div>
            <hr/>

            <div class="ligne1">
                <input class="username-c" type="password" placeholder="Mot de passe" name="mdp-c"/> <input
                    class="mail-c" type="password" placeholder="Confirmation du mot de passe" name="mdp-c2"/>
            </div>

            <input class="submit-c" type="submit" value="Continuer"/>
        </form>
    </div>
</div>
</body>
</html>
Il en faut peu pour être heureux ......