unset pose problème

unset pose problème - PHP - Programmation

Marsh Posté le 16-01-2009 à 15:43:11    

Bonjour à tous,
 
Je cherche à créer un texte à trous à partir des fichiers SUJET.php et CORRECTION.php  
Dans SUJET.php, je réalise un tirage au sort de valeurs issues d'un tableau multidimensionnel, affiche ces valeurs (avec les trous), que j'envoie ensuite à CORRECTION.php  
Mon problème est le suivant : Certaines lignes ne s'affichent que de façon partielle, comme par exemple ici ou la 2ème ligne est anormale.  
 
Quelle est la structure électronique de l'élément Chlore (17 électrons) ?  
Quelle est la structure électronique de l'élément a (f électrons) ?  
Quelle est la structure électronique de l'élément Phosphore (15 électrons) ?  
 
Voici un extrait de SUJET.php :
 
[code]  
// Déclaration de la matrice (tableau multidimensionnel)  
 $matrice = array('element','electrons','reponse','affichage');  
 $matrice[]=array('Hydrogène','1','(K)1','(K)<sup>1</sup>');  
 $matrice[]=array('Hélium','2','(K)2','(K)<sup>2</sup>');  
 etc.....  
 
$_SESSION['matrice']=$matrice;  
$idQuestions= array_rand($_SESSION['matrice'] , $Par);  
echo '<form action='."correction.php".' method='."post".'><ul class='."questions".'><ul>';  
 
$cpt = 0 ;  
for ($cpt = 0 ; $cpt < sizeof($idQuestions) ;$cpt ++)  
 {  
  $key = $idQuestions[$cpt];  
  $element = $_SESSION['matrice'][$key];  
  echo '<input type="hidden" name="questions[]" value="'.$key.'">';  
  echo '<li> Quelle est la structure électronique de l\'élément '.$_SESSION['matrice'][$key][0].' ('.$_SESSION['matrice'][$key][1]. ' électrons) ? '.'<input type="text" size="30" name="r['.$cpt.']" /></li>';  
 
  $question['.$cpt.'] = $_SESSION['matrice'][$key][0];  
  $electrons['.$cpt.'] = $_SESSION['matrice'][$key][1];  
  $reponse['.$cpt.'] = $_SESSION['matrice'][$key][3];  
  $attendue['.$cpt.'] = $_SESSION['matrice'][$key][2];  
 
 
  unset ($_SESSION['matrice'][$key]);   }  
?>  
<input type="hidden" name="question1" value="<?php echo $question1; ?>">  
<input type="hidden" name="electrons1" value="<?php echo $electrons1; ?>">  
<input type="hidden" name="reponse1" value="<?php echo $reponse1; ?>">  
<input type="hidden" name="attendue1" value="<?php echo $attendue1; ?>">  
 
[:code]
 
Quelle erreur ai-je pu commettre ?
Merci d'avance.
 
tete278


Message édité par tete278 le 23-01-2009 à 17:47:06
Reply

Marsh Posté le 16-01-2009 à 15:43:11   

Reply

Marsh Posté le 16-01-2009 à 16:20:56    

Je n'ai pas la réponse à ta question.
Mais tu devrais pouvoir facilement alléger le code - et donc minimiser le risque d'erreurs.
 
en gros, ce que tu veux faire, c'est prendre un certain nombre d'éléments de ton tableau, aléatoirement. C'est ça ?
 
=> Pourquoi utiliser $_SESSION ?
Tu as ta matrice (au passage, tu devrais enlever les éléments redondants, surtout les balises <sup> - le jour où tu veux présenter autrement qu'en exposant tu es mal !).
tu génères uun tableau de valeurs aléatoires, $idQuestions.
 
Ensuite, plutôt que de travailler sur un $_SESSIONS['matrice'], sur lequel en plus tu supprimes les éléments à mesure, il suffit de prendre $matrice :

Code :
  1. $matrice[]=array('Hydrogène','1','(K)1','(K)<sup>1</sup>'); 
  2. $matrice[]=array('Hélium','2','(K)2','(K)<sup>2</sup>');
  3. ...
  4. // On met $Par index aléatoires distincts dans le tableau $idQuestions
  5. $idQuestions= array_rand($matrice , 4);
  6. // On utilise Foreach, qui est plus pratique qu'une boucle for...
  7. foreach ($idQuestions as $question) {
  8. // Plus besoins de $key, la variable $question contient la même chose
  9. // Le seul truc, c'est éventuellement de faire un compteur $cpt ou d'utiliser aussi $question
  10. // Et on va chercher dans $matrice les éléments correspondant.
  11. echo '<input type="hidden" name="questions[]" value="'.$question.'">';
  12. echo '<li> Quelle est la structure électronique de l\'élément '.$matrice[$question][0].' ('.$matrice[$question]. ' électrons) ? '.'<input type="text" size="30" name="r['.$question.']" /></li>';
  13. }

Reply

Marsh Posté le 16-01-2009 à 18:28:36    

Bonjour macgawel,
 
1°) Tu as bien compris mon but.
2°) Pourquoi utiliser $_SESSION ? Parce que je veux tirer au sort plusieurs fois et je crains de reprendre la matrice entière à chaque fois si je ne la passais pas en SESSION.
3°) En fait, je n'ai pas d'élément redondant car je me sers des balises <sup> pour la correction et en mettant effectivement en exposant.
4°) Quant à simplifier le code, mes connaissances actuelles ne me le permettent pas.
 
Ceci étant, merci beaucoup pour ta proposition.
tete278

Reply

Marsh Posté le 17-01-2009 à 13:40:37    

Bonjour à tous,
 
Contrairement à ce que j'écrivais dans mon 1er post, je souhaiterais apporter une rectification car, ayant supprimé la ligne contenant unset, le problème s'est répété donc le problème n'est pas lié à sa présence. Ceci étant, je ne vois toujours pas d'où vient le problème donc si quelqu'un le trouvait, cela m'ôterait une épine du pied.
Merci d'avance
 
tete278

Reply

Marsh Posté le 19-01-2009 à 09:46:21    

Petit truc vite fait :
var_dump($_SESSION['matrice'])
=> Te donne le contenu de ton tableau.
Ca pourrait t'aider...

Reply

Marsh Posté le 21-01-2009 à 11:35:48    

Bonjour et merci macgawel,
 
Ton petit truc donne effectivement le contenu du tableau, ce qui peut être une aide.
 
Je rencontre un problème avec les variables r1, r2, etc. que je cherche à générer dans la ligne comprenant le code suivant :
<input type="text" size="30" name="r['.$cpt.']" />
 
Ces variables r1, r2, etc. ne se génèrent pas; saurais-tu me dire pourquoi ?
Merci encore.
tete278

Reply

Marsh Posté le 21-01-2009 à 11:42:21    

tete278 a écrit :

<input type="text" size="30" name="r['.$cpt.']" />
 
Ces variables r1, r2, etc. ne se génèrent pas; saurais-tu me dire pourquoi ?
Merci encore.
tete278

Ne serait-ce pas par ce que tu demandes la création de "r[1]" et non pas la création de "r1" ?
Vu que tu connais maintenant var_dump, utilise le sur $_POST et $_GET et voit ce que te retourne le formulaire. ;)

Reply

Marsh Posté le 22-01-2009 à 13:00:44    

Bonjour à tous,
 
omega2, je te remercie pour ta réponse.
J'ai modifié name="r['.$cpt.']" />  en name="r".$cpt /> sans succès.
Etant un débutant, je ne vois pas comment combiner var_dump et $_POST. Aurais-tu l'amabilité de m'éclairer davantage ?
 
Merci encore.
tete278

Reply

Marsh Posté le 22-01-2009 à 14:01:08    

Documentation PHP :

Citation :

var_dump($var) retourne les informations structurées d'une variable, y compris son type et sa valeur. Les tableaux et les objets sont explorés récursivement, avec des indentations, pour mettre en valeur leur structure.


$_POST est une variable particulière.
Il suffit juste de faire un var_dump($_POST); pour avoir le contenu de $_POST...
 
[Edit] Mise en valeur du lien vers la doc.


Message édité par macgawel le 22-01-2009 à 14:02:13
Reply

Marsh Posté le 22-01-2009 à 14:43:18    

tete278 a écrit :

Bonjour à tous,
 
omega2, je te remercie pour ta réponse.
J'ai modifié name="r['.$cpt.']" />  en name="r".$cpt /> sans succès.
Etant un débutant, je ne vois pas comment combiner var_dump et $_POST. Aurais-tu l'amabilité de m'éclairer davantage ?
 
Merci encore.
tete278


Dans un "echo" :  

Citation :

