Bonjour, je vous dévoile mon petit problème qui est en rapport avec les sessions.
Donc j'ai un formulaire d'inscription, et quand l'inscription est effectué, un message d'alerte apparaît.
Pour le faire j'ai suivis le tuto de grafikart : http://www.grafikart.fr/tutoriels/php/flash-message-286

Donc mon souci intervient au moment ou l'inscription est effectué je veut soit un message d'erreur si l'email est déjà utilisé soit un message de succès si l'inscription est réussie.
Or pour l'instant sa m'affiche que le message d'erreur car j'accumule 2 fois $Session = new Session(); donc il prend le premier et pour le 2em message j'ai cette erreur :

Notice: Undefined variable: Sessio

Fatal error: Call to a member function setFlash() on a non-object

Voici mon code :

<?php
require("session.class.php");
// je récupération des valeurs du formulaire d'inscription 

        //civilite :
        $civilite = $_POST'civilite'] ;
        //prenom
        $prenom = $_POST'prenom'] ;
        //nom
        $nom = $_POST'nom'] ;
        //adresse
        $adresse = $_POST'adresse'] ;
        //ville
        $ville = $_POST'ville'] ;
        //codepostal
        $codepostal = $_POST'codepostal'] ;
        //email
        $email = $_POST'email'] ;
        //password
        $password = sha1($_POST'password']) ; // le mdp est crypté en SHA1

//connection au serveur
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=oldschoolgen', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
// Vérification de la validité des informations
$connect = mysql_connect ('localhost', 'root', '') or die ("Connexion à la base SQL impossible");
$select = mysql_select_db ('oldschoolgen', $connect);
  // On vérifie si l'email est déjà utilisée
$sql = 'SELECT count(*) FROM membres WHERE email="'.mysql_real_escape_string($_POST'email']).'"'; 
      $res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
      $data = mysql_fetch_array($res); 
      // on verifie que le pseudo ou le mail que l'utilisateur a choisi n'est pas deja pris 
      mysql_free_result($res); 

      if ($data[0] == 1) { 
        $Session = new Session(); 
        $Session->setFlash('Cette email à déjà été utiliser','error'); 
      } 
      // sinon on continue l'inscription
      else  
      {  

// insertion des données récupérer
$req = $bdd->prepare('INSERT INTO oldschoolgen.membres(id, email, password, civilite, nom, prenom, adresse, codepostal, ville) VALUES(:id, :email, :password, :civilite, :nom, :prenom, :adresse, :codepostal, :ville)');
$req->execute(array(
'id' => '',
'email' => $email,
'password' => $password,
'civilite' => $civilite,
'nom' => $nom,
'prenom' => $prenom,
'adresse' => $adresse,
'codepostal' => $codepostal,
'ville' => $ville
));
    }   
// message d'alerte 
$Session = new Session(); 
$Session->setFlash('Votre inscription à bien été effectué','success'); 
// retour a la page d'acceuil
header('Location:index.php'); 
?>

Merci pour vos réponse d'avance

12 réponses


Typhon
Réponse acceptée

Ouki je suis bête ^^ j'avais mal vue la fermeture de l'accolade et j'avais pas bien vue le problème. Et comme çà ?

<?php
require("session.class.php");

$Session = new Session();

// je récupération des valeurs du formulaire d'inscription

        //civilite :
        $civilite = $_POST'civilite'] ;
        //prenom
        $prenom = $_POST'prenom'] ;
        //nom
        $nom = $_POST'nom'] ;
        //adresse
        $adresse = $_POST'adresse'] ;
        //ville
        $ville = $_POST'ville'] ;
        //codepostal
        $codepostal = $_POST'codepostal'] ;
        //email
        $email = $_POST'email'] ;
        //password
        $password = sha1($_POST'password']) ; // le mdp est crypté en SHA1

//connection au serveur
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=oldschoolgen', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Vérification de la validité des informations

