[RESOLU] Récupérer array dans boucle while

Petit nouveau ! | 2 Messages

26 févr. 2021, 18:15

Bonjour à tous,

Je rencontre un problème avec mon array dans une boucle WHILE

J'arrive pas a retrouver une donnée enregistrée dans le tableau array dans la boucle while qui précède. J'ai tenté avec in_array et array_search mais sans résultats
$reponse = "SELECT stock_encours FROM stock_silo" ;
$req = mysql_query($reponse) or die('Erreur SQL !<br />'.$reponse.'<br />'.mysql_error());

// on recupere le resultat sous forme d'un tableau
$data = mysql_fetch_array($req);

$stock_actuel = $data['stock_encours'] ;	

echo "Stock actuel : $stock_actuel" ; ?></br><?php

$today = date("Y-m-d");
$indice = 0 ;
$nb_jour = 0 ;
$num_bat = 1 ;
$nb_bat = 0 ;
$Calcul_jour = "début" ;
$stockage_jr_restant = array() ;

while($stock_actuel >= 0){

	//Calcul du nombre de jour restant en se basant sur la consommation théorique restante après les jours passés.
	//On enlève le batiment 4 car il n'existe pas

	if($num_bat==4){
		$num_bat = 5 ;
	}
	if($num_bat>5){
		$num_bat = 1 ;
	}

	$sqlBoucle = "SELECT * FROM entrees WHERE batiment = $num_bat" ;
	$reqBoucle = mysql_query($sqlBoucle) or die('Erreur SQL !<br />'.$sqlBoucle.'<br />'.mysql_error());


		//while ($dataBoucle = mysql_fetch_array($reqBoucle)) {
		$dataBoucle = mysql_fetch_array($reqBoucle) ;
		
			$date_entree = $dataBoucle['date'] ;
			$batiment = $dataBoucle['batiment'] ;
			$nb_vx = $dataBoucle['nb_veaux_reel'] ;
			
			if($nb_bat >= 5){
				$nb_bat = 1 ;
			}
			
			echo "num_bat = $num_bat" ;?></br><?php

			
			if(array_search("bat_$num_bat", $stockage_jr_restant)){

			$nJours_restant = ($stockage_jr_restant["bat_$num_bat"]+1) ;
			$stockage_jr_restant["bat_$num_bat"] = $nJours_restant ;
			
			echo "Jour trouvé dans tableau ligne 61 : $nJours_restant" ; ?></br><?php
			
			}else{

//Ce code ne s'éxécutera que les 5 premières fois pour enregistrer les dates de départ pour chaque bâtiment
				// On transforme les 2 dates en timestamp
				$date1 = strtotime($today);
				$date2 = strtotime($date_entree);
				 
				// On récupère la différence de timestamp entre les 2 précédents
				$nbJoursTimestamp = $date1 - $date2;
				 
				// ** Pour convertir le timestamp (exprimé en secondes) en jours **
				// On sait que 1 heure = 60 secondes * 60 minutes et que 1 jour = 24 heures donc :
				$nbJours = $nbJoursTimestamp/86400; // 86 400 = 60*60*24
 
			
			//$nJours_restant	= (168 - $nbJours) ;
$nJours_restant = $nbJours ;
			echo "Pas trouvé dans le tableau bat_$num_bat" ; ?></br><?php
			echo "diff jour : $nbJours" ; ?></br><?php
			/*
						  $stockage_jr_restant = array(
			 
				  "bat_$num_bat" => "$nJours_restant",
			  );	
			  */
			  $stockage_jr_restant["bat_$num_bat"] = $nbJours ;
			  echo $stockage_jr_restant["bat_$num_bat"] ;
			  
			}
			
			//selon l'heure du calcul pour savoir s'il reste un repas aujourd'hui ou si on ajoute un jour suivant pour calcul à partir du repas du lendemain matin
			//nJours_suivant	est un entier		= nbJours +0

echo "Jour suivant restant : $nJours_restant" ; ?></br><?php
		
			$reponseCumul = "SELECT quantite_cereale FROM plan_alimentation_theorique WHERE jour = $nJours_restant" ;
			$reqCumul = mysql_query($reponseCumul) or die('Erreur SQL !<br />'.$reponseCumul.'<br />'.mysql_error());

			$donneesCumul = mysql_fetch_array($reqCumul);

			$quantite_cereale = $donneesCumul['quantite_cereale'] ;
			
			//Multiplié par 2 repas par jour et multiplié par le nombre de veaux dans le bâtiment
			//Conso restant en gramme
			$xNConso_theo_restante	= (($quantite_cereale*2)*$nb_vx) ;
			
			//conversion en kilo
			$xNConso_theo_restante	= round(($xNConso_theo_restante/1000),2) ;
			
			$stock_actuel = round($stock_actuel - $xNConso_theo_restante,2) ;
			
echo "Stock actuel : $stock_actuel" ; ?></br><?php

			
				if($nb_bat==4){
					$nb_jour++;
				}
					

				if($stock_actuel <= 0 ){
					
				break ; //sortir de la boucle
						echo "Nombre de jour restant en stock : $nb_jour" ;
						
				}else{
					
					$nb_bat++ ;
					$num_bat++ ;
					
					echo "nb_bat : $nb_bat" ;?></br><?php
					echo "num_bat 2 = $num_bat" ;?></br><?php
					
				}

			//}
			
			echo $stockage_jr_restant["bat_5"] ;
		
		$indice++ ;
		echo "Indice : $indice" ;  ?></br></br><?php

}

