IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Imbrication de foreach dans un foreach [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Imbrication de foreach dans un foreach
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     $organics_query = query("select c.organic_id, c.sort_order, ci.organic_name, c.status, ci.languages_id
    from TABLE_ORGANIC c, TABLE_ORGANIC_INFO ci
    where c.organic_id = ci.organic_id
    and c.status = '1'
    and ci.languages_id = '4'
    ORDER BY c.sort_order, ci.organic_name");
    while ($organic = fetch_array($organics_query)) {
    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;" >';
    // choix du panier
    echo '	<div style=" height:300px; vertical-align:top; text-align:center;">'
    .'<strong>'.TEXT_SELECT_ORGANIC.'</strong><input type="checkbox" name="idProduit['.$organic['organic_id'].']" value="'.$organic['organic_id'].'">'.$organic['organic_name']
    .'<br>'.
    '</div>';
    // choix des produits dans le panier
    echo '	<div style=" vertical-align:top; text-align:left;"><strong>'.TEXT_SELECT_INSIDE.'</strong><br>';
    $organic_products_query = query("select *
    from TABLE_ORGANIC_PRODUCTS
    where organic_id = '" . $organic['organic_id'] . "'
    ORDER BY organic_products_id");
    while($organic_products = fetch_array($organic_products_query)){
    echo '<input type="checkbox" name="pID['.$organic_products['products_id'].']" value="'.$organic_products['products_id'].'" checked="true">'.$organic_products['products_id'].'<br>';
    }
    echo '</div>';
    // choix de la quantité
    echo '	<br><div style=" vertical-align:top; text-align:left;"><strong>'.TEXT_SELECT_QTY.'</strong>
    <input type="number" min="1" max="99" style="width: 7em;" autocomplete="off" name="quantite['.$organic['organic_id'].']" id="'.$organic['organic_id'].'" value=""/>
    </div>
    </div>';
    }
    et pour envoyer tout ça dans le contenu d'un mail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    if(isset($_POST['idProduit'])){
    foreach ($_POST['idProduit'] as $key => $idProduit){
    $sql = query("select c.organic_id, c.sort_order, ci.organic_name, c.status, ci.languages_id
    from TABLE_ORGANIC c, TABLE_ORGANIC_INFO ci
    where c.organic_id = ci.organic_id
    and c.status = '1'
    and ci.languages_id = '4'
    and c.organic_id =".$idProduit."
    ");
    $recup = fetch_array($sql);
    foreach ($_POST['pID'] as $pID){
    $sql2 = query("select *
    from TABLE_ORGANIC_PRODUCTS
    where organic_id = '".$idProduit."'
    and products_id = '" . $pID . "'
    ");
    $recup2 = fetch_array($sql2);
    $organic_prod .= $recup2['products_id'].', ';
    }
    $organic_materials .= $recup['organic_name'].' x '.$_POST['quantite'][$key].' : '.$organic_prod.' </br> ';
    }
    }
    $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

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 272
    Points : 15 588
    Points
    15 588
    Par défaut
    c'est surement l'initialisation qui manque.
    avant la ligne "foreach ($_POST['pID']..." rajoutez "$organic_prod = "";"

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    En fait il faudrait tout reprendre.
    En 8 points

    1 - dans tes SELECT tu mets des colonnes qui ne te servent pas
    2 - tu ne fais pas tes requêtes avec JOIN
    3 - les requêtes imbriquées ce n'est pas du tout performant
    4 - tu mets des apostrophes sur des valeurs numériques
    5 - ton code n'est pas indenté, c'est illisible et c'est donc normal que tu t'y perdes
    6 - dans ton formulaire tes produits ne sont pas liés aux paniers, donc à l'arrivée tout est mélangé
    7 - tu as des incohérences de nom : le champ "idProduit" contient "organic_id"
    8 - il n'y a aucune sécurité concernant l'injection de valeurs dans tes requêtes

    Je propose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
    $organics_query = query("SELECT c.organic_id, ci.organic_name, cp.product_id
    from TABLE_ORGANIC c
    JOIN TABLE_ORGANIC_INFO ci ON c.organic_id = ci.organic_id
    JOIN TABLE_ORGANIC_PRODUCTS cp ON cp.organic_id = c.organic_id
    WHERE c.status = 1
    AND ci.languages_id = 4
    ORDER BY c.sort_order ");
     
    $cur_id = "";
    while ($row = fetch_array($organics_query)) {
     
    	if ($row['organic_id'] != $cur_id) {
     
    		if ($cur_id != "") {
    			echo $end_div;
    		}
     
    		$end_div = '</div>
    			<br><div style=" vertical-align:top; text-align:left;"><strong>'.TEXT_SELECT_QTY.'</strong>
    			<input type="number" min="1" max="99" style="width: 7em;" autocomplete="off" name="quantite['.$row['organic_id'].']" id="'.$row['organic_id'].'" value=""/>
    			</div>';
    		$cur_id = $row['organic_id'];
    	}
    		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;" >';
    		// choix du panier
    		echo '	<div style=" height:300px; vertical-align:top; text-align:center;">'
    		.'<strong>'.TEXT_SELECT_ORGANIC.'</strong><input type="checkbox" name="organic_id[]" value="'.$row['organic_id'].'">'.$row['organic_name']
    		.'<br>'.
    		'</div>';
    		echo '<div style=" vertical-align:top; text-align:left;"><strong>'.TEXT_SELECT_INSIDE.'</strong><br>';
    	}
    	echo '<input type="checkbox" name="produit['.$row['organic_id'].'][]" value="'.$row['products_id'].'" checked="true">'.$row['products_id'].'<br>';
    }
    // on clos le dernier bloc
    echo $end_div;
    ici j'utilise la méthode la plus directe : en profitant du classement par "organic" je capte le changement de valeur pour construire mes blocs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
     
    if(isset($_POST['organic_id']) && !empty($_POST['quantite'][$_POST['organic_id']])) {
    	foreach ($_POST['organic_id'] as $organic_id) {
    		$sql = query("select c.organic_id, ci.organic_name, cp.products_id
    		from TABLE_ORGANIC c
    		JOIN TABLE_ORGANIC_INFO ci ON c.organic_id = ci.organic_id
    		JOIN TABLE_ORGANIC_PRODUCTS cp ON cp.organic_id = c.organic_id
    		where c.status = 1
    		and ci.languages_id = 4
    		and c.organic_id = " . intval($organic_id));
     
    		while ($row = fetch_array($sql)) {
    			$panier[$row['organic_id']]['name'] = $row['organic_name'];
    			$panier[$row['organic_id']]['quantite'] = $_POST['quantite'][$row['organic_id']];
     
    			if (isset($_POST[$row['organic_id']])) {
    				$panier[$row['organic_id']]['products'][] = $row['products_id'];
    			}
    		}
    	}
     
    	$organic_materials = '';
    	foreach ($panier as $organic_id => $values) {
    		$organic_materials .= $values['organic_name'].' x '. $values[$quantite].' : '. implode(',' , $values['products']) . '</br>';
    	}	
    }
    $contenu_email = $organic_materials;
    Ici pour le mail, je construis un tableau PHP classé par "organic_id" c'est plus coûteux mais plus propre quand même.

    Je précise que je n'ai pas testé, il y a peut etre des fautes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Un grand merci à vous 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 vous dits bravo car mon code est un peu voir complètement illisible et incompréhensible.

    Avec l'indication de mathieu,
    J'ai rajouté en début de requète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $organic_prod = "";
    qui me supprime les doublons.

    J'ai également ajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $organic_prod .= (empty($recup2['products_id']) ? '' : $recup2['products_id'].', ');
    pour régler le problème des retours vide.


    Merci également à Sabotage qui m'a 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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Message d'erreur dans un foreach
    Par maysa dans le forum Langage
    Réponses: 2
    Dernier message: 14/08/2007, 11h45
  2. [JSTL] Checkboxes dans un foreach
    Par BadIsGood dans le forum Taglibs
    Réponses: 2
    Dernier message: 29/06/2007, 18h58
  3. [C#]utilisation de variables contenu dans un foreach
    Par beufreecasse dans le forum Windows Forms
    Réponses: 2
    Dernier message: 01/11/2006, 20h42
  4. Problème de variable dans un foreach
    Par VolaiL dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 18/05/2006, 16h57
  5. Réponses: 4
    Dernier message: 14/09/2005, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo