Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/04/2011, 15h34   #1
Membre à l'essai
 
Inscription : mars 2009
Messages : 170
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 170
Points : 20
Points : 20
Par défaut Récupérer dans des input le contenu d'un tableau

Bonjour à tous,

j'ai sur une page, un formulaire qui liste les produits de la base de données. J'ai donc pour cela une boucle While. Dans cette boucle apprait une liste déroulante (qui provient d'une fonction). Cette liste permet de définir pour chaque ligne le nom du fournisseur. Dans un champs Input, je souhaite récupérer pour chacune des lignes le nom du fournisseur sélectionné. Je recharge en fait mon formulaire pour mettre à jour mon champs Input.

Seulement, je n'arrive pas à récupérer pour chacune des ligne le fournisseur choisit. En gros il peut etre à chaque fois différent. Pour l'instant si je sélectionne un fournisseur pour la ligne 1, tous les champs fournisseur des autres lignes affichent la même valeur que la ligne 1 (ou une autre).

Je comprend le principe, mon champs input est un tableau (si je ne me trompe pas) mais je n'arriva pas à récupérer la valeur pour chacune des lignes.

J'utilise évitement des variables de SESSION

Voici la fonction qui liste les fournisseurs
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
function SelectSupplier()
{
 ?>
<SELECT name="fournisseur" id="fournisseur" size="1" style="width:200px" onchange="document.forms['monform'].submit();">
<?php
 echo '<OPTION>Sélectionnez un fournisseur</OPTION>';
 $sql_fournisseur	= mysql_query("SELECT * FROM t_fournisseur_fou ORDER BY fou_nom ASC") or die("Erreur de connexion !");
 while ( $donnees_fournisseur= mysql_fetch_array($sql_fournisseur) )
  {
   echo '<OPTION value='.$donnees_fournisseur['fou_id'].'>'.$donnees_fournisseur['fou_code'].' - '.ucfirst($donnees_fournisseur['fou_nom']).'</OPTION>';
   }
 echo '</SELECT><br />';
}
et voici mon bout de code.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
while ($donnees_reasort = mysql_fetch_assoc($sql_reasort))
  {
  echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post" id="FormInput">';
  echo '<tr>';
  echo '<td>
  <img src="../'.$donnees_reasort['ima_chemin'].'" width="55" height="55"/>
  </td>';
  echo '<td>'.$donnees_reasort['cat_nom'].' - '.$donnees_reasort['cou_nom'].'<br />'.$donnees_reasort['led_reference'].' - '.$donnees_reasort['led_puissance_w'].' - '.$donnees_reasort['cou_nom'].'</td>';
  echo '<td>';
   SelectSupplier();
   /*-----------*/
     if (isset($_POST['fournisseur']) AND ( ($_POST['fournisseur']) !='Sélectionnez un fournisseur')) // POST plein SESSION vide
   {
    $id_fournisseur							= $_POST['fournisseur'];
    $fournisseur 							= $_POST['fournisseur'];
    $_SESSION['reasort']['fournisseur']	= $fournisseur;
	$sql_fournisseur = mysql_query("SELECT *
                                  FROM t_fournisseur_fou
                                  WHERE fou_id='".$id_fournisseur."'
                                 ") 
                                 or die (mysql_error());
    $donnees_fournisseur = mysql_fetch_assoc($sql_fournisseur);                             
    $_SESSION['reasort']['fournisseur']=(isset($id_fournisseur)) ? $donnees_fournisseur['fou_nom'] : '';
    $_SESSION['reasort']['code_fournisseur']	= $donnees_fournisseur['fou_code'];
   }
   elseif (isset($_POST['choix_fournisseur'])) // POST plein SESSION vide
   {
    $id_fournisseur						= $_POST['choix_fournisseur'];
    $fournisseur 						= $_POST['choix_fournisseur'];
    $_SESSION['reasort']['fournisseur']= $fournisseur;
   }
  else // Ni POST Ni SESSION
   {
   $_SESSION['reasort']['fournisseur']	= 'Pas de choix';
   }
	/*---------------*/
  echo '<br /><input type="text" name="choix_fournisseur" id="choix_fournisseur" size="30" value="'.$_SESSION['reasort']['fournisseur'].'" readonly/>';  
  echo '</td>';
  echo '<td>'.$donnees_reasort['led_stock'].' pcs</td>';
  echo '<td><input type="text"   name="QteStock"      value="" id="QteStock" size="3"/> pcs
  <input type="hidden" name="led_reference" value="'.$donnees_reasort['led_reference'].'" />';
  echo '<input type="submit" value="AJOUT" id="AJOUT" name="AJOUT" class="bouton-validation"/>';
  echo '</td>';
  echo '</tr>';
  echo '</form>';	 
  }
Si l'un d'entre vous peut me donner un coup de main ?
paintbox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 16h05   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Voici comment je m'y prendrait:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
<?php
 
// PROVIENT DE MYSQL //
$produits = array(
	array('id' => 1, 'name' => 'prod1', 'fournisseur' => null),
	array('id' => 2, 'name' => 'prod1', 'fournisseur' => null),
	array('id' => 3, 'name' => 'prod1', 'fournisseur' => null),
);
 
// PROVIENT DE MYSQL //
$fournisserus = array(
	array('id' => 1, 'name' => 'four1'),
	array('id' => 2, 'name' => 'four2'),
);
 
?>
 
<form action="save.php" method="post">
 
	<table id="produits">
		<tr>
			<th>Name</th>
			<th>Fournisseur</th>
		</tr>
		<?php foreach ($prouits as $row): ?>
		<tr>
			<td>
				<input type="hidden" name="id[]" value="<?=$row['id']?>" />
				<input type="text" name="name[]" value="<?=$row['name']?>" />
			</td>
			<td>
				<select name="fournisseur[]">
					<?php foreach ($fournisseurs as $subrow): ?>
					<option value="<?=$subrow['id']?>"
					<?php endforeach ?>
				</select>
			</td>
		</tr>
		<?php endforeach ?>
	</table>
	<input type="submit" value="Save" />
 
</form>
Les données fournies par ce formulaire seront de la forme:
Code :
1
2
3
4
5
6
 
$_REQUEST = array(
	'id'          => array('1',       '2',       '3'),
	'name'        => array('prod1', 'prod2', 'prod3'),
	'fournisseur' => array('1',       '2',       '1'),
);
Il ne te reste qu'a traverser cette structure avec un bête for de la façon suivante:
Code :
1
2
3
4
5
6
7
 
$c = count($_REQUEST['id']);
for ($i = 0; $i < $c; $i ++) {
	$id          = $_REQUEST['id'][$i];
	$name        = $_REQUEST['name'][$i];
	$fournisseur = $_REQUEST['fournisseur'][$i];
}
Et le tour est joué
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 16h36   #3
Membre à l'essai
 
Inscription : mars 2009
Messages : 170
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 170
Points : 20
Points : 20
Merci pour ton aide, mais je ne sais pas utiliser ta proposition. Ton code m'obligerait à changer tout le mien.

Merci
paintbox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 16h54   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Alors tu vas devoir utiliser Ajax car je ne connais pas d'autre moyen pour envoyer plusieurs jeux de données avec un formulaire.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 16h57   #5
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 124
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 124
Points : 101
Points : 101
Salut,
En simplifiant le code que génère ton script, on obtient un truc de ce style :

Code :
1
2
3
4
5
6
7
8
 
<select name="fournisseur" id="fournisseur" size="1" style="width:200px" onchange=".."/>
   <OPTION>Sélectionnez un fournisseur</OPTION>
   <OPTION value="1">Fournisseur 1</OPTION>
   <OPTION value="2">Fournisseur 2</OPTION>
   <OPTION value="3">Fournisseur 3</OPTION>
...
</select>
or si tu regardes bien, toutes les listes déroulantes <select> ont le même id : fournisseur. Je pense que c'est la source de ton problème (il semble manquer un truc du style :
Code :
<SELECT name="fournisseur" id="fournisseur<?php echo $idFournisseur;" ?>
).

En espérant qu'il s'agisse bien de cela

PS : c'est un avis mais comme dit Benjamin Deslepierre, il vaudrait mieux vaut séparer au maximum ton code de ta présentation : tu ne feras que gagner en lisibilité (pense aussi aux éventuelles personnes qui liront le code derrière toi et qui te maudiront en galérant pour arriver à bien le comprendre...)
__________________
Chen norris
C/C++, C#, Java, PHP & SQL coder
Web developer
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 17h32   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Le problème ne vient pas tant de l'id que de l'attribut name, avec deux attributs name identiques, le second écrase le premier, le seul moyen de contourner ça est de mettre .

Faites le test vous même avec:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?php
 
var_dump($_REQUEST);
 
?>
 
<form method="post">
	<input type="text" name="equal" />
	<input type="text" name="equal" />
	<input type="text" name="equal" />
	<input type="submit" value="send" />
</form>
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 17h48   #7
Membre à l'essai
 
Inscription : mars 2009
Messages : 170
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 170
Points : 20
Points : 20
Merci à vous 2 pour vos réponses.

J'avais déjà essayé de mettre mais sans succès.

Je ne sais pas si ce à quoi je veux arriver est clair.
Je réexplique au cas ou…

Ma page fait partie de mon back-office et liste tous les produits. Cette page me permet d'encoder le nouveau stock reçu. Donc la liste comprend une image, un descriptif, la liste des fournisseurs, le fournisseur choisit parmis la liste (sous forme d'input) , un input pour indiquer la quantité rentrée en stock et un bouton pour enregistrer le nouveau stock.