echo "Nombre de jour restant en stock lig 143: $nb_jour" ;

mysql_close() ;
?>
J'ai mis des echo un peu partout pour essayer de trouver le problème mais la je sèche !

Après dans un deuxième temps je ne sais pas si mon code est performant au niveau des requête sql ou peut-être il y a -t-il des améliorations à faire...

Je vous remercie d'avance pour votre aide ! ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 févr. 2021, 19:34

Salutations !

Alors effectivement, côté performances, une requête SQL dans une boucle qu'on ne maîtrise pas, c'est pas la panacé :). Après tout est question de contexte et de volume et ça peut être largement suffisant pour un truc perso. Et tant qu'on est sur les performances, tu peux opter pour mysql_fetch_assoc() (qui retourne un tableau associatif) au lieu de mysql_fetch_array() (qui retourne un tableau associatif ET un tableau indexé).
Bon dans l'idéal il faudrait même envisager de passer par les fonctions PDO ou MySQLi... mais on va en revenir au problème initial :)

Les fonctions array_search() et in_array() servent à vérifier la présence d'une valeur dans un tableau. Dans ton cas ce n'est à priori pas une valeur dont tu cherches à savoir si elle existe, mais la présence ou non de son index.

Pour cela, un simple
isSet($stockage_jr_restant["bat_" . $num_bat])
dans ton if() devrait te permettre de vérifier si l'index existe déjà dans ton tableau et de rentrer dans ta condition quand celui-ci est trouvé :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Mammouth du PHP | 1564 Messages

26 févr. 2021, 19:42

Oui pour le isset() ça fonctionne mais tu doit utiliser "array_key_exists("ici ta clé",$stockage_jr_restant)" car tu crée des clés via "$stockage_jr_restant["ici ta clé"] = $nJours_restant ;"

Pour le reste, Ryle à tout dit ;)

Petit nouveau ! | 2 Messages

27 févr. 2021, 15:58

Parfait ! Merci j'avais trové cette solution juste avant de voir que vous aviez posté la même réponse !

Je vais travailler effectivement sur PDO et Mysqli à l'avenir.

Merci pour l'astuce du mysql_fetch_assoc, si je présume c'est encore plus rapide c'est ca ?

Avatar du membre
Mammouth du PHP | 1564 Messages

27 févr. 2021, 16:22

ça doit l'être car il retourne pas les index [0], [1], etc.. seulement les noms ['nom_colonne1'], ['nom_colonne2'], etc