Page 1 sur 1

format tableau

Posté : 04 mai 2006, 10:27
par konjiki
salut,
alors voila j'ai un probleme avec serialize, je vous explique: lorsque je met des valeurs dans un tableau et que j'applique "serialize" tous ce passe bien, le probleme vient quand je remplis mon tableau avec des resultats de requetes.
voila le format de mon tableau (rempli à la main)
a:9:{i:0;i:728;i:1;i:727;i:2;i:685;i:3;i:662;i:4;i:608;i:5;i:597;i:6;i:510;i:7;i:477;i:8;i:417;}
et le format de mon tableau rempli avec les requetes
a:13:{i:1;s:2:"14";i:2;s:2:"23";i:3;s:2:"17";i:4;s:2:"23";i:5;s:2:"42";i:6;s:1:"1";i:7;s:2:"11";i:8;s:1:"0";i:9;s:1:"7";i:10;s:2:"30";i:11;s:3:"106";i:12;s:3:"209";i:13;s:1:"0";}
je ne vois pas trop ce que c'est que ces "s:" et je pense que c'est ça qui me fait tout foiré. Si quelqu'un avait une reponse ce serai cool :D

Si besoin est je rajouterai des partie de code. Merci

Posté : 04 mai 2006, 10:33
par guilt92
Bah commence par nous donner les requetes ! :wink:

Posté : 04 mai 2006, 10:36
par konjiki
la requete est dans une boucle et je met le resultat de chaque requete dans un tableau
$tab_current_year=array();
for($i = 1; $i <= 7; $i++){

if($day<10){
$day = $day;}

if($day_precedent<10){
$day_precedent = "0".$day_precedent;}

if($day<1){
$day=31;
$annee_precedente=$annee_precedente-"01";
}

if($day_precedent<1){
$day_precedent=31;}

$req 	= "select count(id) as nb_news from news where `timestamp` between 200$annee$month$day_precedent and 200$annee$month$day";
//echo $req."<br>";
$result = mysql_query($req) or die( $req . '<br />' . mysql_error() );
$row 	= mysql_fetch_array($result, MYSQL_ASSOC);
$day_precedent 	= $day_precedent-1;
$day 	= $day-1;
$tab_current_year[$i].= $row["nb_news"];
}
et apres je fais comme ça
$data=serialize($tab_current_year);
et je recupe le parametre

Code : Tout sélectionner

<img src="fonctions/hist_vert.php?txt=$data"></img>

Posté : 04 mai 2006, 10:41
par Ryle
Quand tu dis que ça te fais tout foiré, qu'est ce que tu attends et qui ne fonctionne pas exactement ?

Le fonctionnement est normal, le "s:" signifie qu'il considère que la valeur est une chaine de caractère (s pour String).
"s:6:"valeur" signifie une Chaine, de 6 caractère, qui est "valeur"

En gros, cela veut dire que les résultats de ta requête ne sont pas considérés comme des nombres, mais comme des chaines.. tu peux spécifier explicitement le format avec la fonction intvalue() si nécessaire.. tout dépend de la façon dont tu génère l'objet et dont tu le traite ensuite :)

Posté : 04 mai 2006, 10:47
par konjiki
comment je me sert de cette fonction et ou stp ?

Posté : 04 mai 2006, 10:54
par Ryle
Tu peux l'utiliser au moment ou tu récupères la valeur de ta requête, mais je viens de voir où était ton problème :
$tab_current_year[$i].= $row["nb_news"]; 
En fait au lieu de mettre la valeur récupérée directement dans $tab_current_year[$i], tu la concatènes à la valeur existante (qui est vide) à cause du ".=". Du coup, php considère qu'il s'agit d'une chaine (puisqu'il y a eu concaténation)

Essaye de virer le point, ça devrait mieux marcher :)
$tab_current_year[$i] = $row["nb_news"];

// le intvalue aurait été placé ici, mais le problème serait resté le même, vu que tu lui disais ensuite qu'il s'agissait d'une chaine à concatener :)
// $tab_current_year[$i].= intvalue($row["nb_news"]);

Posté : 04 mai 2006, 11:24
par konjiki
la fonction "intvalue" n'est pas reconnu par php. rude :(

Posté : 04 mai 2006, 11:32
par mere-teresa

