passer une variable ARRAY dans post - un détail encore!

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

30 sept. 2011, 05:06

echo '<td align="left" valign="top">'.$nom_eleve.'</td>
<td align="left" valign="top"><input type="text" name="resultat[$id_eleve]" size="3" maxlength = "3"/><br></td>
<td align="left"><textarea name="commentaire_perso[$id_eleve]"rows="8" cols="50"></textarea></td>
<td align="left" valign="top">'.$select.'</td></tr>';

non
echo '<td align="left" valign="top">'.$nom_eleve.'</td>
<td align="left" valign="top"><input type="text" name="resultat['.$id_eleve.']" size="3" maxlength = "3"/><br></td>
<td align="left"><textarea name="commentaire_perso[$id_eleve]"rows="8" cols="50"></textarea></td>
<td align="left" valign="top">'.$select.'</td></tr>';

la faut revoir l'utilisation des chaines de caractères et la différence entre " et '.

Après tu n' a pas besoin de passer le groupe ou quoi que se soit d'autre se référent à l'élève autre que l'id (d'ou le champs hidden de mon exemple) lorsque tu a cette valeur tu a tous le reste.

d'ailleurs tu n'a pas besoin de re renseigner ces valeurs (sinon c'est qu'il y a un soucis).

Après tu peux toujours passer un tableau sérializé (serialize) dans un champ hidden.

il est aussi possible d'utiliser les sessions pour stocker des infos entre deux pages.

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

Eléphant du PHP | 139 Messages

30 sept. 2011, 05:17

La raison pour laquelle je renseigne les autres données sur l'élève est qu'ensuite, je vais imprimer les bulletins pour les 300 élèves. Si pour les 300 élèves, je vais dans une table chercher les info de l'élève, une autre celles de l'enseignant et encore pour les resultats ca sera éternel à traiter. Je me suis donc dit qu'il serait plus pratique de créer une table "octobre" qui contiendrait toutes les info pour faire le bulletin. Est-ce une bonne stratégie?

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

30 sept. 2011, 06:00

non, un sgbd c'est fait pour traiter des gros volume de données.

Je te conseil de faire un tour sur les tutos de http://sqlpro.developpez.com

notamment les formes normales ;)

rajoute a cela que tu ne peux savoir si le formulaire va être ou non modifié, c'est une très mauvaise idée.

le principe c'est de stocker dans les tables et si besoin de générer un affichage pour impression (html , pdf etc).

la par exemple il pourrez y avoir, au moins, 4 tables
create table eleves (
	ideleve
	nom
	prenom
	etc etc
)

create table professeurs (
	idprofs
	nom
	prenom
	etc etc
)

create tables commentaires (
	idcommentaire
	commentaire
)

create table commenttrimestre (
	id
	ideleve
	idprofs
	idcommentaire
	appreciation
        datecommentaire
)
bon après faut voir la complexité de ton application pour déterminer le modèle, ceci n'est qu'un exemple.

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

Eléphant du PHP | 139 Messages

30 sept. 2011, 06:18

C'est exactement les quatre tables que j'utilise. Le système de gestion du dossier des élèves et des absences que j'ai développé fonctionne somme toutes très bien. C'est la première fois dans tous les scripts que j'ai écrits que j'ai à travailler avec des envois de tableaux et je t'avoue que je suis un peu perdu. Le reste (production du bulletin à partir de la BDD en pdf, accès aux groupes personnalisés des enseignants, etc.) est prêt, il ne me reste qu'à régler l'insertion des données du formulaire dans la bdd pour tomber dans les derniers ajustements. Je dois terminer le tout pour lundi matin et je commence à trouver que je tourne pas mal en rond. Là il est près de minuit ici et je vais aller me coucher. Demain, dès 13h30, je me remets à la tâche pour 12 longues heures. Toute aide serait appréciée. Je suis même prêt à payer un certain montant par paypal.

Mammouth du PHP | 2278 Messages

30 sept. 2011, 13:00

Je mets peu à peu de l'ordre dans mes affaires. voici où j'en suis. Mon formulaire affiche très bien, mes champs peuvent être remplis. j'ai mis un indice aux variables (id_eleve). Maintenant, comment je peux pousser tout ça à mon autre script?
    while ($ligne = mysql_fetch_assoc($result))
        {       
            $id_eleve=$ligne["id_eleve"];    
            $nom_eleve=$ligne["nom"];
            $groupe=$ligne["groupe"];    

// ******* valeurs que je veux passer ****************

            echo '<td align="left" valign="top">'.$nom_eleve.'</td>
                  <td align="left" valign="top"><input type="text" name="resultat[$id_eleve]" size="3" maxlength = "3"/><br></td>
                  <td align="left"><textarea name="commentaire_perso[$id_eleve]"rows="8" cols="50"></textarea></td>
   			   	  <td align="left" valign="top">'.$select.'</td></tr>';

// ******* que dois-je mettre ici pour passer le id_eleve, nom_eleve, groupe, resultat, commentaire_perso et commentaire (qui vient du select) ? 
Tu crées ainsi un tableau $resultat dont chaque ligne sera le résultat de l'élève concerné, un tableau $commentaire_perso dont chaque ligne sera le commentaire de l'élève concerné.
Pour le select, solution alignée sur tes autres choix:

//..
// Ajout MB..
$select_partiel = "<option>TB</option><option>B</option></select>"; // on ne crée que la fin du select
print "<form method = 'post' action = 'verifier.php'><table>";

foreach ($liste as $eleve)
{
	$nom_eleve = $eleve['nom'];
	$id_eleve = $eleve['id'];	
	$nom_var = "individu_".$id_eleve."[]";
	$nom_com_std = "commentaire_standard[$id_eleve]";
        // ajout MB
	$select ="<select name = '$nom_com_std' >".$select_partiel; //quand on connait l'id de l'élève, on peut donner un nom au select
	          echo '<tr><td align="left" valign="top">'.$nom_eleve.'</td>
                  <td align="left" valign="top"><input type="text" name="resultat[$id_eleve]" size="3" maxlength = "3"/></td>
                  <td align="left"><textarea name="commentaire_perso[$id_eleve]"rows="8" cols="50"></textarea></td>
   			   	  <td align="left" valign="top">'.$select.'</td></tr>';

}
print "</table>
<button type = 'submit'>OK</button>
</form>";
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 139 Messages

30 sept. 2011, 21:52

J'ai passé la journée à essayer de comprendre les Array et je crois que ça s'en vient! Afin de progresser dans mon script, j'aurais besoin de deux infos:

1 dans le script qui suit, comment je fais afficher, dans le echo du bas, seulement le commentaire 2 (comm_2) ou le resultat 3(res_3)?...pas tout le tableau.
2 dans le verifier.php comment je peut faire afficher le commentaire 2 (comm_2) ou le resultat 3(res_3)?

Si j'ai les réponses à ces questions, je crois que je pourrai arriver à terminer mon script. En attendant vos réponses, je continue à fouiller.
<?PHP

$liste = array(
        array("id_eleve"=>"1","commentaire_perso" =>"com_perso_1","commentaire"=>"com_1","resultat"=>"res_1"),
        array("id_eleve"=>"2","commentaire_perso" =>"com_perso_2","commentaire"=>"com_2","resultat"=>"res_2"),      
        array("id_eleve"=>"3","commentaire_perso" =>"com_perso_3","commentaire"=>"com_3","resultat"=>"res_3")
        ); // pour pouvoir tester simule la bdd


$i=1;
$entree = "";


foreach ($liste as $eleve)
{
        $id_eleve = $eleve['id_eleve'];     
        $commentaire_perso = $eleve['commentaire_perso'];
        $commentaire = $eleve['commentaire'];     
        $resultat = $eleve['resultat'];     

        $nom_var = "individu_".$id_eleve."[]";
        $entree.= "
        <p>
        <input type = 'text' readonly = 'readonly' name ='$nom_var' value = '$commentaire_perso' />
        <input type = 'text' readonly = 'readonly' name ='$nom_var' value='$commentaire' />
        <input type = 'text' readonly = 'readonly' name ='$nom_var' value='$resultat' />";
        $i++;
}

*****************************************
echo ????????????????????????????????????;
*****************************************
/*  print "
	<form method = 'post' action = 'verifier.php'>
	$entree
	<button type = 'submit'>OK</button>
	</form>

";
 */

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

30 sept. 2011, 22:10

$liste[1]['commentaire_perso'] pour le second commentaire ..

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

Eléphant du PHP | 139 Messages

30 sept. 2011, 22:33

Ce n'était pas vraiment le sens de ma question, je n'étais pas assez clair. Ce n'est pas la valeur du array que je voulais récupérer, mais celle entrée par l'utilisateur.

Je crois que je commence à comprendre mon problème. Par exemple, dans le code précédent, je lis les valeurs du array, je les place dans un formulaire (très pratique si l'utilisateur à déjà entré des données dans une session précédente). Je croyais que $entree était une variable array. Je vois bien maintenant que ce n'est pas le cas. J'en déduis donc que je dois créer une variable array qui contiendra les résultats entrés lors de l'appui sur le bouton ok. Est-ce que cette variable est créée comme la première? Est-ce que je crée une boucle pour la remplir? Est-ce que je dois la serializer pour l'envoyer à verifier.php? Je la fait afficher comment dans verifier.php?

Eléphant du PHP | 139 Messages

01 oct. 2011, 01:00

Si quelqu'un a quelques minutes à me consacrer, j'apprécierais grandement.

Merci!

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

01 oct. 2011, 01:22

perso globalement je ne comprend rien a ce que tu veux faire, les infos fournis dans le formulaire sont envoyé au fichier "action" de ta déclaration de formulaire !
donc dans verifier.php il a toute les infos du formulaire, les autres info sont récupéré a partir de ce qu'il y a dans le formulaire ...

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

Eléphant du PHP | 139 Messages

01 oct. 2011, 01:39

Si tu as quelques minutes je t'explique plus clairement. Je réalise en relisant le post que je semble tourner en rond, mais je ne suis pas si nul que ça!

1. J'ai un formulaire issu d'une boucle sql (chaque élève du groupe de l'enseignant, son résultat (à fournir), deux commentaires (à fournir dont un issu d'un menu déroulant)
2. chaque enseignant le complète.
3. Il soumet le formulaire.
4. Les infos vont dans une BDD.
5. À partir des infos de tous les profs, on produit un bulletin.

J'ai donc la possibilité au niveau structure d'avoir:
a. (id_eleve1, resultat1, commentaire_perso1, commentaire1)
(id_eleve2, resultat2, commentaire_perso2, commentaire2)

ou

b. entree1(id_eleve, resultat, commentaire_perso, commentaire)
entree2(id_eleve, resultat, commentaire_perso, commentaire)


Ensuite après le "ok" j'insère tout ça dans la BDD.

Suis-je plus clair?

Mammouth du PHP | 2278 Messages

01 oct. 2011, 15:46

Il fallait distinguer entre ce que voit l'utilisateur, un tableau, et la structure interne qui, ici, est très facile à comprendre.
Je proposerai quand j'aurai un moment, une autre solution avec des tableaux en saisie...
<?PHP
$liste = array(
	array("id" =>114, "nom"=>"toto"),
	array("id" =>211, "nom"=>"toton"),	
	array("id" =>331, "nom"=>"totoche")
	);
$select_partiel = "<option>TB</option><option>B</option></select>";
print "<form method = 'post' action = 'verifier.php'><table>";
//La saisie a l'aspect d'une table, mais chaque champ a un nom personnel
// C'est à la récupéation qu'on en fera un tableau
foreach ($liste as $eleve)
{
	$nom_eleve = $eleve['nom'];
	$id_eleve = $eleve['id'];	
	$nom_var = "individu_".$id_eleve."[]";
	$nom_com_std = "commentaire_standard_$id_eleve";
	$nom_note  = "note_$id_eleve";
	$nom_com ="commentaire_$id_eleve";
	$select ="<select name = '$nom_com_std' >".$select_partiel;
	// j'utilise print pour que les noms des variables soient évalués mais ça marche avec echo "..." au lieu de echo '...'
	print "<tr><td align='left' valign='top'>$nom_eleve</td>
                  <td align='left' valign='top'><input type='text' name='$nom_note' size='3' maxlength = '3'/></td>
                  <td align='left'><textarea name='$nom_com' rows='8' cols='50'></textarea></td>
   			   	  <td align='left' valign='top'>$select</td></tr>";

}
print "</table>
<button type = 'submit'>OK</button>
</form>";	
lu par :
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang = "fr">
<META http-equiv = 'Content-Type' content = 'text/html; charset = utf-8'>
<?PHP
$liste = array(
	array("id" =>114, "nom"=>"toto"),
	array("id" =>211, "nom"=>"toton"),	
	array("id" =>331, "nom"=>"totoche")
	);
$tabeau_resultats = array();
foreach ($liste as $eleve)
{
	$nom_eleve = $eleve['nom'];
	$id_eleve = $eleve['id'];	
	$nom_var = "individu_".$id_eleve."[]";
	$nom_com_std = "commentaire_standard_$id_eleve";
        $nom_note  = "note_$id_eleve";
	$nom_com ="commentaire_$id_eleve";
	$note = $_POST[$nom_note];
	$commentaire = $_POST[$nom_com];
	$comm_std = $_POST[$nom_com_std];
	$tableau_resultats[$id_eleve] ['id'] = $id_eleve;
	$tableau_resultats[$id_eleve] ['note'] = $note;
	$tableau_resultats[$id_eleve] ['comm'] = $commentaire;
	$tableau_resultats[$id_eleve] ['comm_std'] = $comm_std;
}

print_r($tableau_resultats);	
?>

	

Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 139 Messages

01 oct. 2011, 20:03

Merci tout le monde! Mon problème est réglé. Maintenant que c'est fait, je termine mes autres scripts et je post la solution à mon problème. Maintenant J'AI COMPRIS!!

Eléphant du PHP | 139 Messages

01 oct. 2011, 21:05

Quelqu'un pourrait me dire pourquoi la valeur de mon commentaire issu de la table des commentaires et choisi dans un menu déroulant par l'utilisateur ne passe pas de l'autre côté du POST ???
{
	 $sqlcom =	'SELECT commentaire
			 	FROM table_commentaires
			 	ORDER BY positif DESC, commentaire ASC
				';
	$reqcom = mysql_query($sqlcom) or die('Erreur SQL !<br><font size="2">'.$sqlcom.'<br>'.mysql_error()); 

	$select = '<select name="commentaire"><option selected="selected"></option>';
	while($datacom = mysql_fetch_row($reqcom)) 
	   {
	        $commentaire=$datacom[0];
	        $select .= '<option value="'.$commentaire.'">'.$commentaire.'</option>'."\n";
	   } 
	$select_partiel .= '</select>'; 
}
{
    $reqaff = 	" 
    			SELECT $username.id_eleve, id_matiere, liste_eleves.nom, liste_eleves.id_eleve  
            	FROM jambon
            	INNER JOIN liste_eleves ON $username.id_eleve=liste_eleves.id_eleve
            	WHERE id_matiere='$id_groupe'
            	ORDER BY liste_eleves.nom
           		";
    $resultaff = mysql_query ($reqaff);
 }
    while ($ligne = mysql_fetch_assoc($resultaff))
        {       
            $id_eleve	=$ligne['id_eleve'];    
            $nom_eleve	=$ligne['nom'];
            $groupe		=$ligne['groupe'];
            $nom_var 	="individu_".$id_eleve."[]";
			$nom_com_std="commentaire_standard_$id_eleve";
			$nom_note 	="note_$id_eleve";
			$nom_com	="commentaire_$id_eleve";
			$choix		="<select name = '$nom_com_std' >".$select_partiel;


			echo "<br>";
    		echo "	<font face=Arial size=2>
        			<table align='left' cellspacing='2' cellpadding='2'><tr>
              		<td align='left' width ='150'><b>Nom de l'élève</b></td>
              		<td align='left'><b>Résultat</b></td>
              		<td align='left'><b>Commentaires</b></td>
              		<td align='left'><b>commentaires prédéfinis</b></td>
            		</tr>
					<tr>
					<td align='left' valign='top'>$nom_eleve</td>
					<td align='left' valign='top'><input type='text' name='$nom_note' size='3' maxlength = '3'/></td>
					<td align='left'><textarea name='$nom_com' rows='8' cols='50'></textarea></td>
					<td align='left' valign='top'>".$select."</td>
					</tr></font></table>";
      
      }


et de l'autre côté du POST
	if (isset($_POST['submit3']))
 		{
    		$id_groupe=$_POST['id_groupe'];	    	
	    	$rq = 
	    		"
	    		SELECT jambon.id_eleve, liste_eleves.nom 
	            FROM jambon
	            INNER JOIN liste_eleves ON $username.id_eleve=liste_eleves.id_eleve
	            WHERE id_matiere='$id_groupe'
	            ORDER BY liste_eleves.nom
	           	";
	    	$result = mysql_query ($rq);	
			$tableau_resultats = array();
   		 	echo "</br>";
   		 	while ($ligne = mysql_fetch_assoc($result))
    		
    		{       
    	    	
    	    	$nom_eleve = $ligne['nom'];
    	    	$id_eleve = $ligne['id_eleve'];       
    	    	$nom_var = "individu_".$id_eleve."[]";
    	    	$nom_com_std = "commentaire_standard_$id_eleve";
    	    	$nom_note  = "note_$id_eleve";
    	    	$nom_com ="commentaire_$id_eleve";
    	    	$note = $_POST[$nom_note];
    	    	$commentaire = $_POST[$nom_com];
    	    	$comm_std = $_POST[$nom_com_std];
    	    	$tableau_resultats[$id_eleve] ['id'] = $id_eleve;
    	    	$tableau_resultats[$id_eleve] ['note'] = $note;
    	    	$tableau_resultats[$id_eleve] ['comm'] = $commentaire;
    	    	$tableau_resultats[$id_eleve] ['comm_std'] = $comm_std;
			
			
				echo 	$ligne['id_eleve'].$ligne['nom'].
						"eleve ".$tableau_resultats[$id_eleve]['id'].
						" a ".$tableau_resultats[$id_eleve]['note'].
						" et ".$tableau_resultats[$id_eleve]['comm'].
						" comme commentaire".
						" et ".$tableau_resultats[$id_eleve]['comm_std'].
						" comme commentaire choix".
						"</br>";
			
			
			
			}			
	
			
			exit();
			break;        	
       	}


Mammouth du PHP | 2278 Messages

02 oct. 2011, 09:14

parce que ton "<select name = 'commentaire'...>" ne correspond pas à la façon dont tu tentes de le relire.
   $select = '<select name="commentaire"><option selected="selected"></option>';
        while($datacom = mysql_fetch_row($reqcom))
           {
                $commentaire=$datacom[0];
                $select .= '<option value="'.$commentaire.'">'.$commentaire.'</option>'."\n";
           } 
        $select_partiel .= '</select>'; 
crée un $select de nom 'commentaire' dont il manque le "</select>" et un $select_partiel dont il manque le début.
$choix          ="<select name = '$nom_com_std' >".$select_partiel;
crée une variable $choix qui est un <select> portant le bon nom, mais sans contenu et non utilisée
<td align='left' valign='top'>".$select."</td>
utilise un <select> de même nom pour tous les élèves, nom qui ne correspond pas à la façon dont on le relit:
$nom_com_std = "commentaire_standard_$id_eleve";
$comm_std = $_POST[$nom_com_std];
Je dirais cependant que les problèmes de ce genre se résolvent en :
1) Examinant le code source produit par PHP; avec Firefox CTRL+U...
2) Faisant afficher le $_POST dans le script récepteur...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD