Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1647 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [resolu]imbrication de foreach

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[resolu]imbrication de foreach

n°2307760
hugo_064
Posté le 15-11-2017 à 18:29:34  profilanswer
 

Bonjour à tous,
Je viens vers vous pour solliciter vos compétences suite à un problème rencontré.
 
Je suis en train de créer un formulaire pour réserver un/des paniers de bouffe avec choix du contenu.
 
Pour le formulaire de choix :
 
panier 1 (input checkbox pour sélectionner ce panier)
quantité (input number pour ce panier)
liste des produits dans ce panier (input checkbox pour sélectionner les produits)
 
panier 2 (input checkbox pour sélectionner ce panier)
quantité (input number pour ce panier)
liste des produits dans ce panier (input checkbox pour sélectionner les produits)
 
panier 3 (input checkbox pour sélectionner ce panier)
quantité (input number pour ce panier)
liste des produits dans ce panier (input checkbox pour sélectionner les produits)
 

Code :
  1. $organics_query = query("select c.organic_id, c.sort_order, ci.organic_name, c.status, ci.languages_id
  2. from TABLE_ORGANIC c, TABLE_ORGANIC_INFO ci
  3. where c.organic_id = ci.organic_id
  4. and c.status = '1'
  5. and ci.languages_id = '4'
  6. ORDER BY c.sort_order, ci.organic_name" );
  7. while ($organic = fetch_array($organics_query)) {
  8. echo '<div style=" border-width:1px; border-style:solid; border-color:#000; vertical-align:top; text-align:center; display:inline-block; width:250px; margin: 10px; padding:10px;" >';
  9. // choix du panier
  10. echo ' <div style=" height:300px; vertical-align:top; text-align:center;">'
  11. .'<strong>'.TEXT_SELECT_ORGANIC.'</strong><input type="checkbox" name="idProduit['.$organic['organic_id'].']" value="'.$organic['organic_id'].'">'.$organic['organic_name']
  12. .'<br>'.
  13. '</div>';
  14. // choix des produits dans le panier
  15. echo ' <div style=" vertical-align:top; text-align:left;"><strong>'.TEXT_SELECT_INSIDE.'</strong><br>';
  16. $organic_products_query = query("select *
  17. from TABLE_ORGANIC_PRODUCTS
  18. where organic_id = '" . $organic['organic_id'] . "'
  19. ORDER BY organic_products_id" );
  20. while($organic_products = fetch_array($organic_products_query)){
  21. echo '<input type="checkbox" name="pID['.$organic_products['products_id'].']" value="'.$organic_products['products_id'].'" checked="true">'.$organic_products['products_id'].'<br>';
  22. }
  23. echo '</div>';
  24. // choix de la quantité
  25. echo ' <br><div style=" vertical-align:top; text-align:left;"><strong>'.TEXT_SELECT_QTY.'</strong>
  26. <input type="number" min="1" max="99" style="width: 7em;" autocomplete="off" name="quantite['.$organic['organic_id'].']" id="'.$organic['organic_id'].'" value=""/>
  27. </div>
  28. </div>';
  29. }


 
et pour envoyer tout ça dans le contenu d'un mail :
 

Code :
  1. if(isset($_POST['idProduit'])){
  2. foreach ($_POST['idProduit'] as $key => $idProduit){
  3. $sql = query("select c.organic_id, c.sort_order, ci.organic_name, c.status, ci.languages_id
  4. from TABLE_ORGANIC c, TABLE_ORGANIC_INFO ci
  5. where c.organic_id = ci.organic_id
  6. and c.status = '1'
  7. and ci.languages_id = '4'
  8. and c.organic_id =".$idProduit."
  9. " );
  10. $recup = fetch_array($sql);
  11. foreach ($_POST['pID'] as $pID){
  12. $sql2 = query("select *
  13. from TABLE_ORGANIC_PRODUCTS
  14. where organic_id = '".$idProduit."'
  15. and products_id = '" . $pID . "'
  16. " );
  17. $recup2 = fetch_array($sql2);
  18. $organic_prod .= $recup2['products_id'].', ';
  19. }
  20. $organic_materials .= $recup['organic_name'].' x '.$_POST['quantite'][$key].' : '.$organic_prod.' </br> ';
  21. }
  22. }
  23. $contenu_email = $organic_materials;


 
Je souhaite obtenir cela :
"nom du panier" x "quantité" : "liste des id de produits"
 
Le résultat obtenu avec ma formule :
Panier n°2 x 1 : , , , 4363, 4365, 4404, , ,
Panier n°3 x 1 : , , , 4363, 4365, 4404, , , , , , , , , 1239, 1943, 536
 
Le résultat souhaité :
Panier n°2 x 1 : 4363, 4365, 4404
Panier n°3 x 1 : 1239, 1943, 536
 
Le problème vient de mon imbrication de foreach.
Pouvez vous me dire ce qui ne va pas dans ma formule ou m'orienter vers une autre solution.
 
Merci à vous de prendre le temps de regarder.
Bonne fin de journée
 
Hugo_064


Message édité par hugo_064 le 16-11-2017 à 12:36:35
mood
Publicité
Posté le 15-11-2017 à 18:29:34  profilanswer
 

n°2307762
pluj
Posté le 15-11-2017 à 19:04:17  profilanswer
 

Ce n'est franchement pas le code de l'année :

  • pas d'indentation donc c'est vraiment illisible
  • il y a des injections SQL
  • on peut réduire le nombre de requêtes avec IN(...) voire des UNION (ou autre suivant le SGBD)


Bref, déjà, je pense qu'il faudrait (ré)initialiser $organic_prod à chaîne vide en début du premier foreach. ($organic_prod = ''; après la ligne foreach ($_POST['idProduit'] as $key => $idProduit){)
 
Et pour la série de virgules où elles sont seules, c'est parce qu'une des deux requêtes ne renvoie rien ?
 
EDIT : il y a un truc qui ne va pas. Ce n'est pas plutôt name="pID['.$organic['organic_id'].']" au lieu de name="pID['.$organic_products['products_id'].']" (mais c'est probablement la même chose ?) et foreach ($_POST['pID'][$key] as $pID){ (ou foreach ($_POST['pID'][$idProduit] as $pID){ étant donné que $idProduit == $key - du moins en théorie) au lieu de foreach ($_POST['pID'] as $pID){ ? Parce que sinon tes paniers n'ont pas vraiment de corrélation avec les produits d'où les virgules qui traînent (tu parcours tous les produits indépendamment de leur panier donc quand tu tapes sur les produits d'un autre panier, ils n'existent pas et génèrent ces virgules d'autant qu'il n'y a pas non plus de test pour vérifier que tes fetch_array renvoient bien une ligne)
 

Code :
  1. if(isset($_POST['idProduit']) && is_array($_POST['idProduit'])) {
  2.    $sql = query('
  3.        SELECT c.organic_id, c.sort_order, ci.organic_name, c.status, ci.languages_id
  4.            FROM TABLE_ORGANIC c
  5.            JOIN TABLE_ORGANIC_INFO ci USING(organic_id)
  6.        WHERE c.status = 1
  7.            AND ci.languages_id = 4
  8.            AND c.organic_id IN(' . implode(', ', array_map('intval', $_POST['idProduit'])) . ')
  9.    ');
  10.    while ($recup = fetch_array($sql)) {
  11.        if (isset($_POST['pID'][$recup['organic_id']]) && is_array($_POST['pID'][$recup['organic_id']])) {
  12.            $sql2 = query('
  13.                SELECT *
  14.                    FROM TABLE_ORGANIC_PRODUCTS
  15.                    WHERE organic_id = ' . $recup['organic_id'] . '
  16.                        AND products_id = IN(' . implode(', ', array_map('intval', $_POST['pID'][$recup['organic_id']])) . ')
  17.            ');
  18.            $organic_prod = '';
  19.            while ($recup2 = fetch_array($sql2)) {
  20.                $organic_prod .= $recup2['products_id'] . ', ';
  21.            }
  22.            $organic_materials .= /*htmlspecialchars*/($recup['organic_name']) . ' x ' . intval($_POST['quantite'][$key]) . ' : ' . $organic_prod . ' </br> ';
  23.        }
  24.    }
  25. }


?


Message édité par pluj le 15-11-2017 à 23:05:35
n°2307785
hugo_064
Posté le 16-11-2017 à 12:36:06  profilanswer
 

Bonjour,
Un grand merci à toi d'avoir pris le temps de regarder ma requete.
 
N'ayant jamais eu de formation au php, je voyais où était le problème mais je m'y perdais.
Je te dits bravo car mon code est un peu voir complètement illisible et incompréhensible.
 
En rapide mais pas éfficace,
j'ai rajouté en début de requète :

Code :
  1. $organic_prod = "";


qui me supprime les doublons.
 
ainsi que :

Code :
  1. $organic_prod .= (empty($recup2['products_id']) ? '' : $recup2['products_id'].', ');


pour régler le problème des retours vide.
 
Merci de m'avoir ouvert les yeux.
Je vais tenter d'appliquer tes conseils et reprendre mon développement en me basant sur ton codage
et en faisant attention aux incohérences et aux injections sql.
 
En tout cas MERCI, ça m'a dépanner après m'être arraché les cheveux pendant 5 heures.
 
Hugo_064


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [resolu]imbrication de foreach

 

Sujets relatifs
probleme foreach phpFormulaire créé en javascript limité à 90 "lignes"
Problème avec boucle foreach powershellproblème avec une boucle foreach
[SQL/ACCESS] Requête Jointure + imbrication?Problème d'imbrication de références et de tableaux de références
$_GET, foreach et arrayimpossible de rentrer dans mon foreach
Récuperer plusieurs variables $_POST dans un foreachProblème imbrication d'objet Jquery IE
Plus de sujets relatifs à : [resolu]imbrication de foreach


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR