Page 1 sur 2

Pbl d'envois multiple dans le même formulaire

Posté : 24 févr. 2009, 21:17
par alaingpl
Bonsoir,

Je crée un tableau dans un formulaire et j'envoie mon formulaire en post. A la réception du post, la valeur retenue par le formulaire est la dernière ligne de la variable .$row['nom']. soit 1 valeur.

Je souhaite que toutes les valeurs (en général 30) des input 'nom', 'prenom' et 'note' soient envoyées en même temps.

Mais je ne voit pas comment je peux faire. Si quelqu'un a un bout de solution, ce serait sympa. D'avance merci
while($row = mysql_fetch_array($req)) {
        echo '<tr>';
	//input des nom et prénom
        echo '<td ><center><input name="nom" value='.$row['nom'].'></center></td>';
        echo '<td><center><input  name="prenom" value="'.$row['prenom'].'"></center></td>';
	//input des notes pour chaque élèves
		echo '<td><center><input type="text" name="note">';
	//input de la classe
		echo '<input type="hidden" name=classe" value="'.$classe.'">';

Posté : 24 févr. 2009, 21:27
par sylvaing26
Remplace tous les noms de champ par le nom de l'eleve par exemple.
while($row = mysql_fetch_array($req)) { 
        echo '<tr>'; 
    //input des nom et prénom 
        echo '<td ><center><input name="nom_'.$row['nom'].'" value='.$row['nom'].'></center></td>'; 
        echo '<td><center><input  name="prenom_'.$row['nom'].'" value="'.$row['prenom'].'"></center></td>'; 
    //input des notes pour chaque élèves 
        echo '<td><center><input type="text" name="note_'.$row['nom'].'">'; 
    //input de la classe 
        echo '<input type="hidden" name=classe_'.$row['nom].'" value="'.$classe.'">';
Sinon pour eviter qu'il y ai le problème que deux eleves aient le même noms tu peux rajouter un champ id dans ta base pour que chaque eleve est un id et dans ce cas
while($row = mysql_fetch_array($req)) { 
        echo '<tr>'; 
    //input des nom et prénom 
        echo '<td ><center><input name="nom_'.$row[id'].'" value='.$row['nom'].'></center></td>'; 
        echo '<td><center><input  name="prenom_'.$row['id'].'" value="'.$row['prenom'].'"></center></td>'; 
    //input des notes pour chaque élèves 
        echo '<td><center><input type="text" name="note_'.$row['id'].'">'; 
    //input de la classe 
        echo '<input type="hidden" name=classe_'.$row['nom].'" value="'.$classe.'">';

Posté : 24 févr. 2009, 21:50
par alaingpl
bonsoir,

Merci de l'aide, malheureusement ça ne fonctionne pas mais peut être que le soucis viens de la réception dont voici le code ci- dessous :
if(isset($_POST['nom']))    $nom=$_POST['nom'];
if(isset($_POST['prenom']))    $prenom=$_POST['prenom'];
if(isset($_POST['note']))    $note=$_POST['note'];
if(isset($_POST['classe']))    $classe=$_POST['classe'];
if(isset($_POST['matiere']))    $matiere=$_POST['matiere'];
if(isset($_POST['periode']))    $periode=$_POST['periode'];

$sql = "INSERT INTO note (id, classe, pseudo, $matiere, periode) VALUES ('', '$classe', '$nom', '$note', '$periode' )";

Posté : 24 févr. 2009, 21:56
par sylvaing26
Oui car il fausdrai refaire appele à la requete sql
while($row = mysql_fetch_array($req)) { if(isset($_POST['nom_'.$row['nom'].'']))    $nom=$_POST['nom_'.$row['nom'].'']; 
if(isset($_POST['prenom_'.$row['nom'].'']))    $prenom=$_POST['prenom_'.$row['nom'].'']; 
if(isset($_POST['note_'.$row['nom'].'']))    $note=$_POST['note_'.$row['nom'].'']; 
if(isset($_POST['classe_'.$row['nom'].'']))    $classe=$_POST['classe_'.$row['nom'].'']; 
if(isset($_POST['matiere_'.$row['nom'].'']))    $matiere=$_POST['matiere_'.$row['nom'].'']; 
if(isset($_POST['periode_'.$row['nom'].'']))    $periode=$_POST['periode_'.$row['nom'].'']; 

$sql = "INSERT INTO note (id, classe, pseudo, $matiere, periode) VALUES ('', '$classe', '$nom', '$note', '$periode' )";}
Quelque chose de ce gout là

Posté : 24 févr. 2009, 23:13
par Berzemus
Et, genre, protéger les variables contre l'injection SQL ?

addslashes() , mysql_real_escape_string() , y'a le choix.

(je dis c'était pas encore mentionné, je me doute que tout le monde y pense, mais un rappel ne fait jamais de tort)

Posté : 24 févr. 2009, 23:21
par Aureusms
J'ai eu le cas cet après midi avec un update de password...

Posté : 25 févr. 2009, 16:53
par alaingpl
Merci pour les 2 derniers messages en ce qui concerne les injections sql et j'en tiendrai compte.

J'ai essayé plusieurs solutions en plus de c'elles de sylvaing26 mais aucun résultat, soit il ne lit ou ne réceptionne pas les
name ="nom_'.$row['id'].'" value='.$row['nom'].' 
Ce que je souhaite faire:
En fonction d'une liste d'élève inscrits dans une bd et de 2 contraintes : matière et période, enregistrer la note de chaque élève et envoyer toutes les notes en même temps.

Mon problème :
le code :
if(isset($_POST['nom']))    $nom=$_POST['nom']; 
enregistre dans la bd qu'une seule note (la dernière du tableau (mysql_fetch_array).
Pour résumer mon problème : Comment envoyer plusieurs infos dans une seule et même variable en fonction de plusieurs contraintes de nom, prénom...

Si quelqu'un sait comment il faut faire car la je suis à court d'idée.
D'avance merci

Posté : 26 févr. 2009, 10:42
par sylvaing26
Tu as bien rajouté MYSQL CONNECT .... $req= ..... dans l'autre page ? avant
while($row = mysql_fetch_array($req)) { 
if(isset($_POST['nom_'.$row['nom'].'']))    $nom=$_POST['nom_'.$row['nom'].''];  
if(isset($_POST['prenom_'.$row['nom'].'']))    $prenom=$_POST['prenom_'.$row['nom'].''];  
if(isset($_POST['note_'.$row['nom'].'']))    $note=$_POST['note_'.$row['nom'].''];  
if(isset($_POST['classe_'.$row['nom'].'']))    $classe=$_POST['classe_'.$row['nom'].''];  
if(isset($_POST['matiere_'.$row['nom'].'']))    $matiere=$_POST['matiere_'.$row['nom'].''];  
if(isset($_POST['periode_'.$row['nom'].'']))    $periode=$_POST['periode_'.$row['nom'].''];  

$sql = "INSERT INTO note (id, classe, pseudo, $matiere, periode) VALUES ('', '$classe', '$nom', '$note', '$periode' )";}
 

Posté : 26 févr. 2009, 11:40
par thehawk
et tu fais bien un mysql_query($sql); ?

Posté : 26 févr. 2009, 15:19
par alaingpl
Voici le code où j'inscrit les notes pour chacun des élèves. Là j'ai bien la bonne liste en fonction de la classe et les input en face de chaque nom pour y inscrire la note de chaque élève.
require('connect.php');

$sql= 'SELECT id, nom, prenom FROM eleves  WHERE classe="'.$classe.'" ORDER BY id ';

$req = mysql_query ($sql) or die ('Erreur : '.mysql_error() );

    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
  while($row = mysql_fetch_array($req)) {  
        echo '<tr>';  
    //input des nom et prénom  
        echo '<td ><center><input name="nom_'.$row['id'].'" value='.$row['nom'].'></center></td>';  
        echo '<td><center><input  name="prenom_'.$row['id'].'" value="'.$row['prenom'].'"></center></td>';  
    //input des notes pour chaque élèves  
        echo '<td><center><input type="text" name="note_'.$row['id'].'">';  
    //input de la classe  
        echo '<input type="hidden" name=classe_'.$row['nom'].'" value="'.$classe.'">';
        echo '</tr>'."\n";
    }
    echo '</table>'."\n";

    // fin du tableau.

mysql_close(); 
		}
et je fais ceci à la réception
$sql= 'SELECT id, nom, prenom FROM eleves  WHERE classe="'.$classe.'" ORDER BY id ';

	$req = mysql_query ($sql) or die ('Erreur : '.mysql_error() );
	if(isset($_POST['nom_'.$row['nom'].'']))    $nom=$_POST['nom_'.$row['nom'].'']; 
	
while($row = mysql_fetch_array($req)) 
	{  
if(isset($_POST['nom_'.$row['nom'].'']))    $nom=$_POST['nom_'.$row['nom'].''];   
if(isset($_POST['prenom_'.$row['nom'].'']))    $prenom=$_POST['prenom_'.$row['nom'].''];   
if(isset($_POST['note_'.$row['nom'].'']))    $note=$_POST['note_'.$row['nom'].''];   
if(isset($_POST['classe_'.$row['nom'].'']))    $classe=$_POST['classe_'.$row['nom'].''];   
if(isset($_POST['matiere_'.$row['nom'].'']))    $matiere=$_POST['matiere_'.$row['nom'].''];   
if(isset($_POST['periode_'.$row['nom'].'']))    $periode=$_POST['periode_'.$row['nom'].''];   

$sql = "INSERT INTO note (id, classe, pseudo, $matiere, periode) VALUES ('', '$classe', '$nom', '$note', '$periode' )";
	}
et là, tout est vide, il n'y a rien. Pour vérifier, je fais des echo des variables

J'ai essayé d'autres solutions comme faire passer en POST la variable $row du while mais sans résultat

Je n'ai plus d'idée et d'avance merci pour votre aide

Posté : 26 févr. 2009, 16:18
par sylvaing26
le post se fait sur une autre page pour le traitement ?
dans ce cas dans l'autre page il faut aussi mettre
require('connect.php');
$sql= 'SELECT id, nom, prenom FROM eleves  WHERE classe="'.$classe.'" ORDER BY id '; 

    $req = mysql_query ($sql) or die ('Erreur : '.mysql_error() ); 
    if(isset($_POST['nom_'.$row['nom'].'']))    $nom=$_POST['nom_'.$row['nom'].''];  
     
while($row = mysql_fetch_array($req))  
    {   
if(isset($_POST['nom_'.$row['nom'].'']))    $nom=$_POST['nom_'.$row['nom'].''];    
if(isset($_POST['prenom_'.$row['nom'].'']))    $prenom=$_POST['prenom_'.$row['nom'].''];    
if(isset($_POST['note_'.$row['nom'].'']))    $note=$_POST['note_'.$row['nom'].''];    
if(isset($_POST['classe_'.$row['nom'].'']))    $classe=$_POST['classe_'.$row['nom'].''];    
if(isset($_POST['matiere_'.$row['nom'].'']))    $matiere=$_POST['matiere_'.$row['nom'].''];    
if(isset($_POST['periode_'.$row['nom'].'']))    $periode=$_POST['periode_'.$row['nom'].''];    

 mysql_query("INSERT INTO note (id, classe, pseudo, $matiere, periode) VALUES ('', '$classe', '$nom', '$note', '$periode' )"); 
 

Posté : 26 févr. 2009, 17:37
par alaingpl
Oui le post se fait dans une autre page dont voici l'ensemble du code php ci dessous. je confirme que l'affichage des champs de la table <eleves> se fait correctement
<?PHP
if(isset($_POST['classe']))    $classe=$_POST['classe'];

//echo $classe ;

require('connect.php');

$sql= 'SELECT id, nom, prenom FROM eleves  WHERE classe="'.$classe.'" ORDER BY id ';

$req = mysql_query ($sql) or die ('Erreur : '.mysql_error() );


    // début du tableau
	echo 'Eleves de la classe '.$classe.'<br><br>' ;
?>
<form name="evals" action="index.php?page=verif_evals.php"  method="post">
<table>
	<tr>
		<td>
		<select name="matiere">
			<option value="">Sélectionnez une matière</option>
			<option value="francais">Français</option>
			<option value="maths">Mathématiques</option>
			<option value="anglais">Anglais</option>
		</select>
			
		</td>
		<td></td>
		<td>
		<select name="periode">
			<option value="">Sélectionnez une période</option>
			<option value="septembre">Septembre</option>
			<option value="octobre">Octobre</option>
			<option value="novembre">Novembre</option>
			<option value="décembre">Décembre</option>
			<option value="janvier">Janvier</option>
			<option value="février">Février</option>
			<option value="mars">Mars</option>
			<option value="avril">Avril</option>
			<option value="mai">Mai</option>
			<option value="juin">Juin</option>
		</select>
			
		</td>
	</tr>
</table>
<br><br>
<?PHP
	
    echo '<table bgcolor="#FFFFFF" border=\"1\">'."\n";
       //1ere ligne on on affiche les titres
        echo '<tr>';
        echo '<td bgcolor="#669999"><center><b><u>Nom</u></b></center></td>';
        echo '<td bgcolor="#669999"><center><b><u>Prénom</u></b></center></td>';
		echo '<td>Notes</td>';
        echo '</tr>'."\n";
		
    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
  while($row = mysql_fetch_array($req)) {  
        echo '<tr>';  
    //input des nom et prénom  
        echo '<td ><center><input name="nom_'.$row['id'].'" value='.$row['nom'].'></center></td>';  
        echo '<td><center><input  name="prenom_'.$row['id'].'" value="'.$row['prenom'].'"></center></td>';  
    //input des notes pour chaque élèves  
        echo '<td><center><input type="text" name="note_'.$row['id'].'">';  
    //input de la classe  
        echo '<input type="hidden" name=classe_'.$row['nom'].'" value="'.$classe.'">';
		echo '<input type="hidden" name=row" value="'.$row.'">';
        echo '</tr>'."\n";
    }
    echo '</table>'."\n";

    // fin du tableau.

mysql_close(); 
		}
?> 
et la page de traitement dans laquelle doit se faire l' INSERT dans la bd :
<?PHP
require('connect.php'); 
$sql= 'SELECT id, nom, prenom FROM eleves  WHERE classe="'.$classe.'" ORDER BY id ';  

    $req = mysql_query ($sql) or die ('Erreur : '.mysql_error() );  
    if(isset($_POST['nom_'.$row['nom'].'']))    $nom=$_POST['nom_'.$row['nom'].''];   
      
while($row = mysql_fetch_array($req))   
    {    
if(isset($_POST['nom_'.$row['nom'].'']))    $nom=$_POST['nom_'.$row['nom'].''];     
if(isset($_POST['prenom_'.$row['nom'].'']))    $prenom=$_POST['prenom_'.$row['nom'].''];     
if(isset($_POST['note_'.$row['nom'].'']))    $note=$_POST['note_'.$row['nom'].''];     
if(isset($_POST['classe_'.$row['nom'].'']))    $classe=$_POST['classe_'.$row['nom'].''];     
if(isset($_POST['matiere_'.$row['nom'].'']))    $matiere=$_POST['matiere_'.$row['nom'].''];     
if(isset($_POST['periode_'.$row['nom'].'']))    $periode=$_POST['periode_'.$row['nom'].''];     

 mysql_query("INSERT INTO note (id, classe, pseudo, $matiere, periode) VALUES ('', '$classe', '$nom', '$note', '$periode' )"); 

	}
	

echo $classe ;
echo $nom ;
echo $note ;
echo $matiere ;
echo $periode ;
echo $prenom ;

    mysql_close();  
     
	}

?>
et pour être sur que les champs de la table <note> pour l'insertion des données sont corrects ci dessous le code sql de la table

Code : Tout sélectionner

CREATE TABLE `note` ( `id` int(11) NOT NULL auto_increment, `classe` varchar(10) NOT NULL, `pseudo` varchar(25) NOT NULL, `francais` varchar(3) default NULL, `maths` varchar(3) default NULL, `anglais` varchar(3) NOT NULL, `techno_rest` varchar(3) default NULL, `aps_sc` varchar(3) default NULL, `aps_opc` varchar(3) default NULL, `periode` varchar(25) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ;
Là, j'ai tout mis en ligne. Mais l'insertion dans la base bd ne fonctionne pas. Je fais un echo des variables, seules celles des posts : matiere et periode sont lues. Elles ont 1 seule donnée chacune !!
Le pbl viendrais soit : les variables ou les input ou les post ne sont pas capables de lire un tableau (array). Cela ne reste qu'une supposition de ma part.
Si quelqu'un a une solution, merci pour d'avance.

Posté : 26 févr. 2009, 18:45
par thehawk
Au dela du souci technique , je ne vois pas de <form action='...' ></form> a moins que la page de traitement correspond a : index.php?page=verif_evals.php , désolé je prend le train en route ;)


Donc ensuite , si tu ne trouve pas , au tout début de ta page de reception des données
rajoute :
echo"<pre>";
print_r($_POST);
echo"</pre>";
Ce qui te permettra de voir les données entrante via la method="POST" de ton formulaire.

Bye Hawk

Posté : 26 févr. 2009, 23:47
par alaingpl
La page de traitement correspond bien à index.php?page=verif_evals.php et quand je fais
echo"<pre>"; 
print_r($_POST); 
echo"</pre>";
La page est vide, toute blanche, par contre quand je fais
echo $classe ;
echo $nom ;
echo $note ;
echo $matiere ;
echo $periode ;
echo $prenom ;
seule les variables $matière et $ periode s'affichent. Elles viennent du select dans le formulaire de la page précédente
Je n'arrive pas à saisir d'où vient le pbl. J'ai modifié le code plusieurs fois, essayé pas mal de chose, mais rien de rien. Là je suis " out ".

Posté : 26 févr. 2009, 23:50
par thehawk
tu peux me faire un fichier ZIP contenant les infos (script + sql) que je test en local :)