Je n'arrive pas à trouver mon erreur qui provoque un comportement assez étonnant.
Voilà le topo : je cherche à faire entrer des données issues d'une base DB2 dans un tableau. Ce tableau correspond en fait à un calendrier en première entrée horizontale) et à une liste d'élément en deuxième entrée (verticale).
A chacun de ces éléments correspond donc une valeur à un jour donné. (c'est clair jusque là ?)
Je vous avouerais que mon code est assez tarabiscoté et ne me plaît pas vraiment(while imbriqués), mais il faut voir aussi que je vais chercher les éléments en question sur une base MySQL et les données sur une base DB2.
Le comportement bizarre en question est qu'en fait le code me donne ce que j'attend pour les mois dont le nombre de jours est strictement inférieur à 31. Dès que le mois a 31 jours, la grande boucle ($dr) est effectuée 2 fois seulement alors qu'elle est censée contenir 6 objets.
L'appel au résultat est assez long, j'ai donc fait appel à ob_start (à améliorer plus tard) que je ne connaissais pas, j'espère que ce n'est pas ça qui gène.
$sql= "Select * from dr";
$st = mysql_query($sql) or die('Failed query: '.mysql_st_error().":".mysql_st_errormsg());
while ($dr = mysql_fetch_array($st)) {
$mareq = "Select * from Table";
$test = mysql_query($mareq) or die('Failed query: '.mysql_test_error().":".mysql_test_errormsg());
$fichierCache="cache/cache-index.php"; // Chemin du fichier cache de la page
if (@filemtime($fichierCache)<time()-(3600) { //si la page n'existe pas dans le cache ou si elle a expiré
ob_start();
include ("i5_connect.inc"); //connexion DB2
while ($liste = mysql_fetch_array($test)) {
$dateCourante = $dateDebut;
for($i = 1; $i <=$nbMax; $i++) { //nbMax obtenu par une fonction calculant le nombre de jour du mois concerné.
// requete
$requete= "Select count(*) from Table Where ...";
$stmt = db2_exec($db, $requete) or die('Failed query: '.db2_stmt_error().":".db2_stmt_errormsg());
while ($resultat = db2_fetch_array($stmt)) {
$l3 .= '<td>'.$resultat[0].'</td>';
$total[$i] += $resultat[0];
}
$dateCourante = $dateDebut + ($i * 86400);
}
echo '<tr><td>'.$liste['Code'].'</td>'.$l3.'</tr>';
$l3 = null;
}
echo '<tr><td class="total">Bilan</td>';
for($i = 1; $i <=$nbMax; $i++) {
$l4 .= '<td class="total">'.$total[$i].'</td>';
}
echo $l4;
$l4 = null;
$total = null;
echo '</tr>';
include ("i5_disconnect.inc");
$contenuCache = ob_get_contents(); // récupération du contenu
ob_end_flush();// on termine la bufferisation
$fd = fopen("$fichierCache", "w"); // Ouverture du fichier cache
if ($fd) {
fwrite($fd,$contenuCache); // Ecriture du contenu du buffer dans le fichier cache
fclose($fd);
}
} else { // le fichier cache existe déjà
include ($fichierCache);
}
J'ai fait quelque raccourci, s'il manque des morceaux de code ou des précisions, je vous les apporterai.
Je serais heureux d'apprendre ce qui cloche, mais aussi d'entendre toute suggestion pour améliorer ce code.
Merci.