Page 1 sur 1

Sum() qui pose Pb

Posté : 09 mai 2005, 08:17
par FAbrice
bonjour tout le monde

Je suis entrain de faire une page de statistiques avec 3 zones texte.
dans les 2 premieres, la date de début et de fin qui me servent de limite.
dans la 3ème, un seuil de points.

mon but est d'afficher tous les enregistrements compris entre les deux dates et dont la somme des points est < au contenu de la zonetexte n°3.

g donc le code suivant (obtenu avec dream (je c ce que vont dire les habitués!!! cf Cyrano :) ))
<?php require_once('../../Connections/ateliermeca.php'); ?>
<?php
$currentPage = $_SERVER["PHP_SELF"];

$maxRows_stataffichage = 10;
$pageNum_stataffichage = 0;
if (isset($_GET['pageNum_stataffichage'])) {
  $pageNum_stataffichage = $_GET['pageNum_stataffichage'];
}
$startRow_stataffichage = $pageNum_stataffichage * $maxRows_stataffichage;

$colname3_stataffichage = "1";
if (isset($_GET['valeur'])) {
  $colname3_stataffichage = (get_magic_quotes_gpc()) ? $_GET['valeur'] : addslashes($_GET['valeur']);
}
$colname1_stataffichage = "1";
if (isset($_GET['datemin'])) {
  $colname1_stataffichage = (get_magic_quotes_gpc()) ? $_GET['datemin'] : addslashes($_GET['datemin']);
}
$colname2_stataffichage = "1";
if (isset($_GET['datemax'])) {
  $colname2_stataffichage = (get_magic_quotes_gpc()) ? $_GET['datemax'] : addslashes($_GET['datemax']);
}
mysql_select_db($database_ateliermeca, $ateliermeca);
$query_stataffichage = sprintf("SELECT registre.NumDossier, registre.NumOT, registre.NumPompe, registre.Marques, registre.Models, registre.Secteur, registre.Urgence, registre.Datedebut, registre.Cloture, SUM(points.Points) FROM registre, points WHERE (registre.ID=points.Numdossier) and Datedebut > '%s' and Datedebut < '%s' and %s<SUM(points.Points) GROUP BY registre.Numdossier ORDER BY registre.Datedebut", $colname1_stataffichage,$colname2_stataffichage,$colname3_stataffichage);
$query_limit_stataffichage = sprintf("%s LIMIT %d, %d", $query_stataffichage, $startRow_stataffichage, $maxRows_stataffichage);
$stataffichage = mysql_query($query_limit_stataffichage, $ateliermeca) or die(mysql_error());
$row_stataffichage = mysql_fetch_assoc($stataffichage);

if (isset($_GET['totalRows_stataffichage'])) {
  $totalRows_stataffichage = $_GET['totalRows_stataffichage'];
} else {
  $all_stataffichage = mysql_query($query_stataffichage);
  $totalRows_stataffichage = mysql_num_rows($all_stataffichage);
}
$totalPages_stataffichage = ceil($totalRows_stataffichage/$maxRows_stataffichage)-1;

$queryString_stataffichage = "";
if (!empty($_SERVER['QUERY_STRING'])) {
  $params = explode("&", $_SERVER['QUERY_STRING']);
  $newParams = array();
  foreach ($params as $param) {
    if (stristr($param, "pageNum_stataffichage") == false && 
        stristr($param, "totalRows_stataffichage") == false) {
      array_push($newParams, $param);
    }
  }
  if (count($newParams) != 0) {
    $queryString_stataffichage = "&" . htmlentities(implode("&", $newParams));
  }
}
$queryString_stataffichage = sprintf("&totalRows_stataffichage=%d%s", $totalRows_stataffichage, $queryString_stataffichage);
?>
est ce que quelqu'un voit pourquoi j'obtiens le message suivant qd j'affiche ma page:
Invalid use of group function
merci de votre aide,
FAb

Posté : 09 mai 2005, 08:54
par Cyrano
Salut,
est-ce que ton message d'erreur précise une ligne particulière dans le script ?

P.S.: C'est vrai que je n'aime pas le code généré par DreamWeaver, ce n'est pas très optimisé, et je trouve que c'est un outil d'apprentissage déplorable, mais bon, chacun est libre de l'utiliser si ça fait son bonheur :D

Posté : 09 mai 2005, 09:08
par FAbrice
Salut Cyrano :D

je n'ai aucune info de ligne, seulement ce joli petiot message. :(

merci de ton aide,
FAb

Posté : 09 mai 2005, 09:51
par Ripat
Tu as une erreur sémantique dans ta requête. Tu ne peux pas faire de sum() dans un WHERE. MySQL est tout perdu, il ne sait pas ce qu'il doit faire.

Tu lui demandes de créer un tableau de résultats avec des sommes et, simultanément, de ne retenir que les sommes répondant à une condition. C'est cette simultanéité qu'il ne sait pas gérer.

Il doit d'abord créer un ensemble de résultats en faisant une somme sur le GROUP BY et seulement ensuite, sur cet ensemble, ne retenir que les sum() > quelque-chose. Pour cela il faut utiliser HAVING qui fera une sélection à postériori.

Je verrais plutôt quelque-chose comme:

Code : Tout sélectionner

SELECT registre.NumDossier, registre.NumOT, registre.NumPompe, registre.Marques, registre.Models, registre.Secteur, registre.Urgence, registre.Datedebut, registre.Cloture, SUM(points.Points) FROM registre JOIN points ON registre.ID=points.Numdossier WHERE registre.Datedebut > '%s' and registre.Datedebut < '%s' GROUP BY registre.Numdossier HAVING %s < SUM(points.Points) ORDER BY registre.Datedebut
J'ai modifié la syntaxe de la jointure (pour être un peu plus conforme à l'ANSI SQL) mais c'est surtout au niveau du HAVING que ça se passe. Il doit se trouver après le GROUP BY mais avant le ORDER BY.

Essaye.

Posté : 09 mai 2005, 13:16
par FAbrice
Salut,

je viens d'essayer la solution que tu me proposes mais ca ne fonctionne pas.
est ce que c'est normal que le %s avant l' "<" n'est pas de ' ' ???

en fait, ce qui ce passe:
la page s'affiche bien. je rentre les deux dates ainsi que le seuil. qd je clique sur OK, la page se recharge mais le tableau est vide!

je me domandais: dnas ton code, ou est ce que les zones textes sont prises en compte???

merci de ton aide,
FAb

Posté : 09 mai 2005, 13:27
par pjl
Vu que c'est un pb de requete, le plus simple est de la tester dans un client de ta base de données comme PHPMyAdmin (si tu utilise MySQL)..

Posté : 09 mai 2005, 13:36
par Ripat
je viens d'essayer la solution que tu me proposes mais ca ne fonctionne pas.
est ce que c'est normal que le %s avant l' "<" n'est pas de ' ' ???
Oui. La fonction d'agrégation sum() retourne un entier ou réel. On le compare donc à un autre entier ou réel.

Utiliser sprintf n'est pas courant mais correct, pour autant que tu sépares bien les spécificateurs de type:
// pas correct (voir ton code plus haut)
...'and %s<SUM(points.Points) GROUP BY...'

// correct
'...and %s < SUM(points.Points) GROUP BY...'
Fais un echo de tes requêtes avant chaque mysql_query. Si elle ont l'air correct, -> couper/coller -> ligne de commande ou phpmyadmin pour les tester

Posté : 09 mai 2005, 15:25
par FAbrice
rebonjour

pjl, comment fais tu pour tester un fonction avec phpmyadmin?

ripat, j'ai bien un espace avant et apres le <.
je ne comprend pas trop ta technique du "echo" :(
tu m'aurais m'expliquer???:oops:

en tout cas, merci de votre aide!!!!!!!!!!
FAb

Posté : 09 mai 2005, 17:20
par Ripat
Je comprends à ta question que tu n'es pas l'auteur du code ci-dessus. Pas grave. Quand tu veux débugger une requête assemblée dans du code PHP il faut tout d'abord t'assurer que celle-ci est correctement constituée avant de l'envoyer au serveur MySQL (par la fonction mysql_query). Il te suffit de faire un "print" de la variable dans laquelle ta requête a été stockée. Exemple pris de ton code:
// ici on construit ta requête
$query_limit_stataffichage = sprintf("%s LIMIT %d, %d", $query_stataffichage, $startRow_stataffichage, $maxRows_stataffichage);

// ici tu insères un echo de contrôle
echo $query_limit_stataffichage;

// c'est ici que ta requête est passée au serveur MySQL pour exécution
$stataffichage = mysql_query($query_limit_stataffichage, $ateliermeca) or die(mysql_error());
$row_stataffichage = mysql_fetch_assoc($stataffichage);
Sur la page affichée tu fais un copier/coller de la requête et tu la testes dans phpmyadmin ou tout autre client MySQL. Dans quel contexte/environnement travailles-tu?

Posté : 09 mai 2005, 17:48
par FAbrice
re :=)

Je travaille sous XP et avec phpmyadmin

FAb

PS: je suis le créateur de la page, mais avec l'aide de dream ;=)

Posté : 10 mai 2005, 10:26
par cerber
C'est un probleme [RESOLU] ? ou pas ?

Posté : 10 mai 2005, 13:09
par FAbrice
salut cerber

nan, le fil n'est pas encore terminé! malheureusement... :(

FAb