[resolu]imbrication de foreach

imbrication de foreach [resolu] - PHP - Programmation

Marsh Posté le 15-11-2017 à 18:29:34    

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
Reply

Marsh Posté le 15-11-2017 à 18:29:34   

Reply

Marsh Posté le 15-11-2017 à 19:04:17    

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
Reply

Marsh Posté le 16-11-2017 à 12:36:06    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed