Erreur sur script de redimensionnement d'image

Mammouth du PHP | 672 Messages

03 mai 2011, 11:37

Code : Tout sélectionner

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 52
Ce genre de message, c'est signe d'une erreur de syntaxe :mrgreen:
Malheureusement, la ligne signalée n'est pas forcément celle sur laquelle se trouve l'erreur...

Les cas les plus courants :
- Quote/guillemet non fermée. Si tu as un éditeur de texte à coloration syntaxique, ça se voit vite...
- Parenthèse / Accolade non fermée. Là encore, un éditeur de texte à coloration syntaxique, ça aide.
- Oubli d'un ; à la fin de la ligne précédente. #-o

Sinon, le script a l'air correct (à vue de nez).
Mais je te conseillerais, surtout pour commencer, de reprendre un script / une fonction / une classe déjà existant, quitte à modifier. Par exemple [url=vos-contributions/upload-fichiers-verif ... 29.htmlICI[/url]...
En plus, tu peux l'étudier, c'est toujours instructif...

Eléphant du PHP | 57 Messages

03 mai 2011, 14:29

Merci de ta réponse.

J'ai effectivement trouvé les erreurs syntaxiques et les ai corriger.
Cependant, jobtiens maintenant un nombre incalculable (4 en fait :mrgreen: ) de Warning et autres Notice.
J'ai bien pris un script déjà existant, je ne l'ai point inventé (j'en suis pas capable ^^). Il me semble que c'était sur asp-php.net.

Les voici :

Code : Tout sélectionner

Notice: Use of undefined constant XX - assumed 'XX' in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 55 Warning: getimagesize() expects parameter 1 to be string, array given in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 16 Warning: Division by zero in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 19 Warning: Division by zero in C:\wamp\www\SMTK\admtool\edition\ajoutarticle.php on line 20
Pour ce qui est de la première erreur, je ne sais pas quoi mettre à la place de XX, puisque j'aimerais garder la proportionalité de l'image (en gros, je veux juste spécifier la hauteur de l'image, et la largeur serait en fonction).
La deuxième, je n'ai aucune idée, et les deux autres, j'ai l'impression que cela fait comme si je n'avais pas uploadé d'image #-o (pas de données -> divison par zero non ?).

Merci d'avance.

Mammouth du PHP | 672 Messages

03 mai 2011, 15:21

1. La fonction redimage attend en paramètres : image source, largeur souhaitée, hauteur souhaitée.
Le problème, c'est qu'en PHP on peut définir une constante XX (via la comande define ( XX, <laValeurConstante>)).
Du coup PHP considère que XX est une constante, mais elle n'a pas été définie.
Alors comme il est gentil, il l'interprète comme une chaîne de caractères...
Pour ce qu'il faut mettre, ben il suffit de lire le script :
// Si Height final non précisé (0)
2. La fonction getimagesize() attend comme premier paramètre une chaîne de caractère, mais elle reçoit un array.
Là encore, si tu lis le script, tu as $size = GetImageSize($img_src);
=> $img_src serait un Array.
En remontant, tu vois que $img_src est le premier paramètre passé à redimage.
Et l'appel à la fonction :
redimage("$_FILES['photoArticle']",XX,270)
Si tu lis le manuel (RTFM :evil: ), tu verras que $_FILES est un tableau... Et que GetimageSize attend une chaîne avec le nom (et le chemin) du fichier....
Pour savoir ce qu'il faut prendre comme valeur, tu peux toujours afficher le contenu de $_FILES :
print_r($_FILES);
3 et 4. La division par zéro :
Le problème vient de cette ligne $dst_w / $src_w
=> en remontant on voit que $src_w = $size[0], et que $size = GetImageSize($img_src);
Comme on a vu que GetImageSize ne reçoit pas le bon paramètre, un coup d'oeil dans le manuel nous montre que GetimageSize renvoit FALSE...

Eléphant du PHP | 57 Messages

03 mai 2011, 16:18

Wow merci pour toutes ces explications, même si je galère encore.

Ok pour l'appel de la fonction, il suffisait de mettre "0" =P~ .

Pour mettre le bon argument dans getImageSize, j'ai testé plusieurs solutions, mais aucune n'a fonctionné :
	$size = GetImageSize($_FILES['photoArticle']['tmp_name']); //renvoie un chemin qui se termine par un fichier .tmp
	$size = GetImageSize($_FILES['photoArticle']['tmp_name'].$_FILES['photoArticle']['name']); // pareil qu'en haut + nom d'origine du fichier
        $size = GetImageSize($repertoireDestination.$nomDestination); // ne marche pas car ces variables sont définies après la fonction (enfin surement)
       Et quelques autres encore plus loufoques.
Du coup, je pense avoir compris qu'il faut indiquer le chemin de mon fichier temporaire (ce que j'ai essayé de faire) mais je n'y parviens pas.
Enfin, j'imagine que résoudre ce problème, amènera à la résolution des 2 autres ?

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

03 mai 2011, 22:04

redimage($repertoireDestination.$nomDestination,0, 270);

Ce code est a utiliser dans le if qui valide l'upload (move_uploaded_file) car il te faut modifier l'image qui est validé et non le fichier temporaire.

qui plus est, dans le dernier code, il n'y a pas de return dans la fonction ni même de fonctions de traitement d'image ce qui me fait dire qu'iln'y aura pas de redimensionnement d'image ;)

[quote=Pauloscorps]
J'ai l'impression que mon script ne va pas marcher.
Je suis complètement désespérée avec ce script de redimensionnement, blasée aussi, qu'un langage aussi commun soit aussi peu aisé à mettre en oeuvre pour une tel chose, je dois bien le dire, courante. Enfin bref.

Si quelqu'un à une idée quelconque pour améliorer mon script, je suis preneuse.
Merci d'avance.[/quote]

Je dirais plutôt que, comme tous langage, il faut respecter une logique et correctement utiliser la syntaxe, hors (désolé) ce n'est pas le cas ici.
Le fait que cela soit courant n'inclus pas la simplicité ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 57 Messages

04 mai 2011, 09:32

Merci de ta réponse,

Voici mon code actuel :
<?php
	require_once('../includes/connexion.php');
	session_start();
	if (!isset($_SESSION['login']))
	{
		exit();
	}
	include('../includes/header.php');

/******************************************************************************/
/*********************** Fonction de redimensionnement ************************/
/******************************************************************************/

/******************************************************************************/

if (isset($_POST['submit']))
{
	$idCat = $_POST["idCat"];
	$titreArticle = htmlspecialchars($_POST["titreArticle"]);
	$contenuArticle = htmlspecialchars($_POST["contenuArticle"]);
	$photoArticle = $_FILES["photoArticle"];
	$descPhoto = htmlspecialchars($_POST["descPhoto"]);
	addslashes($contenuArticle) && addslashes($titreArticle) && addslashes($descPhoto);

	if(!empty($idCat) && !empty($titreArticle) && !empty($contenuArticle) && !empty($photoArticle) && !empty($descPhoto))
	{
	//----------------------------------------------------------------------------------------------------------------
	// TRAITEMENT DE L'IMAGE
	//----------------------------------------------------------------------------------------------------------------
		$nomOrigine = $_FILES['photoArticle']['name'];
		$elementsChemin = pathinfo($nomOrigine);
		$extensionFichier = $elementsChemin['extension'];
		$extensionsAutorisees = array("jpeg", "jpg", "JPG", "JPEG", "GIF", "PNG", "gif", "png");
		if (!(in_array($extensionFichier, $extensionsAutorisees)))
		{
			echo "Le fichier n'a pas l'extension attendue";
		}
		else
		{

			$repertoireDestination = "../../photos/";
			$nomDestination = "photo".date("YmdHis").".".$extensionFichier;
			$URLPhoto = ("http://localhost/smtk/photos/".$nomDestination);
		}
			if (move_uploaded_file($_FILES['photoArticle']["tmp_name"],	$repertoireDestination.$nomDestination))
			{
				function redimage($img_src,$dst_w,$dst_h)
				{
					// Lit les dimensions de l'image
					$size = GetImageSize($repertoireDestination.$nomDestination);
					$src_w = $size[0];
					$src_h = $size[1];
	
					// Teste les dimensions tenant dans la zone
					$test_h = round(($dst_w / $src_w) * $src_h);
					$test_w = round(($dst_h / $src_h) * $src_w);
					// Si Height final non précisé (0)
					if(!$dst_h) $dst_h = $test_h;
					// Sinon si Width final non précisé (0)
					elseif(!$dst_w) $dst_w = $test_w;
					// Sinon teste quel redimensionnement tient dans la zone
					elseif($test_h>$dst_h) $dst_w = $test_w;
					else $dst_h = $test_h;
					return;
				}
				redimage($repertoireDestination.$nomDestination,0,270);
			}
			else
			{
				echo "Le fichier n'a pas été uploadé ";
			}
//------------------------------------------------------------------------------
// REQUETE SQL D'AJOUT DANS LA BDD
//------------------------------------------------------------------------------
			$req = 'INSERT INTO articles (idArticle, idCat, titreArticle, contenuArticle, photoArticle, descPhoto) VALUES ("", "'. $idCat .'", "'. 	$titreArticle .'" , "'. $contenuArticle .'","'. $URLPhoto .'", "'. $descPhoto .'");';
			$result = mysql_query($req, $connexion) or die(mysql_error());
	
			if ($result)
			{
				echo '<div class="valide"><p>L\'ajout a été correctement effectué.</p></div>' ;
			}
			else
			{
				echo '<div class="echec"><p> L\'ajout a échoué.</p></div>';
			}
	}
	else echo '<div class="echec"><p> Vous n\'avez pas rempli tous les champs. </p></div>';
}
include('../includes/form_ajoutarticle.php');
include('../includes/footer.php');
mysql_close($connexion);

?>
J'ai essayé de mettre la fonction directement dans les if pour palier aux problèmes de définition des variables, mais rien à faire, elles ne le sont effectivement pas. J'obtiens 5 messages d'erreur : $repertoireDestination et $nomDestination undefined, getimagesize() qui est vide, et toujours les deux divisions par zéro.
De plus, pourrais-tu m'éclairer sur ce que doit retourner la fonction ? J'ai beau réfléchir, je ne vois pas quelle variable retourner #-o . J'ai pensé aux nouvelles largeurs et hauteurs bien sûr, mais puis-je en mettre deux dans le return ?

Merci d'avance.

Eléphant du PHP | 57 Messages

06 mai 2011, 10:09

Bonjour,

Je reviens vers vous pour vous informer que j'ai essayé une autre fonction qui est celle de J. Reaux (consultable ici : http://j-reaux.developpez.com/tutoriel/ ... mage/#LIII)

Cependant, j'ai un petit problème quant à son adaptation.

Voici l'architecture de la fonction :
function fctredimimage($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src) {
Voici mes variables et l'appel de la fonction, dans mon fichier ajoutarticle.php :
		$nomOrigine = $_FILES['photoArticle']['name'];
		$repertoireOrigine = $_FILES['photoArticle']['tmp_name'];
		$elementsChemin = pathinfo($nomOrigine);
		$extensionFichier = $elementsChemin['extension'];
		$extensionsAutorisees = array("jpeg", "jpg", "JPG", "JPEG", "GIF", "PNG", "gif", "png");
		if (!(in_array($extensionFichier, $extensionsAutorisees)))
		{
			echo "Le fichier n'a pas l'extension attendue";
		}
		else
		{
			$repertoireDestination = "../../photos/";
			$nomDestination = "photo".date("YmdHis").".".$extensionFichier;

		}

		$redimOK = fctredimimage(0,270,$repertoireDestination,$nomDestination,$elementsChemin,$nomOrigine);
		if ($redimOK == true) { echo 'Redimensionnement OK !'; }
		else { echo 'Essaye encore T_T'; }
		
		$URLPhoto = ("http://localhost/smtk/photos/".$nomDestination);
Premier essai, j'obtiens mon 'Redimessionnement Ok!', mais l'image n'a pas été redimensionnée.
Ensuite, j'ai touché à quelque chose et j'ai 'Essaye encore'.
Bon, de toute facon ca marchait pas, pas de quoi en faire un plat.

Mais du coup je me demande si j'appelle ma fonction comme il faut. J'ai notamment un petit doute sur le 5eme paramètre "$elementsChemin".
De plus, je viens de m'apercevoir que mon image a bien été redimensionnée (ca ma surpris sur le coup ^^) mais dans mon dossier edition (c'est-à-dire celui qui contient mon fichier ajoutarticle.php). Son nom d'origine était 'astronaute.jpg', il s'appelle maintenant 'Arrayastronaute.jpg'. Il semblerait donc qu'il y ai eu un petit souci.

Si quelqu'un pouvait m'éclairer sur ces différentes questions...
Merci d'avance :mrgreen:


EDIT : Après consultation du manuel, je viens de m'apercevoir que $elementsChemin retourne un tableau, donc forcèment, ma photo s'appelle 'Array machin chose'
Je l'ai donc remplacé par la variable suivante :
	$repertoireOrigine = $_FILES['photoArticle']['tmp_name'];
Pour obtenir :
$redimOK = fctredimimage(0,270,$repertoireDestination,$nomDestination,$repertoireOrigine,$nomOrigine);

Eléphant du PHP | 57 Messages

06 mai 2011, 16:40

Oh mon Dieu ca y'est çà marche !
Merci de votre aide, et voici la solution (enfin, ma solution, parce que c'est pas forcément la meilleure non plus) :
		$nomOrigine = $_FILES['photoArticle']['name'];
		$repertoireOrigine = "c:/wamp/tmp/";
		$elementsChemin = pathinfo($nomOrigine);
		$extensionFichier = $elementsChemin['extension'];
		$extensionsAutorisees = array("jpeg", "jpg", "JPG", "JPEG", "GIF", "PNG", "gif", "png");
		$repertoireDestination = "c:/wamp/www/smtk/photos/";
		$nomDestination = "photo".date("YmdHis").".".$extensionFichier;

		if (!(in_array($extensionFichier, $extensionsAutorisees)))
		{
			echo "Le fichier n'a pas l'extension attendue";
		}
		else
		{
			if (move_uploaded_file($_FILES['photoArticle']["tmp_name"],	$repertoireDestination.$nomDestination))
			{

				$redimOK = fctredimimage(0,270,$repertoireDestination,$nomDestination,$repertoireDestination,$nomDestination);
				if ($redimOK == true)
				{
				//	echo 'Redimensionnement OK !';
				}
				else
				{
					echo 'Le redimensionnement a réussi.';
				}
				$URLPhoto = ("http://localhost/smtk/photos/".$nomDestination);
				// ca marche !
			}
			else
			{
				echo "Le fichier n'a pas été uploadé ";
			}
		
		//	echo ' <br/> rep_dst=' .$repertoiredestination. ' <br/>nom_dst= ' .$nomDestination. '<br/> rep_src=' .$elementsChemin. '- <br/>nom_src =' .$nomOrigine.'';

		}