Page 1 sur 1

boucle sur fonction thumbnails, erreur inconnue

Posté : 30 juin 2005, 16:31
par VaN
Voila, je permet d'upload 4 img. Je crée une boucle

for ($i=1;$i<=4;$i++) {
}

et j'associe $i a la fin du nom de l'image. Pour l'envoi vers la bdd, ça marche bien, par contre quand j'arrive a ma fonction pour resize mes images, il m'affiche un message que je n'ai encore jamais vu :


Fatal error: Cannot redeclare thumbnail() (previously declared in c:\program files\easyphp1-7\www\extranet\back\add_article_market.php:131) in c:\program files\easyphp1-7\www\extranet\back\add_article_market.php on line 131
for ($i=1;$i<=4;$i++) {
function thumbnail($image_path,$thumb_path,$image_name,$thumb_width)
{	
	$pic = $_FILES['pic'.$i]['name'];
	$size = $_FILES['pic'.$i]['size'];
		
	$ext = explode(".", $pic);
	$extension = $ext[1];
	
	if ($extension=="JPG" || $extension=="jpg" || $extension=="jpeg" || $extension=="JPEG") {
    $src_img = imagecreatefromjpeg("$image_path/$image_name");
	}
	if ($extension=="PNG" || $extension=="png") {
    $src_img = imagecreatefrompng("$image_path/$image_name");
	}
	elseif ($extension=="GIF" || $extension=="gif") {
	$src_img = imagecreatefromgif("$image_path/$image_name");
	}
    $origw=imagesx($src_img);
    $origh=imagesy($src_img);
    $new_w = $thumb_width;
    $diff=$origw/$new_w; 
	
	$sql_max = "SELECT MAX(id_market_pic) AS id_market_pic FROM market_pics";
	$query_max = mysql_query($sql_max);
	$result_max = mysql_fetch_array($query_max);
	$id_market_pic = $result_max['id_market_pic'];
	
    $new_h=$origh/$diff;
    $dst_img = imagecreatetruecolor($new_w,$new_h);
    imagecopyresized($dst_img,$src_img,0,0,0,0,$new_w,$new_h,imagesx($src_img),imagesy($src_img));
	if ($extension=="JPG" || $extension=="jpg" || $extension=="jpeg" || $extension=="JPEG") {
    imagejpeg($dst_img, "$thumb_path/$image_name");
	}
	elseif ($extension=="PNG" || $extension=="png") {
	imagepng($dst_img, "$thumb_path/$image_name");
	}
	elseif ($extension=="GIF" || $extension=="gif") {
	imagegif($dst_img, "$thumb_path/$image_name");
	}
    return true;
	
} 
}
thumbnail('pictures','pictures_s', $pic.$i, 100);


echo ("Picture successfully resized.");
la ligne 131 equivaut a cela :
function thumbnail($image_path,$thumb_path,$image_name,$thumb_width)
qu'est ce que signifie ? les boucles sur les fonctions ne marchent pas ?

Posté : 01 juil. 2005, 09:54
par VaN
^^

Posté : 01 juil. 2005, 09:58
par ouckileou
le message veut dire qu'il ne peut pas redéclarer la fonction
ce qui est logique puisque tu la redéclares à chaque tour de boucle

quel intérêt as-tu à redéclarer une fonction ?
l'intérêt d'une fonction c'est justement de réutiliser le code

et pour changer des choses dedans il y a les paramètres...

a priori e verrais plutôt ça :
   function thumbnail($image_path,$thumb_path,$image_name,$thumb_width) {
       // ton code
   }
for ($i=1;$i<=4;$i++) {
   thumbnail('pictures','pictures_s', $pic.$i, 100);
}

echo ("Picture successfully resized.");

Posté : 01 juil. 2005, 10:00
par VaN
Mais dans ma fonction il y'a ça :
function thumbnail($image_path,$thumb_path,$image_name,$thumb_width)
{	
	$pic = $_FILES['pic'.$i]['name'];
	$size = $_FILES['pic'.$i]['size'];
qui me permet de recuperer les 4 images à la suite. Si je n'arrive pas à incrémenter mon nom d'image, je ne fais en recuperer qu'une seule nan ?

je viens de voir ton edit, mais a priori ça ne va pas marcher a cause de l'incrementation dans la fonction si ?

Posté : 01 juil. 2005, 10:02
par ouckileou
si je comprends, ces deux lignes indiquent le fichier à redimensionner non ?

alors ce fichier devrait être passé en paramètre, et c'est en dehors que tu incrémentes ton indice

Posté : 01 juil. 2005, 10:03
par VaN
mhh ok je vois.
donc plutot que
thumbnail('pictures','pictures_s', $pic.$i, 100);
je met
thumbnail('pictures','pictures_s', $_FILES['pic'.$i], 100);
et ça devrait marcher correctement, en descendant la boucle autour de l'appel de la fonction?

[edit]
je viens de voir qu'il y'a aussi ça qui risque de me poser probleme :
$ext = explode(".", $pic); 
    $extension = $ext[1]; 

Posté : 01 juil. 2005, 10:11
par ouckileou
j'ai regardé le code vite fait

apparament tu passes le nom de l'image à créer => $image_name

rajoutes simplement un paramètre $imageAmodifier :
function thumbnail($image_path,$thumb_path,$image_name,$thumb_width, $fichierImage) 
qui sera le fichier à travailler
comme ça ta fonction sert pour 'nimporte quoi, tu pourras la récupérer pour un autre site

Posté : 01 juil. 2005, 10:20
par VaN
rajoutes simplement un paramètre $imageAmodifier :
function thumbnail($image_path,$thumb_path,$image_name,$thumb_width, $fichierImage) 
j'ai peur de ne pas saisir.

lorsque j'appelle la fonction, je fais ça donc ?
for ($i=1;$i<=4;$i++) {
thumbnail('pictures','pictures_s', $_POST['pic'.$i], 100, $_POST['pic'.$i]);
}
je me retrouve avec 2 $_POST['pic'.$i] la.

Dsl je ne suis pas encore très doué pour les fonctions: /

Posté : 01 juil. 2005, 10:25
par ouckileou
ben oui

mais bon, il y a un paramètre pour donner le nom de la miniature, et un autre pour le nom du fichier à miniaturiser

ils pourraient donc être différents, mais ici ils sont identiques

seulement si tu fais ça :
thumbnail('pictures','pictures_s', $_POST['pic'.$i], 100, $_POST['pic'.$i]); 
tu récupéreras le nom du fichier dans ta fonction avec
$fichierImage['name']
donc cela t'oblige à utiliser des fichiers uploadés avec cette fonction

le principe des fonctions c'est très simple
tu repères un bout de code ton tu as besoin souvent
exemple : tu récupères une date en SQL comme ça : aaa-mm-jj
et tu veux l'afficher comme ça jj/mm/aaaa
tu vois bien que c'est toujours la même opération, y'a que la date qui change, tu la passes donc en paramètre

ici c'est pareil, qu'est-ce qui change ? le fichier à réduire, le nom que tu donnes à la réduction, et la taille
donc tu passes tout ça en paramètres, et l'opération derrière est toujours la même
donc essaye de rendre ça indépendant du contexte

Posté : 01 juil. 2005, 10:29
par VaN
ok. et comment résoudre ce dernier probleme :
$ext = explode(".", $pic);
$extension = $ext[1];
qui se trouve egalement dans la fonction.

il est possible de passer directement explode(".", $_POST['pic'.$i]['name']) en parametre de fonction, comme ce qu'on vient de faire sur $pic ?

Posté : 01 juil. 2005, 10:32
par ouckileou
cette ligne devrait marcher encore

si tu récupère $pic en paramètre c'est bon ;)

Posté : 01 juil. 2005, 10:33
par VaN
ah ok. donc au vu de
function thumbnail($image_path,$thumb_path,$image_name,$thumb_width, $fichierImage)
je devrais plutot l'ecrire comme ceci
		
$ext = explode(".", $fichierImage);
$extension = $ext[1];
si j'ai bien compris ?

Posté : 01 juil. 2005, 10:44
par ouckileou
je pense oui

Posté : 01 juil. 2005, 11:32
par VaN
fiouuuu.. après bien 40 minutes de test, ça marche enfin impec. Me suis surpassé je crois, trop fier d'avoir trouvé l'astuce :
thumbnail('pictures','pictures_s', $_FILES['pic'.$i]['name'], 100, $_FILES['pic'.$i]['name'], $id_media_pic[$i]);
j'ai fait pas mal de bidouille avec $id_media_pic[$i], mais voila, ça marche du tonerre.

merci pour les conseils ouckileou.