Récupérer lé valeur de champs dynamiques [Résolu/Fermé]

Signaler
-
 maguidi -
Bonjour,
J'ai besoin d'aide je sais plus quoi faire.
j'ai un formulaire sortie de stock qui permet de saisir un article sa quantité, l'utilsateur peut sortir autant d'article qu'il veut et pur cele il lui suffit juste de cliquer sur un bouton ajout qu ajoute deux champ dynamique à chaque clic. Jusque là tout marche mais le probléme est que quand je n'arrive pas à récupérer toutes les données je récupére seulement les valeurs des champs par défaut et le dernier champs ajoutés. C'est comme ci les valeurs du dernier champ ajouté écrasait ceux d'avant.
Voici le code sur deux pages
sortie_stock.php
<?php
include("connexionbd.php");
$numero_article = $_GET['num_article'];
$select_article = mysql_query("SELECT Designations, Stock FROM articles WHERE KArticles='$numero_article'");
$res_article = mysql_fetch_array($select_article);
$article = $res_article['Designations'];
$stock = $res_article['Stock'];
$select_activite = mysql_query("SELECT KActivites, NomActivite FROM activites");
?>
<html>
<head>
<STYLE>

A:LINK { color: #000050; text-decoration: none }

A:VISITED { color: #000050; text-decoration: none }

A:HOVER { background-color: #FFFFFF; text-transform: uppercase; font-weight:bold; color:#000050; text-decoration: none }

A:ACTIVE {color: #000050; text-decoration: none}
</STYLE>

<script type="text/javascript">
<!--
//VERIFICATION DEFORMULLAIRE
function verif_formulaire()
{
// Control sur la saisie de la quantité d'article en entrée pour envoi de message d'erreur si le champ est vide
if(document.sortie_stock.quantite.value == "")
{
alert("Veuillez entrer la quantité de l'article!");
document.sortie_stock.quantite.focus();
return false;
}

// Control sur la selection de l'activite pour envoi de message d'erreur si le champ est vide
if(document.sortie_stock.activite.value == "")
{
alert("Veuillez choisir une activite!");
document.sortie_stock.activite.focus();
return false;
}

var chkZ = 1;
// Control sur la saisie de la quantité de l'article à sortir pour envoi de message d'erreur si la quantité est < 0
for(i=0;i<document.soortie_stock.quantite.value.length;++i)
{
if(document.sortie_stock.quantite.value.charAt(i) < "0" || document.sortie_stock.quantite.value.charAt(i) > "9")
{
chkZ = -1;
}
}
if(chkZ == -1)
{
alert("La quantite de l'article à sortir ne pas être négative, ni égale à 0!");
document.sortie_stock.quantite.focus();
return false;
}
}


var d, d2, design, f, f2,qest, g, g2, qast, i=0;

// AJOUT DE CHAMPS DYNAMIQUES
function plus()
{
//ajouter un champ avec son "name" propre;

d=document.getElementById('cadre2');
f=document.getElementById('cadre3');
g=document.getElementById('cadre4');

d2=d.getElementsByTagName('nom2');
f2=f.getElementsByTagName('nom3');
g2=f.getElementsByTagName('nom4');


design=document.createElement('input');
qest=document.createElement('input');
qast=document.createElement('input');


design.setAttribute('type','text');
qest.setAttribute('type','decimal');
qast.setAttribute('type','decimal');


design.setAttribute('name','design'+d2.length);
qest.setAttribute('name','qest'+f2.length);
qast.setAttribute('name',' qast'+g2.length);


d.appendChild(design);
f.appendChild(qest);
g.appendChild( qast);
}
//-->
</script>


</head>
<BODY>
<table border=1>
<tr>
<td width=250 height=15> <B> <center> <a href="modif_article.php?num_article=<?php echo $numero_article;?>"> Modifier </a> </B> </center></td>
<td width=250 height=15> <B> <center> <a href="entree_stock.php?num_article=<?php echo $numero_article;?>"> Entrée de stock </a> </center> </B> </center> </td>
<td width=250 height=15> <B> <center> <font size=3 color=000000> Sortie de stock </font> </B> </center> </td>
<td width=250 height=15> <B> <center> <center> <font size=3 color=000000> Supprimer </font> </a> </B> </center> </td>
</tr>
</table> <br> <br> <br>


<div align=right>

<table>
<tr>
<td width=300>
<fieldset color=#000050>
<legend> <font size=5 color=#000050> Rechercher Articles </font> </legend> <br>
<center><input type="text" id="cherch" name="cherch">
<input type="submit" value="OK"> </center>
<fieldset
</td>
<tr>
</table>
</div>
<form name="sortie_stock" action="sortie_stock_bd.php" method="post" enctype='multipart/form-data' onSubmit="return verif_formulaire()">
<input type="hidden" id="num" name="num" value="<?php echo $numero_article;?>">
<fieldset style="border: 3px double" color=#000050 >
<legend> <font size=5 color=#000050> Sortie de stock </font> </legend> <br> <br>
<center>
<table border bordercolor=#000000>
<tr>

<td width=200 height=15> <center> <B> Désignations </center> </B> </td>
<td width=200 height=15> <center> <B> Quantité en stock </center> </B> </td>
<td width=200 height=15> <center> <B> Quantité à sortir </center> </B> </td>
<td width=200 height=15> <center> <B> Activité </center> </B> </td>
</tr>
<tr>
<td width=200 height=100> <input type="text" id="article" name="article" value="<?php echo $article;?>">
<div id="cadre2" name="cadre2" name="nom2">

</div>
</td>
<td width=15 height=15> <input type="decimal" id="stock" name="stock" value="<?php echo $stock;?>">
<div id="cadre3" name="nom3">
</div>
</td>
<td width=200 height=100> <input type="decimal" id="quantite" name="quantite">
<div id="cadre4" name="nom4">
</div>
</td>
<td width=200 height=100>
<select id="activite" name="activite" >
<option value="" selected="selected"> Choisir une activité </option> <?php
while($res_activite = mysql_fetch_array($select_activite))
{?>
<option value="<?php echo $res_activite['NomActivite'] ?>"> <?php echo $res_activite['NomActivite'] ?> </option> <?php
}?>
</select>
</td>
</tr>
</table> <br>
<input type="button" value="Ajouter" onclick="plus()" />
<input type="submit" value="Valider">
<center>
<fieldset> <br> <br>
</form>
</BODY>

sotie_stock_bd
<?php
include("connexionbd.php");

//$num_article = $_POST['num'];
//$article = $_POST['article'];
//$stock = $_POST['stock'];
//$stock = $_POST['quantite'];
//$activite = $_POST['activite'];

//le formulaire poste les valeurs de tous les champs dans un array $_POST avec comme cle le nom du champ

$array_design = array();
$array_qenst = array();
$array_qast = array();

foreach($_POST as $cle=>$value)
{
//on recupere les valeurs des champs cadre2 et on les stoke dans un array
if(substr($cle,0,6)=="design")
{
$array_design[]=$value;
}

//on recupere les valeurs des cadre4 et on les stoke dans un array
if(substr($cle,0,4)=="qest")
{
//$array_cadre3[]=$value;
}

//on recupere les valeurs des champs cadre4 et on les stoke dans un array
if(substr($cle,0,4)=="qast")
{
$array_qast[]=$value;
}
}

print_r($_POST);

//print_r($array_cadre2);
//echo $array_cadre[0];

for ($i=0; $i<sizeof($array_design); $i++)
{
$select_sortie = mysql_query("INSERT INTO sorties (FKArticles) VALUES('$array_design[$i]')");

if($select_sortie>0)
{echo "yes";}else{echo"no";}
}
?>

8 réponses

Bonjour

As-tu fait un print_r($_POST) au début de ton traitement ? tu verrais que tu ne récupères que la dernière ligne ajoutée.
Tu donnes le même nom à toutes tes nouvelles lignes.

Dans ta fonction plus, tu récupères le nombre de lignes existante par le nombre d'éléments de d2
d2=d.getElementsByTagName('nom2'); (je ne m'intéresse qu'à un seul champ)
Mais tu ne crées pas de nouvel élément qui s'appelle 'nom2', d2.length reste à 0 et les nouveaux champs que tu crées s'appellent tous design0,quest0 et qast0

Comme tes champs s'appellent en fait article, stock et quantite, il serait beaucoup plus simple (j'ai fait l'essai) de les renommer article[], stock[] et quantite[]

Dans la fonction plus, tu laisses tomber d2,f2,g2 qui ne servent à rien et tu modifies :
design.setAttribute('name','article[]');
qest.setAttribute('name','stock[]');
qast.setAttribute('name','quantite[]');

Comme ça tu vas récupérer tous les champs saisis, pas seulement la dernière ligne ajoutée. Bien sûr il faut modifier le traitement aussi, mais ça devrait plutôt le simplifier
merci de m'avoir répondu j vais essayé tout de suite ce que u m'a di, j te tien o couran after
ça marche à moitié j'ai juste mis ça
design.setAttribute('name','article[]');
qest.setAttribute('name','stock[]');
qast.setAttribute('name','quantite[]');
et j'ai supprimé d2,f2,g2 comme u m la di é la j'arrive à récupérer les champs que j'ai ajouté mais je récupére pas le champs par défaut qu existe
quand j fais un print_r($_POST) j'obtient ceci

Array ( [num] => 46 [article] => Array ( [0] => A1 [1] => A2 ) [stock] => Array ( [0] => 1 [1] => 2 ) [quantite] => Array ( [0] => 1 [1] => 2 ) [activite] => ACT1 )

Sur mon formulaire j'ai fais ceci

Désignations Quantité en stock Quantité à sortir Activité
A3 0 0 ACT1 (ligne par défaut)
A1 1 1 (ligne ajouté)
A2 2 2 (ligne ajouté)

mais le [num] => 46 c'est le id de l'article du champ par défaut ce ki manque c'est le nom la quantité et l stock
c bon ça marche en fait le truc c que j'avais déjà nommé mes champs par défaut par le mem nom article, quantité et stock. Donc j'ai changé leur nom en ajoutant juste 1 à chak nom pour les différencier article1,
quantité 1et stock1 et là ça marche jarrive à récupérer toutes les valeurs.
Merci pour ton aide j sais pas c que j'aurai fais sans toi
As-tu bien renommé AUSSI les champs par défaut article[] au lieu de article, idem pour stock et quantite
wé j l'ai fais tout marche.
Mais j'ai un autre problème qui n'a rien a voir avec ça c sur les listes déroulantes liées
j'ai des articles qui appartiennent à des familles et des sous familles. Avant d'arriver à l'article on a une familles et 4 sous familles, par exemple l'article A1 appartient a la sous famille3 qui appartient à la sous famille2 qui appartient à la sous famille1 qui appartient à la familles1. lorsque l'utilisateur veut créer un article il doit d'abord choisir la famille sur la liste1 et et sur la liste 2 il n'y aura que les sous familles1 appartenant à la famille qu'il a choisi, ensuite il fait son choix sur la liiste2 et sur la liste 3 il n'y aura que les sous familles2 appartenant à la sous famille1 qu'il a choisi et ainsi de suite.
Dans ma base de données j'ai une table famille, une table sous famille1, une table sous famille2, une table sous familles3 et une table articles.
J'ai réussi à l faire avec duex liste mais le truc c que j'arrive pas à l faire avc 4 liste.
J peux poster mon code si tu y connais kelk choz
Ouh la la ! J'ai attrapé la migraine en essayant de comprendre :-D
C'est sûrement faisable, mais ça doit demander un peu plus de temps que celui dont je dispose. Je te conseille de créer un nouveau fil car c'est un nouveau sujet.
Bon courage
ok et encore une fois merci pour tn aide