Expiration variables de session

jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006 - 23 mai 2006 à 23:39
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 - 26 mai 2006 à 13:14
Bonjour à toutes et tous,

J'ai un problème avec un formulaire que j'essaie d'envoyer par email, avec les données des champs que je place dans des variables de session mais qui se vident mystérieusement à la fin!

Voici mon code, composé d'une page (index.php) contenant un formulaire, d'une page (coordonnees.php) contenant les coordonnées de l'internaute et enfin, d'une page (envoi.php) qui sert a envoyer le mail:

index.php
<?
session_start;
?>
... un ensemble de listes déroulantes, les variables étant sous la forme variable1_1_1, variable1_1_2, variable1_1_3, variable1_1_4, puis de nouveau variable1_2_1, variable1_2_2, ... jusqu'à variable1_15_4 :
<FORM method= "POST" action=" coordonnees.php ">
       <select name ="variable1_1_1" id= "variable1_1_1">
          <option value="rien;" selected>rien;</option>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
          <option value="5">5</option>
          <option value="6">6</option>
          <option value="7">7</option>
      </select>

  </FORM>
...

coordonnees.php
<?
on attribue aux variables de session les valeurs du formulaires de la page précédente:
for($i =1;$i<= 15;$i++){
    for($j=1;$j<=4;$j++){
    if (empty($_SESSION["variable1_".$i."_".$j])) {
        $_SESSION["variable1_".$i."_".$j]=${variable1_.$i._.$j};
       test d'affichage des variables de session pour voir si elles sont bien remplies (le test est OK !):
        echo $_SESSION["variable1_".$i."_".$j]."\n";
        }
    }
}
?>
  <FORM method="POST" action=" envoi.php ">
 Votre nom et prénom:

 
 

  Votre adresse E-Mail:

 
 

  Votre adresse postale:

  <textarea name ="adresse" cols=30 rows=5></textarea>
 
   
  </FORM>

envoi.php
<?
for($i=1;$i<=15;$i++){
    for($j=1;$j<=4;$j++){
       test pour voir si les variables de sessions sont toujours remplies mais elles ne le sont plus à cet instant !
       echo $_SESSION["variable1_".$i."_".$j];
    }
}  
  $msg = "Nom:\t$nom\n";
  $msg .= "E-Mail:\t$email\n";
  $msg .= "Adresse:\t$adresse\n\n";

   for($i=1;$i<=15;$i++){
    for($j=1;$j<=4;$j++){
    $msg .=$_SESSION["variable1_".$i."_".$j];
    $msg .=" - ";
    }
    $msg .="\n";
}

  $recipient = "monmail@phpcs.com";
  $subject = "Formulaire";
  
  $mailheaders = "From: Mon test de formulaire<> \n";
  $mailheaders .= "Reply-To: $email\n\n";
  
  mail($recipient, $subject, $msg, $mailheaders);
  
  echo "<HTML><HEAD>";
  echo "<TITLE>Formulaire envoyé!</TITLE></HEAD>";
  echo "Merci, $nom
";
  echo "";
  echo "Votre formulaire à bien été envoyé !

";
  echo "</HTML>";
    ?>

Voila mon code, et je ne comprends pas pourquoi mes variables $_SESSION["variable1_".$i."_".$j] sont remplies et s'affichent en haut de ma page coordonnees.php mais sont vides en arrivant dans envoi.php ?

SI vous avez de quelconques informations, cela m'aiderait enormement!

merci

12 réponses

Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
23 mai 2006 à 23:50
il manque deja le session_start(); a chaque debut de page sauf la premiere ...
et si tu cherchent des variables qui expirent c'est des cookies les sessions ca reste ...si on fait les bonnes choses
--------------------------------------------------------------------------------------------------
         Ilvaut mieux poser une question et passer pour bête que le rester toutesa vie
0
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
24 mai 2006 à 13:48
oui, je n'ai pas remis mes "session_start" car j'ai condensé mais je les avais mis dans mes vraies pages!