$connect = mysql_connect ('localhost', 'root', '') or die ("Connexion à la base SQL impossible");
$select = mysql_select_db ('oldschoolgen', $connect);

  // On vérifie si l'email est déjà utilisée
$sql = 'SELECT count(*) FROM membres WHERE email="'.mysql_real_escape_string($_POST'email']).'"';
$res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data = mysql_fetch_array($res);
// on verifie que le pseudo ou le mail que l'utilisateur a choisi n'est pas deja pris
mysql_free_result($res);

      if ($data[0] == 1) {
        $Session->setFlash('Cette email à déjà été utiliser','error');
      }

      // sinon on continue l'inscription
      else
      {
            // insertion des données récupérer
            $req = $bdd->prepare('INSERT INTO oldschoolgen.membres(id, email, password, civilite, nom, prenom, adresse, codepostal, ville) VALUES(:id, :email, :password, :civilite, :nom, :prenom, :adresse, :codepostal, :ville)');
            $req->execute(array(
                  'id' => '',
                  'email' => $email,
                  'password' => $password,
                  'civilite' => $civilite,
                  'nom' => $nom,
                  'prenom' => $prenom,
                  'adresse' => $adresse,
                  'codepostal' => $codepostal,
                  'ville' => $ville
            ));
            // message d'alerte
            $Session->setFlash('Votre inscription à bien été effectué','success');
      }
// retour a la page d'acceuil
header('Location:index.php');
?>

bonsoir,

je pense que ton problème vient de la double création d'une instance de la classe Session.

Essaye de faire la modif suivante :

  • Mets $Session = new Session(); à la ligne 3
  • supprimer $Session = new Session(); des autre positions (46 et 70)

de cette façon tu vas crée l'instance une seule fois et puis tu envoies seulement les données

xander
Auteur

Bonjour, elRingo merci de ta réponse, j'avais déjà essayé cette méthode mais elle ne fonctionne pas, je pense que sa a un rapport avec le require session.class.php

Si ton premier passe, c'est qu'il y peut être un souci de nom (N'y avais t'il pas une page traitement.php dans le tuto ? bref), tente de remplacer le dernier par ceci :

// message d'alerte 
// Remplace le $Session (Met ce que tu veut, tant que ce n'est pas $Session)
// Si sa persiste, met nous le code de session.class.php
$Session_2 = new Session(); 
$Session_2->setFlash('Votre inscription à bien été effectué','success');

Florian.

xander
Auteur

re bonjour florian merci a toi aussi pour ton aide mais non sa persiste, donc je vous mais le session.class.php
ps : si il y avais un traitement.php dans le tuto mais sa reprenais que le se code :

<?php 
// c'est le traitement.php du tuto
require("session.class.php");
$Session = new Session(); 
$Session->setFlash('Mon message','success'); 
/**
* On renvoit sur la page d'accueil
**/
header('Location:index.php'); 
?>

Voici le session.class

<?php
class Session{
    public function __construct(){
        session_start(); 
    }
    public function setFlash($message,$type = 'error'){
        $_SESSION'flash'] = array(
            'message' => $message,
            'type' => $type
        );
    }
    public function flash(){
        if(isset($_SESSION'flash'])){
            ?>
            <div id="alert" class="alert alert-<?php echo $_SESSION'flash']'type']; ?>">
                <?php echo $_SESSION'flash']'message']; ?>
            </div>
            <?php
            unset($_SESSION'flash']); 
        }
    }
}

Bon, fait nous un p'tit screen de ton erreur (Afin que l'on voient toutes les info concernant l'erreur) ;)

xander
Auteur

Re, donc mon message d'erreur s'affiche mais le message de succès j'ai une erreur php voici les screens
http://imageshack.us/f/689/errorst.jpg/

le code utilisé

<?php
require("session.class.php");
// je récupération des valeurs du formulaire d'inscription ....]

