[RESOLU] probleme session_start

Eléphanteau du PHP | 14 Messages

12 août 2013, 21:48

Bonsoir ,
Je suis en train de coder un formulaire d'inscription sur mon index.php qui renvoi sur membre.php , mais le probleme est que je n'arrive pas a garder la session ouverte , quand j'arrive sur membre .php les données normalement envoyées ne sont pas la , je vous met mes 2 codes :

En vous remerciant :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<?php
/* il faut demarrer la session*/
session_start();

if (empty($_SESSION['id'])) //les membres connecte ne peuvent pas s'inscrire
{
/* il faut que toutes les variables du formulaires existent*/
if(isset($_POST['pseudo']) && isset($_POST['mdp']) && isset($_POST['email']))
{
/*il faut que tous les champs soient renseignes*/
if($_POST['pseudo']!="" && $_POST['mdp']!="" && $_POST['email']!="")
{
/*connexion a la BDD*/
try
{
$bdd = new PDO('mysql:host=localhost;dbname=formulaire', 'root', '');
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}

/* on teste l'adresse email, si c'est bon, on continue, sinon, on affiche un message d'erreur*/
if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}.[a-z]{2,4}$#", $_POST['email']))
{
/*on verifie si un membre ne possede pas deja le meme pseudo*/
$req = $bdd->prepare('SELECT id FROM membre WHERE pseudo = :pseudo');
$req->execute(array('pseudo'=> $_POST['pseudo']));
$nb_resultats_recherche_membre=$req->fetch();

if(!$nb_resultats_recherche_membre) /*si il n'y a pas de resultat*/
{
/*on crypte le mot de passe*/
$mdp = sha1($_POST['mdp']);

/*Si le pseudo est libre et l'email valide, alors on enregistre le nouveau membre*/
$req=$bdd->prepare('INSERT INTO membre(pseudo, pass, email, date_inscription) VALUES(:pseudo, :pass, :email, CURDATE())');
$req->execute(array('pseudo'=>$_POST['pseudo'], 'pass'=>$mdp, 'email'=>$_POST['email']));

/* on demarre la session */
session_start();

/* on cree les variables de session du membre qui lui serviront pendant sa session*/
$_SESSION['id']= $resultat['id'];
$_SESSION['pseudo']= $pseudo;
$_SESSION['mail']= $resultat['email'];


header('Location: membre.php');
}
else
{
echo "Un membre possede deja ce pseudo";
}
}
else
{
echo "Votre adresse email n'est pas valide";
}
}
else
{
echo "Il faut remplir tous les champs";
}
}
else
{
echo "Une erreur s'est produite";
}
}
else
{
echo "Vous n'avez pas le droit d'acceder a cette page";
}
?>
</body>
</html>

et

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<?php
session_start();
echo "page membre";
?>
<?php
echo 'id : ',$_SESSION['id'],'<br />
mail : ',$_SESSION['mail'],'<br />
<form action="logout.php" method="post">
<input type="submit" value="logout"/>
</form>';
?>
</body>
</html>

Mammouth du PHP | 1967 Messages

13 août 2013, 08:52

Une session se démarrre en tout début de script, et surtout avant le moindre envoi de donnée donc y compris avant
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>
L'ouverture de session ne doit se faire qu'une fois par page, donc pas besoin dele rajouter une 2ème fois dans ta page.

Tu devrais faire afficher toutes les erreurs tu aurais tout de suite eu une qui te signale ton ouverture de session après affichage.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 14 Messages

13 août 2013, 19:45

Ok j'ai modifié mon code comme indiqué , mais j'ai toujours le meme probleme , pas de données envoyé sur ma page membre.php
<?php session_start()?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<?php
/* il faut demarrer la session*/

 
if (empty($_SESSION['id'])) //les membres connecte ne peuvent pas s'inscrire
{
    /* il faut que toutes les variables du formulaires existent*/
    if(isset($_POST['pseudo']) && isset($_POST['mdp']) && isset($_POST['email']))
    {
        /*il faut que tous les champs soient renseignes*/
        if($_POST['pseudo']!="" && $_POST['mdp']!="" && $_POST['email']!="")
        {
            /*connexion a la BDD*/
            try
            {
                $bdd = new PDO('mysql:host=localhost;dbname=formulaire', 'root', '');
            }
            catch (Exception $e)
            {
	        die('Erreur : ' . $e->getMessage());
            }
 
            /* on teste l'adresse email, si c'est bon, on continue, sinon, on affiche un message d'erreur*/
            if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}.[a-z]{2,4}$#", $_POST['email']))
            {
                /*on verifie si un membre ne possede pas deja le meme pseudo*/
                $req = $bdd->prepare('SELECT id FROM membre WHERE pseudo = :pseudo');
	        $req->execute(array('pseudo'=> $_POST['pseudo']));
	        $nb_resultats_recherche_membre=$req->fetch();
 
                if(!$nb_resultats_recherche_membre) /*si il n'y a pas de resultat*/
                {
                    /*on crypte le mot de passe*/
                    $mdp = sha1($_POST['mdp']);
 
                    /*Si le pseudo est libre et l'email valide, alors on enregistre le nouveau membre*/
                    $req=$bdd->prepare('INSERT INTO membre(pseudo, pass, email, date_inscription) VALUES(:pseudo, :pass, :email, CURDATE())');
                    $req->execute(array('pseudo'=>$_POST['pseudo'], 'pass'=>$mdp, 'email'=>$_POST['email']));
				
				
			/* on demarre la session */
               
 [color=#FF0000]
               /* on cree les variables de session du membre qui lui serviront pendant sa session*/
               $_SESSION['id']= $resultat['id'];
	       $_SESSION['pseudo']= $pseudo;
	       $_SESSION['mail']= $resultat['email'];
					[/color]
 
                    header('Location: membre.php');
					
                }
                else
                {
                    echo "Un membre possede deja ce pseudo";
                }	
            }
            else
            {
                echo "Votre adresse email n'est pas valide";
            }
        }
        else
        {
           echo "Il faut remplir tous les champs"; 
        }
    }
    else
    {
        echo "Une erreur s'est produite";
    }
}
else
{
     echo "Vous n'avez pas le droit d'acceder a cette page";
}
?>
</body>
</html>
et
<?php session_start()?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>

