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

Langage PHP Discussion :

probleme de boucle ( surement)


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    Points : 48
    Points
    48
    Par défaut probleme de boucle ( surement)
    Bonjour,

    J'aurais besoin d'un peu d'aide. Je vais essayer de vous expliquer.
    J'ai une requête qui dans phpmyadmin me renvoie ceci :

    ________________________
    choix / id /nb_produit
    ---------------------------
    1 / 3 / 7
    1 / 8 / 1
    1 / 10 / 2
    1 / 11 / 1
    2 / 12 / 1
    2 / 13 / 3
    2 / 14 / 7
    2 / 15 / 8
    3 / 16 / 8



    Chaque ligne représente une commande, avec le nombre de produits pour chacune trié par mois ( variable choix = mois, donc choix=1 >> janvier)
    Je cherche à savoir combien j'ai de produits supérieur à 5. Par exemple pour la première ligne, j'ai 7 produits donc 2 produit supérieur à 5. J'additionne ensuite cette quantité par mois
    donc je devrais avoir pour le mois de :
    -Janvier (choix = 1) 2 produits
    - Février = 5 produits (7-5)+(8-5)
    - Mars = 3 produits.

    Je me retrouve avec en sortie:
    Janvier>> 2 produits
    Février >> 7 produits
    Mars >> 10 produits

    Clairement, il additionne tout. pour février il a bien trouver 5 produit mais + les 2 de janvier, pour mars il a bien trouver les 3 produits mais il a rajouter les 7 de février.
    En résumé >> janvier = les produits supérieur a 5 de janvier
    février >> les produits de janvier et février
    mars >> les produits de janvier février et mars. Il devrait pas faire ca.
    J'en deviens fou. Une semaine que je cherche alors je me tourne vers vous.

    Voici mon code, il doit y avoir un mini détail qui fait tt rater ..



    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    $sql_cout = "SELECT $SELECT AS choix, id_commande AS id, count( id_produit ) AS nb_produit
    FROM commandes_detail , commandes
    WHERE commandes_detail.id_commande = commandes.id
    AND commandes.statut
    IN (
    2, 3, 4, 100
    )
    $WHERE
    GROUP BY (
    id_commande
    )";
     
     
     
    sql_mysql_query ($sql_cout, 'cout');
     
     
    $test = 0;
    $val_sup = 0;
     
     
    while ($row = mysql_fetch_object($query_cout)) {
     
            $tab_cout[ $row -> choix] = $row -> nb_produit;
     
     
            // si le nombre de produit est sup à 5
            if ($tab_cout[$row -> choix] = $row -> nb_produit > 5)
     
                {    
     
                $val_sup = 0;
     
     
                    // stocke  le nombre de produit supérieur à 5 pour chaque commande (si 7 commande $sup = 2)
                    $sup = ($tab_cout[$row -> choix] = $row -> nb_produit)-5;
     
     
                        //somme les valeurs sup à 5                    
                        $val_sup +=   $sup;              
     
                }
     
        //retourne val_sup
        $tab_cout[ $row -> choix] = $val_sup;
                                                                           }


    J'ai a peu pres tout essayer, bien remettre toutes les variables à zéro, mettre des prints, des message d erreurs partt..
    Je vous remercie d'avance !!

  2. #2
    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
    Cette condition me parait douteuse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($tab_cout[$row -> choix] = $row -> nb_produit > 5)
    Mais tu dois pouvoir faire ce calcul depuis ta requête sur le mode
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SUM(compte) FROM (
    SELECT id_produit, count(id_produit) as compte FROM table 
    GROUP BY id_produit
    HAVING COUNT(id_produit) > 5
    ) a
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    Points : 48
    Points
    48
    Par défaut
    Bonjour, en fait il serait bien mieux pour moi de ne pas changer la requête.
    En fait, j'ai exactement le même problème sur d'autre pages et je dois effectuer des petits traitements php qui ne sont pas gérable par le SQL sur ces autres pages. Le problème est exactement le même. En janvier tout va bien, février me renvoie les résultats de janvier + février ect ..

  4. #4
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    en tout cas, je ne vois pas comment tu as dit à ton algo que février c'est pas janvier. C'est une information qui apparait dans le commantaire et pas dans le code ni dans le résultat de la donnée. Quel que part dans ton code il devrait y avoir un systeme qui étudie le cas d'un changement de mois. En fait je sais même pas faire le lien entre un mois et ta premiere requete.

    D'autre part LE langage fait pour manipuler les données c'est SQL, c'est pas php, c'est rare les manipulations qu'on ne peut pas faire en sql.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  5. #5
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Essaye cette requete :

    Code sql : 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
    SELECT 
    	choix,
    	SUM(nb_produit) as nb_produit
    FROM (
    		SELECT 
    			$SELECT AS choix, 
    			id_commande AS id, 
    			case when count(id_produit) <= 5 
    				then 0
    				else (count(id_produit) - 5)
    			end AS nb_produit
    		FROM 
    			commandes_detail, 
    			commandes
    		WHERE 
    			commandes_detail.id_commande = commandes.id
    			AND commandes.statut IN (2, 3, 4, 100)
    			$WHERE
    		GROUP BY
    			id_commande
    ) tmp
    GROUP BY 
    	choix
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  6. #6
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    @Seb33300 tu t'es bcp embêté pour ne pas écrire de HAVING.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    Points : 48
    Points
    48
    Par défaut
    J'ai changer le code php et ca fonctionne bien.
    Alors pour vous répondre, le traitement pour savoir à quels mois on est se fait plus loin de le code. Jai simplement ici mis le bout de code que je soupçonnais de faire des bêtises.

    Si je ne voulais pas changer la requête c parce que dans les autres pages où j'ai le même problème, je dois par exemple extraire un code postal et un id collissimo et faire des expressions régulières. Si les 2 premiers chiffre sont 8L la commande est nationale ce genre de choses.

    Je récupère ensuite le poids d'une commande et selon si la commande est nationale ou internationale ou autre, le poids définit le prix des frais de ports.
    (avec énormément de if , si le poids est entre 200g et 300g et la commande en nationale le frais de port sera un certain nombre). Je ne pense pas que cela soit jouable en SQL.
    Ci joint le code qui a résolu le problème. Je n'ai plus qu'à l'adapter pour qui'il fonctionne sur cette deuxième page plus complexe.

    Je vous remercie de votre aide.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    while ($row = mysql_fetch_object($query_cout))
    {
        if ($row->nb_produit > 5)
        {
            if(!isset($tab_cout[$row->choix]))
            {
                $tab_cout[$row->choix] = 0;
            }
     
            $tab_cout[$row->choix] += $row->nb_produit - 5;
        }
    }

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 106
    Points : 48
    Points
    48
    Par défaut
    ta requête seb fonctionne bien ca m'aurait donné le même résultat

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

Discussions similaires

  1. Probleme de boucle a s arracher les cheuveux
    Par calimero642 dans le forum Langage
    Réponses: 6
    Dernier message: 16/03/2006, 14h44
  2. Probleme de boucle avec des processus sous UNIX
    Par sebastieng dans le forum POSIX
    Réponses: 6
    Dernier message: 15/10/2005, 18h57
  3. [Language]Problème de boucle
    Par marc_dd dans le forum Langage
    Réponses: 11
    Dernier message: 06/10/2005, 14h24
  4. Problem de boucle.....
    Par skad dans le forum C++
    Réponses: 6
    Dernier message: 29/09/2005, 16h28
  5. [C#] Probleme de boucle for et random
    Par Freeman166 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/01/2005, 14h34

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