[Upload] Ne retourne pas d'erreur

Mammouth du PHP | 965 Messages

08 mai 2006, 10:20

J'ai repris le script du tuto pour l'upload de fichier qui est très bien fait mais quand je rentre un fichier qui depasse la taille ou qui n'a pas la bonne extension il ne me le copie pas sur le disque mais ne m'indique pas d'erreur.

J'ai tester avec pas mal de choses mais je bloque la dessus :
<?php
		require ("connect.php");

      if(isset($_FILES['photo']))

      {

		unset($erreur);
		// On definit les extensions
		$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
		$taille_max = 500000;

		// On verrifie les extensions
	 	if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
	 	  {
			$erreur = header("location : chavatar.php?erreur1&PHPSESSID=".$_POST['session']);

		  }
		// On verrifie la taille du fichier
	 	elseif( file_exists($_FILES['photo']['name']) and filesize($_FILES['photo']['name']) > $taille_max)
	 	  {
			$erreur = header("location : chavatar.php?erreur2&PHPSESSID=".$_POST['session']);

		  }

		// Si ficher = bonne taille & bonne extension
   	  if(!isset($erreur))

      {

      $dest_dossier = 'c:/www/Avatars/';

      

			$dest_fichier = basename($_FILES['photo']['name']);
			$dest_fichier = strtr($dest_fichier,
			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
		// On upload le fichier 
        move_uploaded_file($_FILES['photo']['name'], $dest_dossier . $dest_fichier);


		header("location: chavatar.php?1&PHPSESSID=".$_POST['session']);
		// On remet a jour la base de donnée
		$valide = "UPDATE `art` SET avatar = '".$_FILES['photo']['name']."'  WHERE nom = '".$_POST['pseudo']."' ";
		$test = mysql_query($valide) or die("erreur ! ".mysql_error());
		}
      }else{
	  	echo"chavatar.php?erreur2&PHPSESSID=".$_POST['session'];
	  }




?>

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

08 mai 2006, 10:37

As-tu vérifié en plaçant des echo dans les différentes conditions que le script y passait bien ?

D'après ce que tu en comprends, comment le script doit il réagir s'il y a une erreur de taille ou d'extension ? (En gros, que t'attends tu à le voir faire ?)

Mammouth du PHP | 965 Messages

08 mai 2006, 10:40

a renvoyer sur mon autre page avec le chavatar.php?erreur1 ou 2 ou 3 et dans mon autre script j'indique justement a quoi correspond l'erreur :
													<?php
														if(isset($_GET['erreur1'])){
															echo "Format de fichier non supporté";
															}
														if(isset($_GET['erreur2'])){
															echo "Taille du fichier trop importante";
															}
													?>

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

08 mai 2006, 10:49

Et qu'est ce qui ne fonctionne pas ? tu n'es pas renvoyé sur l'autre page ? tu es bien renvoyé mais la variable n'est pas définie ?

as-tu placé des echo dans les if in_array et filesize pour vérifier qu'il rentrait bien dedans ?

Mammouth du PHP | 965 Messages

08 mai 2006, 10:52

Je suis de toute facon bien redirigé sur l'autre page mais le gros soucis c'est qu'il me met l'URL comme si c'etait bon alors que ca ne copie pas le fichier puisque le format n'est pas bon.

Je ne comprends pas ce que tu veux dire par mettre des echo dans les valeurs j'ai tester et il me retourne bien 500000 pour la taille :?

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

08 mai 2006, 10:56

Pour les echos je pensais simplement faire afficher un bout de texte pour vérifier que le script passait bien là ou il fallait :
   if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) ) 
           { 
// par exemple ici, juste ajouter :
echo "Extension non autorisé";
            $erreur = header("location : chavatar.php?erreur1&PHPSESSID=".$_POST['session']); 
          } 
S'il rentre bien là, tu verras apparaitre le message (ainsi qu'un warning te disant que le header a déjà été envoyé puisque tu as écrit avant, mais ca c'est pas grave, c'est pour le suivre :))

Ce que tu peux déjà faire c'est virer le "$erreur =", la fonction header est de type "void" cela veut dire qu'elle ne retourne rien, tu ne peux donc rien récuperer dans $erreur :)

Mammouth du PHP | 965 Messages

08 mai 2006, 10:59

Quand je met le echo ca me retourne le "extension non supporté" mais ca m'indique aussi une erreur de header qui me reviens souvent !!

Code : Tout sélectionner

Warning: Cannot modify header information - headers already sent by (output started at C:\www\vavatar.php:11) in C:\www\vavatar.php on line 18 Warning: Cannot modify header information - headers already sent by (output started at C:\www\vavatar.php:11) in C:\www\vavatar.php on line 46
Donc en fait il ne test pas la valeur $erreur ? qu'est ce que je peux faire pour maintenir la redirection avec erreur ?

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

08 mai 2006, 11:41

Pour le warning, c'est normal, il t'indique simplement que tu as déjà envoyé du code à l'écran (en l'occurence par le echo) et qu'il ne peut donc pas faire la redirection du header.

Ce que tu peux faire, c'est déjà retirer le "$erreur =" qui ne sert à rien (s'il y a une erreur de toute façon tu rediriges vers un autre script, donc pas besoin de récupérer quoi que ce soit d'autre sur celui ci :))
et ajouter un exit() juste après le header pour qu'il n'aille pas plus loin dans le code, vu que ca ne sert à rien. Essaye comme ceci :
 if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )  { 
  header("location : chavatar.php?erreur1&PHPSESSID=".$_POST['session']); // pas de valeur retournée, juste le changement de page
  exit(); // on arrête le script ici
} 
...
et de meme pour la taille...

Mammouth du PHP | 965 Messages

08 mai 2006, 11:44

c'est que par la suite il test si la variable $erreur a été rentré pour proceder a la fin du script donc il faut bien definir ce $erreur quelque pars :
if(!isset($erreur))

      {
donc si erreur n'est pas trouvé on passe a la suite mais la non ca ne marche pas.

J'ai tester avec :
	 	if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
	 	  {
	 	  // par exemple ici, juste ajouter :
			header("location : chavatar.php?erreur1&PHPSESSID=".$_POST['session']);
			exit();

		  }
Il me bloque le script je n'ai rien dans la source et je ne vois pas quoi faire.

En tout cas merci pour ton aide

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

08 mai 2006, 11:53

Le truc c'est que si une erreur est trouvée, le header te renvoi sur une autre page, donc il n'arrivera jamais au if(isSet($erreur)) ... ca serait vrai si au lieu d'une redirection tu mettais un message dans la variable comme le fait Chile dans un topic un peu plus bas... :-k

Cela dit, j'ai peut être trouvé ce qui ne va pas : dans tes header() vire l'espace entre "Location" et ":" :
header("location: chavatar.php?erreur1&PHPSESSID=".$_POST['session']); 
On va bien finir par l'avoir ce satané script ! ;)

Mammouth du PHP | 965 Messages

08 mai 2006, 11:58

ouf !

Effectivement c'etait l'espace en trop qui genais le reste donc maintenant il me retourne bien les fichiers non supportés mais pas le poids maximum je fais encore quelque test pour voir.

Mammouth du PHP | 965 Messages

08 mai 2006, 12:48

<?php
		require ("connect.php");

      if(isset($_FILES['photo']))

      {

		unset($erreur);
		// On definit les extensions
		$extensions_ok = array('png', 'gif', 'jpg', 'jpeg');
		$taille_max = 500000;

		// On verrifie les extensions
	 	if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
	 	  {
	 	  // par exemple ici, juste ajouter :
			header("location: chavatar.php?erreur1&PHPSESSID=".$_POST['session']);
			echo "erreur";
		  }
		// On verrifie la taille du fichier
	 	if( file_exists($_FILES['photo']['name']) and filesize($_FILES['photo']['name']) > $taille_max)
	 	  {

			header("location: chavatar.php?erreur2&PHPSESSID=".$_POST['session']);
			 echo "erreur";
		  }

		// Si ficher = bonne taille & bonne extension
   	  	if(!isset($erreur))
       	  {
      		$dest_dossier = 'c:/www/Avatars/';
			$dest_fichier = basename($_FILES['photo']['name']);
			$dest_fichier = strtr($dest_fichier,
			'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
			'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
			$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);

			// On upload le fichier
       		 move_uploaded_file($_FILES['photo']['name'], $dest_dossier . $dest_fichier);
			header("location: chavatar.php?1&PHPSESSID=".$_POST['session']);
			// On remet a jour la base de donnée
			$valide = "UPDATE `art` SET avatar = '".$_FILES['photo']['name']."'  WHERE nom = '".$_POST['pseudo']."' ";
			$test = mysql_query($valide) or die("erreur ! ".mysql_error());
		 }
      }else{
	  	header("location: chavatar.php?erreur1&PHPSESSID=".$_POST['session']);
	  }




?>
quand le format n'est pas bon ca me retourne bien le message mais quand la taille depasse il me le valide quand même ... je comprends pas d'ou viens l'erreur encore une fois j'ai fais quelque test.

j'ai essayer avec exit() mais le script ne s'arrête pas et le echo je ne peux pas le voir car le header fait la redirection comme si tout allait bien.

Mammouth du PHP | 965 Messages

08 mai 2006, 14:10

Il ne m'upload plus non plus le fichier sur le repertoire ...

Je peux bien changer la base de donnée lire les images et les modifier mais pas les upload sur mon disque ni regler la taille :?

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

08 mai 2006, 15:01

Je crois qu'il continue d'exécuter le script jusqu'au bout malgré le header. Le exit devrait te permettre d'éviter ça, sinon à la place de ton echo "erreur", tu peux définir la variable erreur pour être sur qu'il ne rentre pas dans ton if(isSet()) :
header("Location:...");
$error = true;
Une petite remarque sinon, tu as également un header avant ton Update, ce serait mieux d'inverser et de faire l'update en premier et de ne faire le header qu'une fois que tu as terminé..

Mammouth du PHP | 965 Messages

08 mai 2006, 15:06

non je pense pas car le header pour l'extension marche très bien c'est celui pour la taille qui ne fonctionne pas.

Quand a la base SQL je l'update bien le soucis c'est qu'il ne me copie plus les fichiers dans le repertoire !