Page 1 sur 1

Insertion nom d'une image dans une base de donné

Posté : 24 juin 2013, 03:27
par nriem
bonjour

j'ai suivi un tuto sur youtube sur l'upload d'image,

j'ai un scripte dans ma page fonction.php qui s'ocuppe de securiser l'mage et de l'Uploader, j'inclus fonction.php dans form.php, mon image s'upload bien dans mon fichier "image",

mai j'ai un souci j’arrive pas a enregistrai le nom de mon image (crypter avec sha1) dans ma base de donnée, j'ai eseyer de le faire de plusieurs manier dans fonction.php sa marche pas, la même chose si je le fait dans form.php

voila mon scripte form.php
$image = $_FILES['photoObjet']['name'];
$imageTmp = $_FILES['photoObjet']['tmp_name'];
 
// si il y'a une image  on vérifie  l'extension
if (!empty($imageTmp))
{
     $ext = strtolower(end(explode('.',$image)));
                                     
    if(in_array($ext,array('png','gif','jpeg','jpg')) === FALSE)   
     {
       $erreurImage = "veuilles saisir une image avec un bon format";
    }
}
                                 
if (empty($erreurImage))
{
    // fonction  qui Upload l'image
    upload_image($imageTmp);
}                    
scripte fonction.php

function upload_image($imageTmp,$image)
{
    if(file_exists($imageTmp))
    {
        $imageSize = getimagesize($imageTmp); // r'envoi la taille de l'image
 
            if($imageSize['mime'] == 'image/jpeg')
        {
            $imageSrc = imagecreatefromjpeg($imageTmp);
        }
        else if($imageSize['mime'] == 'image/png')
        {
            $imageSrc = imagecreatefrompng($imageTmp);
        }
        else if($imageSize['mime'] == 'image/gif')
        {
            $imageSrc = imagecreatefromgif($imageTmp);
        }
        else //si c'est pas une image valide
        {
            echo "Votre image n'est pas valide";
            $imageSrc = FALSE;
        }
                 
    if($imageSrc !== FALSE)
    {
        $imageWidth = 300;
         
        if($imageSize[0] <= $imageWidth)
        {
            $imageFinal = $imageSrc; // si l'mage vaut 300 on garde l'image
        }
        else // si elle et suprior de 300px on la redimansion
        {
            $newWidth[0] = $imageWidth; // on redimansion a 300px
                         
            $newHeight[1] = ($imageSize[1]/$imageSize[0])*$imageWidth;
                             
            $imageFinal = imagecreatetruecolor($newWidth[0],$newHeight[1]);
                             
            imagecopyresampled($imageFinal,$imageSrc,0,0,0,0,$newWidth[0],$newHeight[1],$imageSize[0],$imageSize[1]);
                         
            // on crypte le nom de l'image pour pas que y'a 2 image les même
            $location = sha1(session_id().microtime());
                             
            imagejpeg($imageFinal,'image/' . $location. '.jpg'); // on enregistre limage dans le dossier
                             
                                 
                         
             
        }
    }
  }
}

en deux mot je voudrais savoirs ou (quel fichier) je suis censée enregistrai le nom de l'image et comment



(désoler pour l’orthographe je parle pas nickel français)

merci d'avance

Re: Insertion nom d'une image dans une base de donné

Posté : 24 juin 2013, 13:26
par Spols
Le mieux est de modifier ta fonction pour qu'elle retourne le nom de ton image, et récupèreé cette info lors de l'appel de la fonction pour l'inclure en base
$image = $_FILES['photoObjet']['name'];
$imageTmp = $_FILES['photoObjet']['tmp_name'];
 
// si il y'a une image  on vérifie  l'extension
if (!empty($imageTmp))
{
     $ext = strtolower(end(explode('.',$image)));
                                     
    if(in_array($ext,array('png','gif','jpeg','jpg')) === FALSE)   
     {
       $erreurImage = "veuilles saisir une image avec un bon format";
    }
}
                                 
if (empty($erreurImage))
{
    // fonction  qui Upload l'image
    $new_name = upload_image($imageTmp);
if ($new_name !== false) {
//ICI le code pour inclure $new_name dans une requète pour l'enregistrer en base
}
}                    
script fonction.php

function upload_image($imageTmp,$image)
{
    if(file_exists($imageTmp))
    {
        $imageSize = getimagesize($imageTmp); // r'envoi la taille de l'image
 
            if($imageSize['mime'] == 'image/jpeg')
        {
            $imageSrc = imagecreatefromjpeg($imageTmp);
        }
        else if($imageSize['mime'] == 'image/png')
        {
            $imageSrc = imagecreatefrompng($imageTmp);
        }
        else if($imageSize['mime'] == 'image/gif')
        {
            $imageSrc = imagecreatefromgif($imageTmp);
        }
        else //si c'est pas une image valide
        {
            echo "Votre image n'est pas valide";
            $imageSrc = FALSE;
return false;//Si il y a erreur, on l'indique au nouveau nom pour que l'enregistrement en base ne se fasse pas
        }
                 
    if($imageSrc !== FALSE)
    {
        $imageWidth = 300;
         
        if($imageSize[0] <= $imageWidth)
        {
            $imageFinal = $imageSrc; // si l'mage vaut 300 on garde l'image
        }
        else // si elle et suprior de 300px on la redimansion
        {
            $newWidth[0] = $imageWidth; // on redimansion a 300px
                         
            $newHeight[1] = ($imageSize[1]/$imageSize[0])*$imageWidth;
                             
            $imageFinal = imagecreatetruecolor($newWidth[0],$newHeight[1]);
                             
            imagecopyresampled($imageFinal,$imageSrc,0,0,0,0,$newWidth[0],$newHeight[1],$imageSize[0],$imageSize[1]);
                         
            // on crypte le nom de l'image pour pas que y'a 2 image les même
            $location = sha1(session_id().microtime());
                             
            imagejpeg($imageFinal,'image/' . $location. '.jpg'); // on enregistre limage dans le dossier
                             
                                 
                         
             
        }
    }
return $location;
  }
return false;
}


Re: Insertion nom d'une image dans une base de donné

Posté : 03 juil. 2013, 01:02
par nriem
merci beaucoup Spols pour ta réponse (rapide, désoler pour la mien en retard)

j'ai essayer comme tu ma dit (même si y'a un truque que j'ai pas tout a fais compris, les 2 return en bas de fonction.php) mai y'a toujours un problème (obligé sinon c'est pas du jeux lol),
y'a des image qu'il s'Upload nickel avec le nom de l'image crypter dans la base de donnes,
mai y'a d'autre image que non, il me mes plusieurs erreur

premier erreur:

------------ --------------------------- --------------------------- --------------------------- ---------------------------
Notice: Undefined variable: location in C:.....\function.php on line 56
--------------------------------------------- --------------------------- ---------------------------

la ligne 56 = return $location;

deuxième erreur:

--------------------------- --------------------------- --------------------------- --------------------------- -------------------
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'photoObjet' cannot be null' in C:.....form.php on line 147
--------------------------------------------- --------------------------- --------------------------- ---------------------------

la ligne 147 = 'photoObjet' => $new_name ( c'est dans la requête préparé pour enregistres dans la Bdd)

et la troisième erreur elle ressemble a la deuxième:

--------------------------- --------------------------- --------------------------- --------------------------- ---------------------------
PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'photoObjet' cannot be null in C:\.....form.php on line 147
--------------------------- --------------------------- --------------------------- --------------------------- ---------------------------

j'aurai bien voulus savoirs pourquoi sa marche pas pour tout les image
je suis rester des heur dessus #-o
j’espère que tu va lire ma réponse

merci d'avance

Re: Insertion nom d'une image dans une base de donné

Posté : 04 juil. 2013, 17:02
par Spols
J'ai commencé par refaire l’indentation de ta fonction, même si PHP n'en a pas besoin, cela aide grandement pour comprendre un code
function upload_image($imageTmp,$image) {
    if(file_exists($imageTmp)) {
        $imageSize = getimagesize($imageTmp); // r'envoi la taille de l'image
        if($imageSize['mime'] == 'image/jpeg') {
            $imageSrc = imagecreatefromjpeg($imageTmp);
        } elseif($imageSize['mime'] == 'image/png') {
            $imageSrc = imagecreatefrompng($imageTmp);
        } else if($imageSize['mime'] == 'image/gif') {
            $imageSrc = imagecreatefromgif($imageTmp);
        } else { //si c'est pas une image valide
            echo "Votre image n'est pas valide";
            $imageSrc = FALSE;
	    return false;//Si il y a erreur, on l'indique au nouveau nom pour que l'enregistrement en base ne se fasse pas
        }
        if($imageSrc !== FALSE) {
	    $imageWidth = 300;
	    if($imageSize[0] <= $imageWidth) {
		$imageFinal = $imageSrc; // si l'mage vaut 300 on garde l'image
	    } else { // si elle et suprior de 300px on la redimansion
		$newWidth[0] = $imageWidth; // on redimansion a 300px
		$newHeight[1] = ($imageSize[1]/$imageSize[0])*$imageWidth;
		$imageFinal = imagecreatetruecolor($newWidth[0],$newHeight[1]);
		imagecopyresampled($imageFinal,$imageSrc,0,0,0,0,$newWidth[0],$newHeight[1],$imageSize[0],$imageSize[1]);
		// on crypte le nom de l'image pour pas que y'a 2 image les même
		$location = sha1(session_id().microtime());
		imagejpeg($imageFinal,'image/' . $location. '.jpg'); // on enregistre limage dans le dossier
	    }
	}
	return $location;
    }
    return false;
}
Les 2 return à la fin interviennent dans des cas complètement diffèrent.
J'aurais pu écrire la fonction comme ceci
function upload_image($imageTmp,$image) {
    if(file_exists($imageTmp)) {
       //BLABLA...
	return $location;
    } else {
        return false;
    }
}
En d'autres termes, si le fichier existe je traite le fichier et je retourne son nouveau nom sinon je renvoie un booléen pour indiquer le problème

Les erreurs

C'est une notice, la plupart du temps elle n'empèche pas le script de fonctionner mais peuvent être très utiles pour débugger.
Elle indique que la variable $location qui est lue avec "return" à la ligne 56 n'est jamais définie, donc il existe un cas dans la fonction qui arrive à cette ligne 56 sans passer par la ligne " $location = sha1(session_id().microtime());" qui défini ma fonction. C'est le cas avec une image de taille infèrieure à 300.
En effet, si la condition "if($imageSize[0] <= $imageWidth) {" est remplie, il n'y aura pas de définition de la variable $location.
Il y a plusieurs façon de corriger cela. Je te propose le code en bas de ce post, si l'image est plus petite que 300 on garde les dimensions actuelles et la création de l'image est sortie de se IF. Si cela ne te convient pas, soit sur de comprendre ton code et revient avec d'autres questions plus précises.

La 2ème t'indique que $new_name est nulle (vide) ce qui est logique si on lit une variable qui n'a jamais été définie, ceci devrait être corrigé par la modification expliqué ci-dessus
la 3ème est directement lié à la 2ème.

Ce code devrait donc mieux te convenir :
J'ai également retiré le 2ème argument de ta fonction, tu ne le renseigne pas lors de l'appel à ta fonction et tu ne t'en servais jamais.
function upload_image($imageTmp) {
    if(file_exists($imageTmp)) {
        $imageSize = getimagesize($imageTmp); // r'envoi la taille de l'image
        if($imageSize['mime'] == 'image/jpeg') {
            $imageSrc = imagecreatefromjpeg($imageTmp);
        } elseif($imageSize['mime'] == 'image/png') {
            $imageSrc = imagecreatefrompng($imageTmp);
        } else if($imageSize['mime'] == 'image/gif') {
            $imageSrc = imagecreatefromgif($imageTmp);
        } else { //si c'est pas une image valide
            echo "Votre image n'est pas valide";
            $imageSrc = FALSE;
	    return false;//Si il y a erreur, on l'indique au nouveau nom pour que l'enregistrement en base ne se fasse pas
        }
        if($imageSrc !== FALSE) {
	    $imageWidth = 300;
	    if($imageSize[0] <= $imageWidth) {
		$newWidth[0] = $imageSize[0];
		$newHeight[1] = $imageSize[1];
	    } else { // si elle et suprior de 300px on la redimansion
		$newWidth[0] = $imageWidth; // on redimansion a 300px
		$newHeight[1] = ($imageSize[1]/$imageSize[0])*$imageWidth;
            }
	    $imageFinal = imagecreatetruecolor($newWidth[0],$newHeight[1]);
	    imagecopyresampled($imageFinal,$imageSrc,0,0,0,0,$newWidth[0],$newHeight[1],$imageSize[0],$imageSize[1]);
	    // on crypte le nom de l'image pour pas que y'a 2 image les même
	    $location = sha1(session_id().microtime());
	    imagejpeg($imageFinal,'image/' . $location. '.jpg'); // on enregistre limage dans le dossier
	}
	return $location;
    }
    return false;
}

Re: Insertion nom d'une image dans une base de donné

Posté : 05 juil. 2013, 13:00
par Nriem
merci infiniment!!! tu et un tueur

bien jouer j'avais pas penser pour, si la dimension de l'image était moins que 300 =D>
si je veut quel fasse minimum 300 j'ai juste a faire une condition, si c'est moins que 300 on la redimensionne a 300 c'est faisable ouai !?

juste une dernier question pourquoi on a besoin de sortir de la condition (du else) pour enregistrai l'image?

merci pour tout

Re: Insertion nom d'une image dans une base de donné

Posté : 05 juil. 2013, 16:09
par Spols
oui tu peux la redimensionné à 300 peu importe sa taille, mais agrandir une image c'est moche.
Il suffit de faire ceci :

function upload_image($imageTmp) {
    if(file_exists($imageTmp)) {
        $imageSize = getimagesize($imageTmp); // r'envoi la taille de l'image
        if($imageSize['mime'] == 'image/jpeg') {
            $imageSrc = imagecreatefromjpeg($imageTmp);
        } elseif($imageSize['mime'] == 'image/png') {
            $imageSrc = imagecreatefrompng($imageTmp);
        } else if($imageSize['mime'] == 'image/gif') {
            $imageSrc = imagecreatefromgif($imageTmp);
        } else { //si c'est pas une image valide
            echo "Votre image n'est pas valide";
            $imageSrc = FALSE;
            return false;//Si il y a erreur, on l'indique au nouveau nom pour que l'enregistrement en base ne se fasse pas
        }
        if($imageSrc !== FALSE) {
            $imageWidth = 300;
            $newWidth[0] = $imageWidth; // on redimansion a 300px
            $newHeight[1] = ($imageSize[1]/$imageSize[0])*$imageWidth;
            $imageFinal = imagecreatetruecolor($newWidth[0],$newHeight[1]);
            imagecopyresampled($imageFinal,$imageSrc,0,0,0,0,$newWidth[0],$newHeight[1],$imageSize[0],$imageSize[1]);
            // on crypte le nom de l'image pour pas que y'a 2 image les même
            $location = sha1(session_id().microtime());
            imagejpeg($imageFinal,'image/' . $location. '.jpg'); // on enregistre limage dans le dossier
        }
        return $location;
    }
    return false;
}
On n'a pas besoin de vérifier la taille, on redimensionne d'office.

Le besoin de sortir du if, c'est surtout pour ne pas devoir recopier 2 fois du code qui fait la même chose, cela simplifie le debuggage et la mise à niveau. Si tu doit modifier une valeur et que tu dois modifier cette valeurs à plusieurs endroits dans ton code, la probabilité que tu en oublie un est d'autant plus grande.

donc je me sers de ce if uniquement pour établir mes nouvelles dimensions et puis je les utilise pour le redimensionnement

Re: Insertion nom d'une image dans une base de donné

Posté : 06 juil. 2013, 23:28
par Nriem
Merci