erreur quand il n'y a pas d'image à uploader

Eléphant du PHP | 101 Messages

11 sept. 2005, 17:55

bonjour à tous,

de retour parmis vous, je ne vous quitte plus....
j'ai un code pour uploader les images que j'ai trouvé ici et qui marche tres bien, mais j'ai un probleme, c'est que quand je n'ai pas d'image à uploader il me met le message d'erreur suivant:

Code : Tout sélectionner

Notice: Undefined variable: dest_fichier in d:\easyphp\www\mabase\enregistrer.php on line 82
la ligne 82 etant la ligne ou j'insere ma requete: ($dest_fichier), je vous mets le code:
<?
include("_connexion.php");

//upload images 
if(isset($_FILES['Image1'])) 
{ 
// params 
unset($erreur); 
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'JPG'); 
$taille_max = 200000; 
$dest_dossier = 'd:/easyphp/www/mabase/images_upload/';  
// utilisez également des slashes sous windows : $dest_dossier = 'd:/damien/photos/'; 
$taille = $_FILES['Image1']['size']; 
// vérifications 
if( !in_array( substr(strrchr($_FILES['Image1']['name'], '.'), 1), $extensions_ok ) ) 
{ 
$erreur = 'Veuillez sélectionner une image de type png, gif, jpg, jpeg ou JPG '; 
 include("erreur.php");
} 
elseif (!is_dir($dest_dossier)) { 
     $erreur = 'Veuillez indiquer un r&eacute;pertoire destination correct !';
	  include("erreur.php"); 
   } 
elseif (!is_writeable($dest_dossier)) { 
     $erreur = 'Veuillez spécifier des droits en écriture pour le r&eacute;pertoire destination !'; 
	  include("erreur.php");     
   } 
elseif ($taille > $taille_max) { 
$erreur = 'Veuillez sélectionner une image de taille inférieure à 200Ko !'; 
    include("erreur.php");
}
// copie du fichier 
if(!isset($erreur)) 
{ 
$dest_fichier = basename($_FILES['Image1']['name']); 
// formatage nom fichier 
// enlever les accents 
$dest_fichier = strtr($dest_fichier, 
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); 
// remplacer les caracteres autres que lettres, chiffres et point par _ 
$dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier); 
// copie du fichier et verification 
if (is_uploaded_file($_FILES['Image1']['tmp_name'])) { 
$erreur = 'L\'image a été uploadée avec succes, mais n\'a pas pu être copiée.'; 
move_uploaded_file($_FILES['Image1']['tmp_name'], $dest_dossier . $dest_fichier); 
  if (is_uploaded_file($dest_dossier . $dest_fichier)){ 
    $reussi = 'yeah! Enfin!!!!'; 
  } 
} 
elseif (!is_uploaded_file($_FILES['Image1']['tmp_name'])) { 
$erreur = 'L\'image n\'a pas été uploadée'; 
 include("erreur.php");
} 
} 
} 

?> 
<!-- Erreur ? --> 

<div class="en-tete"><div class="img_en-tete"></div> 
<?php 
if(isset($erreur)){ 
echo $erreur ; 
} 
elseif(isset($reussi)){ 
echo $reussi ; 
} 
else{ }

mysql_query ("INSERT INTO commande VALUES('', '". ($_POST['nom']) ."', '". ($dest_fichier)."')");
 ?>
  
etant donné que l'upload d'image n'est pas une obligation, c'est un peu ennuyeux comme message d'erreur, en esperant trouver une personne qui aura encore envie de m'aider, d'avance merci de vos reponses.
muriel

Eléphant du PHP | 101 Messages

11 sept. 2005, 17:59

j'ai oublié de vous dire qu'en plus quand je fais un transfert d'image il me met ce message:
L'image a été uploadée avec succes, mais n'a pas pu être copiée.
alors que la copie de l'image ce fait bien dans le dossier:
d:/easyphp/www/mabase/images_upload/
et le nom de l'image se met bien dans la BD.

voilà je vous ai tout dit.
muriel

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 sept. 2005, 18:00

il faudrait initialiser $dest_fichier à vide quelque part
mettre par exemple un else à cette condition :
if(isset($_FILES['Image1'])) {
   // traitement
} else {
   $dest_fichier = null;
}
ou alors faire 2 requêtes, une avec et une sans le fichier

enfin, il faudrait indenter ton code, tu t'y retrouverais mieux dans tes conditions multiples et tu comprendrais pourquoi il te met un message d'erreur alors que tout s'est bien passé ;)

Eléphant du PHP | 101 Messages

11 sept. 2005, 18:15

bonjour ouckileou,

tout d'abord merci pour ta reponse tres, tres rapide, ça marche impeccable, et je me permet de te poser 2 questions suplementaires en esperant que tu pourras y repondre ?
pourquoi il me dis:
L'image a été uploadée avec succes, mais n'a pas pu être copiée. 
alors que la copie de l'image ce fait bien dans le dossier:
d:/easyphp/www/mabase/images_upload/
et le nom de l'image se met bien dans la BD.
et ma deuxieme question c'est quand je fais l'upload de l'image mais que pour une raison ou pour une autre cela n'a pas marché, comment je peux faire pour qu'il me donne le message d'erreur:
'L\'image n\'a pas été uploadée'
mais que cette erreur ne se mette pas quand il n'y a pas d'image ?

je sais que mes 2 questions sont tres precises en esperant que tu pourras y repondre, d'avance merci de ton aide suplementaire.
muriel

Eléphant du PHP | 493 Messages

11 sept. 2005, 18:22

ton code est à revoir !
tu définies le message d'erreur meme si celle-ci n'est pas encore survenu d'où ton probleme. une solution :
if(!isset($erreur))
{
    $dest_fichier = basename($_FILES['Image1']['name']);
    // formatage nom fichier
    // ...

    if (is_uploaded_file($_FILES['Image1']['tmp_name']))
    {
        move_uploaded_file($_FILES['Image1']['tmp_name'], $dest_dossier . $dest_fichier);

        if (is_uploaded_file($dest_dossier . $dest_fichier))
            $reussi = 'yeah! Enfin!!!!';
        else
            $erreur = 'L\'image a été uploadée avec succes, mais n\'a pas pu être copiée.';
    }
    else
    {
        $erreur = 'L\'image n\'a pas été uploadée';
        include("erreur.php");
    }
}

} // end of "is set Image1"

// HTML
// ...

if ( isset( $reussi ) )
    echo $reussi;
else
    echo $erreur;

// SQL
// ...

Eléphant du PHP | 101 Messages

11 sept. 2005, 18:49

bonjour Vaedan,

je te remercie pour ta participation à ce post, et j'ai bien noté ton code qui marche parfaitement, sauf que j'ai toujours ce message d'erreur:

Code : Tout sélectionner

L'image a été uploadée avec succes, mais n'a pas pu être copiée.
alors je pense que cela vient de la variable: 'tmp_name'mais je ne sais pas trop quoi faire pour qu'il prenne en compte que l'image a bien été copiée.

encore merci à tous pour votre aide, en esperant qu'on va y arriver...
muriel

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 sept. 2005, 19:08

pourquoi 2 fois is_uploaded_file() ?

ce message devrait être utilisé avec un test sur le retour de move_uploaded_file()
if(!isset($erreur))
{
    $dest_fichier = basename($_FILES['Image1']['name']);
    // formatage nom fichier
    // ...

    if (is_uploaded_file($_FILES['Image1']['tmp_name']))
    {
        if (move_uploaded_file($_FILES['Image1']['tmp_name'], $dest_dossier . $dest_fichier))
        {
            $reussi = 'yeah! Enfin!!!!';
        }
        else
        {
            $erreur = 'L\'image a été uploadée avec succes, mais n\'a pas pu être copiée.';
        }
    }
    else
    {
        $erreur = 'L\'image n\'a pas été uploadée';
        include("erreur.php");
    }
} 

Eléphant du PHP | 101 Messages

11 sept. 2005, 19:22

merci ouckileou, tu es genial, ça marche magnifiquement bien maintenant, je te remercie de ton aide.

en esperant un jour pouvoir aider les autres comme toutes les personnes de ce forum ont pu m'aider.

@++
muriel

Eléphant du PHP | 493 Messages

11 sept. 2005, 21:44

pour répondre à ouckileou, parce que je n'ai pas regardé le code. je me suis juste interressé aux conditions et aux variables $erreur et $reussi.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 sept. 2005, 22:32

pour répondre à ouckileou, parce que je n'ai pas regardé le code. je me suis juste interressé aux conditions et aux variables $erreur et $reussi.
la remarque ne s'adressait pas vraiment à toi, j'ai repris ton code mais c'était pour le problème de départ ;)