Posté : 04 mai 2006, 15:02
par konjiki
bon les gars je comprend de moins en moins, j'ai essayé les solution que vous m'avez proposé mais y a pas de changement :( . J'ai donc essayé autre chose:
regarder ça:
print_r($tab_current_year);
echo "<br>";
//$data=serialize($tab_current_year);



$val1=150;
$val2=106;
$val3=30;
$val4=7;
$val5=0;
$val6=11;
$val7=1;
$val8=42;
$val9=23;
$val10=23;
$val11=23;
$val12=23;
$val13=23;

$data2 = array($val1,$val2,$val3,$val4,$val5,$val6,$val7,$val8,$val9,$val10,$val11,$val12,$val13,);
print_r($data2);
//$data=serialize($data2);
dans la premiere partie je fais comme c'était avant donc les resultats de mes requetes sont dans $tab_current_year. Là les parametre ne sont pas passés à la fonction (le code suit plus bas).
Mais quand j'affecte des valeurs $val1,$val2 ... dans un tableau et que je les fais passer en parametre ça marche :shock:
J'ai aussi testé mes valeurs de tableau avec la fonction is_numeric, et c'est bien des données de type numerique.
je vous redonne les partie de code importantes
requete:
$tab_last_year=array();
for($i = 1; $i <= 13; $i++){

if($month<10){
$month = "0".$month;}

if($monthm<10){
$monthm = "0".$monthm;}

if($month<1){
$month=12;
$annee_precedente=$annee_precedente-"01";
}

if($monthm<1){
$monthm=12;}

if($day<1){
$day=30;}

$req = "select count(id) as nb_news from news where `timestamp` between 200$annee_precedente$monthm$fin_requete and 200$annee_precedente$month$fin_requete";
//echo " $req <BR>";

$result = mysql_query($req) or die( $req . '<br />' . mysql_error() );
$row = mysql_fetch_array($result, MYSQL_ASSOC);
$monthm = $monthm-1;
$month = $month-1;
$tab_last_year[$i].= $row["nb_news"];

}
serialize:
print_r($tab_current_year);
echo "<br>";
//$data=serialize($tab_current_year);



$val1=150;
$val2=106;
$val3=30;
$val4=7;
$val5=0;
$val6=11;
$val7=1;
$val8=42;
$val9=23;
$val10=23;
$val11=23;
$val12=23;
$val13=23;

$data2 = array($val1,$val2,$val3,$val4,$val5,$val6,$val7,$val8,$val9,$val10,$val11,$val12,$val13,);
print_r($data2);
//$data=serialize($data2);
et la fonction d'affichage:
<?php
//recuperation des valeurs du tableau
$data=unserialize($_GET['txt']);

//appel de la fonction
hist_vert($data);

function hist_vert($data){

$hauteur_tot	= "275";
$largeur_tot	= "800";

$hauteur	= "250";
$largeur	= "600";
$im=ImageCreate($largeur_tot,$hauteur_tot);

//definition des couleurs
$fond=ImageColorAllocate($im,245,245,245);
$blanc=ImageColorAllocate($im,255,255,255);
$noir=ImageColorAllocate($im,0,0,0);
$rouge[0]=ImageColorAllocate($im,255,10,10);
$rouge[1]=ImageColorAllocate($im,255,30,30);
$rouge[2]=ImageColorAllocate($im,255,50,50);
$rouge[3]=ImageColorAllocate($im,255,90,90);
$rouge[4]=ImageColorAllocate($im,255,90,90);
$rouge[5]=ImageColorAllocate($im,255,50,50);
$rouge[6]=ImageColorAllocate($im,255,30,30);
$rouge[7]=ImageColorAllocate($im,255,10,10);
$bleu=ImageColorAllocate($im,0,0,255);
$orange[0]=ImageColorAllocate($im, 255,180,34);
$orange[1]=ImageColorAllocate($im, 255,200,54);
$orange[2]=ImageColorAllocate($im, 255,220,74);
$orange[3]=ImageColorAllocate($im, 255,240,94);
$orange[4]=ImageColorAllocate($im, 255,240,94);
$orange[5]=ImageColorAllocate($im, 255,220,74);
$orange[6]=ImageColorAllocate($im, 255,200,54);
$orange[7]=ImageColorAllocate($im, 255,180,34);

//couleur de fond du graphique
ImageFilledRectangle ($im, 50, 10,$largeur, $hauteur-20, $blanc);

//ligne horizontal
Imageline($im,50,$hauteur-20,$largeur,$hauteur-20,$noir);
//fin ligne horizontal

//pointillés hori
for($espace=1; $espace<=4; $espace++){
ImageDashedLine($im, 50, 250-(50*$espace), 600, 250-(50*$espace), $bleu);}
/*//aff unités
for($espace=1; $espace<=4; $espace++){
ImageString($im,4,20,240-(50*$espace),(30*$espace),$noir);}
//fin aff unités*/

//aff jours
for($jour=2; $jour<=13; $jour++){
ImageString($im,4,($jour*40),$hauteur-20,$jour-1,$noir);}
//fin aff jours

//ligne vert
Imageline($im,50,10,50,$largeur-370,$noir);
$maxdata=210;

    for ($jour=2; $jour<=13; $jour++) {
		$hauteurImageRectangle = round(($data[$jour-1]*$hauteur)/$maxdata);

		if($data[$jour-1]>=80){//condition pour aff couleur
//affiche baton
		//degradé
		for($i=0; $i<=7; $i++) { 
		ImageFilledRectangle ($im, $jour*40, $hauteur-$hauteurImageRectangle, $jour*40+10-(2*$i), $hauteur-20, $orange[$i]);
		}//fin degradé

		ImageString ($im, 4, $jour*40, $hauteur-$hauteurImageRectangle-20, $data[$jour-1], $noir);
		}
//affiche baton
		else{
		//degradé
		for($i=0; $i<=7; $i++) { 
        	ImageFilledRectangle ($im, $jour*40, $hauteur-$hauteurImageRectangle, $jour*40+10-(2*$i), $hauteur-20, $rouge[$i]);
		} //fin degradé
        	ImageString ($im, 4, $jour*40, $hauteur-$hauteurImageRectangle-20, $data[$jour-1], $noir);
    		}
				} 
//envoie de l'entête MIME
header("content-type:image/png");
//creation format PNG
ImagePng($im);
//cloture de l'entête MIME
//return($im);
imageDestroy ($im);
}
?> 
le post est un peu long j'espere que ça ira. Merci

Posté : 04 mai 2006, 17:02
par konjiki
pas d'idées?

Posté : 04 mai 2006, 18:48
par mere-teresa
Trop de code à lire.

Posté : 05 mai 2006, 01:00
par konjiki
ok je comprend je pense que j'ai du abuser un peu merci quand même :wink: