Je rencontre un problème avec l'utilisation de $_session.
J'utilise une BD dans laquelle j'implemente une structure arborescente sur mes données. J'ai des éléments nommés focus , chacun étant liés à un nombre variable d'éléments nommés CE, qui sont soient des feuilles, soient des noeuds contenant eux même des CE.
Autrement dit ça donne un truc comme ça :
Focus 1 :
_ CE 1
_ CE 2
Focus 2 :
_ CE 1
___ CE 1.1
___ CE 1.2
_ CE 2
Le but de mes fonction est d'afficher dynamiquement, un focus par page, et pour chaque focus, la liste de ses fils, sous forme de formulaire.
J'ai réussi à afficher la liste des focus et leurs fils sur une seule page à l'aide d'une boucle, donc la fonction d'affichage de la structure arborescente fonctionne.
Maintenant j'ai une fonction focus( $i) qui crée un fichier HTML et écrit, outre les en-têtes HTML, les instructions basiques de creation d'un formulaire, puis appelle simplement la fonction display_children($node,$parent,$level,$fichier) qui ecrira a son tour dans le fichier le resultat de son parcours.
Pour pouvoir avoir ce traitement pour tous les focus, le script affiche_focus est lancé quand on clique sur le bouton submit du formulaire. Ce script vérifie qu'il reste encore des focus non affichés à l'aide de la variable $_SESSION['nb_focus'] et si c'est le cas rappelle la fonction focus($i) avec $i=$_SESSION['focus_courant'] .
Lors du premier passage dans focus , tout se passe normalement. Parcontre quand elle est rappelée la 2ème fois, il semble qu'il n'y a plus acces aux variables de session.
Pourtant je ne détruis pas la session. Tout se passe comme si le fait de créer un nouveau fichier HTML et d'être redirigé dessus lui fait perdre la session.
Je joins les morceaux de code liés.
Merci de votre aide.
FICHIER : displayCE.php / Fonction focus($i)
<?php session_start() ; ?>
<?php
//include "contenuCE.php";
include "displayTree.php";
function focus($i){
//echo "focus courant = cle : $i Valeur : $_SESSION[".$i."] <br/>";
for($j=0;$j<5;$j++){
$val=$_SESSION["$j"];
echo "cle $j = focus $val<BR>\n";
}
$nomFichier='focus'.$_SESSION[$i].'.html';
$fichier=fopen($nomFichier,'a');
fwrite($fichier,'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">');
fwrite($fichier,"<html>\n\t<head><title>focus</title></head>\n<body>\n");
$mon_form='<form action="afficheFocus.php" method="post" name="'.$nameFocus.'\">'."\n";
$ma_table='<table border="0">'."\r\n";
fwrite($fichier,$mon_form);
fwrite($fichier,$ma_table);
fwrite($fichier,"i=$i <br> \n");
$queryNameFocus="SELECT Name FROM Focus WHERE ID =$_SESSION[$i]";
$query="SELECT DISTINCT ID,Name,is_node,the_mode FROM ContextualElement WHERE ID in (SELECT CEID FROM CEFocus WHERE FocusID='$_SESSION[$i]') ORDER BY 'ID'";
fwrite($fichier,"$query <BR>\n");
//On s'aperçoit que la requete est mal formée, le programme n'a plus acces à la valeur $_SESSION[$i]
echo $query;
$nomFocus=mysql_query($queryNameFocus);
if($nomFocus){
$nameFocus=mysql_fetch_row($nomFocus);
fwrite($fichier, "<b>$nameFocus[0]</B> <BR>\n");
}
$q=mysql_query($query);
$num_resultat=@mysql_num_rows($q);
$num_resultat.="<BR>\n";
fwrite($fichier,$num_resultat);
while($CEcourant=mysql_fetch_row($q)){
display_children($CEcourant,'null', 1,1,$fichier);
}
fwrite($fichier, '</table>');
fwrite($fichier, '<input name="Submit" type="submit" value="Submit">');
fwrite($fichier, '</form></body></html>');
fclose($fichier);
//Pour rediriger vers le fichier nouvellement crée. A laisser en commentaire si on veut observer les valeurs
//affichées avec echo le temps de debugger.
//echo '<meta http-equiv="refresh" content="0;url='.$nomFichier.'" />';
}
?>
FICHIER : FocusList.php / 1er appel à la fonction focus. Initialise les variables de session
<?php session_start() ; ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Focus</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
include "displayCE.php";
include "routines.php";
//Affiche l'entité parente
echo "l'entité etait : ";
$entity=$_POST["EntityList"];
echo "$entity";
echo "<br><br>";
//REQUETE = ID de tous les Focus utilisés pour l'entité choisie
$queryMatchingEntity='SELECT ID FROM Focus WHERE EntityID IN (SELECT ID FROM Entity WHERE Name=\''.$entity.'\')'."\r\n";
echo "<br><br>\r\n";
//ENVOI DE LA REQUETE
$result=mysql_query($queryMatchingEntity);
if (! $result ) //Si la requete échoue
{
$message = mysql_error();
echo "$message<br>";
die();
}
elseif (@mysql_num_rows($result) == 0) //S'il n'y pas de focus correspondant à l'entité transmise
{
echo("<b>Query completed. No results returned.
</b><br>");
}
else //Il existe au moins un focus pour l'entité transmise
{
//Stocke tous les focus dans un tableau. Ils sont indexés par un indice de 0 à nb_focus
$les_focus=array();
$nb_focus=0;
while ($row = mysql_fetch_row($result)) {
//$_SESSION[$row[0]]=$row[0];
$a=array($nb_focus=>$row[0]);
$les_focus=array_merge($les_focus,$a);
$nb_focus++;
}//ENDWHILE
$_SESSION['nb_focus']=$nb_focus;
echo "nombre focus = ".$_SESSION['nb_focus'];
$_SESSION['focus_courant']=0;
//Stocke tous les focus dans le tableau de session.
$_SESSION=array_merge($_SESSION,$les_focus);
//echo '<meta http-equiv="refresh" content="0;url=http://piad1315.free.fr/afficheFocus.php" />';
/*for($j=0;$j<$nb_focus;$j++){
$val=$_SESSION["$j"];
echo "cle $j = focus $val<BR>\n";
}*/
$_SESSION['focus_courant']=1;
$_SESSION['nb_focus']--;
focus(0);
}//ENDELSE
?>
</body>
</html>
Fichier afficheFocus.php : rappelle la fonction focus tant qu'il existe des focus non affiches
<?php session_start() ; ?>
<?php
include "displayCE.php";
include "routines.php";
//for ($i=0;$i<$_SESSION['nb_focus'];$i++){
if ($_SESSION['nb_focus']!=0){
//echo "focus courant = cle : $_SESSION['focus_courant'] Valeur : $_SESSION[$_SESSION['focus_courant']] <br/>";
focus($_SESSION['focus_courant']);
$_SESSION['focus_courant']++;
$_SESSION['nb_focus']--;
}
?>
Fichier displayTree.php : Fonction display_children($node,$parent,$level,$fichier) <?php session_start() ; ?>
<?php
// $parent is the parent of the children we want to see
// $level is increased when we go deeper into the tree,
// used to display a nice indented tree
function display_children($node,$parent,$level,$fichier) {
// retrieve all children of $parent
$query="SELECT ID,Name,is_node,the_mode FROM ContextualElement WHERE ParentID ='$node[0]'";
$result = mysql_query($query);
fwrite($fichier,$query);
displayNode($node,$parent,$level);
// display each child
while ($row = mysql_fetch_array($result)) {
// indent and display the title of this child
$numMatchingCE=count($result);
// call this function again to display this child's children
display_children($row,$node,$level+1,$fichier);
}
}
function displayNode($node,$parent,$level,$fichier){
if($node[2]==2) //le CE est une feuille
{switch ($node[3]){
case 0 : affiche_champs_texte($node[1],$level,$fichier);
break;
case 2 : affiche_bouton_radio($node[1],$level,$parent[1],$fichier);
break;
}
}
else{
$espace= str_repeat("     ", $level);
fwrite($fichier,$espace);
fwrite($fichier, "<u>$node[1]</u><br>\n");
}
}
function affiche_champs_texte($nom,$level){
$espace= str_repeat("     ", $level);
fwrite($fichier,$espace);
fwrite($fichier, "$nom <input name='$nom' type='text' size='strlen($nom')><bR>\n");
}
function affiche_bouton_radio($nom,$level,$parent_name){
$espace=str_repeat("     ", $level);
fwrite($fichier,$espace);
fwrite($fichier, "<input name='$parent_name' type='radio' value='$nom'>$nom</input><br>\n");
}
?>
La script routine.php contient simplement les instruction pour se connecter à la BD.