Vous n'êtes pas identifié(e).
Pages :: 1
Bonjour,
A la suite d'un problème (résolu) dans ce Topic : http://forum.phpdebutant.org/viewtopic.php?id=13432 je tombe sur un autre problème.
Pour rappel, je génère un formulaire grâce à une entrée numérique dans ma base de donnée, le champ "numero[]" peut donc être affiché 1 fois comme 5 fois.
Je le récupère ensuite avec un foreach comme ceci sans problème :
Désormais, je voudrais récupérer le même formulaire avec avec des informations en plus comme ceci :
Et c'est le drame lol! La je ne sais plus comment faire pour récupérer les champs. J'ai imaginer imbriquer des foreach de cette façon :
Je ne sais pas si c'est correct et je souhaiterais avoir votre avis avant de faire une bêtise ou une boucle infinie ...
Merci à tous!
Anthony
Hors ligne
Saluton,
Comme je te l'ai déjà dit un id doit être unique dans une page HTML, or là, tu risques d'avoir plusieurs ids 'numero', 'details' et 'remarque'.
Ensuite, pour éclaircir le reste de ta problématique, il faudrait nous communiquer le résultat d'un var_dump($_POST['numero']); à partir du script php cible de l'attribut action de ton <form>
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Saluton,
Comme je te l'ai déjà dit un id doit être unique dans une page HTML, or là, tu risques d'avoir plusieurs ids 'numero', 'details' et 'remarque'.
Ensuite, pour éclaircir le reste de ta problématique, il faudrait nous communiquer le résultat d'un var_dump($_POST['numero']); à partir du script php cible de l'attribut action de ton <form>
Bonjour,
Je ne l'ai pas mis ici mais pour les ID j'incrémente de +1 une variable ce qui donne en gros id="numero<?php echo $var++; ?>".
En ce qui concerne la réponse de var_dump:
Hors ligne
Bon,
En fait ce que tu souhaites c'est générer dans ton formulaire des structures contenant, chacune, trois infos : numero, details et remarque.
Dans ta boucle de création des input essaye comme cela
et vois ce que ça donne en nous postant le résultat de
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Re,
Voici le résultat :
J'ai oublié de préciser que les champs détails et remarque sont des champs hidden qui contiennent des informations provenant d'une BDD mais je ne pense pas que cela gêne ?...
Merci pour ton aide,
Anthony
Dernière modification par Anthotill (25-05-2011 12:48:21)
Hors ligne
Bon, bah, c'est bien ce que tu voulais obtenir, non ?
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Bon, bah, c'est bien ce que tu voulais obtenir, non ?
Oui, le problème vient ensuite.
Comment faire pour traiter ceci ? avec un seul champ il faut faire:
Mais avec plusieurs champ à récupérer ?
Je sais que l'exemple ci-dessous n'est pas correct (du moins je crois j'ai "peur" d'essayer) mais alors comment on reprend tout les champs dans ces cas là ?
A noté qu'ensuite j'insère une ligne dans une BDD autant de fois qu'il y a de champs "numero"
Merci pour votre aide,
Anthony
Dernière modification par Anthotill (26-05-2011 13:56:47)
Hors ligne
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
foreach($_POST['lignes'] as $ligne){
echo 'numero : ',$ligne['numero'], '<br />details : ',$ligne['details'], '<br />'remarque : ',$ligne['remarque'], '<br />';
}
Merci beaucoup ! Avec vous les choses sont très vites comprises c'est très bien, je n'y avait pas penser à cette façon d'écrire le code !
Mais désormais, nous revenons à mon premier post à savoir, comment vérifier si les champs sont remplis ?
J'utilisais un flag :
foreach($_POST['numero'] as $champ)
{
if(empty($champ)) { $flag = true; }
}
if($flag === true)
{
echo '<div style="padding: 5px;" class="text_erreur"><img src="images/horsstock.png" width="16" height="16" alt="erreur"> Un ou plusieurs champs n\'ont pas été remplis...</div>';
}
Désormais, je veux faire ce test sur le champ numéro uniquement alors j'ai fait comme suit :
foreach($_POST['lignes']['numero'] as $champ)
{
if(empty($champ)) { $flag = true; }
}
if($flag === true)
{
echo '<div style="padding: 5px;" class="text_erreur"><img src="images/horsstock.png" width="16" height="16" alt="erreur"> Un ou plusieurs champs n\'ont pas été remplis...</div>';
}
sans succès je dois dire ...
Pouvez vous m'aiguiller s'il vous plaît ? (les boucles me font peur, j'ai déjà planté un serveur avec une boucle infinie alors ...)
Merci à vous pour votre aide !
Anthony
Hors ligne
if(empty($champ)) {
$flag = true;
break;
}
a++
Hors ligne
if(empty($champ)) {
$flag = true;
break;
}a++
Bonjour,
Merci pour ton aide, je n'ai pas de problème avec le flag mais avec le foreach :-)
Hors ligne
quel problème ???
de toute façon, ce que j'ai mis reste valable
a++
Hors ligne
Bonsoir,
@anthotill : Sais-tu comment fonctionne une boucle Foreach?
Tu as deux données à traiter avec ton foreach, à savoir les index de lignes et les contenus de chaque ligne. Pour éviter les erreurs, 2 bons conseils avec foreach
1) Ne pas considérer que les indexs de ligne coïncident avec les indexs de ton tableau (meilleure façon pour se tromper sur toute la ligne, façon de parler )
2) Vérifier le contenu de ce que tu lis avant de lui appliquer un traitement.
En résumé, du codage comme il doit être pratiqué, car si tu appliques cette méthode, même si tu ne sais pas comment fonctionne un foreach réellement, tu devrais obtenir les bons résultats en procédant ainsi.
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
Bonjour,
En regardant de plus prêt :
Je ne suis pas un codeur, je travail juste sur un petit module qui nous facilite la vie au boulot, qui permet de servir comme il se doit nos clients, nous sommes trois à l'utiliser...
Pour la solution donnée par Maljuna Kris, j'ai un petit soucis, il ne prend en compte que la moitié des champs j'ai l'impression :
N'insert que deux enregistrements lorsqu'il y a 4 champs dans le formulaire.
Avez vous une idée ?
Anthony
Dernière modification par Anthotill (28-05-2011 09:14:54)
Hors ligne
Dans ta clause VALUES, c'est quoi les '', devant $id ?
Si la colonne id est une primary key autoincrémenté tu peux l'ignorer.
D'autre part pour te faciliter la vie utilises plutôt une fonction comme sprintf
Encore un conseil, évite de nommer tes colonnes avec des mots réservés comme DATE ou NAME
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Bonjour,
Merci beaucoup. Je n'ai pas l'impression que la fonction soit opérante avec le NOW(), j'ai essayé plusieurs écritures mais pour le moment ça ne fonctionne pas, je verrais ça après.
En revanche, je n'ai toujours que la moitié des enregistrements dans la base, les deux dernières boucles pour être exact (semble t-il en tout cas). Comme si le foreach ne parcourais pas tous le tableau.
Avez vous une idée ?
Anthony
Hors ligne
$SQL_INSERT_NUM = sprintf("INSERT INTO gstock_Historique
(PartNumber,Designation,Numero,Email,Name,Date)
VALUES ('%s','%s,'%s',%s','%s',NOW())"
,$ligne['PartNumber']
,$ligne['details']
,$ligne['numero']
,$Name
);
Comme ça, le problème avec NOW() devrait disparaître.
Pour le parcours incomplet du tableau par foreach, je ne vois pas ce qui peut en être l'origine.
Il faudrait voir l'ensemble du code.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Bonjour,
Je modifie le nom des champs de façon définitives et je posterais ensuite l'ensemble du code, merci beaucoup pour votre aide.
Anthony
Hors ligne
Re,
Voici le code complet:
<?php
// Boucle pour afficher le nom/prénom du client
while($DETAILS_NAME = mysql_fetch_assoc($REQ_DETAILS_NAME))
{
$NameClt_1 = $DETAILS_NAME['name'];
echo $NameClt_1;
}
?>
<br>
<?php
// Boucle pour afficher le contenu de la commande
while($DETAILS_CMD = mysql_fetch_assoc($REQ_DETAILS_CMD))
{
// Création d'une varible pour l'email du client
$EmailClt = $DETAILS_CMD['email'];
?>
<?php echo $DETAILS_CMD['order_id']; ?><br>
<?php echo $DETAILS_CMD['order_item_sku']; ?><br>
<?php echo $DETAILS_CMD['order_item_name']; ?><br>
<?php echo $DETAILS_CMD['product_quantity']; ?><br>
<?php
for($i=0;$i < $DETAILS_CMD['product_quantity'];$i++)
{
echo '<input type="text" name="lignes['.$i.'][numero_serie]" id="numero_serie" value="" /><br>';
echo '<input type="hidden" name="lignes['.$i.'][details]" id="details" value="'.filtre_spec_caracteres($DETAILS_CMD['order_item_name']).'" /><br>';
echo '<input type="hidden" name="lignes['.$i.'][PartNumber]" id="PartNumber" value="'.$DETAILS_CMD['order_item_sku'].'" /><br>';
} // fin for
} // Fin while($DETAILS_CMD = mysql_fetch_assoc($REQ_DETAILS_CMD))
?>
<br>
> Veuillez remplir le(s) champ(s) ci-dessus (obligatoire).
<br>
<input type="hidden" name="EnvForm" id="EnvForm" value="1" />
<input type="hidden" name="Name" id="Name" value="<?php echo $NameClt_1; ?>" />
<input type="hidden" name="email" id="email" value="<?php echo $EmailClt; ?>" />
<input type="submit" name="button" id="button" value="Ajouter à la synthèse" class="boutonf_commentaire" />
<?php
} // Fin du if - if($NB_LST_CMD != '0')
?>
</form>
<?php
// Si le formulaire est envoyé, on traite les champs
if(isset($_POST['EnvForm']))
{
// Création d'un flag pour vérifier si tous les champs sont remplis
$flag = false;
// Parcours du tableau
foreach($_POST['lignes'] as $ligne)
{
// Si des champs "numero_serie" ne sont pas remplis $flag = true
if(empty($ligne['numero_serie'])) { $flag = true; }
}
// Si flag vaut TRUE on affiche une erreur
if($flag === true)
{
echo '<div style="padding: 5px;" class="text_erreur"><img src="images/horsstock.png" width="16" height="16" alt="erreur"> Un ou plusieurs champs n\'ont pas été remplis...</div>';
}
// Sinon, on continu le traitement
else
{
// Vérification si les champs on bien été remplis
$id = $_GET['id'];
$emailclt = $_POST['email'];
$Nameclt = $_POST['Name'];
// Connexion base de donnée
include('includes/connexion_base_site.php');
// On parcours le tableau notamment en cas de plusieurs produits (product_quantity > 1)
foreach($_POST['lignes'] as $ligne)
{
// REQUETE INSERTION DANS LA BASE SN / ASSUR
$SQL_INSERT_NUM_SERIE =
sprintf("INSERT INTO
gstock_HistoriqueCommande
(NumeroCommande,PartNumber,Designation,NumeroSerie,Email,NameClt,DateAjt)
VALUES ('%s','%s','%s','%s','%s','%s',NOW())"
,$id
,$ligne['PartNumber']
,$ligne['details']
,$ligne['numero_serie']
,$emailclt
,$Nameclt
);
$REQ_INSERT_NUM_SERIE = mysql_query($SQL_INSERT_NUM_SERIE) or die( "Impossible d'ajouter des données à la table : " .mysql_error());
}
// Fermeture de la base de donnée
mysql_close($db);
// SI correctement éxécuté on redirige
echo '<script language="javascript" type="text/javascript">window.location.replace("test.php?cmd=',$id,'");</script>';
} // Fin else =====> if($flag === true)
} // Fin if =====> if(isset($_POST['EnvForm']))
?>
Hors ligne
Bonjour,
J'ai encore essayé pas mal de modification mais je n'ai toujours que la moitié de la boucle qui est lu ...
Je commence a désespérer !
Il y a surement un problème avec le foreach de la ligne 88 qu'en pensez vous ?
Hors ligne
Bon je crois que j'ai une piste, si je modifie ceci :
Pour ceci :
J'ai bien tous les enregistrement mais bien sur, les informations enregistrées dans mysql ne sont pas les bonnes car dans le "DOM l'id n'est pas UNIQUE" (ref Maljuna Kris :-)).
Donc le problème viens de $i qui ne doit probablement pas fournir assez d'id différent dans la page html.
Comment contourner cela, tel est la question ?
Hors ligne
salut,
pour l'id c'est que tu met id="numero_serie" à tout les input, idem pour les deux lignes du dessous
ensuite pour quoi lignes[numero_serie], lignes[details] et lignes[PartNumber] tu pourrais simplement utiliser 3 tableaux c'est plus simple
ensuite si tu affiche tous cela dans une boucle tu n'a pas besoin de préciser l'index (sauf si celui ci à vraiment une importance, mais les 3 champs auront le même index.
par exemple
avec ça tu aura trois tableaux avec les mêmes index (si bien sur tu affiche le tout dans une boucle par groupe de trois).
l'ajout du $i dans l'id permet de tous les différencier et ainsi ne plus avoir de soucis avec JS si tu souhaite les valider avec (ou faire quoique soit )
@+
Il en faut peu pour être heureux pompompompompompompompompompompom
Hors ligne
Bonjour moogli et merci pour ton aide,
N'y aurait-il pas un moyen de fournir des "index" différents aux trois champs plutôt que de changer le reste ?
En effet, je ne passe pas un temps "officiel" sur ce problème car je suis au boulot et je voudrais éviter de tout changer si cela est toujours possible.
Dans la négative, si je fait 3 tableaux, dois-je faire trois boucles pour afficher les inputs genre :
Si oui, comment récupérer ces trois boucles, est-il possible de les récupérer en une seule et ainsi ne faire qu'une seule requête d'insertion dans la base de donnée ?
Hors ligne
Pages :: 1