J'ai donc tous ces éléments par ligne.
Et donc pour chacun des produits, je veux pouvoir choisir dans la liste un fournisseur (-> le champ se met à jour dès sélection dans la liste puisque la page se recharge) puis on indique la quantité et on clic sur mettre à jour. Puis on passe au produit suivant…
paintbox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 17h56   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Citation:
J'avais déjà essayé de mettre name="un_nom[]" mais sans succès.
Il faut que le script d'enregistrement soit compatible avec la structure de POST que cela implique, réfères-toi à mon post précédent.

Citation:
Ma page fait partie de mon back-office et liste tous les produits. Cette page me permet d'encoder le nouveau stock reçu. Donc la liste comprend une image, un descriptif, la liste des fournisseurs, le fournisseur choisit parmis la liste (sous forme d'input) , un input pour indiquer la quantité rentrée en stock et un bouton pour enregistrer le nouveau stock.

J'ai donc tous ces éléments par ligne.
Et donc pour chacun des produits, je veux pouvoir choisir dans la liste un fournisseur (-> le champ se met à jour dès sélection dans la liste puisque la page se recharge) puis on indique la quantité et on clic sur mettre à jour. Puis on passe au produit suivant…
Oui et c'est donc l'ensemble des champs de formulaire qui sont envoyés en même temps, on tombe dans le problème évoqué plus haut: le dernier écrase les autres. Il faut donc que tu adaptes l'exemple que je t'ai donné pour updater plusieurs champs en même temps indépendament les uns des autres.
Il n'y a pas de solution toute faite à ce problème ni d'attribut miraculeux à mettre: il faut changer l'algo tout entier... Si je dis ça c'est parce que j'en ai déjà fait l'expérience.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 16h55   #9
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 124
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 124
Points : 101
Points : 101
Une solution déjà évoquée par Benjamin est d'utiliser Ajax. J'ai déjà expérimenté ce problème avec une formulaire contenant des infos sur une personne (nom, prénom, ...) et dont les champs doit pouvoir être mis à jour et enregistrés indépendamment, sans recharger la page à chaque fois.

