Page 1 sur 1

Affichage résultats requête incohérent

Posté : 18 nov. 2013, 19:20
par Heisenberg
Bonsoir,

je fais un site pour une société de livraison. Les chauffeurs se connectent au site, saisisse le numéro de leur tournée, le nombre de colis livrés et le nombre de colis ramassés.

Côté admin, un grand tableau affiche l'ensemble des tournées saisies par les chauffeurs avec le nombre de colis livrés et récupéré par numéro de tournée et par date. Avec en dernière ligne du tableau, le total des colis livrés et récupérés. Voici une image d'un exemple de tableau général:
Image

Donc ici vous voyez le tableau avec les numéros de tournées en haut, les dates à gauche. Les cellules sont remplies selon cet ordre: nombre de colis livrés - nombre de colis ramassés. En dernière ligne, le total. Ceci correspond au groupe TNT.
Bref, donc voilà ce que je souhaiterais obtenir pour un autre groupe EXAPAQ mais regardez ce que j'obtiens:

Image

Comme vous le remarquez, le total ne s'affiche pas pour toutes les tournées, mais uniquement pour la tournée 25.5, pour une raison qui m'échappe totalement.
Mon problème est donc ici, pourquoi le total ne s'affiche pas alors que sur le groupe TNT ça fonctionne parfaitement bien?
Je précise que j'ai exactement le même code entre les deux groupes, seul les appels aux tables dans les requêtes sont différents évidement.

Je vous poste quand même le code de la page affichant ce tableau:
<?php
session_start(); 
if (!isset($_SESSION['email'])) {
   header ('Location: index.php');
   exit(); 
}
$session_email = mysql_escape_string($_SESSION['email']);
?>
 