//connection au serveur
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=oldschoolgen', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
// Vérification de la validité des informations
$connect = mysql_connect ('localhost', 'root', '') or die ("Connexion à la base SQL impossible");
$select = mysql_select_db ('oldschoolgen', $connect);
  // On vérifie si l'email est déjà utilisée .....]

      if ($data[0] == 1) { 
        $Session = new Session(); 
        $Session->setFlash('Cette email à déjà été utiliser','error'); 
      } 
      // sinon on continue l'inscription
      else  
      {  

// insertion des données récupérer ....] // 
ici j'ai enlevé le $Session = new Session(); pour obtenir mon message d'erreur d'email deja utilisé
$Session->setFlash('Votre inscription à bien été effectué','success'); 
    }   
/**
* Ici on appel le message d'alerte avec une vérification de l'email
**/
/**
* On renvoit sur la page d'accueil
**/
header('Location:index.php'); 
?>

donc si je rajoute $Session = new Session(); pour mon message de succès, il me l'affichera toujours même si je rentre un email déjà utilisé

Alors la, je voie pas trop :/ Essaye sur un vrai serveur linux :)

xander
Auteur

en attendant que grafikart regarde le souci j'ai créer une variable message d'erreur que j'afficherais a la place merci pour votre aide en tout cas

À tout hasard, je propose une solution toute faite ;)
Je me dis que d'avoir éclaircis quelques points que je trouvais obscure dans ton code, aura peut être résolus le problème, si tu as toujours une erreur, fais m'en part, je comprendrais peut être mieux le problème après

Essaie avec ca

<?php
require("session.class.php");
$Session = new Session();

// je récupération des valeurs du formulaire d'inscription

        //civilite :
        $civilite = $_POST'civilite'] ;
        //prenom
        $prenom = $_POST'prenom'] ;
        //nom
        $nom = $_POST'nom'] ;
        //adresse
        $adresse = $_POST'adresse'] ;
        //ville
        $ville = $_POST'ville'] ;
        //codepostal
        $codepostal = $_POST'codepostal'] ;
        //email
        $email = $_POST'email'] ;
        //password
        $password = sha1($_POST'password']) ; // le mdp est crypté en SHA1

//connection au serveur
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=oldschoolgen', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

// Vérification de la validité des informations

$connect = mysql_connect ('localhost', 'root', '') or die ("Connexion à la base SQL impossible");
$select = mysql_select_db ('oldschoolgen', $connect);

  // On vérifie si l'email est déjà utilisée
$sql = 'SELECT count(*) FROM membres WHERE email="'.mysql_real_escape_string($_POST'email']).'"';
      $res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
      $data = mysql_fetch_array($res);
      // on verifie que le pseudo ou le mail que l'utilisateur a choisi n'est pas deja pris
      mysql_free_result($res);

      if ($data[0] == 1) {
        $Session->setFlash('Cette email à déjà été utiliser','error');
      }

      // sinon on continue l'inscription
      else 
      { 

// insertion des données récupérer

$req = $bdd->prepare('INSERT INTO oldschoolgen.membres(id, email, password, civilite, nom, prenom, adresse, codepostal, ville) VALUES(:id, :email, :password, :civilite, :nom, :prenom, :adresse, :codepostal, :ville)');
$req->execute(array(
'id' => '',
'email' => $email,
'password' => $password,
'civilite' => $civilite,
'nom' => $nom,
'prenom' => $prenom,
'adresse' => $adresse,
'codepostal' => $codepostal,
'ville' => $ville
));
    }  
// message d'alerte
$Session->setFlash('Votre inscription à bien été effectué','success');
// retour a la page d'acceuil
header('Location:index.php');
?>
xander
Auteur

bonjour typhon merci de ta réponse je vais testé sa et c'est une solution que j'avais déjà essayé elRingo l'avais proposé aussi, j'ai plus d'erreur mais le message d'erreur n’apparaît pas sa me met toujours le message de succès

xander
Auteur

excellent !!! tu peut me dire ou étais vraiment l'erreur dans mon code stp et pourquoi sa me faisait cette erreur