Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/02/2011, 17h51   #1
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
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 :
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 !!
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 19h20   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Cette condition me parait douteuse.
Code :
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 :
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
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 10h47   #3
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
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 ..
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 11h04   #4
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
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 Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 11h15   #5
Membre Expert
 
Avatar de Seb33300
 
Homme Sébastien Alfaiate
Développeur Web
Inscription : janvier 2007
Messages : 1 329
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Alfaiate
Âge : 26
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : janvier 2007
Messages : 1 329
Points : 1 657
Points : 1 657
Essaye cette requete :

Code sql :
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 Engineer PHP 5.3

« 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
Seb33300 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 11h21   #6
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
@Seb33300 tu t'es bcp embêté pour ne pas écrire de HAVING.
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 11h52   #7
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
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 :
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;
    }
}
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 11h55   #8
Futur Membre du Club
 
Inscription : avril 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 105
Points : 18
Points : 18
ta requête seb fonctionne bien ca m'aurait donné le même résultat
xavioche77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h03.


 
 
 
 
Partenaires

Hébergement Web