Pbl d'envois multiple dans le même formulaire

Eléphant du PHP | 271 Messages

24 févr. 2009, 21:17

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.'">';
Patience et obstination sont des qualités !

Mammouth du PHP | 686 Messages

24 févr. 2009, 21:27

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.'">';

Eléphant du PHP | 271 Messages

24 févr. 2009, 21:50

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' )";
Patience et obstination sont des qualités !

Mammouth du PHP | 686 Messages

24 févr. 2009, 21:56

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à

ViPHP
ViPHP | 4039 Messages

24 févr. 2009, 23:13

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)
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

ViPHP
ViPHP | 1996 Messages

24 févr. 2009, 23:21

J'ai eu le cas cet après midi avec un update de password...
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 271 Messages

25 févr. 2009, 16:53

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
Patience et obstination sont des qualités !

Mammouth du PHP | 686 Messages

26 févr. 2009, 10:42

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' )";}
 
Modifié en dernier par sylvaing26 le 26 févr. 2009, 13:37, modifié 1 fois.

Mammouth du PHP | 991 Messages

26 févr. 2009, 11:40

et tu fais bien un mysql_query($sql); ?
DevOps, Symfony4, Hoa

Eléphant du PHP | 271 Messages

26 févr. 2009, 15:19

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
Patience et obstination sont des qualités !

Mammouth du PHP | 686 Messages

26 févr. 2009, 16:18

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' )"); 
 

Eléphant du PHP | 271 Messages

26 févr. 2009, 17:37

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.
Patience et obstination sont des qualités !

Mammouth du PHP | 991 Messages

26 févr. 2009, 18:45

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
DevOps, Symfony4, Hoa

Eléphant du PHP | 271 Messages

26 févr. 2009, 23:47

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 ".
Patience et obstination sont des qualités !

Mammouth du PHP | 991 Messages

26 févr. 2009, 23:50

tu peux me faire un fichier ZIP contenant les infos (script + sql) que je test en local :)
DevOps, Symfony4, Hoa