<body>
<?php
echo "page membre";
?>
<?php
echo  'id : ',$_SESSION['id'],'<br />
     mail : ',$_SESSION['mail'],'<br />
<form action="logout.php" method="post">
<input type="submit" value="logout"/>
</form>';
?>
<?php
echo '<form action="index.php" method="post">
<input type="submit" value="acceuille"/>
</form>';
?>
</body>
</html>

ViPHP
xTG
ViPHP | 7331 Messages

13 août 2013, 20:11

Tu as tout plein de html en plein dans le code PHP...
Par exemple :
 <span style="color: #FF0000">
               /* on cree les variables de session du membre qui lui serviront pendant sa session*/
               $_SESSION['id']= $resultat['id'];
               $_SESSION['pseudo']= $pseudo;
               $_SESSION['mail']= $resultat['email'];
                                        </span>
Ton script ne peut que générer des erreurs...
Actives l'affichage des erreurs sur ton serveur, ou bien vas voir les logs de PHP. ;)

Eléphanteau du PHP | 14 Messages

13 août 2013, 20:53

ok , je suis en local avec wamp , comment je fais pour activer les erreurs ? Et qu'appel tu logs de php et ou les trouver ? Par contre je ne rencontre pas de vrai erreur , la page membre s'affiche bien , c'est juste que ca me mais un espace vide ou je devrais avoir l'ID et le mail , pas contre ma page login avec le meme code pratiquement m'affiche bien les données

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

13 août 2013, 22:09

Salut,

Le problème, dans le cas de la création de compte c'est que tu enregistre en session un id a partir d'une variable qui n'existe pas.
Avec cette ligne
$_SESSION['id']= $resultat['id'];
$resultat n'existe pas !
Tu devrais avoir une erreur avec ligne (variable inexistante).

Dans ce cas $_SESSION['id'] contient donc null (mais existe) du coup sur la page membre rien ne s'affiche.