j'ai aussi changé les noms pour avoir le nom de ma variable de formulaire différent de celui de la variable de session, mais rien n'y fait! a ma page coordonnees.php, mon test fonctionne et mes variables s'affichent bien avec le "echo", mais dans la troisième page envoi.php, le test ne fonctionne plus puisque mon "echo" n'affiche plus rien !

du coup, mon email ne contient pas non plus les données des variables de sessions pusiqu'elles se vident entre la deuxieme et troisieme page!
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
24 mai 2006 à 16:09
Salut,

Les cookies sont-ils activés sur ton navigateur ?

Si non, il le faut car les session les utilisent (par défaut, mais c'est configurable).

Si oui, faut voir autre chose...

Note :

pourquoi ne pas utiliser des tableau à la place de 'variable1_2_5' ?

index.php
<select name= "variable[1][1]"/>
<select name="variable[1][1]"/>
<select name="variable[1][1]"/>

...
<select name="variable[10][5]"/>
...

coordonnees.php
$_SESSION['variable'] = $_POST['variable'];

envoi.php
foreach( $_SESSION['variable'] as $X=>$x ) {
    foreach( $X as $y ) {
       $mess.= $_SESSION['variable'][$x][$y];
    }  
}

bien que moins performant, c'est plus joli... non ?

autre chose :
echo '';
print_r($_SESSION); // te dira tout de suite à quoi ressemblent tes variables de session
echo '

';

A+
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
24 mai 2006 à 16:11
ERREUR :







envoi.php

foreach( $_SESSION['variable'] as $X=>$x ) {
    foreach( $X as $y=>$val ) {
       $mess.= $val;    // equivalent à $_SESSION['variable'][$x][$y];
    }  
}

Et finalement, c'est assez perfomant et franchement mignon !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
24 mai 2006 à 17:55
merci J_G et c'est vrai que c'est franchement mignon et je n'y avais pas pensé! en meme temps, je debute vraiment en php!

cependant, je ne sais pas si cela changera quelque chose ou pas, mais il semblerait que ce que j'ai fais au depart ne fonctionne pas a cause du register_globals=ON. Cela influence t'il ta technique aussi? car je ne peux changer cette valeur.

et deuxieme point, dans ta technique de tableau, y a t'il moyen de ne pas passer par $_POST ou pas?
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
24 mai 2006 à 18:29
Normalement, il ne devrait pas y avoir de relation entre ton bug et register_global=on.

Explication :
avec register_global, $_SESSION['variable'] créera au chargement du script la variable $variable avec la même valeur.
Et $_POST['variable'] créera aussi $variable...
L'un des deux va écraser la création de l'autre, c'est sûr. Mais je ne sais pas lequel et on s'en fout car en aucun cas $_POST['variable'] ne va affecter la valeur de $_SESSION['variable'].
Donc, tu devrais retrouver la bonne valeur de session, quelque soit les valeur de $_POST ou $variable...
(T'as suivi ?)

Pour ta deuxième question, je ne la comprends pas très bien...

$_POST, $_GET, $_COOKIe, $_SESSION, $_SERVER et $GLOBALS sont ni plus ni moins des tableaux PHP (mis à part le fait que ces variables sont toutes des "super globales" : c-à-d. accessibles de partout).

En PHP un tableau est un conglomérat (prononcer "structure") de n'importe quoi !

$tab = array();
$tab[] = true; // bool
$tab[] = 123; // int
$tab[] = 123.456; // float
$tab[] = 'salut'; // string
$tab[] = array(1,2,3,4); // array
$tab[] = new MyClass(); // object
$tab[] = fopen($file,'r'); // resource
print_r($tab); // si tu veux voir...

va te créer un tableau de sept éléments complètement différents, mais cohabitant sans problème dans la même structure...

Bref, aucun problème pour faire passer des tableaux dans un tableau de tableaux... dont POST et conçort...

(NB pour ne pas t'enduire d'erreur : pour mettre des objets dans SESSION, utiliser serialize et unserialize pour le récupérer. Les ressources ne pourrons jamais être récupérée lors d'autre requètes, sauf si psockopen ou mysql_pconnect, ou ... Enfin, là on touche à plus complexe.)
0
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
24 mai 2006 à 18:37
merci pour ces super explications detaillees et bien pedagogiques! je vais essayer d'analyser tout cela et de changer mon truc!

je te tiens au courant de toute facon si ca ne te gene pas trop de m'aider!

un grand merci
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
25 mai 2006 à 11:15
[auteurdetail.aspx?ID= 403016
]


Ok, j'y retourne ici, ça a pas l'air de fonctionner en messagerie privée (désolé Teclis01)

Donc je vais te montrer comment il faut travailler avec les objets, afin de créer des interfaces de programmation sympatoches...

Voici comment j'aurais fait le truce :

Tu pose dans ta base un table questionnaire. Cette table contiendra temporairement les réponses aux différents questionnaire. Une ligne par questionnaire et par utilisateur.
Id => INT(10) unsigned notnull autoincrement primarykey
PHPSESSID = > CHAR(32) pour reconnaitre l'utilisateur
questionnaire => VARCHAR(255) pour reconnaitre le questionnaire
responses => TEXT pour rentrer les réponse de l'utilisateur au dit questionnaire

Puis tu fais une classe qui gère cette table. L'interface ! Ainsi, si tu change le nom d'un champ dans ta table, pas besoin de faire le tour de tout tes scripts pour répercuter la modification.
class questionnaire {

    // le nom du questionnaire pour enregistrer dans la base
    var $nom;

    // ici : le constructeur de la classe... C'est lui qui donne le nom à la création
    function questionnaire( $nom );

    // une fonction à usage interne pour la connexion MySQL
    function connexionMySQL() ;

    // Ici, tu envoi un de tes questionnaires (selon le nom) à l'affichage...
    // par exemple un grand switch( $this->nom ) { case 'A' : include 'questionnaireA.php'; break; ...
    function afficherQuestionnaire();

    // Une fonction qui valide le questionnaire
    // Elle regarde dans $_POST pour savoir si les réponses intéressantes ont été soumise
    function validerReponse();

    // Enregistre les réponse dans la base de données, retourn l'identifiant créé (mysql_insert_id();)
    function enregistrerReponse();

    // Retourne les réponse à partir de l'id (action inverse en gros)
    function sortirReponse( $id );

    // on videra la table des réponse de l'utilisateur après envoi...
    function viderTable();
}

Ensuite, tu va faire un script choix_questionnaire.php. Celui où ton utilisateur choisi les questionnaires auquel il veut répondre...
<?php
// Donc après soumission on stock le choix dans une variable de session
// un questionnaire non renseigné aura une valeur de 0
// sinon, il s'agira de l'id de la réponse
if( $_POST['action'] == valider ) {
    foreach( $_POST['questionnaire'] as $nom ) {
       $_SESSION['questionnaire'][$nom_questionnaire] = 0;
    } 
    // On passe à la suite
    header("Location: questionnaire.php");
    exit;
}
?>
<form>
    <select mutliple name="questionnaire">
       <option value="A">questionnaireA</option>...
    </select>
   
</form>
 

Puis dans questionnaire.php, c'est là ou ta classe prend toute sa valeur
<?php
// d'abord, on choisi le prochain questionnaire non renseigné
$nom_questionnaire = false;

// fouillle dans la session
foreach( $_SESSION['questionnaire'] as $nom=>$id ) {
    if( $id == 0 ) { // j'en ai trouvé un non renseigné
        $nom_questionnaire = $nom;
        break; // on sort du foreach !
    }
}

// Condition "si j'en ai pas trouvé"
if( $nom_questionnaire === false ) {
    // on passe à la suite
    header("Location: envoi.php");
    exit;
}

// Donc là, on créer le dit questionnaire...
$questionnaire = new questionnaire( $nom_questionnaire );

// Si l'utilisateur vient de répondre au questionnaire
if( $questionnaire->validerReponse() ) {
    // on enregistre sa réponse
    $id = $questionnaire->EnregistrerReponse( $_POST['reponse'] );
    // on se souvient que le questionnaire a été rempli
    $_SESSION['questionnaire'][$questionnaire->nom] = $id;
    // Et on retourne au début du script (nouvel appel) pour choisir un autre questionnaire
    header("Location: questionnaire.php");
    exit;
}
else {
    // sinon, on affiche brutal le questionnaire
    $questionnaire->afficherQuestionnaire();
}

?>

Et enfin !!! envoi.php
<?php
$reponse = '';

// création d'u questionnaire blanc... (pas très propre comme façon de faire)
$questionnaire = new questionnaire('');

// pour chacun des quesqtionnaire répondu, je retrouve la reponse et forme le message avec
foreach( $_SESSION['questionnaire'] as $nom=>$id ) {
    $reponse.= $questionnaire->sortirReponse( $id );
}

?>

voili voilou dans le principe...

Le problème ici est posé par les fonctions afficherQuestionnaire, validerReponse et sortirReponse ; car je suppose que tes questionnaires sont différent ! (sinon pourquoi en faire plusieurs ?)

pour cela, il faudrait faire de l'héritage... Exemple :
Tu parts de la classe questionnaire décrite ci-dessus et tu vas "surcharger" ces fonctions dans des classes "filles"

class questionnaireA extends questionnaire {
    function questionnaireA() {
       parent::questionnaire( 'A' );
    }

    function afficherQuestionnaire() {
       // Affichage personnalisé du questionnaire A
    }

    function validerReponse() {
       // validation personalisée
    }

    function sortirReponse( $id ) {
       // on attrape dans la base de données
       $reponse = parent::sortirReponse( $id );
      
       // puis tu formates la réponse à ton grès
    }
}

et ainsi de suite : questionnaireB, C, D...

A ce moment là, dans questionnaire.php

if( class_exists("questionnaire$nom ) ) {
    eval( "\$questionnaire = new questionaire$nom();");
} else trigger_error("questionnaire$nom non trouvé !?!");

Avec tout ça, je pense que tu as du grain à moudre ;)

bonne chance...
0
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
25 mai 2006 à 13:01
un enorme merci pour cette aide, que je dois a present compiler vu que je decouvre un peu le php!

alors, effectivement, chacun de mes questionnaires est different, sinon ca ne serait pas tres drole!

Ce que je ne comprends pas tres bien, c'est qu'avec ta fonction "afficherQuestionnaire();" cela necessite d'avoir une table par questionnaire, et d'avoir egalement dans chaque table, une ligne par question, c'est cela?
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
25 mai 2006 à 13:16
!!! PAS DU TOUT !!!

Tu stock les réponses en un bloc !
Le mieux est de faire un tableau...

Genre :

Ton formulaire est
nom :
prenom :
age du capitaine :
...

ta reponse sera
$rep = array(); // toujours initialiser tes variables !!!
$rep['nom'] = 'moi';
$rep['prenom'] = 'lui';
$rep['age'] = 12;

il existe une fonction qui permet de transformer n'importe quoi en chaine de caractère :
$rep_str = serialize( $rep );

C'est ça que tu met dans la table
$session_id = session_id();
$nom = $this->nom; // dans un objet questionnaire
$rep = addslashes( $rep_str );
INSERT INTO table ( PHPSESSID, questionnaire, reponse ) VALUES ('$session_id', '$nom', '$rep_str');

Pour récupérer les réponses :
$rep_str = select reponse from table where PHPSESSIONID='...' and id='...';
$rep = unserialize( $rep_str );

magique, le tableau des réponses est de nouveau là !!!

Ainsi, tu peux tout mettre dans la même table.
0
jekifvb6 Messages postés 156 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 18 septembre 2006
25 mai 2006 à 18:34
ok, mais je vais peut etre te paraitre tres c**, mais dans ce cas, ca implique de creer les formulaires "en dur" dans le script et toutes les reponses d'un meme questionnaire sont balancées en meme temps dans la meme cellule de la table?  :s
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
26 mai 2006 à 13:14
Euh... oui
0
Rejoignez-nous