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 :

Cumuler des variables depuis une boucle


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut Cumuler des variables depuis une boucle
    Bonjour,

    Je n'arrive pas à trouver la solution à un problème, c'est pourquoi je viens ici.

    Je développe une petite appli php/mysql .

    Disons pour simplifier que dans cette base j'ai trois infos :
    1 produit
    2 prix unitaire
    3 quantité

    Je me connecte à la base, j'affiche les éléments avec une boucle while et pour le prix total de chaque produit j'utilise ce code :
    $tune= (($data["prix_unitaire"]) *($data["quantité"]));

    Ainsi à l'affichage ça donne par exemple ceci :
    Produit : Cocaïne prix unitaire : 250 € quantité : 10
    Prix Total : 2500 €

    Produit : klenex prix unitaire : 50 € quantité : 5
    Prix Total : 250 €

    etc...

    Mais ce que je ne sais pas faire, c'est à la fin indiquer la totalité des prix totaux, soit faire le cumul de la variable $tune à chaque tour de boucle dans une autre variable finale (totalité des prix totaux).
    Dans l'exemple plus haut ça donnerait 2500 + 250 soit 2750.

    Voici la partie du code simplifié (sans le css etc...) de ma boucle à supposer que c'est à ce niveau ou plus bas qu'il faille agir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while ($data = mysql_fetch_array($show))
        {
    // affiche toutes les infos 
     $tune= (($data["prix_unitaire"]) *($data["quantité"]));
    echo '
     <b>produit :</b>  '.$data['designation'].'
     <b>quantité :</b> '.$data['quantité'].'
        <b>Prix unitaire:</b> '.$data['prix_unitaire'].'
         <b>coût :</b>'.$tune.' € HT
          </div>
     ';
    }
    Cordialement
    Philippe

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while ($data = mysql_fetch_array($show))
    {
    // affiche toutes les infos
    $tune= (($data["prix_unitaire"]) *($data["quantité"]));
    echo '
    <b>produit :</b> '.$data['designation'].'
    <b>quantité :</b> '.$data['quantité'].'
    <b>Prix unitaire:</b> '.$data['prix_unitaire'].'
    <b>coût :</b>'.$tune.' € HT
    $tune_total+=$tune';
    }
    echo'<b>coût total : </b>'.$tune_total.'€ HT
    </div>';
    Je pense que ça devrait faire ce que tu voulais. Par contre tu fermais a chaque tour de boucle une <div> ça me parait bizarre vu qu'il n'y a pas de <div> ouverte dans ta boucle

    ++

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    moi je ferais une requete comme celle la plus propre ds le code ensuite pour le calcul du prix:

    select produit,prix unitaire,quantité,prix unitaire*quantité as prix_tot from tatable

    et le code
    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
     
    $total=0;
    while ($data = mysql_fetch_array($show))
    {
    // affiche toutes les infos
    echo '
    <b>produit :</b> '.$data['designation'].'
    <b>quantité :</b> '.$data['quantité'].'
    <b>Prix unitaire:</b> '.$data['prix_unitaire'].'
    <b>coût :</b>'.$data['prix_tot'].' € HT
    </div>
    ';
     
    $total += $data['prix_tot'];
    }
    echo $total;

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2009
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2009
    Messages : 138
    Par défaut
    et si tu déclares une variable $total avant le while, initialisée à 0, et tu ajoutes à chaque passage dans le boucle, le montant courant $tune, ca marcherait pas ??

    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
     
    $total = 0;
    while ($data = mysql_fetch_array($show))
    {
    // affiche toutes les infos
    $tune= (($data["prix_unitaire"]) *($data["quantité"]));
    echo '
    <b>produit :</b> '.$data['designation'].'
    <b>quantité :</b> '.$data['quantité'].'
    <b>Prix unitaire:</b> '.$data['prix_unitaire'].'
    <b>coût :</b>'.$tune.' € HT
    $total += $tune;
    </div>
    ';
    }
    echo $total
    [EDIT]oups, trop tard ...
    et en plus, mon $total += $tune; est mal placé...[/EDIT]

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut Merci
    Bonjour narutobaka,

    J'ai eut ce matin l'agréable surprise d'avoir des réponses.
    Je viens de tester ta solution et ça marche nickel .

    Je connaissais le ++ mais pas le + derrière une variable.
    Comment cela s'appel t'il histoire que j'approfondisse le sujet ?

    COrdialement
    Philippe

  6. #6
    Membre éprouvé
    Inscrit en
    Juin 2009
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2009
    Messages : 138
    Par défaut
    équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tune_total = $tune_total + $tune;
    Il ne faut pas simplement considérer l'opérateur +, c'est l'opérateur +=.

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut réponse2
    Merci Boo 64

    Ta solution alternative est intéressante, mais je n'arrive pas à la faire fonctionner j'ai du faire une erreur quelque part.

    Mon ancien code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (empty ($mov) ) { $requete = "SELECT   *  FROM globale,historique where globale.id=historique.produit  ORDER BY id2 DESC "; }


    Mon nouveau en fonction de tes instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (empty ($mov) ) { $requete = "SELECT id,lot,ref,designation,conditionnement,unité_de_mesure,prix_unitaire,quantité,id2,move,date,produit,quantité,où,new_stock,old_stock   prix_unitaire*quantité as prix_tot  FROM globale,historique where globale.id=historique.produit  ORDER BY id2 DESC "; }


    j'ai aussi essayé ceci pour que ça soit moins long :

    ... SELECT *, prix_unitaire*quantité as prix_tot FROM ....

    Dans les deux cas j'ai une erreur sql, donc je suppose qu'il doit manquer un élément ou bien un pb de syntaxe, ou encore pe lié au fait que dans mon cas je fais un croisement de tableau.

    Ais-je le droit de faire "SELECT *, prix_unitaire*quantité as prix_tot FROM" ?

    Cordialement
    Philippe

  8. #8
    Membre éprouvé
    Inscrit en
    Juin 2009
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2009
    Messages : 138
    Par défaut
    Citation Envoyé par mac7474 Voir le message
    Ais-je le droit de faire "SELECT *, prix_unitaire*quantité as prix_tot FROM" ?
    je sais pas... a priori on peut faire le produit comme tu le fais (cf: ce topic).

    Par contre, je sais pas trop si c'est possible, mais ca me parait bizarre le "select *" suivi d'une autre colonne...

  9. #9
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Citation Envoyé par mac7474 Voir le message
    Ais-je le droit de faire "SELECT *, prix_unitaire*quantité as prix_tot FROM" ?
    Oui

    Mais peut être faut il les parenthèses ?
    (prix_unitaire*quantité) as prix_tot

    Je n'en suis pas sûr. Peux tu nous dire quel est l'erreur qui est retournée ?

  10. #10
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut Réponse à Bého32
    Bonjour,

    Merci pour ton éclaircissement sur l'équivalence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tune_total = $tune_total + $tune;
    ça c'était à ma porté... mais je n'y ais pas pensé.

    Cordialement
    Philipppe

  11. #11
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut Réponse 4
    Ok merci, d'après ce topic il faudrait utiliser des parentèses...
    A tester...

    a+

  12. #12
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut Réponse à Seb33300
    Ok merci je vais tester avec les parenthèses.

    Pour le message :
    Echec de requète SQL

    qui est renvoyé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $show =  mysql_query($requete) or die ("Echec de requète SQL");

  13. #13
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut test avec parenthèses
    Bonjour,

    Je viens de tester avec les parenthèses et j'ai encore le message d'erreur.
    Ne vous prenez pas les tête, l'une des solutions donnée ici fonctionne c le principal.

    Cependant j'aimerais comprendre ceci :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    prix_unitaire*quantité as prix_tot

    Le as prix_tot est un champ virtuel temporaire qui récupère prix_unitaire*quantité ?

    Cordialement
    Philippe

  14. #14
    Membre éprouvé
    Inscrit en
    Juin 2009
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2009
    Messages : 138
    Par défaut
    En gros, dans ta fonction de sélection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *, prix_unitaire*quantité as prix_tot FROM
    tu vas afficher toutes les colonnes de ta table (par le "*"), et une autre colonne qui s'appelerait prix_unitaire*quantité.

    Le AS prix_tot permet de renommer cette dernière colonne en prix_tot.

    En gros, ça renomme ta colonne.

  15. #15
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut
    Citation Envoyé par bého32 Voir le message
    En gros, dans ta fonction de sélection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *, prix_unitaire*quantité as prix_tot FROM
    tu vas afficher toutes les colonnes de ta table (par le "*"), et une autre colonne qui s'appelerait prix_unitaire*quantité.

    Le AS prix_tot permet de renommer cette dernière colonne en prix_tot.

    En gros, ça renomme ta colonne.
    Ok merci mais cette colonne n'existe pas dans ma base, donc c'est une colonne virtuelle parallèle à la base ?

  16. #16
    Membre éprouvé
    Inscrit en
    Juin 2009
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2009
    Messages : 138
    Par défaut
    Oui, elle n'a rien de concret par rapport à la base, si ce n'est les informations qu'elle contient.
    Cette colonne n'apparaît nulle part dans ta base. on peut dire que oui, c'est "virtuel".

  17. #17
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Pour connaitre l'erreur SQL retournéer il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $show =  mysql_query($requete) or die (mysql_error());

  18. #18
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut Réponses bého32 Seb33300 boo64
    Ok merci à vous trois.

    bého32,
    Ce qui pourrait justifier cette erreur, c pe tout simplement que je fais référence à cette colonne vituelle sans qu'il y est de correspondance avec une table, puisqu'elle n'appartient à aucune des deux que je croise :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    if (empty ($mov) ) { $requete = "SELECT   *  FROM globale,historique where globale.id=historique.produit "; }

    seb33300,
    Merci pour ton code je testerai cela lundi.

    boo64,
    Je crois mieux comprendre ta stratégie qui se situe en amont pour le calcul du prix total dans un but d'allégement de code.
    Par contre je ne sais pas encore pourquoi ça ne marche pas, mais avec le code de seb33300 je vais pouvoir avoir plus de détail sur l'erreur.

    Quoiqu'il en soit merci à vous tous de m'avoir aidé.
    J'ai appris tout seul à programmer en m'aidant des tutoriaux sur internet, mais parfois je bloque.

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Citation Envoyé par mac7474 Voir le message
    Ok merci mais cette colonne n'existe pas dans ma base, donc c'est une colonne virtuelle parallèle à la base ?
    re dsl pour la réponse tardive donc tout simplement le as permet de mettre un alias sur le nom de la colonne que te retourne mysql dans le résultat:

    prix_unitaire*quantité as prix_tot

    permet donc d'eviter dans le traitement de devoir faire:

    $data['prix_unitaire*quantité']

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

Discussions similaires

  1. initialisation des variable avec une boucle
    Par grospatapouf dans le forum Langage
    Réponses: 10
    Dernier message: 10/01/2009, 12h17
  2. [E-07] créer des variables dans une boucle ?
    Par edouardg dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/12/2008, 22h19
  3. Afectation des variables dans une boucle
    Par Yoni Lebene dans le forum Delphi
    Réponses: 3
    Dernier message: 05/01/2007, 18h52
  4. Générer des variables avec une boucle
    Par Anamelech dans le forum Delphi
    Réponses: 15
    Dernier message: 03/11/2006, 12h33
  5. [MySQL] Traitement des variables d'une boucle for
    Par liryc78 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/03/2006, 20h53

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