8791 sujets

Développement web côté serveur, CMS

Hello,

J'ai un piti souci qui ne veut pas partir depuis quelques jours...

Dans une page, je dois afficher une image créée de façon dynamique avec GD (qui est installé).

Ma page d'affichage appelle le script php qui permet de créer l'image avec la balise
<img src="monfichier.php?parametres=.... />


Dans mon fichier.php, il y a tout ce qu'il faut pour créer l'image :
-> les requêtes qui vont chercher dans la BD ce qu'il faut pour créer les éléments dynamiques de l'image
-> les fonctions GD qui créent l'image.

Comme je débutais, j'ai écrit et testé monfichier.php en le mettant à la racine de mon site, et en le renommant index.php - ainsi je pouvais voir directement si ça fonctionnait correctement ou non en me connectant à mon site.

J'ai vu que ça fonctionnait bien, donc je remets tout en place et là, il refuse d'afficher l'image dans le cadre prévu à cet effet. Smiley bawling

J'ai le pressentiment que c'est le "include (modules/blablabla/monmodule.php)" qui permet de se connecter à la base de données qui merde car : quand je mets dans l'URL de mon navigateur l'adresse de monfichier.php (celui là même qui est dans la balise IMG) il me dit que l'include ne marche pas car il ne trouve pas le fichier... Smiley sweatdrop

Je deviens un peu chèvre - est ce que ce genre de chose vous parle ?

Sur d'autres sites, j'ai pourtant vu que ça ne devrait pas poser le moindre pbm de faire une page php qui contient à la fois de la collecte de données dans la base et de la création d'images avec les données collectées.

Merci pour votre aide Smiley smile
Lorsque tu remets à sa place monfichier.php, ill n'est plus à la racine de ton site, c'est ça ?

Dans ce cas ajoute un / dans l'include comme ceci : "include (/modules/blablabla/monmodule.php)"

Pour plus d'informations je te conseille de faire une petite recherche sur les adresses absolue et relative Smiley cligne

edit : Si ton fichier va dans "/modules/" tu peux très bien utiliser "include (blablabla/monmodule.php)" à la place.
Modifié par kurt11 (20 Jul 2009 - 09:56)
Merci Kurt,

Je viens d'essayer mais ça ne fonctionne pas - toujours le même pbm : il dit qu'il ne retrouve pas le fichier.

J'aurais été étonné que ça fonctionne car tous les autres includes n'ont pas besoin de ce \ au début, alors pourquoi en aurait il besoin dans ce fichier... ?

Bref, non je pense qu'il doit y avoir une limitation ou une erreur que je fais sans la comprendre... Smiley decu .
Revois le cheminement de ton include. Peut-être as-tu oublié de remonté dans le parent avant de redescendre ou quelque chose comme ça. Ou encore une faute de frappe dans le nom d'un dossier.

Ça arrive parfois qu'on soit sur de son chemin alors qu'il y a a finalement une erreur bête Smiley ravi
En fait, je suis relativement sur de mon chemin, car quand je prends la page qui réalise l'image, que je la renomme index.php et que je la mets à la racine de mon serveur web, il affiche tout seul l'image comme un grand...

Mais quand je la mets dans au bon endroit et avec le bon nom, elle refuse de s'afficher... Smiley bawling
En fait, je ne sais pas si j'ai été clair. Voici une nouvelle formulation du pbm.

J'ai un fichier php qui doit générer une image - après avoir été chercher données dans la BD. Dans ce fichier se trouve en première ligne un include vers la classe qui me permet de gérer les connexions à la BD.

Or, lorsque j'ouvre ce fichier directement dans un navigateur, il fait exactement ce qu'il doit faire - il va chercher les données, et me construit l'image en conséquence.

Par contre, lorsque j'appelle ce fichier depuis une balise <IMG />, ca ne fonctionne pas, et en y regardant de plus près, c'est l'include qui ne fonctionne pas (mon serveur me renvoit include fail, etc.)

TOute aide, fortement appréciée Smiley biggrin
Qu'elle est l'erreur complète que te renvoie PHP ?
Peut-être est-ce du à un protocole de sécurité lié aux requêtes http depuis une balise IMG (simple supposition).
Avant, il m'envoyait "fail to include Smiley gnagnagna 'modules/blablabla/monfichier.php" does not exist.

Maintenant, il m'envoit : "L'image blablabla ne peut être affichée car elle contient des erreurs"... sans en dire plus.
Et quand je l'ouvre sous IE il m'affiche ma page, pleine de caractère spéciaux , sans message d'erreur.
Pour info, j'ai modifié un peu ma fonction pour qu'au lieu d'afficher l'image, il la sauvegarde --> ca marche parfaitement...

Incompréhensible pour le jeune padawan que je suis Smiley sweatdrop
Juste une vérification, ton type mime est il bien envoyé ?

Cela expliquerais que le navigateur essai d'interpréter l'image comme du texte.
Hello,

ce serait quand même plus facile de répondre en voyant ton code. Smiley rolleyes

A tout hasard je dirais que c'est un problème de header...
Ben non, c pô haidaire (header).
Bon, pour la beauté de l'exercice, voici le code : dans sa version où il sauvegarde le fichier au lieu de l'afficher (mais le changement est quasi nul à faire, puisqu'il suffit d'enlever le chemin de création du fichier dans la fonction imagejpeg...

Je ne souhaite plus revenir sur ce code, car en sauvegardant l'image, je fais une "mise en cache" d'un élément lourd à générer et qui ne sera pas amené à changer toutes les secondes, c'est donc une très bonne solution.

Pour info, l'idée de ce code est d'aller piocher dans la base des éléments pour en faire une carte (avec un certain niveau de zoom) et afficher des trucs sur cette carte.
J'espère que mes commentaires mal formulés vous aideront à y voir un peu clair, et à me pardonner car je n'ai qu'un mois de PHP derrière moi.



function create_map(&$univers, &$zoom){	
require_once('modules/admin/models/PDO2.php');
$dbh = baseconnexion();
$zoom1=exp(1/6*$zoom);

// Je prends les propriétés relatives à mon univers
$query = 'SELECT UNPR_ID, UNPR_VALEUR FROM T_UNI_ATTRIBUTS WHERE UNI_ID ="'.$univers.'" ORDER BY UNPR_ID';
$result = $dbh -> prepare($query);
$result -> execute();
$monuni = $result -> fetchall(PDO::FETCH_ASSOC);

//1 = largeur
$uni_larg = $monuni[1]['UNPR_VALEUR'];
//2 = hauteur
$uni_haut = $monuni[2]['UNPR_VALEUR'];
//3 population totale
$uni_pop = $monuni[3]['UNPR_VALEUR'];

// Nouvelle image
$x_width = $uni_larg*$zoom1;
$y_height = $uni_haut*$zoom1;
$image = imagecreatetruecolor($x_width, $y_height);
// Couleur de fond
$background = imagecolorallocate($image, 228, 226, 197);
//On redessine un fond pour qu'il ne soit pas noir (imposé par le true color)
imagefilledrectangle($image, 0, 0, $x_width, $y_height, $background);

// Couleur de remplissage des ellipses
$col_friend_restos = imagecolorallocatealpha ($image, 121, 121, 255, 90);
//$col_foe_restos = imagecolorallocatealpha ($image, 255, 74, 74, 90);

//Je collecte la liste de mes restos
$query = 'SELECT ROC_ID, ROC_NOM, USR_OWNR, USR_MNGR, ROC_POS_X, ROC_POS_Y FROM T_RST_OCCURRENCES WHERE UNI_ID="'.$univers.'"';
$result = $dbh -> prepare($query);
$result -> execute();
$restos_uni = $result -> fetchall(PDO::FETCH_ASSOC);
$uni_densite = $uni_pop/($x_width*$y_height);
$myfilepath = 'modules/restaurants/views/maps/uni'.$univers.'/U'.$univers.'Z'.$zoom.'T'.time().'.txt';
$cachefile = fopen($myfilepath,'wb');
//je crée une "bulle" pour chaque resto en fonction de sa fréquentation
for ($i=0;$i<count($restos_uni);$i++){
	$rst_x_pos = $restos_uni[$i]['ROC_POS_X']*$zoom1;
	$rst_y_pos = $restos_uni[$i]['ROC_POS_Y']*$zoom1;
	$rst_id= $restos_uni[$i]['ROC_ID'];
	$rst_nom = $restos_uni[$i]['ROC_NOM'];
	$query = 'SELECT USR_PSEUDO FROM T_USERS WHERE USR_ID='.$restos_uni[$i]['USR_OWNR'].' UNION SELECT USR_PSEUDO FROM T_USERS WHERE USR_ID='.$restos_uni[$i]['USR_MNGR'];
	$result = $dbh -> prepare($query);
	$result -> execute();
	$rst_users = $result->fetchall(PDO::FETCH_ASSOC);
	if(count($rst_users)==1){
		$rst_owner = $rst_users[0]['USR_PSEUDO'];
		$rst_mngr = $rst_owner;
	}
	elseif(count($rst_users)==2){
		$rst_owner = $rst_users[0]['USR_PSEUDO'];
		$rst_mngr = $rst_users[1]['USR_PSEUDO'];
	}
	$query = 'SELECT RVL_VALEUR FROM T_RST_VALEURS WHERE ROC_ID="'.$restos_uni[$i]['ROC_ID'].'" AND RPR_ID = 3';
	$result = $dbh -> prepare($query);
	$result -> execute();
	$freq = $result -> fetchall(PDO::FETCH_ASSOC);
	$freq = $freq[0]['RVL_VALEUR'];
	$dim = sqrt($freq/($uni_densite*3.14116));
	//on dessine les ellipses des restaurants
	$cercle = imagecreatefrompng('images/app/friendly-resto.png');
	$pointer = imagecreatefrompng('images/app/pointer.png');
	$taillecercle= getimagesize('images/app/friendly-resto.png');
	$taillepointer= getimagesize('images/app/pointer.png');
	$pntr_x_pos = $rst_x_pos-$taillepointer[0]/2;
	$pntr_y_pos = $rst_y_pos-$taillepointer[1];
	if ($pntr_y_pos<0){
		$pntr_y_pos = 0;
	}
	if($pntr_x_pos<0){
		$pntr_x_pos = 0;
	}
	// afin d'afficher les infos bulles dans l'image finale, je crée un fichier qui contiendra la position
	// des pointeurs sur l'image afin de placer les "maps" dans l'image finale
	fwrite($cachefile, $pntr_x_pos.';'.$pntr_y_pos.';'.$rst_id.';'.$freq.';'.$rst_nom.';'.$rst_owner.';'.$rst_mngr.";\n");
	//maintenant je place mes éléments : d'abord la zone d'influence,
	// puis le pointeur pour qu'il soit toujours devant
	imagecopyresampled($image, $cercle, $rst_x_pos-$dim/2, $rst_y_pos-$dim/2, 0, 0 , $dim, $dim, $taillecercle[0],$taillecercle[1]);
	imagecopy($image, $pointer, $pntr_x_pos, $pntr_y_pos, 0, 0, $taillepointer[0], $taillepointer[1]);
}
// On affiche l'image
fclose($cachefile);
header("Content-type: image/png");
$filepath = 'modules/restaurants/views/maps/uni'.$univers.'/U'.$univers.'Z'.$zoom.'T'.time().'.png';
imagejpeg($image, $filepath);
imagedestroy($image);
$dbh = null;
}


Voilou, si vous savez pourquoi quand je lui demande d'afficher l'image il ne l'affiche pas mais quand je lui demande la sauvegarder il la sauvegarde... Smiley sweatdrop
Salut,

bon ben comme le code est impossible à tester ça n'aide pas vraiment... Smiley murf

Juste un pitit truc : c'est étonnant d'utiliser une image png, de déclarer un header png et d'utiliser imagejpeg au lieu de imagepng.