Pour activer les erreurs il faut modifier le paramètre error_reporting a E_ALL dans le php.ini (dans le répertoire php du répertoire d'installation de wamp).

Le log serveurs c'est, par défaut, dans le répertoire Apache\logs.
A moins qu'il y ai un répertoire log dans le repertoir d'installation de wamp.

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

Eléphanteau du PHP | 14 Messages

15 août 2013, 10:04

Ok bien vu moogli , j'ai donc remplacer les $resultat par des $post , et ca fonctionne pour les données qui ont était rentré dans le formulaire , par contre je ne sais pas comment récupérer l'id du membre qui se connecte (vu qu'il ne le rentre pas dans le formulaire) ???

je remet le code a jour

Code : Tout sélectionner

<?php session_start()?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Document sans titre</title> </head> <body> <?php /* il faut demarrer la session*/ if (empty($_SESSION['id'])) //les membres connecte ne peuvent pas s'inscrire { /* il faut que toutes les variables du formulaires existent*/ if(isset($_POST['pseudo']) && isset($_POST['mdp']) && isset($_POST['email'])) { /*il faut que tous les champs soient renseignes*/ if($_POST['pseudo']!="" && $_POST['mdp']!="" && $_POST['email']!="") { /*connexion a la BDD*/ try { $bdd = new PDO('mysql:host=localhost;dbname=formulaire', 'root', ''); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } /* on teste l'adresse email, si c'est bon, on continue, sinon, on affiche un message d'erreur*/ if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}.[a-z]{2,4}$#", $_POST['email'])) { /*on verifie si un membre ne possede pas deja le meme pseudo*/ $req = $bdd->prepare('SELECT id FROM membre WHERE pseudo = :pseudo'); $req->execute(array('pseudo'=> $_POST['pseudo'])); $nb_resultats_recherche_membre=$req->fetch(); if(!$nb_resultats_recherche_membre) /*si il n'y a pas de resultat*/ { /*on crypte le mot de passe*/ $mdp = sha1($_POST['mdp']); /*Si le pseudo est libre et l'email valide, alors on enregistre le nouveau membre*/ $req=$bdd->prepare('INSERT INTO membre(pseudo, pass, email, date_inscription) VALUES(:pseudo, :pass, :email, CURDATE())'); $req->execute(array('pseudo'=>$_POST['pseudo'], 'pass'=>$mdp, 'email'=>$_POST['email'])); /* on demarre la session */ [color=#FF0000] /* on cree les variables de session du membre qui lui serviront pendant sa session*/ $_SESSION['id']= ???????; $_SESSION['pseudo']= $_POST['pseudo']; $_SESSION['mail']= $_POST['email'];[/color] header('Location: membre.php'); } else { echo "Un membre possede deja ce pseudo"; } } else { echo "Votre adresse email n'est pas valide"; } } else { echo "Il faut remplir tous les champs"; } } else { echo "Une erreur s'est produite"; } } else { echo "Vous n'avez pas le droit d'acceder a cette page"; } ?> </body> </html>

Eléphant du PHP | 250 Messages

15 août 2013, 10:58

Salut,

Lorsque tu fais ton insertion dans bdd, utilise ensuite mysqli_insert_id
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Eléphanteau du PHP | 14 Messages

15 août 2013, 16:54

C chaud , j'ai lu le manuel mais c'est assez galere , je ne sais pas comment l'integrer au code????

Eléphant du PHP | 250 Messages

15 août 2013, 17:32

Ben, si c'est simple; regarde bien le manuel, et après ton:
/*Si le pseudo est libre et l'email valide, alors on enregistre le nouveau membre*/
                    $req=$bdd->prepare('INSERT INTO membre(pseudo, pass, email, date_inscription) VALUES(:pseudo, :pass, :email, CURDATE())');
                    $req->execute(array('pseudo'=>$_POST['pseudo'], 'pass'=>$mdp, 'email'=>$_POST['email']));
il te suffit de récupérer l'id créé (au hasard, dans ta $_SESSION['id'] ) ...
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Eléphanteau du PHP | 14 Messages

15 août 2013, 20:25

On avance j'ai modifier ca :

Code : Tout sélectionner

/* on cree les variables de session du membre qui lui serviront pendant sa session*/ $_SESSION['id']= [color=#FF0000]mysql_insert_id()[/color] ; $_SESSION['pseudo']= $reponse['pseudo']; $_SESSION['mail']= $reponse['email'];
Ca retourne bien une valeur mais c'est tjrs = a 0

Quoi rajouter pour avoir l'id du membre qui vient de s'inscrir??

Eléphant du PHP | 250 Messages

15 août 2013, 21:17

Excuses moi, mais ça, c'est quoi?
      $_SESSION['id']= [color=#FF0000]mysql_insert_id()[/color] ;
1) as tu fait un print_r($_SESSION), histoire de voir ce qu'elle te renvoie?
2) heu....comment redire ce que t'as déjà xTG un peu plus haut à propos du html dans ton php?.... :mrgreen:
3)si je puis me permettre (ne te vexe pas) mais je pense qu'il serait bon que tu maîtrise déjà (au moins) un peu le html et les css avant d'aller plus loin... :mrgreen:
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

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

16 août 2013, 13:53

@Boro64 : il utilise l'extension PDO, tu ne connais pas ? il serait bon de connaitre un minimum pour l'aider (cf remarque html /css) :mrgreen:
donc le mysqli_insert_id n'est pas utilisable.

@tomtom59 : utilise la requête sql suivant pour avoir l'info que tu souhaite (n'est valable que pour mysql).
select LAST_INSERT_ID() as lastid;
tu récupère lastid dans le jeux de résultat et c'est cette info que tu met en session (dans $_SESSION['id']).


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

Eléphanteau du PHP | 14 Messages

16 août 2013, 18:23

Ok , j'ai enfin reussi tous fonctionne maintenant , il manquait pas grand chose :

Code : Tout sélectionner

/* on cree les variables de session du membre qui lui serviront pendant sa session*/ $_SESSION['id']= $bdd->lastInsertId() ; $_SESSION['pseudo']= $_POST['pseudo']; $_SESSION['mail']= $_POST['email'];
Un grand merci a tous ceux qui ont prit le temps d'étudier mon probleme

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

16 août 2013, 18:38

Attention avec cette méthode
Note:
Cette méthode peut ne pas retourner un résultat significatif suivant les drivers PDO utilisés, car la base de données utilisée peut ne pas supporter la notion de champs auto-incrémenté ou de séquences.
c'est pour cela que je t'ai présenté la solution SQL ;)


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