<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
        <title>Gestion des feuilles de route</title>
        <link rel="stylesheet" href="style.css" />
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.css" />
        <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
        <script src="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.js"></script>
    </head>
    <body>
        <div data-role="page">
            <div data-role="header">
                <a href="membre.php" data-icon="home">Retour</a>
                <h1>Gestion des feuilles de route de EXAPAQ</h1>
                <a href="ajout_exa.php" data-icon="plus">Ajouter une tournée</a>
            </div><!-- /Entete de la page -->
            <div data-role="content">
            <form action="exa_admin.php" method="post" data-ajax="false">
                <fieldset class="ui-grid-b">
                    <div class="ui-block-a">
                        <label for="select-choice-1" class="select"></label>
                            <select name="mois" id="select-choice-1">
                            <?php
                            $base = mysql_connect ('sql.free.fr', '******', '******'); 
                            mysql_select_db ('******', $base);
                            $reponse = mysql_query('SELECT DISTINCT MONTH(Date_liv) AS mois FROM `tournee_exa` ORDER BY mois');
                            while($donnees = mysql_fetch_array($reponse))
                            {
                            ?>
                                <option VALUE="<?php echo $donnees['mois'];?>"><?php echo $donnees['mois'];?></option>
                            <?php
                            }
                            ?>
                            </select>
                    </div>
                    <div class="ui-block-b">
                        <label for="select-choice-1" class="select"></label>
                            <select name="annee" id="select-choice-1">
                                <?php
                                $base = mysql_connect ('sql.free.fr', '******', '******'); 
                                mysql_select_db ('******', $base);
                                $reponse = mysql_query('SELECT DISTINCT YEAR(Date_liv) AS annee FROM `tournee_exa` ORDER BY annee');
                                while($donnees = mysql_fetch_array($reponse))
                                {
                                ?>
                                    <option VALUE="<?php echo $donnees['annee'];?>"><?php echo $donnees['annee'];?></option>
                                <?php
                                }
                                ?>
                            </select>
                    </div>
                    <div class="ui-block-c">
                        <label for="afficher"></label><input type="submit" name="afficher" id="afficher" value="Afficher" data-theme="b" />
                    </div>
                </fieldset>
            </form>
            <?php
            if (isset($_POST['afficher']) && $_POST['afficher'] == 'Afficher') {
                $base = mysql_connect ('sql.free.fr', '******', '******'); 
                mysql_select_db ('******', $base);
                $result2 = mysql_query('SELECT DISTINCT Numero FROM tournee_exa ORDER BY Numero');
                while($row= mysql_fetch_array($result2)) {
                     $tblNumero[] = $row['Numero'];
                }
                /*ICI*/
                $result = mysql_query('SELECT Numero, Nb_pt_liv, Pickup, Date_liv FROM tournee_exa WHERE MONTH(Date_liv) = "'.mysql_escape_string($_POST['mois']).'" AND YEAR(Date_liv) = "'.mysql_escape_string($_POST['annee']).'" ORDER BY Date_liv');
                while ($row = mysql_fetch_assoc($result)) {
                     $data[$row['Date_liv']][$row['Numero']] = array('points'=>$row['Nb_pt_liv'], 'pickup'=>$row['Pickup']);
                }
                echo '<table id="gradient-style" summary="Meeting Results"><tr><th scope="col">Points - Ramasses</th>';
                foreach ($tblNumero as $numero) {
                   echo '<th scope="col">' . $numero . '</th>';
                   $i = $i+1;
                }
                echo '</tr>';
                foreach($data as $date=>$data_numeros) {
                    echo '<tr><th scope="col">'. $date . '</th>';
                    foreach ($tblNumero as $numero) {
                         if (isset($data_numeros[$numero])) {
                                $points = $data_numeros[$numero]['points'];
                                $pickup = $data_numeros[$numero]['pickup'];
                          }
                         else {
                                $points = '';
                                $pickup = '';
                         }
                         echo '<td>' . $points . ' - ' . $pickup . '</td>';
                     }
                     echo '</tr>';
                }
                echo '<tr><th scope="col">Total</th>';
                $result2 = mysql_query('SELECT DISTINCT Numero FROM tournee_exa ORDER BY Numero');
                while($row= mysql_fetch_array($result2)) {
                    $num = $row['Numero'];
                    $mois = mysql_escape_string($_POST['mois']);
                    $annee = mysql_escape_string($_POST['annee']);
                    $nb_pt="SELECT SUM(Nb_pt_liv) AS nb_pt, SUM(Pickup) AS pick FROM tournee_exa WHERE Numero ='$num' AND MONTH(Date_liv) = '$mois' AND YEAR(Date_liv) = '$annee' ORDER BY Numero";
                    $req_nb_pt=mysql_query($nb_pt);
                    $tab_nb_pt=mysql_fetch_array($req_nb_pt) ;
                    echo '<th  scope="col">'.$tab_nb_pt["nb_pt"].' - '.$tab_nb_pt["pick"].'</th>';
                }
                echo '</tr></table>';
            } else {
                $base = mysql_connect ('sql.free.fr', '******', '******'); 
                mysql_select_db ('******', $base);;
                $result2 = mysql_query('SELECT DISTINCT Numero FROM tournee_exa ORDER BY Numero');
                while($row= mysql_fetch_array($result2)) {
                     $tblNumero[] = $row['Numero'];
                }
                /*ICI*/
                $result = mysql_query('SELECT Numero, Nb_pt_liv, Pickup, Date_liv FROM tournee_exa WHERE MONTH(Date_liv) = MONTH(Now()) AND YEAR(Date_liv) = YEAR(Now()) ORDER BY Date_liv');
                while ($row = mysql_fetch_assoc($result)) {
                     $data[$row['Date_liv']][$row['Numero']] = array('points'=>$row['Nb_pt_liv'], 'pickup'=>$row['Pickup']);
                }
                echo '<table id="gradient-style" summary="Meeting Results"><tr><th scope="col">Points - Ramasses</th>';
                foreach ($tblNumero as $numero) {
                   echo '<th scope="col">' . $numero . '</th>';
                   $i = $i+1;
                }
                echo '</tr>';
                foreach($data as $date=>$data_numeros) {
                    echo '<tr><th scope="col">'. $date . '</th>';
                    foreach ($tblNumero as $numero) {
                         if (isset($data_numeros[$numero])) {
                                $points = $data_numeros[$numero]['points'];
                                $pickup = $data_numeros[$numero]['pickup'];
                          }
                         else {
                                $points = '';
                                $pickup = '';
                         }
                         echo '<td>' . $points . ' - ' . $pickup . '</td>';
                     }
                     echo '</tr>';
                }
                echo '<tr><th scope="col">Total</th>';
                $result2 = mysql_query('SELECT DISTINCT Numero FROM tournee_exa ORDER BY Numero');
                while($row= mysql_fetch_array($result2)) {
                    $num = $row['Numero'];
                    $nb_pt="SELECT SUM(Nb_pt_liv) AS nb_pt, SUM(Pickup) AS pick FROM tournee_exa WHERE Numero ='$num' AND MONTH(Date_liv) = MONTH(Now()) AND YEAR(Date_liv) = YEAR(Now()) ORDER BY Numero";
                    $req_nb_pt=mysql_query($nb_pt);
                    $tab_nb_pt=mysql_fetch_array($req_nb_pt) ;
                    echo '<th  scope="col">'.$tab_nb_pt["nb_pt"].' - '.$tab_nb_pt["pick"].'</th>';
                }
                echo '</tr></table>';
            }
            ?>
            </div>
            <div data-role="footer">
                <div class="ui-grid-b">
                    <div class="ui-block-a"></div>
                    <div class="ui-block-b"><a href="exa.php" data-role="button" data-type="horizontal">Mes tournées</a><h4 style="text-align:center">&copy; Aldana - Antony 2013</h4></div>
                    <div class="ui-block-c"></div>
                </div><!-- /grid-b -->
            </div><!-- /Pied de page -->
 
        </div>
    </body>