name="r['.$cpt.']" />

devient

Citation :

name="r[1]" />


Citation :

name="r".$cpt />

devient

Citation :

name="r"1 />


 
Si tu regardes le code de la page telle qu'elle est reçu par ton navigateur (menu "Affichage"/"code source de la page" avec firefox par exemple) tu verras bien l'erreur que t'as faite.
Là, entre ce que je t'ai dit et ce que t'as indiqué macgawel, je ne vois pas comment t'aider d'avantage sauf à te donner la réponse. Je te laisse donc chercher un peu, tu verras qu'en regardant le code php et ce que reçoit le navigateur, t'arriveras à trouver rapidement comment écrire cette ligne.

Reply

Marsh Posté le 22-01-2009 à 14:43:18   

Reply

Marsh Posté le 22-01-2009 à 14:52:49    

Bonjour macgawel,
 
Merci pour ta réactivité. Je viens de faire ce que tu proposes, à savoir var_dump($_POST); dans le fichier correction.php et ce qui m'est retourné ne me donne pas comme variables r1, r2, etc mais seulement ceci : ["r"]=> string(2) "ee"
J'en déduis que mes variables ne sont toujours pas crées normalement et j'avoue sécher sur ce problème. Une autre piste ?
Merci d'avance.
 
tete278

Reply

Marsh Posté le 22-01-2009 à 15:22:09    

Je vois qu'omega2 est égelement intervenu au moment où je faisais ma réponse.
J'ai modifié en mettant name="r.$cpt" et en regardant le code interprété, je retrouve exactement la même chose donc ne retrouve ni r1 ,ni r2 ...
Je suis désolé mais je sèche.
tete278

Reply

Marsh Posté le 22-01-2009 à 19:37:09    

1ere erreur : tu sépares R et $cpt par un point, donc tu obtiens r.$cpt  
2eme erreur : PHP n'interprète pas les variables dans les guillemets simples :

Code :
  1. $var = 1;
  2. echo 'name="r$var"'; //affiche : name="r$var"
  3. echo "name=\"r$var\"; //affiche : name="r1"


La deuxième syntaxe (qui à l'avantage de marcher) est moins lisible (il faut échapper les guillemets doubles de l'attribut html name).
Tu peux donc faire :

Code :
  1. name="<?php echo $var ?>"

Reply

Marsh Posté le 23-01-2009 à 13:19:59    

Bonjour luc@s et merci pour ta réponse.
 
Je n'ai vraiment pas acquis les bases car je n'avais pas vu cette erreur.
Ceci ne fonctionne néanmoins toujours pas car, en regardant dans le code vu par le navigateur j'obtiens ceci :
<input type="text" size="30" name=\"r$cpt\" /> alors que l'on devrait retrouver name = "r1" puis name = "r2", etc si je ne m'abuse.
 
Est-ce que je me trompe ?
Merci un jour, merci toujours....
tete278

Reply

Marsh Posté le 23-01-2009 à 14:45:37    

omega2 a écrit :

Dans un "echo" ...


petit extrais de mon message précédant vu son importance par rapport à ce qui suit.  

tete278 a écrit :

Bonjour luc@s et merci pour ta réponse.
 
Je n'ai vraiment pas acquis les bases car je n'avais pas vu cette erreur.
Ceci ne fonctionne néanmoins toujours pas car, en regardant dans le code vu par le navigateur j'obtiens ceci :
<input type="text" size="30" name=\"r$cpt\" /> alors que l'on devrait retrouver name = "r1" puis name = "r2", etc si je ne m'abuse.
 
Est-ce que je me trompe ?
Merci un jour, merci toujours....
tete278

Vu ce que ton navigateur reçoit, ton texte n'est pas dans un bloc de code php et donc pas dans un echo.
Si tu veux que le php transforme le "$cpt" en une donné utile alors il faut lui dire que cette partie du fichier est du code php. Pour ça, il faut que tu ouvres un nouveau bloc php ("<?php" par exemple) et que tu le refermes plus loin ("?>" ). Tout ce qui sera entre ces deux éléments doit être du code php valide (donc pas de texte html qui traine entre ces deux balises sans être dans une chaine de caractère)
 
Le bloc php le plus court (celui qui ne prend que la variable) est : "<?php echo $cpt; ?>" (sans les guillemets)
Le bloc php raccourcis équivalent est "<?= $cpt; ?>" (attention, peut ne pas être considéré comme du php en fonction des réglages)
Si tu prends la ligne entière d'html, tu retombes dans ce que t'avais proposé plus haut avec juste "<?php" et "?>" à rajouter.