Dans ton cas, il faut qu'au clic sur un bouton d'enregistrement appelle une méthode d'enregistrement save dont le code javascript serait le suivant :
Code :
1
2
3
4
5
6
7
8
9
save = function(identifiant_de_ligne) {
	new Ajax.Request(
		'enregistrerValeurs.php', {
			method: 'get',
			parameters: {nom1: valeur1, nom2: valeur2},
		}
	);
}
avec parameters = les valeurs de la ligne courante.
Pour récupérer les valeurs de ta ligne courante, je ne te détaille pas mais c'est faisable assez facilement en Javascript (d'où le paramètre identifiant_de_ligne d'ailleurs).

N'hésite pas si tu souhaites plus d'infos pour savoir comment implémenter cette solution
__________________
Chen norris
C/C++, C#, Java, PHP & SQL coder
Web developer
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 17h06   #10
Membre habitué
 
Avatar de Chen norris
 
Inscription : mai 2004
Messages : 124
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 124
Points : 101
Points : 101
Du nouveau dans l'avancement ? Si résolu, ne pas oublier le tag
__________________
Chen norris
C/C++, C#, Java, PHP & SQL coder
Web developer
Chen norris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 20h41   #11
Membre à l'essai
 
Inscription : mars 2009
Messages : 170
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 170
Points : 20
Points : 20
Hello,

j'ai finalement présenté mon formulaire différemment afin de contourner le problème.

Merci à vous 2 pour votre aide !
paintbox est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h15.


 
 
 
 
Partenaires

Hébergement Web