Additionner plusieurs valeurs en fonction d'une requete [Résolu]

atreides51
Messages postés
11
Date d'inscription
lundi 13 novembre 2000
Dernière intervention
18 décembre 2008
- 7 juil. 2008 à 21:20 - Dernière réponse : JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
29 juin 2010
- 8 juil. 2008 à 23:03
Bonjour,
je cherche un truc tout bete du style, j'envoie dans un fichier req.php plusieurs valeurs d'un champ.ensuite en fonction de ses valeurs je cherche à les additionner entre elles groupé par fournisseur et afficher le résultat. j'ai essayé avec la fonction SUM(prix), la condition et group by fournisseur mais ils ne m'aditionne pas le resultat lorsque je choisi plusieurs produits...mon champ prix est en VARCHAR...
quelqu'un pourrait m'expliquer comment m'approcher de la réponse à ma requête ?..
Merci d'avance

 ma table catalogue_produit
id - code_produit - fournisseur  -  prix
1       34                     1              12.20
2         3                     1              14.40
3       34                     2              12.25
4         3                     2              14.42
5       34                     3              12.28
6         3                     3              14.41

voici mon fichier req.php

<?php
include('connect.php');
$nb_code_produit=$_POST['nb_code_produit'];


for($i=0;$i<$nb_code_produit;$i++)
{
 if (isset($_POST["mavaleur$i"]))
         {
$le_produit=$_POST["mavaleur$i"]; 
         } 
}
$query = "SELECT code_produit, fournisseur, SUM(prix) as masomme FROM catalogue_produit WHERE code_produit='$le_produit' GROUP BY fournisseur";
$somme = mysql_query($query) or die ('Erreur : '.mysql_error() );

while($code_f=mysql_fetch_array($somme))
       {     
    echo "Le total chez " .$code_f["fournisseur"]; . " est de : " . $code_f['masomme'] . "
"; 
        }
?>
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
29 juin 2010
- 8 juil. 2008 à 22:29
3
Merci
Re,

Bon, j'ai fait un code qui fonctionne ^^ (la flemme de mettre en couelur)
En fait, le but est de récupérer les tableau de valeurs ... quoi de mieux qu'un Array ^^ Et Html nous offre cette possibilité ! (regarde le code rouge) Et il ne reste qu'a traité (2eme code rouge) comme un simpel Array. Si tu as besoin de plus d'informations demande :p

<?php

include './connexion.php';

$sql = 'SELECT code, produit, stock_actuel, stock_mini, mesure FROM rep_produits WHERE stock_actuel <= stock_mini order by produit';
$resultat = mysql_query($sql) or die('Une erreur systeme s\'est glissée: ' . mysql_error());

if ( mysql_num_rows($resultat) <> 0 )
{
    ?>
<form name="form1" method="post" action="rep_caddie.php">

<?php

while( $row = mysql_fetch_array($resultat) ) // ou bien: while ($lignes=mysql_fetch_rows($resultat))
{
    if( $row['stock_actuel'] >= $row['stock_mini'] )
    {
        continue;
    }

    echo '
  ----

    ', $row['code'], ',
    ', $row['produit'], ',
    produits[', $row['code'], ']" value="', $row['code'], '" />,
  ';

}
?>
    ----

       
            id="cmd_enreg" value="Enregistrer" />,
   

</form>
<?php

mysql_free_result($resultat);

}

mysql_close();

?>

Et

<?php

include './connexion.php';

// Le formulaire à t'il été envoyé ? Et _POST['produits'] est-il un Array ??
// -> cela permet une meilleur gestion. Un simple parcourt de tableau suffit,
//    et on récupère toutes les valeurs, facilitant par la même occasion la
//    gestion
if( isset($_POST['produits']) && is_array($_POST['produits']) )
{
    $list_id_produits = array();
    foreach( $_POST['produits'] as $id_produit )
    {
        // Et autres vérifications, si besoin :p
        if( !is_numeric($id_produit) )
        {
            continue;
        }
        $list_id_produits[] = $id_produit;
    }

    // $list_id_produit contient donc la liste de tous les produits à tester ...
    // Soit on fait directement dans le SQL, soit on fait une reqûete par produit
    // ou on lit tout et on prend ce qu'on à besoin ...
    // -> 1er solution ^__^

    // On crée une chaîne de caractères avec les ID des produits pour SQL    $sql_list_id_produits 'code_produit ' . implode(' OR code_produit = ', $list_id_produits);
    // Si besoin :    // {  $sql_list_id_produits 'code_produit "' . implode('" OR code_produit = "', $list_id_produits) . '"';  }

    ## PARTIE I
    // On fait la liste de tous les produits demandés et on prend les informations utiles ...
    $list_produits_fournisseurs = array();

    $sql = '
SELECT
 code_produit, fournisseur, prix, table2.produit as name_produit
FROM
  catalogue_produit
    LEFT JOIN rep_produits as table2 ON table2.code = code_produit
WHERE
  (' . $sql_list_id_produits . ')';
    $resultats = mysql_query($sql) or die ('SQL Erreur : '.mysql_error() );
    while( $row = mysql_fetch_assoc($resultats ))
    {
        $list_produits_fournisseurs[$row['fournisseur']][$row['code_produit']] = $row;
    }

    ## PARTIE II
    // On fait le traitement par fournisseur, le total et le nombre de produits ;)
    //  L'ideal serait de trouver un moyen de récupérer tous les code_produits (séparés par quelque chose (caractère)) ...
    //  malheureusement je ne sais pas faire ça ... et je ne voie pas si c'est possible :s
    //  Donc, on sépare les deux requetes ^^
    $sql = '
SELECT
  fournisseur, SUM(prix) as prix_total, COUNT(code_produit) as nbre_produits
FROM
  catalogue_produit
WHERE
  (' . $sql_list_id_produits . ')
GROUP BY fournisseur';

    $resultats = mysql_query($sql) or die ('SQL Erreur : '.mysql_error() );
    while( $row = mysql_fetch_assoc($resultats ))
    {
        // On vérifie qu'il existe une entrée par apport à la 1er requete (normalement pas de problème ^^) -> BUG de MySQL ??
        if( isset($list_produits_fournisseurs[$row['fournisseur']]) )
        {
            // On affiche de détail
            echo '
  Détail fournisseur n°', $row['fournisseur'], ' :

  ';
            // ... par rapport à la 1er reqûete
            foreach( $list_produits_fournisseurs[$row['fournisseur']] as $code_produit => $row_detail_produit )
            {
                // Bla bla bla ...
                echo '
    <li>', $row_detail_produit['name_produit'], ' (ID ', $row_detail_produit['code_produit'], ') ', $row_detail_produit['prix'], '</li>';
            }
            echo '
 
  Total : ', $row['prix_total'], ' (', $row['nbre_produits'], ' articles)
 

  <hr />';
        }
        else
        {
            echo 'Erreur !';
        }
    }
}
else
{
    echo 'Erreur : envoie de donnée invalide !';
}
?>

Et ça donne :

Détail fournisseur n°1 :
<li>Cacao (ID 34) 13.30</li><li>Pâté De Volaille (ID 3) 15.50</li>Total : 28.8 (2 articles)

<hr />
Détail fournisseur n°3 :
<li>Pâté De Volaille (ID 3) 12.20</li><li>Cacao (ID 34) 16.40</li>Total : 28.6 (2 articles)

<hr />
Détail fournisseur n°4 :
<li>Pâté De Volaille (ID 3) 12.60</li><li>Cacao (ID 34) 4.50</li><li>boite (ID 102) 22.03</li>Total : 39.13 (3 articles)

<hr />

<hr />Si ma reponse te convient, merci de l'accepter ! 

Merci JoJo738 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de JoJo738
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
29 juin 2010
- 8 juil. 2008 à 00:11
0
Merci
Salut !

Hum ... je ne comprend pas trop ton code :s

Bon, tu sélectionne le code_produit, le fournisseur et la somme des prix de ton catalogue quand code_produit = $le_produit (une erreur d'ailleurs ! Ta boucle n'as aps de sens ! Seule la dernière valeur est gardée ...)
Donc, tu récuperes ce résultat ... qui corespond en fait à par exemple pour code_produit = 34
1       34                     1              12.20
3       34                     2              12.25
5       34                     3              12.28

Ensuite, tu fais une boucle, et affiche le total chez X ... En fait, tu veux (selon ton code) afficher la table telle qu'elle est ... alors quel est l'utilité de SUM() ??

Peux-tu m'expliquer ton code ??

Sinon, coté récupération de données ... que récupères-tu (plusieurs données ? une seule ?) ??

Selon ton code, il existe plusieurs champs mavaleurX, et seul le dernier est gardé dans $le_produit ...
Ne veux-tu pas récupérer plusieurs codes produits ???

<hr />Si ma reponse te convient, merci de l'accepter ! 
Commenter la réponse de JoJo738
atreides51
Messages postés
11
Date d'inscription
lundi 13 novembre 2000
Dernière intervention
18 décembre 2008
- 8 juil. 2008 à 15:39
0
Merci
Bonjour Jojo,
merci de prendre un peu de ton temps pour m'aider dans cette appli qui j'en suis sur est toute bete mais je m'en sors pas...

voici ma page formulaire :
<?php
include "../connexion.php";
$rq="SELECT code,produit,stock_actuel,stock_mini,mesure FROM rep_produits WHERE stock_actuel <= stock_mini order by produit";
$resultat=mysql_query($rq) or die("Une erreur systeme s'est glissée: ".mysql_error());
$nb=mysql_num_rows($resultat);
if ($nb>0)
{
?>
<form name="form1" method="post" action="req_caddie_formulaire.php">
  <?    
$nb_code_produit=0;
while($lignes=mysql_fetch_array($resultat,MYSQL_NUM)) // ou bien: while ($lignes=mysql_fetch_rows($resultat))
               {
if ($lignes[2] < $lignes[3])
                        {
?>
  ----

    <?php echo $lignes[0]; ?>,
    <?php echo $lignes[1]; ?>,
          name="mavaleur<?php echo $nb_code_produit; ?>" value="<?php echo $lignes[0]; ?>">
   ,
   
  <?php
 $nb_code_produit++;
                     }
            }
?>
  ----

           
        <?php echo ""; ?>
   ,
   

</form>
<?
mysql_free_result($resultat);
}
mysql_close();
?>
/***********************/
ensuite avec $nb_code_produit je compte le nombre de variable que je fais passer dans le second fichier et je recupere les valeurs des variables incrémenter avec :
$nb_code_produit=$_POST['nb_code_produit'];for($i=0;$i<$nb_code_produit;$i++)
{
 if (isset($_POST["mavaleur$i"]))
         {
$le_produit=$_POST["mavaleur$i"]; 
         } 
}
$le_produit me sort donc tous les codes produits car si je fais un echo $le_produit.'
';
j'ai bien tous mes codes produits l'un en dessous des autres dans mon fichier req_caddie_formulaire.php et c'est apres que je veux en fonction de tout ces codes produit, les additionner et les regrouper par fournisseur.

Selon ton code, il existe plusieurs champs mavaleurX, et seul le dernier est gardé dans $le_produit ...
Ne veux-tu pas récupérer plusieurs codes produits ???
Si exactement ca.je veux simplement additionner le champ "prix" et regrouper par fournisseur seulement ces codes produits qui auront été cochés dans le fichier formulaire ci dessus.

Donc, tu récuperes ce résultat ... qui corespond en fait à par exemple pour code_produit = 34

1       34                     1              12.20
3       34                     2              12.25
5       34                     3              12.28

oui mais je n'arrive pas a additionner plusieurs "prix" en fonction des codes produits choisis dans le fichier formulaire qui envoi tous ces codes produits et les regrouper par fournisseur.
vois tu ce que je veux dire?
c'est dur?
Merci
Commenter la réponse de atreides51
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
29 juin 2010
- 8 juil. 2008 à 19:33
0
Merci
Je n'ai pas trop regarder, là je vais manger ^^

Mais :

for($i=0;$i<$nb_code_produit;$i++)
{
 if (isset($_POST["mavaleur$i"]))
         {
$le_produit=$_POST["mavaleur$i"]; 
         } 
}

C'est faux ! Si tu fais tout de suite un echo $le_produit; oki, ca va marcher. Mais si apprès tu fais un echo(); ... la tu ne vas récupérer que le dernier.

Après manger je te montre une autre méthode beaucoup plus simple ;)

(passer en _POST un tableau -> mavaleur['id_array'])

Après pour ton traitement, tu peux faire un traitement dirrectement sur le SQL ou après ... tout dépend ce que tu veux faire ... Je vais étudier ça ;)

Pour m'aider dans ma tache, pourrais tu me passer ton code SQL (création de al table, et quelques enregistrements ???) J'ai la flemme de tout créer :p

<hr />Si ma reponse te convient, merci de l'accepter ! 
Commenter la réponse de JoJo738
atreides51
Messages postés
11
Date d'inscription
lundi 13 novembre 2000
Dernière intervention
18 décembre 2008
- 8 juil. 2008 à 20:19
0
Merci
Super sympa, je te donne la table apres y avoir passé LOL

table catalogue_produit

CREATE TABLE `catalogue_produit` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `code_produit` int(10) NOT NULL default '0',
  `fournisseur` varchar(20) NOT NULL default '',
  `date` date NOT NULL default '0000-00-00',
  `mini_commande` varchar(20) NOT NULL default '',
  `prix` varchar(10) NOT NULL default '0',
  `choix` int(5) NOT NULL default '0',
  `norme` int(5) NOT NULL default '0',
  `ref_produit` varchar(20) NOT NULL default '',
  `conditionnement` varchar(50) NOT NULL default '',
  `origine` varchar(100) NOT NULL default '',
  `marque` varchar(100) NOT NULL default '',
  `observations` varchar(250) NOT NULL default '',
  KEY `Num_Abs` (`id`),
  KEY `Num_Abs_2` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;


--
-- Contenu de la table `catalogue_produit`
--


INSERT INTO `catalogue_produit` (`id`, `code_produit`, `fournisseur`, `date`, `mini_commande`, `prix`, `choix`, `norme`, `ref_produit`, `conditionnement`, `origine`, `marque`, `observations`) VALUES
(5, 3, '3', '2008-07-03', '', '12.20', 0, 0, '', 'Kg', '', '', ''),
(3, 3, '4', '2008-07-03', '3 cartons', '12.60', 0, 0, '12459', 'Pièce', 'france', 'senoble', 'sucré'),
(11, 34, '1', '0000-00-00', '', '13.30', 0, 0, '', '', '', '', ''),
(6, 34, '3', '2008-07-04', '', '16.40', 0, 0, '', '', '', '', ''),
(2, 34, '4', '2008-07-08', '4 cartons', '4.50', 1, 3, '57', 'Kg', 'france', 'benco', 'très bon'),
(4, 3, '1', '2008-07-03', '2 cartons', '15.50', 0, 0, '4577', 'Pièce', 'france', 'senoble', 'sucré'),
(12, 102, '4', '2008-07-08', '', '22.03', 0, 0, '6455', 'Boite', '', '', '');

table rep_produits

CREATE TABLE `rep_produits` (
  `code` int(10) unsigned NOT NULL auto_increment,
  `code_general` int(10) NOT NULL default '0',
  `code_categ` int(10) NOT NULL default '0',
  `code_sous_categ` int(10) NOT NULL default '0',
  `produit` varchar(50) NOT NULL default '',
  `mesure` varchar(20) NOT NULL default '',
  `stock_actuel` varchar(10) NOT NULL default '',
  `date_entree` date NOT NULL default '0000-00-00',
  `stock_mini` int(10) NOT NULL default '0',
  `dlc` date NOT NULL default '0000-00-00',
  `quantite_ration` varchar(10) NOT NULL default '',
  `grammage_ration` varchar(20) NOT NULL default '',
  `observations` text NOT NULL,
  `photo` varchar(20) NOT NULL default '',
  `local` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`code`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=50 ;


--
-- Contenu de la table `rep_produits`
--


INSERT INTO `rep_produits` (`code`, `code_general`, `code_categ`, `code_sous_categ`, `produit`, `mesure`, `stock_actuel`, `date_entree`, `stock_mini`, `dlc`, `quantite_ration`, `grammage_ration`, `observations`, `photo`, `local`) VALUES
(1, 1, 2, 1, 'Thé Aromatisé', 'Boite', '6', '2005-09-17', 3, '2008-10-01', '1', 'Pièce', '2.28€ HT chez Misa', '1.JPG', '1'),
(2, 1, 2, 1, 'Lipton Tea', 'Boite', '0', '2005-09-17', 0, '2007-03-01', '1', 'Pièce', 'RAS', '2.JPG', '1'),
(3, 1, 1, 2, 'Pâté De Volaille', 'Pièce', '2', '2005-09-17', 5, '2008-02-01', '1', 'Pièce', 'RAS', '3.JPG', '1'),
(5, 1, 2, 4, 'Arôme Basquaise', 'Boite', '0', '2005-09-17', 0, '2006-08-01', '4', 'Gramme', 'RAS', '5.JPG', '1'),
(17, 1, 2, 4, 'Sauce Béarnaise Nestlé', 'Boite', '2', '2005-09-27', 4, '2006-02-25', '5', 'Gramme', 'de marque NESTLE', '17.JPG', '1'),
(26, 1, 2, 9, 'Miel En Petit Pot', 'Pièce', '300', '2005-09-17', 99, '2008-04-01', '1', 'Pièce', '0.15€ chez misa
', '26.JPG', '1'),
(27, 1, 2, 9, 'Pom''potes', 'Pièce', '0', '2005-09-17', 0, '2006-03-03', '1', 'Pièce', 'R.A.S. actuellement', '27.JPG', '1'),
(28, 1, 2, 9, 'Café Moulu En 1 Kg', 'Kg', '4', '2005-09-17', 2, '2008-02-01', '5', 'Gramme', 'R.A.S. actuellement', '28.JPG', '1'),
(29, 1, 2, 6, 'Gavroche 3 Brigands', 'Pièce', '0', '2005-09-17', 0, '2006-04-30', '1', 'Pièce', 'gâteau de 30 g', '29.JPG', '2'),
(30, 1, 2, 9, 'Sucre Morceaux', 'Kg', '50', '2005-09-17', 9, '2008-06-30', '5', 'Gramme', '1.57€ HT chez Misa', '30.JPG', '1'),
(31, 1, 2, 9, 'Choco Krispies', 'Boite', '2', '2005-09-17', 4, '2008-02-20', '30', 'Gramme', 'R.A.S. actuellement', '31.JPG', '1'),
(32, 1, 2, 3, 'Chips', 'Sachet', '32', '2005-09-17', 0, '2007-10-08', '1', 'Pièce', 'carton de 30 pièces de 30 gr', '32.JPG', '1'),
(33, 1, 2, 9, 'Pâte à Tartiner', 'Pièce', '433', '2005-09-17', 240, '2008-05-13', '1', 'Pièce', 'pâte à tartiner à 18.92€/carton de 120 chez misa
\r\n0.15€ pièce chez misa
', '33.JPG', '1'),
(34, 1, 2, 9, 'Cacao', 'Kg', '5', '2005-09-17', 7, '2009-03-15', '10', 'Gramme', '3.84€ en Okakao chez Misa \r\n- 4.97€ en nesquick chez misa', '34.JPG', '1');

formulaire_caddie.php
<?php
include "../connexion.php"; 
$rq="SELECT code,produit,stock_actuel,stock_mini,mesure FROM rep_produits WHERE stock_actuel <= stock_mini order by produit";
$resultat=mysql_query($rq) or die("Une erreur systeme s'est glissée: ".mysql_error());
$nb=mysql_num_rows($resultat);
if ($nb>0)
{
?>
<form name="form1" method="post" action="req_caddie_formulaire.php">
  <?    
$nb_code_produit=0;
while($lignes=mysql_fetch_array($resultat,MYSQL_NUM)) // ou bien: while ($lignes=mysql_fetch_rows($resultat))
            {
if ($lignes[2] < $lignes[3])
                        {
?>
  ----

    <?php echo $lignes[0]; ?>,
    <?php echo $lignes[1]; ?>,
          " value="<?php echo $lignes[0]; ?>">
   ,
   
  <?php
 $nb_code_produit++;
                     }
            }
?>
  ----

           
        <?php echo ""; ?>
   ,
   

</form>
<?
mysql_free_result($resultat);
}
mysql_close();
?>

et req_caddie_formulaire.php
<?php 
include('../connexion.php');


$nb_code_produit=$_POST['nb_code_produit'];


for($i=0;$i<$nb_code_produit;$i++)
{
 if (isset($_POST["mavaleur$i"]))
 {
$le_produit=$_POST["mavaleur$i"];
echo $le_produit.'
';
 } 
}
  
$query = "SELECT code_produit, fournisseur, SUM(prix) as masomme FROM catalogue_produit WHERE code_produit='$le_produit' GROUP BY fournisseur ";
$somme = mysql_query($query) or die ('Erreur : '.mysql_error() );


while($code_f=mysql_fetch_array($somme))
        {  
    echo "Le total chez " . $code_f["fournisseur"] . " est de : " . $code_f['masomme'] . "
";    
        }
?>

Voila les 2 fichiers et les 2 tables et je crois entre apercevoir ce que tu veux dire par la boucle pour sortir $le_produit...


mais les array j'ai encore un peu de mal a comprendre leur utilisation hormis quand je fais du pompage betement...
Commenter la réponse de atreides51
atreides51
Messages postés
11
Date d'inscription
lundi 13 novembre 2000
Dernière intervention
18 décembre 2008
- 8 juil. 2008 à 22:51
0
Merci
Jojo tu es un super Chef !!!!
voilà 3 jours que je coince sur ce truc car il me manque quelques base en php et quand on a pas quelqu'un pres de soi
pour expliquer calmement eh ben c'est pas evident ...
je vais 'éplucher ce code pour mieux comprendre des fonctions que tu as mis.
et tu maitrises super le php, pas comme moi LOL
si je rencontre quelques problemes épineux pour moi, pourrai je te demander conseil encore?
Un Grand merci pour ton aide je vais pouvoir devellopper davantage mon programme et utiliser session_start(); pour ce type de formulaire
Encore merci et je te souhaite une bonne soirée !
Webamicalement
Florian
Commenter la réponse de atreides51
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
29 juin 2010
- 8 juil. 2008 à 23:03
0
Merci
^^

Je suis là, pas de problème !

Enfin, je me suis quand même un peu creusé la tête ... je voulait tout rasemblait en une seule requête, mais ce n'est apparamment pas possible (enfin, avec une certaine méthode si ... mais bon .. je l'aime pas ^^ (ORDER BY fournisseur, et mettre un bout de code suplementaire pour savoir si c'est un nouveau fournisseur ou pas ... bla bla bla ^^) Berk ! ^^)

Sinon, je rajouterais un petit ORBER BY code_produit ou name_produit dans la 1er reqûete, pour avoir un rendu uniformisé ;)
Ah, et fait attention au include ;) je l'ai legerement modifié pour mes besoins :p

Aller ! sur ce, bonnen nuit ^^ Et bon courage :D

<hr />Si ma reponse te convient, merci de l'accepter ! 
Commenter la réponse de JoJo738

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.