Reply

Marsh Posté le 23-01-2009 à 15:52:16    

Bonjour omega2,
 
Je suis d'accord sur le principe que tu exposes mais il semble pourtant que mes balises indiquent bien que ce soit du php, pour preuve le code complet ci-dessous :
 

Code :
  1. <form action="membreSuite.php" method="post">
  2. <?php
  3. if (!$base)
  4. {echo 'impossible d\'ouvrir la base.';
  5. }
  6. else
  7. {
  8. $Par = 5; // Nbre maximal de lignes à afficher
  9. // Récupération de l'étape en cours'
  10. $req = "SELECT * FROM exo_resultats WHERE id =".$_SESSION['id_enregist'];
  11. $res =mysql_query($req,$link) or die ('Erreur :'.mysql_errno().mysql_error());
  12. $rows = mysql_num_rows($res);
  13. while ($rows=mysql_fetch_array($res))
  14.  {
  15.   $etape = trim($rows['etape']);
  16.  }
  17.  // Déclaration de la matrice (tableau multidimensionnel)
  18.  $matrice[]=array('Hydrogène','1','(K)1','(K)<sup>1</sup>');
  19.  $matrice[]=array('Hélium','2','(K)2','(K)<sup>2</sup>');
  20.  $matrice[]=array('Lithium','3','(K)2(L)1','(K)<sup>2</sup>(L)<sup>1</sup>');
  21.  $matrice[]=array('Béryllium','4','(K)2(L)2','(K)<sup>2</sup>(L)<sup>2</sup>');
  22.  $matrice[]=array('Bore','5','(K)2(L)3','(K)<sup>2</sup>(L)<sup>3</sup>');
  23.  $matrice[]=array('Carbone','6','(K)2(L)4','(K)<sup>2</sup>(L)<sup>4</sup>');
  24.  $matrice[]=array('Azote','7','(K)2(L)5','(K)<sup>2</sup>(L)<sup>5</sup>');
  25.  $matrice[]=array('Oxygène','8','(K)2(L)6','(K)<sup>2</sup>(L)<sup>6</sup>');
  26.  $matrice[]=array('Fluor','9','(K)2(L)7','(K)<sup>2</sup>(L)<sup>7</sup>');
  27.  $matrice[]=array('Néon','10','(K)2(L)8','(K)<sup>2</sup>(L)<sup>8</sup>');
  28.  $_SESSION['matrice']=$matrice;
  29.  shuffle($_SESSION['matrice']); // mélange aléatoirement le tableau
  30.  $_SESSION['exo1_trier']=0;
  31. }
  32. $idQuestions= array_rand($_SESSION['matrice'] , $Par); // Extrait $Par éléments de $_SESSION['matrice']
  33. echo '<form action='."membreSuite.php".'method='."post".'><ul> ';
  34. $cpt = 0 ;
  35. for ($cpt = 0 ; $cpt < sizeof($idQuestions) ;$cpt ++)
  36. {
  37.  $key = $idQuestions[$cpt];
  38.  $element = $_SESSION['matrice'][$key];
  39.  //ici, je pose la question
  40.  echo '<input type="hidden" name="questions[]" value="'.$key.'">'; // le numero de la question
  41.  echo '<li> Quelle est la structure électronique de l\'élément '.$_SESSION['matrice'][$key][0].' ('.$_SESSION['matrice'][$key][1]. ' électrons) ? '.'<input type="text" size="30" name=\"r$cpt\" /></li>';
  42.  $question['.$cpt.'] = $_SESSION['matrice'][$key][0];
  43.  $electrons['.$cpt.'] = $_SESSION['matrice'][$key][1];
  44.  $reponse['.$cpt.'] = $_SESSION['matrice'][$key][3];
  45.  $attendue['.$cpt.'] = $_SESSION['matrice'][$key][2];
  46.  unset ($_SESSION['matrice'][$key]); // Supprime l'élément en cours
  47. }
  48. echo'</ul>';
  49. ?>
  50. <input type="hidden" name="question1" value="<?php echo $question1; ?>">
  51. <input type="hidden" name="electrons1" value="<?php echo $electrons1; ?>">
  52. <input type="hidden" name="reponse1" value="<?php echo $reponse1; ?>">
  53. <input type="hidden" name="attendue1" value="<?php echo $attendue1; ?>">
  54. <input type="hidden" name="question2" value="<?php echo $question2; ?>">
  55. <input type="hidden" name="electrons2" value="<?php echo $electrons2; ?>">
  56. <input type="hidden" name="reponse2" value="<?php echo $reponse2; ?>">
  57. <input type="hidden" name="attendue2" value="<?php echo $attendue2; ?>">
  58. <input type="hidden" name="question3" value="<?php echo $question3; ?>">
  59. <input type="hidden" name="electrons3" value="<?php echo $electrons3; ?>">
  60. <input type="hidden" name="reponse3" value="<?php echo $reponse3; ?>">
  61. <input type="hidden" name="attendue3" value="<?php echo $attendue3; ?>">
  62. <input type="hidden" name="question4" value="<?php echo $question4; ?>">
  63. <input type="hidden" name="electrons4" value="<?php echo $electrons4; ?>">
  64. <input type="hidden" name="reponse4" value="<?php echo $reponse4; ?>">
  65. <input type="hidden" name="attendue4" value="<?php echo $attendue4; ?>">
  66. <input type="hidden" name="question5" value="<?php echo $question5; ?>">
  67. <input type="hidden" name="electrons5" value="<?php echo $electrons5; ?>">
  68. <input type="hidden" name="reponse5" value="<?php echo $reponse5; ?>">
  69. <input type="hidden" name="attendue5" value="<?php echo $attendue5; ?>">
  70. <input type="hidden" name="Par" value="<?php echo $Par; ?>">
  71. <input type="hidden" name="MAJ" value="<?php echo $MAJ; ?>">
  72. <input type="submit" name="connexion" value="Vérifier">
  73. </form>


Qu'en dis-tu ?
Encore merci pour ton aide.
tete278

Message cité 1 fois
Message édité par tete278 le 23-01-2009 à 17:36:24
Reply

Marsh Posté le 23-01-2009 à 15:57:10    

J'en dis que dans ce cas, t'as pas lu le dernier message de luc@s. :pfff:  
 
et qu'en passant ton code serait plus lisible s'il était posté entre [ code] et [ /code] (sans les espaces)

Reply

Marsh Posté le 23-01-2009 à 16:55:09    

Mille pardons omega2, mais j'ai lu le dernier message de luc@s mais ne l'ai sans doute pas compris. Il fait référence à 2 syntaxes, la première que j'ai choisie consistant à mettre

Code :
  1. "name=\"r$var\";


et la seconde  

Code :
  1. name="<?php echo $var ?>"

que je n'ai pas choisie car ajoutant les balises <?php et ?> que j'avais déjà.
 
Désolé de t'avoir énervé mais ce n'est pas de la mauvaise volonté de ma part.
tete278


Message édité par tete278 le 23-01-2009 à 17:06:42
Reply

Marsh Posté le 23-01-2009 à 17:01:54    

Puisque tu dis avoir lu son message. De laquelle des deux lignes ci-dessous ta ligne à toi se rapproche le plus? Regarde bien, il y a une subtilité entre les deux. ;)

tete278 a écrit :

Code :
  1. echo '<li> Quelle est la structure électronique de l\'élément '.$_SESSION['matrice'][$key][0].
  2. ' ('.$_SESSION['matrice'][$key][1].
  3. ' électrons) ? '.
  4. '<input type="text" size="30" name=\"r$cpt\" /></li>';



 
EDIT : Rajout de retour à la ligne pour pas casser l'affichage du forum.


Message édité par omega2 le 23-01-2009 à 17:03:46
Reply

Marsh Posté le 23-01-2009 à 17:11:23    

Partant du fait que ma variable d'incrémentation se nomme $cpt, ma ligne 4 se rapproche forcément davantage de sa ligne 3.
tete278
 
PS: j'ai rajouté l'antislash

Reply

Marsh Posté le 23-01-2009 à 17:17:29    

Raté. Tes chaines commencent par ' donc ça se rapproche de sa ligne 2.

Reply

Marsh Posté le 23-01-2009 à 17:45:42    

Op la, je ne devrais pas me lancer la dedans à mon âge ....., tu as parfaitement raison et je vais modifier ça tranquillement ce week-end à la maison et te tiens au courant.
Un grand merci et ... à bientôt.
tete278

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed