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 :

"sauter" un enregistrement avec une boucle [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut "sauter" un enregistrement avec une boucle
    Bonjour,

    c'est encore moi le nb du php

    et j'ai encore une question existentielle à laquelle je ne trouve pas de réponse...

    J'ai boucle pour générer un tableau qui fonctionne parfaitement (en presque...) qui utilise la requete suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mysql_select_db($database_cosmetiques, $cosmetiques);
    $query_a_commander = "SELECT * FROM production, associations_produits, produits WHERE production.suivi = 'A commander' AND production.id_recette = associations_produits.id_recette AND associations_produits.id_produit = produits.id";
    $a_commander = mysql_query($query_a_commander, $cosmetiques) or die(mysql_error());
    $row_a_commander = mysql_fetch_assoc($a_commander);
    $totalRows_a_commander = mysql_num_rows($a_commander);
    La définition de ma boucle que voici (c'est un do while).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($row_a_commander = mysql_fetch_assoc($a_commander));
    Mon problème c'est que la requête lit tout les enregistrement du tableau avec les conditions qui sont fixées bien sûr.

    Mais je voudrais que le champ associations_produits.id_produit ne soit affiché qu'une seule fois pour une même valeur de ce champ

    ex :
    une ligne pour le produit 56
    une ligne pour le produit 72

    mais si le produit 56 est de nouveau présent dans la table, je voudrais sauter ce nouvel enregistrement
    et ensuite reprendre la lecture du tableau

    une ligne pour le 87 ect...

    es ce que c'est possible ?

    merci d'avoir eu la patience de me lire

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 159
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 159
    Points : 8 338
    Points
    8 338
    Billets dans le blog
    17
    Par défaut
    Oui c'est possible. Il faut stocker dans un tableau les identifiants rencontrés dans la boucle et avant tout nouvel affichage s'assurer que l'identifiant n'est pas présent de le tableau.
    Ceci dit il vaudrait mieux faire une requête sans doublons.
    D'ailleurs à propos de la requête, pour les jointures, ils faut utiliser INNER JOIN.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Je crois avoir compris le fonctionnement de INNER JOIN après quelques lectures.

    Cependant je ne vois pas comment écrire ma requête car dedans je dois faire un WHERE = "A commander" sur le champ suivi de la table production, est ce que je peux faire juste après un AND FROM matable INNER JOIN matable2 (matable.champ = matable2.champ) ?

    La solution pour créer un tableau ou stocker les identifiants stockés par la boucle m'intéresse beaucoup .

    sans vouloir abuser , Je suis prenneur d'une piste pour m'orienter sur le sujet.

    merci encore

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 159
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 159
    Points : 8 338
    Points
    8 338
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par ripout Voir le message
    Je crois avoir compris le fonctionnement de INNER JOIN après quelques lectures.

    Cependant je ne vois pas comment écrire ma requête car dedans je dois faire un WHERE = "A commander" sur le champ suivi de la table production
    La requête suivante est identique à la tienne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM production
    INNER JOIN associations_produits ON production.id_recette = associations_produits.id_recette
    INNER JOIN produits ON associations_produits.id_produit = produits.id
    WHERE production.suivi = 'A commander'
    La solution pour créer un tableau ou stocker les identifiants stockés par la boucle m'intéresse beaucoup .
    ... mais franchement pas efficace, et puis c'est le rôle de SQL de te sortir des données comme il faut.

    Donne la structure de tes 3 tables, un petit extrait significatif de données et ce que tu souhaites en obtenir.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut super sympas de m'aider
    Tout d'abord Séb. merci beaucoup de prendre le temps de m'aider et de partager ton savoir.

    Je note l'utilisation de INNER JOIN pour déterminer les liaisons.

    Alors pour mes tables
    table produits

    id int(11) (clé primaire auto incrémentée)
    type varchar(50)
    designation varchar(80)
    unite_volume varchar(2)
    densite decimal(6,3)
    valeur_goutte_ml decimal(6,3)
    conditionnement int(11)
    prix_conditionnement decimal(5,2)


    table recettes

    id int(11) (clé primaire auto incrémentée)
    designation varchar(80)
    quantite int(11) (j'aurais pu l'apeller conditionnement, ce champ contient pour quelle quantite de la recette sont données les proportions d'ingrédients.)
    procede text
    commentaire text


    table associations_produits

    id int(11) (clé primaire auto incrémentée)
    id_produit int(11)
    id_recette int(11)
    quantite decimal(6,2)


    table entrees_stock (j'aurais pu apeller cette table mouvements de stock, j'y enregistre ce qui entre en stock en effet et aussi ce qui en sort en négatif)

    id int(11) (clé primaire auto incrémentée)
    date varchar(10) (honte à moi de pas l'avoir déclaré en champ date mais je n'ai pas besoin de faire de calculs spécifique au dates alors bon...)
    produit int(11)
    quantite decimal(6,2)
    prix decimal(5,2)


    table production

    id int(11) (clé primaire auto incrémentée)
    suivi varchar(50)
    id_recette int(11)
    quantite int(11)
    date varchar(10)
    Pour ce que je souhaite en obtenir.

    Dans la table production j'indique que une quantité x d'une recette est commandée, la table associations_produits me permet d'indiquer quelle quantité et e quels ingrédients sont nécessaires pour cette recette, et dans table produits je peut voir quels sont les détails de ces produits.

    Au final je veut générer un tableau dynamique dans lequel je synthétise quels produits sont nécessaires à la réalisation des recettes commandées moins les quantités que j'ai déjà en stock.

    Une préparation de commande fournisseur en quelque sorte

    J'espère que j'ai été clair et n'avoir rien oublié, et aussi de ne pas avoir construit ma base de données trop n'importe comment.

    Je me répète encore mais merci beaucoup d'avoir la patience de me lire

  6. #6
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour,

    oui il faut toujours essayer de ramener le minimum d'information de MySQL afin de gagner en performances et en mémoire.

    Ceci dit à titre d'information, tu peux sauter une occurence de boucle à l'aide de continue

    Exemple :

    Code php : 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
     
    $exclude = array(4, 7);
    $affichages = 0;
     
    for($i=1; $i<11; $i++){
    	if(in_array($i, $exclude))
    		continue;
     
    	echo $i . ' pas dans le tableau ! <br />' ;
    	$affichages++;
    }	
     
    echo $affichages . ' affichages au total';
     
    /* -->
    1 pas dans le tableau !
    2 pas dans le tableau !
    3 pas dans le tableau !
    5 pas dans le tableau !
    6 pas dans le tableau !
    8 pas dans le tableau !
    9 pas dans le tableau !
    10 pas dans le tableau !
    8 affichages au total
    */

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    tu fais pas de distrinct ni de group by ? ou un NOT IN si ca dépend d'autre chose ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Bonsoir,

    merci pour vos réponse.

    J 'explore les pistes que vous me donnez et je reviens honteusement poster ensuite.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 19
    Points
    19
    Par défaut Merci
    Bonsoir.

    j'ai enfin eu un peu de temps pour potasser mon application.

    et grâce a toutes vos pistes et tous vos conseils.

    ça marche enfin impec !

    Merci beaucoup à tous

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/05/2013, 22h40
  2. Enregistrer dans la BD avec une boucle
    Par jillthe1 dans le forum Doctrine2
    Réponses: 11
    Dernier message: 09/01/2012, 00h53
  3. Réponses: 1
    Dernier message: 15/04/2010, 19h48

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