</html>
J'explique mon code, on peut afficher les tournées en choisissant quel mois et quelle année. Quand on a rien saisi, par défaut le tableau affiche les tournées du mois en cours. Sinon rien de bien particulier, j'utilise jQueryMobile.

Si vous avez besoin du code d'autres pages ou quoi que ce soit, n'hésitez pas à me le demander.

Merci beaucoup pour votre aide!

Re: Affichage résultats requête incohérent

Posté : 18 nov. 2013, 21:18
par Mazarini
SELECT SUM(Nb_pt_liv) AS nb_pt, SUM(Pickup) AS pick FROM tournee_exa 
WHERE Numero ='$num' AND MONTH(Date_liv) = MONTH(Now()) AND YEAR(Date_liv) = YEAR(Now()) 
ORDER BY Numero
A mon avis le ORDER by est de trop.
Le mieux est de vérifier les erreurs avec mysql_errno() et mysql_error().

Sur le principe, il faudrait utiliser le même code pour les 2. Et même utiliser la même table. Il suffirait de mettre le nom de la table dans une variable ou d'ajouter une colonne et ajouter une condition dans les select.

Re: Affichage résultats requête incohérent

Posté : 18 nov. 2013, 23:20
par Heisenberg
Merci de ta réponse rapide.

Je viens ajouter des nouvelles informations. En interrogeant la base de données directement en saisissant des requêtes SQL dans phpmyadmin, je me suis aperçu que lorsque je demande de me retourner la somme des colis livrés ou des ramasses et bien j'obtiens "NULL-NULL" sur toutes les tournées exceptée la "25.5".
De plus, je n'obtiens aucun résultat lorsque j'interroge la BDD en me demandant de retourner les valeurs des champs nb_colis_livrés ou ramasses, toujours excepté, pour la tournée "25.5".

Voici les requêtes:
SELECT SUM( Nb_pt_liv ) AS nb_pt, SUM( Pickup ) AS pick
FROM tournee_exa
WHERE Numero =  '43.1'
Résultat:
nb_pt pick
NULL NULL
SELECT SUM( Nb_pt_liv ) AS nb_pt, SUM( Pickup ) AS pick
FROM tournee_exa
WHERE Numero =  '25.5'
Résultat:
nb_pt pick
4 4
SELECT Nb_pt_liv AS nb_pt, Pickup AS pick
FROM tournee_exa
WHERE Numero =  '25.5'
Résultat:
nb_pt pick
3 3
1 1
SELECT Nb_pt_liv AS nb_pt, Pickup AS pick
FROM tournee_exa
WHERE Numero =  '43.1'
Résultat:
"MySQL n'a retourné aucun enregistrement."

(j'ai pris '43.1' à titre d'exemple, mais ça ne fonctionne avec aucune autre non plus, sauf la '25.5').

Je précise que les structures entre les tables tnt et exapaq sont identiques.
Je trouve ça quand même vraiment bizarre que ça ne fonctionne que pour la tournée "25.5" et aucun des autres...

Re: Affichage résultats requête incohérent

Posté : 19 nov. 2013, 00:18
par Mazarini
De quel type est la colonne numero ?
A priori, il faut choisir varchar.

Re: Affichage résultats requête incohérent

Posté : 20 nov. 2013, 00:35
par Heisenberg
Numéro est de type float.
Il y a-t-il une raison pour que ça fonctionne uniquement pour la tournée '25.5'?

Re: Affichage résultats requête incohérent

Posté : 22 nov. 2013, 12:07
par Heisenberg
Bon et bien c'est résolu! Tu as raison, il fallait utiliser le type varchar pour la colonne 'Numero' =D>
J'en reviens pas que le problème soit résolu... MERCI :mrgreen:

Juste une petite question... Tu en venus comment à penser qu'il faudrait utiliser varchar plutôt que float?
Ça a un rapport avec le fait que je souhaitais faire la somme de nombres à virgule, du coup ça bloquait?

Re: [RESOLU] Affichage résultats requête incohérent

Posté : 22 nov. 2013, 12:57
par Mazarini
J'ai fait du Fortran au siècle dernier :priere:
En Fortran on ne teste pas que 2 variables sont égales, mais que leur différence est "très petite".

Dans les faits, lorsque tu affiches 0,2 tu peux voir 0,199999. Le codage en float provoque des arrondis. Ce qui se code bien en base 10 peut se coder moins bien en base 2. Le format décimal n'a pas ce problème, le float est à garder pour des vrais calculs. Pour de la compta par exemple, le plus simple est de travailler en centimes (et donc en entier).

A titre d'exemple 1/3 en base 3 se code "0,1" et en base 10 "0,33333333..." (je n'ai pas d'exemple en base 2)