boucle et connexion DB2

Petit nouveau ! | 5 Messages

20 oct. 2008, 22:36

Bonjour,

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.

Petit nouveau ! | 5 Messages

24 oct. 2008, 11:42

Bonjour,

Ce n'est pas vraiment mon genre, mais je suis contraint de 'upper'. Je ne vois vraiment plus quoi faire.

J'ai tenté pas mal de choses :

- Suppprimer la bufferisation par ob_start => aucun effet.
- forcer le nombre d'itérations du for : si je le fore à 31 ça marche pas, mais si je le force à 30 ça fonctionne (et ça me laisse la dernière case du 31 vide).

Me disant que la requête était trop lourde , j'ai tenté de la séparer en 2 :

- première moitié de mois : j'affiche des cases vides sans effectuer la requete, j'effectue la requete sur la seconde moitié de mois. ça fonctionne. Je tente alors l'inverse (données en début de mois rien à la fin) ça fonctionne aussi.
Je garde donc ma requete en deux morceaux et je fait le calcul sur les 2 moitiés en me disant que ce serait bon ... => raté.
Je continue le test en reforçant mes limites sup à 30 et 31 => encore une fois, ça passe pour 30 mais pas pour 31

- utiliser foreach au lieu de while => toujours le même résultat.
- récupération des données dans un array avant : => echec (=même résultat)

J'ai aussi remarqué d'autres bizarreries :
Sur le mois en cours où ma requete s'arrête au jour actuel et non en fin de mois, sans rien changer au code, parfois j'obtiens tous mes éléments, et parfois non. Et encore autre chose, si je joue sur l'ordre des éléments avec un order by, il arrive qu'il ne maffiche les données que pour un seul dr (non, je n'ai pas de "break" qui traine)...

Je pense avoir épuisé mes ressources et mes idées, je teste en ce moment en imbriquant un autre ob_start mais jusquà maintenant, ça n'a strictement rien changé ...En fait, ce qu'il faudrait vraiment que je découvre, c'est l'origine de ce problème, mais je ne vois pas du tout d'où ça peut venir.

Merci d'avance, pour toute piste que vous pourriez me donner.

Petit nouveau ! | 5 Messages

30 oct. 2008, 23:05

Hello !

Vous donnez le rang de boulet ici ?
Si oui j'en veux bien un .... :lol:

je pense avoir trouvé et résolu mon problème Lundi dernier ... ça m'a prit du temps, enfin heureusement j'ai fait d'autres choses aussi !

Bref, omnubilé par le fait que ça ne marchait pas quasiment que dans un cas précis (sauf problème aléatoire), je m'étais pas rendu compte que je faisais quelque chose qui ne me parait pas bien du tout :

connexion et déconnexion à la BDD à l'intérieur d'une boucle ...

Depuis que je ne le fais plus, plus de problème ....

alors j'aimerais qu'on me confirme, mais à mon sens c'était vraiment pas bien ce que je faisais.

En tout cas merci quand même. :mrgreen: