Quand on parle de "redimensionnement" d'image, il faut distinguer :
ou comment afficher ses images à la taille d'affichage voulue ?
l'image elle-même n'est pas modifiée, seules ses dimensions d'affichage sont "recalculées".
modification du "poids" de l'image (nouvelle image aux dimensions spécifiées),
fct_affich_image($Wmax, $Hmax, $img_Src)
Les paramètres :
- $Wmax : LARGEUR maxi d'affichage ----> ou 0 : largeur libre
- $Hmax : HAUTEUR maxi d'affichage ----> ou 0 : hauteur libre
- $img_Src : NOM de l'image Source (+ chemin)
L'image source n'est pas modifiée, seules ses dimensions d'affichage sont "recalculées".
fct_affich_image.php
<?php // -------------------------------------------------------------------------------------------------- // fonction de redimensionnement A L'AFFICHAGE // -------------------------------------------------------------------------------------------------- // La FONCTION : fct_affich_image($Wmax, $Hmax, $img_Src) // Les paramètres : // - $Wmax : LARGEUR maxi finale ----> ou 0 : largeur libre // - $Hmax : HAUTEUR maxi finale ----> ou 0 : hauteur libre // - $img_Src : NOM de l image Source // -------------------------------------------------------------------------------------------------- // UTILISATION (exemple) : // <img src="repimg/monimage.jpg" <?php fct_affich_image(100, 100, 'repimg/monimage.jpg') ?>> // -------------------------------------------------------------------------------------------------- function fct_affich_image($Wmax, $Hmax, $img_Src) { // ------------------------------------------------------------------ // Lit les dimensions de l'image $sizeimg = GetImageSize($img_Src); $Src_W = $sizeimg[0]; // largeur $Src_H = $sizeimg[1]; // hauteur // ------------------------------------------------------------------ // Teste les dimensions tenant dans la zone $test_H = round(($Wmax / $Src_W) * $Src_H); $test_W = round(($Hmax / $Src_H) * $Src_W); // ------------------------------------------------------------------ // Si Height final non précisé (0) if(!$Hmax) $Hmax = $test_H; // Sinon si Width final non précisé (0) elseif(!$Wmax) $Wmax = $test_W; // Sinon teste quel redimensionnement tient dans la zone elseif($test_H>$Hmax) $Wmax = $test_W; else $Hmax = $test_H; // ------------------------------------------------------------------ // (procédure : ne retourne aucune valeur mais ...) // AFFICHE les dimensions optimales echo 'width='.$Wmax.' height='.$Hmax; } // -------------------------------------------------------------------------------------------------- ?>
fct_redim_image($Wmax, $Hmax, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Redimensionnement "physique "en proportions" (conserve les proportions de l'image)
3 options :
A- "normal" : image finale à HAUTEUR ET LARGEUR maxi fixes.
B- "hauteur" : image finale à HAUTEUR maxi fixe (largeur libre)
C- "largeur" : image finale à LARGEUR maxi fixe (hauteur libre)
Retourne la valeur :
- 1 (vrai) si le redimensionnement et l enregistrement ont bien eu lieu,
- sinon rien (false)
Les paramètres :
- $Wmax : LARGEUR maxi finale --> ou 0 : largeur libre
- $Hmax : HAUTEUR maxi finale --> ou 0 : hauteur libre
- $rep_Dst : répertoire de l'image de destination (déprotégé) --> ou '' : même répertoire
NB il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod ou via logiciel FTP)
- $img_Dst : NOM de l'image de destination --> ou '' : même nom
- $rep_Src : répertoire de l'image source (déprotégé)
- $img_Src : NOM de l'image source
Les 3 options :
A- $Wmax != 0 et $Hmax != 0 -> à LARGEUR maxi ET HAUTEUR maxi fixes
B- si $Wmax = 0 -> à LARGEUR maxi fixe
C- si $Hmax = 0 -> à HAUTEUR maxi fixe
NB :
- si $rep_Dst = '' -> $rep_Dst=$rep_Src (même répertoire)
- si $img_Dst = '' -> $img_Dst=$img_Src (même nom)
- si $rep_Dst='' ET $img_Dst='' -> on écrase (remplace) l'image source !
- $img_Dst et $img_Src doivent avoir la même extension (même type mime) !
Extensions acceptées (traitées ici) : .jpg , .jpeg , .png
Pour ajouter d'autres extensions :
voir la bibliothèque GD ou ImageMagick.
fct_redim_image.php
<?php // -------------------------------------------------------------------------------------------------- // fonction de REDIMENSIONNEMENT physique "proportionnel" et ENREGISTREMENT // -------------------------------------------------------------------------------------------------- // retourne : 1 (vrai) si le redimensionnement et l enregistrement ont bien eu lieu, sinon rien (false) // -------------------------------------------------------------------------------------------------- // La FONCTION : fct_redim_image($Wmax, $Hmax, $rep_Dst, $img_Dst, $rep_Src, $img_Src) // Les paramètres : // - $Wmax : LARGEUR maxi finale ----> ou 0 : largeur libre // - $Hmax : HAUTEUR maxi finale ----> ou 0 : hauteur libre // - $rep_Dst : répertoire de l image de Destination (déprotégé) ----> ou '' : même répertoire // il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod ou via logiciel FTP) // - $img_Dst : NOM de l image de Destination ----> ou '' : même nom que l image Src // - $rep_Src : répertoire de l image Source (déprotégé) // - $img_Src : NOM de l image Source // -------------------------------------------------------------------------------------------------- // si $rep_Dst = '' : $rep_Dst=$rep_Src (même répertoire) // si $img_Dst = '' : $img_Dst=$img_Src (même nom) // Attention : si $rep_Dst='' ET $img_Dst='' : on écrase (remplace) l image source ($img_Src) ! // NB : $img_Dst et $img_Src doivent avoir la même extension (même type mime) ! // -------------------------------------------------------------------------------------------------- // 3 options : // A- $Wmax != 0 et $Hmax != 0 : a LARGEUR maxi ET HAUTEUR maxi fixes // B- si $Wmax = 0 : image finale a LARGEUR maxi fixe (hauteur libre) // C- si $Hmax = 0 : image finale a HAUTEUR maxi fixe (largeur libre) // -------------------------------------------------------------------------------------------------- // Extensions acceptees (traitees ici) : .jpg , .jpeg , .png // Pour ajouter d autres extensions : voir la bibliothèque GD ou ImageMagick // (GD) NE FONCTIONNE PAS avec les GIF ANIMES ou a fond transparent ! // -------------------------------------------------------------------------------------------------- // UTILISATION (exemple) : // $redimOK = fct_redim_image(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg'); // if ($redimOK == 1) { echo 'Redimensionnement OK !'; } // -------------------------------------------------------------------------------------------------- function fct_redim_image($Wmax, $Hmax, $rep_Dst, $img_Dst, $rep_Src, $img_Src) { // ------------------------------------------------------------------ $condition = 0; // Si certains paramètres ont pour valeur '' : if ($rep_Dst == '') { $rep_Dst = $rep_Src; } // (meme repertoire) if ($img_Dst == '') { $img_Dst = $img_Src; } // (meme nom) if ($Wmax == '') { $Wmax = 0; } if ($Hmax == '') { $Hmax = 0; } // ------------------------------------------------------------------ // si le fichier existe dans le répertoire, on continue... if (file_exists($rep_Src.$img_Src) && ($Wmax!=0 || $Hmax!=0)) { // ---------------------------------------------------------------- // extensions acceptées : $ExtfichierOK = '" jpg jpeg png"'; // (l espace avant jpg est important) // extension $tabimage = explode('.',$img_Src); $extension = $tabimage[sizeof($tabimage)-1]; // dernier element $extension = strtolower($extension); // on met en minuscule // ---------------------------------------------------------------- // extension OK ? on continue ... if (strpos($ExtfichierOK,$extension) != '') { // ------------------------------------------------------------- // récupération des dimensions de l image Src $size = getimagesize($rep_Src.$img_Src); $W_Src = $size[0]; // largeur $H_Src = $size[1]; // hauteur // ------------------------------------------------------------- // condition de redimensionnement et dimensions de l image finale // ------------------------------------------------------------- // A- LARGEUR ET HAUTEUR maxi fixes if ($Wmax != 0 && $Hmax != 0) { $ratiox = $W_Src / $Wmax; // ratio en largeur $ratioy = $H_Src / $Hmax; // ratio en hauteur $ratio = max($ratiox,$ratioy); // le plus grand $W = $W_Src/$ratio; $H = $H_Src/$ratio; $condition = ($W_Src>$W) || ($W_Src>$H); // 1 si vrai (true) } // ------------------------------------------------------------- // B- LARGEUR maxi fixe if ($Hmax != 0 && $Wmax == 0) { $H = $Hmax; $W = $H * ($W_Src / $H_Src); $condition = $H_Src > $Hmax; // 1 si vrai (true) } // ------------------------------------------------------------- // C- HAUTEUR maxi fixe if ($Wmax != 0 && $Hmax == 0) { $W = $Wmax; $H = $W * ($H_Src / $W_Src); $condition = $W_Src > $Wmax; // 1 si vrai (true) } // ------------------------------------------------------------- // on REDIMENSIONNE si la condition est vraie // ------------------------------------------------------------- if ($condition == 1) { // création de la ressource-image"Src" en fonction de l extension // et on crée une ressource-image"Dst" vide aux dimensions finales switch($extension) { case 'jpg': case 'jpeg': $Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src); $Ress_Dst = ImageCreateTrueColor($W,$H); break; case 'png': $Ress_Src = imagecreatefrompng($rep_Src.$img_Src); $Ress_Dst = ImageCreateTrueColor($W,$H); // fond transparent (pour les png avec transparence) imagesavealpha($Ress_Dst, true); $trans_color = imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127); imagefill($Ress_Dst, 0, 0, $trans_color); break; } // ---------------------------------------------------------- // REDIMENSIONNEMENT (copie, redimensionne, ré-echantillonne) ImageCopyResampled($Ress_Dst, $Ress_Src, 0, 0, 0, 0, $W, $H, $W_Src, $H_Src); // ---------------------------------------------------------- // ENREGISTREMENT dans le répertoire (avec la fonction appropriée) switch ($extension) { case 'jpg': case 'jpeg': ImageJpeg ($Ress_Dst, $rep_Dst.$img_Dst); break; case 'png': imagepng ($Ress_Dst, $rep_Dst.$img_Dst); break; } // ---------------------------------------------------------- // libération des ressources-image imagedestroy ($Ress_Src); imagedestroy ($Ress_Dst); } // ------------------------------------------------------------- } } // -------------------------------------------------------------------------------------------------- // retourne : 1 (vrai) si le redimensionnement et l enregistrement ont bien eu lieu, sinon rien (false) // si le fichier a bien été créé if ($condition == 1 && file_exists($rep_Dst.$img_Dst)) { return true; } else { return false; } } // -------------------------------------------------------------------------------------------------- ?>
fct_crop_image($Wfin, $Hfin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Redimensionnement "physique "crop centré" (l'image est "coupée" aux dimensions voulues)
4 options :
A- "normal" : crop "centré" aux dimensions indiquées
B- "hauteur" : crop "centré" de la hauteur indiquée (même largeur que la source)
C- "largeur" : crop "centré" de la largeur indiquée (même hauteur que la source)
D- "cas spécial" : crop "carré" à la plus petite dimension de l'image source
Retourne la valeur :
- 1 (vrai) si le redimensionnement et l enregistrement ont bien eu lieu,
- sinon rien (false)
Les paramètres :
- $Wfin : LARGEUR finale ----> ou 0
- $Hfin : HAUTEUR finale ----> ou 0
- $rep_Dst : répertoire de l'image de destination (déprotégé) ----> ou '' (même répertoire)
NB il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod ou via logiciel FTP)
- $img_Dst : NOM de l'image de destination ----> ou '' (même nom)
- $rep_Src : répertoire de l'image source (déprotégé)
- $img_Src : NOM de l'image source
Les 4 options :
A- si $Wfin != 0 et $Hfin!= 0 : crop aux dimensions indiquées
B- si $Wfin = 0 et $Hfin != 0 : crop en HAUTEUR (même largeur que la source)
C- si $Wfin != 0 et $Hfin = 0 : crop en LARGEUR (même hauteur que la source)
D- si $Wfin= 0 et $Hfin = 0 : (cas spécial) crop "carré" à la plus petite dimension de l'image source
NB :
- si $rep_Dst = '' -> $rep_Dst = $rep_Src (même répertoire)
- si $img_Dst = '' -> $img_Dst = $img_Src (même nom)
- si $rep_Dst='' ET $img_Dst='' -> on écrase (remplace) l'image source !
Extensions :
- acceptées (traitées ici) : .jpg , .jpeg , .png
- $img_Dst et $img_Src doivent avoir la même extension (même type mime) !
Pour ajouter d'autres extensions :
voir la bibliothèque GD ou ImageMagick
ASTUCE : picto carré (de 100 x 100 pixels)
--> Crop "carré", puis "proportionnel"
$redim = fct_crop_image(0,0,$repDest,$imageDest,$repSource,$imageSource);
$redim = fct_redim_image(100,0,'','',$repDest,$imageDest);
if ($redim==true) { echo 'picto carré créé !'; }
ct_crop_image.php
<?php // -------------------------------------------------------------------------------------------------- // fonction de REDIMENSIONNEMENT physique "CROP CENTRE" et Enregistrement // -------------------------------------------------------------------------------------------------- // retourne : 1 (vrai) si le redimensionnement et l enregistrement ont bien eu lieu, sinon rien (false) // -------------------------------------------------------------------------------------------------- // La FONCTION : fct_crop_image($Wfin, $Hfin, $rep_Dst, $img_Dst, $rep_Src, $img_Src) // Les parametres : // - $Wfin : LARGEUR finale --> ou 0 // - $Hfin : HAUTEUR finale --> ou 0 // - $rep_Dst : repertoire de l image de Destination (deprotégé) --> ou '' // il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod ou via logiciel FTP) // - $img_Dst : NOM de l image de Destination ----> ou '' // - $rep_Src : repertoire de l image Source (deprotégé) // - $img_Src : NOM de l image Source // -------------------------------------------------------------------------------------------------- // 4 options : // A- si $Wfin != 0 et $Hfin != 0 : crop aux dimensions indiquees // B- si $Wfin = 0 et $Hfin != 0 : crop en HAUTEUR (meme largeur que la source) // C- si $Wfin != 0 et $Hfin = 0 : crop en LARGEUR (meme hauteur que la source) // D- si $Wfin = 0 et $Hfin = 0 : (cas special) crop "carre" a la plus petite dimension de l image source // -------------------------------------------------------------------------------------------------- // - si $rep_Dst = '' : $rep_Dst=$rep_Src (meme repertoire que le repertoire Source) // - si $img_Dst = '' : $img_Dst=$img_Src (meme nom que l image Source) // - si $rep_Dst='' ET $img_Dst='' : on ecrase (remplace) l image source ($img_Src) ! // -------------------------------------------------------------------------------------------------- // NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) ! // Extensions acceptees (traitees ici) : .jpg , .jpeg , .png // Pour ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick // (GD) NE FONCTIONNE PAS avec les GIF ANIMES ou a fond transparent ! // -------------------------------------------------------------------------------------------------- // UTILISATION (exemple) : // $cropOK = fct_crop_image(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg'); // if ($cropOK == 1) { echo 'Crop centré OK !'; } // -------------------------------------------------------------------------------------------------- function fct_crop_image($Wfin, $Hfin, $rep_Dst, $img_Dst, $rep_Src, $img_Src) { // ------------------------------------------------------------------ $condition = 0; // Si certains parametres ont pour valeur '' : if ($rep_Dst == '') { $rep_Dst = $rep_Src; } // (meme repertoire) if ($img_Dst == '') { $img_Dst = $img_Src; } // (meme nom) if ($Wfin == '') { $Wfin = 0; } if ($Hfin == '') { $Hfin = 0; } // ------------------------------------------------------------------ // si le fichier existe dans le répertoire, on continue... if (file_exists($rep_Src.$img_Src)) { // ---------------------------------------------------------------- // extensions acceptees : $ExtfichierOK = '" jpg jpeg png"'; // (l espace avant jpg est important) // extension fichier Source $tabimage = explode('.',$img_Src); $extension = $tabimage[sizeof($tabimage)-1]; // dernier element $extension = strtolower($extension); // on met en minuscule // ---------------------------------------------------------------- // extension OK ? on continue ... if (strpos($ExtfichierOK,$extension) != '') { // ------------------------------------------------------------- $condition = 1; // ------------------------------------------------------------- // recuperation des dimensions de l image Source $size = getimagesize($rep_Src.$img_Src); $W_Src = $size[0]; // largeur $H_Src = $size[1]; // hauteur // ------------------------------------------------------------- // condition de crop et dimensions de l image finale // ------------------------------------------------------------- // A- crop aux dimensions indiquees if ($Wfin != 0 && $Hfin != 0) { $W = $Wfin; $H = $Hfin; } // ------------------------------------------------------------- // B- crop en HAUTEUR (meme largeur que la source) if ($Wfin == 0 && $Hfin != 0) { $H = $Hfin; $W = $W_Src; } // ------------------------------------------------------------- // C- crop en LARGEUR (meme hauteur que la source) if ($Wfin != 0 && $Hfin == 0) { $W = $Wfin; $H = $H_Src; } // D- (cas special) crop "carre" a la plus petite dimension de l image source if ($Wfin == 0 && $Hfin == 0) { if ($W_Src >= $H_Src) { $W = $H_Src; $H = $H_Src; } else { $W = $W_Src; $H = $W_Src; } } // ------------------------------------------------------------- // creation de la ressource-image"Src" en fonction de l extension switch($extension) { case 'jpg': case 'jpeg': $Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src); break; case 'png': $Ress_Src = imagecreatefrompng($rep_Src.$img_Src); break; } // ---------------------------------------------------------- // creation d une ressource-image"Dst" aux dimensions finales // fond noir (par defaut) switch($extension) { case 'jpg': case 'jpeg': $Ress_Dst = ImageCreateTrueColor($W,$H); // fond blanc $blanc = imagecolorallocate ($Ress_Dst, 255, 255, 255); imagefill ($Ress_Dst, 0, 0, $blanc); break; case 'png': $Ress_Dst = ImageCreateTrueColor($W,$H); // fond transparent (pour les png avec transparence) imagesavealpha($Ress_Dst, true); $trans_color = imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127); imagefill($Ress_Dst, 0, 0, $trans_color); break; } // ------------------------------------------------------------- // CENTRAGE du crop // coordonnees du point d origine Scr : $X_Src, $Y_Src // coordonnees du point d origine Dst : $X_Dst, $Y_Dst // dimensions de la portion copiee : $W_copy, $H_copy // ------------------------------------------------------------- // CENTRAGE en largeur if ($Wfin == 0) { if ($Hfin == 0 && $W_Src<$H_Src) { $X_Src = 0; $X_Dst = 0; $W_copy = $W_Src; } else { $X_Src = 0; $X_Dst = ($W - $W_Src) /2; $W_copy = $W_Src; } } else { if ($W_Src > $W) { $X_Src = ($W_Src - $W) /2; $X_Dst = 0; $W_copy = $W; } else { $X_Src = 0; $X_Dst = ($W - $W_Src) /2; $W_copy = $W_Src; } } // ------------------------------------------------------------- // CENTRAGE en hauteur if ($Hfin == 0) { if ($Wfin == 0 && $H_Src<$W_Src) { $Y_Src = 0; $Y_Dst = 0; $H_copy = $H_Src; } else { $Y_Src = 0; $Y_Dst = ($H - $H_Src) /2; $H_copy = $H_Src; } } else { if ($H_Src > $H) { $Y_Src = ($H_Src - $H) /2; $Y_Dst = 0; $H_copy = $H; } else { $Y_Src = 0; $Y_Dst = ($H - $H_Src) /2; $H_copy = $H_Src; } } // ------------------------------------------------------------- // CROP par copie de la portion d image selectionnee imagecopyresampled ($Ress_Dst, $Ress_Src, $X_Dst, $Y_Dst, $X_Src, $Y_Src, $W_copy, $H_copy, $W_copy, $H_copy); // ---------------------------------------------------------- // ENREGISTREMENT dans le repertoire (avec la fonction appropriee) switch ($extension) { case 'jpg': case 'jpeg': ImageJpeg ($Ress_Dst, $rep_Dst.$img_Dst); break; case 'png': imagepng ($Ress_Dst, $rep_Dst.$img_Dst); break; } // ---------------------------------------------------------- // liberation des ressources-image imagedestroy ($Ress_Src); imagedestroy ($Ress_Dst); } // ------------------------------------------------------------- } // -------------------------------------------------------------------------------------------------- // retourne : 1 (vrai) si le redimensionnement et l enregistrement ont bien eu lieu, sinon rien (false) // si le fichier a bien ete cree if ($condition == 1 && file_exists($rep_Dst.$img_Dst)) { return true; } else { return false; } } // -------------------------------------------------------------------------------------------------- ?>
But :
(gain de temps de chargement et d'espace disque).
3 étapes :
1- Liste : liste des images présentes + options AJOUTER - MODIFIER - SUPPRIMER
2- Formulaire : affichage du formulaire (en fonction de l'option choisie)
3- Traitement : (faisant appel aux fonctions de redimensionnement "physique")
On a donc besoin :
1- d'une base de données MySQL (MABASE),
dans laquelle est créée une table (MATABLE) contenant au moins les champs suivants :
2- d'un dossier déprotégé (repIMAGES) (avec "droits en écriture").
3- des fichiers :
4- Les fonctions de redimensionnement)
<?php // Paramètres persos $host = "localhost"; // voir hébergeur $user = "login"; // identifiant de votre BD (vide ou "root" en local) $pass = "password"; // mot de passe de votre BD (vide en local) $bdd = "MABASE"; // nom de la BD // connexion @mysql_connect($host,$user,$pass) or die("Impossible de se connecter"); @mysql_select_db("$bdd") or die("Impossible de se connecter"); ?>
Via PhpMyAdmin, ou requête SQL :
CREATE TABLE 'MATABLE' (
'NUM' INT( 11 ) NOT NULL AUTO_INCREMENT ,
'COMMENT1' VARCHAR( 255 ) ,
'PHOTO1' VARCHAR( 255 ) ,
'PICTO1' VARCHAR( 255 ) ,
PRIMARY KEY ( 'NUM' )
) TYPE = MYISAM ;
dans cet exemple :
- affichage en ligne les pictos des photos présentes dans la table de la base de données,
- avec pour chacune des boutons "Modifier" et "Supprimer"
- et un bouton "Ajouter Nouveau"
<?php // connexion a la base de donnees include("_connexion.php"); // FONCTION de redimensionnement "à l affichage" include("fct_affich_image.php"); // -------------------------------------------------------------------------------------------------- // La base de données (MABASE) avec une table (MATABLE) // La table doit contenir (au moins) les champs suivants : // - NUM (INT - 11 - auto-incremente - NotNull) // - COMMENT1 (VARCHAR - 255 - Null) // - PHOTO1 (VARCHAR - 255 - Null)) // - PICTO1 (VARCHAR - 255 - Null) // Important : conserver le champ COMMENT1, il est nécessaire en mode AJOUTER // -------------------------------------------------------------------------------------------------- // mettre le nom de la table dans une variable : $table = 'MATABLE'; // REMARQUE : on peut utiliser ce fichier pour PLUSIEURS TABLES (de même structure) // $table = $_GET['CAT']; // (préciser le nom de la table à l'appel du fichier : MONFICHIER_LISTE.php?CAT=MATABLE) // -------------------------------------------------------------------------------------------------- // Les photos et pictos sont stockés dans un dossier déprotégé en écriture $chemincourt = 'repIMAGES/'; // -------------------------------------------------------------------------------------------------- // sélection de toutes les fiches de la table $query = 'SELECT * FROM '.$table.' WHERE PHOTO1<>"" ORDER BY NUM DESC'; $result = mysql_query($query) or die('Erreur SQL ! '.$query.'<br/>'.mysql_error()); ?> <html><head><title></title></head> <body><center> <div> <?php echo 'TABLE '.$table; ?><br/> <a href="MONFICHIER_FORM.php?CAT=<?php echo $table; ?>&TRAITER=AJOUTER">AJOUTER NOUVEAU</a> </div> <div> <table border="1"> <tr> <?php // -------------------------------------------------------------------------------------------------- // AFFICHAGE tant qu'il y a des fiches while ($val = mysql_fetch_array($result)) { ?> <td> <a href="MONFICHIER_FORM.php?CAT=<?php echo $table; ?> &TRAITER=MODIFIER&NUM=<?php echo $val['NUM']; ?>"> MODIFIER</a> <a href="MONFICHIER_FORM.php?CAT=<?php echo $table; ?> &TRAITER=SUPPRIMER&NUM=<?php echo $val['NUM']; ?>"> Supprimer</a><br/> <?php if ($val[PICTO1] != "") { ?> <img border="0" src="<?php echo $chemincourt.$val['PICTO1']; ?>" <?php fct_affich_image(100, 100, $chemincourt.$val['PICTO1']) ?>> <?php } ?> </td> <?php } // fin while // -------------------------------------------------------------------------------------------------- ?> </tr> </table> </div> </center></body></html> <?php // liberation de la ressource et deconnexion mysql_free_result($result); mysql_close(); ?>
dans cet exemple : on affiche
- le bon formulaire en fonction de l'option choisie (ajouter, modifier, supprimer)
- la fiche concernée (photo et commentaire)
<?php // connexion a la base de donnees include("_connexion.php"); // -------------------------------------------------------------------------------------------------- // Répertoire des photos et pictos (déprotégé) $chemincourt = 'repIMAGES/'; // -------------------------------------------------------------------------------------------------- // recuperation du nom de la TABLE $table=$_GET['CAT']; // recuperation du mode de traitement (AJOUTER - MODIFIER - SUPPRIMER) $TRAITER=$_GET['TRAITER']; // -------------------------------------------------------------------------------------------------- if ($TRAITER == 'MODIFIER' || $TRAITER == 'SUPPRIMER') { //on recupere aussi le numero de la fiche $NUM=$_GET['NUM']; // on recupere les donnees la fiche numero NUM $query = 'SELECT * FROM '.$table.' WHERE NUM = '. $NUM; $result = mysql_query($query) or die('Erreur SQL ! '.$query.'<br/>'.mysql_error()); $val = mysql_fetch_array($result); } // -------------------------------------------------------------------------------------------------- ?> <html><head><title></title></head> <body><center> <?php // -------------------------------------------------------------------------------------------------- if ($TRAITER == 'AJOUTER') { ?> <div> <FORM name="AJOUTER" method="post" ENCTYPE="multipart/form-data" action="MONFICHIER_TRAITER.php"> <INPUT type="hidden" name="CAT" value="<?php echo $table; ?>"> <INPUT type="hidden" name="TRAITER" value="<?php echo $TRAITER; ?>"> AJOUTER<br/> Légende :<INPUT type="text" name="COMMENT1" size="50"><br/> PHOTO :<INPUT TYPE=FILE NAME="PHOTO1" size="50"><br/> <a href="#" onclick="history.back()">ANNULER</a> <INPUT type="submit" value="CONFIRMER" name="CONFIRMER"> <INPUT type="reset" value="Rétablir" name="B2"> </FORM> </div> <?php } // fin if AJOUTER // -------------------------------------------------------------------------------------------------- if ($TRAITER == 'MODIFIER') { ?> <div> <FORM name="MODIFIER" method="post" ENCTYPE="multipart/form-data" action="MONFICHIER_TRAITER.php"> <INPUT type="hidden" name="CAT" value="<?php echo $table; ?>"> <INPUT type="hidden" name="TRAITER" value="<?php echo $TRAITER; ?>"> <INPUT type="hidden" name="NUM" value="<?php echo $NUM; ?>"> <INPUT type="hidden" name="PHOTO1avant" value="<?php echo $val['PHOTO1']; ?>"> <INPUT type="hidden" name="PICTO1avant" value="<?php echo $val['PICTO1']; ?>"> MODIFIER<br/> Légende :<INPUT type="text" name="COMMENT1" size="50" value="<?php echo $val['COMMENT1']; ?>"><br/> <?php if ($val['PHOTO1'] != "") { ?> <img border="0" src="<?php echo $chemincourt.$val['PHOTO1']; ?>"><br/> <?php } ?> PHOTO :<INPUT TYPE=FILE NAME="PHOTO1" size="50"><br/> <a href="#" onclick="history.back()">ANNULER</a> <INPUT type="submit" value="CONFIRMER" name="CONFIRMER"> <INPUT type="reset" value="Rétablir" name="B2"> </FORM> </div> <?php } // fin if MODIFIER // -------------------------------------------------------------------------------------------------- if ($TRAITER == 'SUPPRIMER') { ?> <div> <FORM name="SUPPRIMER" method="post" ENCTYPE="multipart/form-data" action="MONFICHIER_TRAITER.php"> <INPUT type="hidden" name="CAT" value="<?php echo $table; ?>"> <INPUT type="hidden" name="TRAITER" value="<?php echo $TRAITER; ?>"> <INPUT type="hidden" name="NUM" value="<?php echo $NUM; ?>"> <INPUT type="hidden" name="PHOTO1avant" value="<?php echo $val['PHOTO1']; ?>"> <INPUT type="hidden" name="PICTO1avant" value="<?php echo $val['PICTO1']; ?>"> SUPPRIMER ? (ATTENTION : toute suppression est définitive !)<br/> <a href="#" onclick="history.back()">ANNULER</a> <INPUT type="submit" value="CONFIRMER" name="CONFIRMER"><br/> <?php echo $val['COMMENT1']; ?> <?php if ($val['PHOTO1'] != "") { ?> <br/><img border="0" src="<?php echo $chemincourt.$val['PHOTO1']; ?>"> <?php } ?> </FORM> </div> <?php } // fin if SUPPRIMER // -------------------------------------------------------------------------------------------------- ?> </center> </body></html> <?php // liberation de la ressource et deconnexion if (($TRAITER == 'MODIFIER') || ($TRAITER == 'SUPPRIMER')) { mysql_free_result($result); } mysql_close(); ?>
dans cet exemple :
TRAITEMENT :
0- gestion des erreurs
- Restrictions sur les fichiers : jpg, jpeg, png ou gif - 1Mo maxi
Si "AJOUTER" ou MODIFIER"
1- TELECHARGER la photo dans le répertoire
- PHOTO : on enregistre en ajoutant NUM- devant le nom de l'image uploadée
NUM est le numéro auto -la CLE primaire- de la fiche dans la base de données
On associe donc l'image à la fiche concernée et on rend le nom de l'image unique.
(on évite ainsi toute confusion, même si on upload plus tard des images de même nom)
2- REDIMENSIONNEMENT (si nécessaire) :
(on utilise les fonctions de redimensionnement "physique")
- PHOTO ? (ex. : on veut une largeur maxi de 600 pixels)
- PICTO ? (ex. : on veut 100 x 100 pixels maxi)
--> Si oui : on renomme le PICTO = picto-PHOTO
--> Si non : PICTO = PHOTO
3- Enregistrement dans la base de données (noms des photo et picto),
4- Suppression des anciens photo et picto du répertoire
Si "SUPPRIMER"
1- suppression de la fiche concernée dans la base de données,
2- suppression des photos et pictos concernés dans le répertoire.
<?php // connexion a la base de donnees include("_connexion.php"); // FONCTIONS de redimensionnement "physique" include("fct_redim_image.php"); // include("fct_crop_image.php"); // (inutile ici) // -------------------------------------------------------------------------------------------------- // Répertoire des photos et pictos (déprotégé) $cheminlong = realpath('repIMAGES').'\\'; $chemincourt = 'repIMAGES/'; // ------------------------------------------------------------- // recuperation du nom de la TABLE $table=$_POST['CAT']; // recuperation du mode de traitement (AJOUTER - MODIFIER - SUPPRIMER) $TRAITER=$_POST['TRAITER']; // ------------------------------------------------------------- // Restrictions sur les fichiers : $FileSizeMax = 1000000; $ExtfichierOK = '" jpg jpeg png gif"'; // (NB : l espace avant .jpg est important) // -------------------------------------------------------------------------------------------------- // GESTION DES ERREURS (upload fichier) // (ne concerne que les options "AJOUTER" et "MODIFIER") // -------------------------------------------------------------------------------------------------- $erreurfile = 0; // si un fichier N a PAS ete poste if ($_FILES['PHOTO1']['size']<=0 && $TRAITER == 'AJOUTER') { echo 'isset ? NON<br/>'; $erreurfile = 1; echo 'Erreur ! Pas de fichier IMAGE défini<br/>'; echo '<a href="#" onclick="history.back()">Retour au formulaire</a>'; } if ($_FILES['PHOTO1']['size']<=0 && $TRAITER == 'MODIFIER' && $_POST['PHOTO1avant']=='') { echo 'isset ? NON<br/>'; $erreurfile = 1; echo 'Erreur ! Pas de fichier IMAGE défini<br/>'; echo '<a href="#" onclick="history.back()">Retour au formulaire</a>'; } // ------------------------------------------------------------- // si un fichier a bien ete poste if ($_FILES['PHOTO1']['size']>0 && ($TRAITER == 'AJOUTER' || $TRAITER == 'MODIFIER')) { echo 'isset ? OUI<br/>'; // on verifie les restrictions sur les fichiers // extension $tabfile = explode('.',$_FILES['PHOTO1']['name']); $extension = $tabfile[sizeof($tabfile)-1]; // dernier element $extension = strtolower($extension); // on met en minuscule if (strpos($ExtfichierOK,$extension)=='') { $erreurfile = 1; echo 'Erreur ! Ce n\'est pas un fichier IMAGE (jpg, jpeg, png ou gif)<br/>'; echo '<a href="#" onclick="history.back()">Retour au formulaire</a>'; } // taille maxi autorisee elseif ($_FILES['PHOTO1']['size'] > $FileSizeMax) { $erreurfile = 1; echo 'Erreur ! Taille de fichier supérieure à la taille maxi autorisée ('.$FileSizeMax.' octets)<br/>'; echo '<a href="#" onclick="history.back()">Retour au formulaire</a>'; } elseif (UPLOAD_ERR_OK<>0 && UPLOAD_ERR_FORM_SIZE==2) { $erreurfile = 1; echo 'Erreur ! Taille de fichier trop important ('.$FileSizeMax.' octets)<br/>'; echo '<a href="#" onclick="history.back()">Retour au formulaire</a>'; } } // -------------------------------------------------------------------------------------------------- // si PAS d ERREUR : traitement if ($erreurfile == 0) { echo 'TRAITEMENT OK<br/>'; // -------------------------------------------------------------------------------------------------- // TRAITEMENT du formulaire // -------------------------------------------------------------------------------------------------- if ($TRAITER == 'AJOUTER') { // recuperation des elements du formulaire $COMMENT = addslashes($_POST['COMMENT1']); // ------------------------------------------------------------- // ENREGISTREMENT du COMMENT dans la BASE DE DONNEES par INSERT $listechamps = 'COMMENT1'; $listevaleurs = '''.$COMMENT.'''; $queryNEW = 'INSERT INTO '.$table.'('.$listechamps.') VALUES('.$listevaleurs.')'; $resultNEW = mysql_query($queryNEW) or die('Erreur SQL ! '.$queryNEW.'<br/>'.mysql_error()); // ------------------------------------------------------------- // recuperation du NUM en selectionnant LA DERNIERE fiche cree $query = 'SELECT MAX(NUM) AS NUMmax FROM '.$table; $result = mysql_query($query) or die('Erreur SQL ! '.$query.'<br/>'.mysql_error()); $val_NUMmax = mysql_fetch_array($result); $NUM = $val_NUMmax['NUMmax']; } // -------------------------------------------------------------------------------------------------- if ($TRAITER == 'MODIFIER') { // recuperation des elements du formulaire $NUM=$_POST['NUM']; $COMMENT = addslashes($_POST['COMMENT1']); // ------------------------------------------------------------- // ENREGISTREMENT dans la BASE DE DONNEES par UPDATE $SQL = 'UPDATE '.$table.' SET COMMENT1=''.$COMMENT.'' WHERE NUM= '.$NUM; mysql_query($SQL); // ------------------------------------------------------------- $PHOTOavant = $_POST['PHOTO1avant']; $PICTOavant = $_POST['PICTO1avant']; // par defaut $PHOTO = $PHOTOavant; $PICTO = $PICTOavant; } // -------------------------------------------------------------------------------------------------- // TRAITEMENT des champs FILE (PHOTOS et PICTOS) // -------------------------------------------------------------------------------------------------- if (($TRAITER == 'AJOUTER') || ($TRAITER == 'MODIFIER')) { if(isset($_FILES['PHOTO1']) && $_FILES['PHOTO1']['size']>0) { // ------------------------------------------------------------- // upload de la PHOTO sous forme NUM_nomfichier // NUM etant la CLE primaire de la fiche, ce qui rend le nom UNIQUE $PHOTO = $NUM.'_'.$_FILES['PHOTO1']['name']; // ------------------------------------------------------------- // pour eviter tout probleme par la suite, on remplace jpeg par jpg $PHOTO = str_replace('.JPEG','.jpg',$PHOTO); $PHOTO = str_replace('.jpeg','.jpg',$PHOTO); // autre modification : remplacement des caracteres genants (espaces) $PHOTO = str_replace(' ','-',$PHOTO); // ------------------------------------------------------------- // extension $tabfile = explode('.',$PHOTO); $extension = $tabfile[sizeof($tabfile)-1]; // dernier element $extension = strtolower($extension); // on met en minuscule // ------------------------------------------------------------- // enregistrement du fichier image dans le repertoire $tempfile = $_FILES['PHOTO1']['tmp_name']; move_uploaded_file($tempfile, $chemincourt.$PHOTO); // ------------------------------------------------------------- // REDIMENSIONNEMENT et SAUVEGARDE de la PHOTO (si necessaire) // ------------------------------------------------------------- // on veut : une photo de 600 pixels maxi de large // ecraser (remplacer) la photo (meme rep, meme nom) $redimPHOTOOK = fct_redim_image(600,0,'','',$chemincourt,$PHOTO); // $redimPHOTOok =1 si OK // ------------------------------------------------------------- // REDIMENSIONNEMENT et SAUVEGARDE du PICTO // ------------------------------------------------------------- // on veut : un picto de 100 x 100 pixels maxi // enregistrer en ajoutant 'picto_' devant le nom de la photo // dans le meme repertoire que la photo $redimPICTOok = fct_redim_image(100,100,'','picto_'.$PHOTO,$chemincourt,$PHOTO); // $redimPICTOok =1 si OK // nom du picto pour la BD if ($redimPICTOok == 1) { $PICTO = 'picto_'.$PHOTO; } else { $PICTO = $PHOTO; } // ------------------------------------------------------------- // SUPPRESSION des anciennes PHOTOS dans le repertoire if ($TRAITER == 'MODIFIER') { if ($PHOTOavant != '' && $PHOTOavant != $PHOTO && $PHOTOavant != $PICTO) { unlink($cheminlong.$PHOTO1avant); // Suppression de la photo } if ($PICTOavant != '' && $PICTOavant != $PHOTO && $PICTOavant != $PICTO) { unlink($cheminlong.$PICTOavant); // Suppression du picto } } // ------------------------------------------------------------- } // ---------------------------------------------------------------- // enregistrement dans la table par UPDATE $SQL = 'UPDATE '.$table.' SET PHOTO1=''.$PHOTO.'' WHERE NUM= '.$NUM; mysql_query($SQL); $SQL = 'UPDATE '.$table.' SET PICTO1=''.$PICTO.'' WHERE NUM= '.$NUM; mysql_query($SQL); } // -------------------------------------------------------------------------------------------------- if ($TRAITER == 'SUPPRIMER') { // recuperation des elements du formulaire $NUM=$_POST['NUM']; $PHOTOavant=$_POST['PHOTO1avant']; $PICTOavant=$_POST['PICTO1avant']; // ------------------------------------------------------------- // SUPPRESSION de la fiche numero NUM dans la BD $query = 'DELETE FROM '.$table.' WHERE NUM = '.$NUM ; $result = mysql_query($query) or die('Erreur SQL ! '.$query.'<br/>'.mysql_error()); // ------------------------------------------------------------- // SUPPRESSION des PHOTOS dans le repertoire if ($PHOTOavant != '') { unlink($cheminlong.$PHOTOavant); // Suppression de la photo } if ($PICTOavant != '' && $PICTOavant != $PHOTOavant) { unlink($cheminlong.$PICTOavant); // Suppression du picto } } // -------------------------------------------------------------------------------------------------- ?> <html><head><title></title></head> <body><div align="center"> <?php // -------------------------------------------------------------------------------------------------- // AFFICHAGE // -------------------------------------------------------------------------------------------------- if (($TRAITER == 'AJOUTER') || ($TRAITER == 'MODIFIER')) { // ------------------------------------------------------------- // recuperation des donnees de la nouvelle fiche pour reaffichage $query = 'SELECT * FROM '.$table.' WHERE NUM = '. $NUM; $result = mysql_query($query) or die('Erreur SQL ! '.$query.'<br/>'.mysql_error()); $val = mysql_fetch_array($result); // ------------------------------------------------------------- if ($TRAITER == 'AJOUTER') { echo 'LA PHOTO a été AJOUTEE.<br/>'; } if ($TRAITER == 'MODIFIER') { echo 'LA PHOTO a été MODIFIEE.<br/>'; } ?> <a href="MONFICHIER_LISTE.php?CAT=<?php echo $table; ?>">RETOUR</a><br/><br/> <?php echo $val['COMMENT1']; ?><br/> <?php if ($val['PHOTO1'] != "") { ?> <img border="0" src="<?php echo $chemincourt.$val['PHOTO1']; ?>"> <?php } ?> <?php } // -------------------------------------------------------------------------------------------------- if ($TRAITER == 'SUPPRIMER') { ?> LA PHOTO a été SUPPRIMEE.<br/> <a href="MONFICHIER_LISTE.php?CAT=<?php echo $table; ?>">RETOUR</a> <?php } // -------------------------------------------------------------------------------------------------- } // fin du traitement si PAS d ERREUR ?> </div> </body></html> <?php // Déconnexion mysql_close(); ?>
Utilisation dans un espace d'administration :
voir http://www.phpcs.com/tutoriaux/PHP-ADMINISTRER-LIGNE-PROTECTION-PAGES_882.aspx
Utilisation par les visiteurs (espace membre):
On doit d'abord récupérer l'IDvisiteur.
(le visiteur ne doit pas avoir accès à toute la base, mais seulement à ses propres photos !)
- soit il a ses propres tables (ex. IDvisiteur_MATABLE1, ...)
- soit vérifier ses droits d'accès avant ...
Traitement de plusieurs tables :
Déja prévu : le nom de la table étant enregistré dans la variable "$table", il est simple de changer de table : Dans le fichier MONFICHIER_LISTE.php
Au lieu de :
$table = 'MATABLE';
On met :
$table = $_GET['CAT'];
En précisant à l'appel du fichier :
MONFICHIER_LISTE.php?CAT=MATABLE
Vous avez un dossier "repPHOTOS" contenant déjà des images.
Vous souhaitez créer des images de prévisualisation (pictos), de 150 x 100 pixels maxi,
et les enregistrer dans le dossier "repPHOTOS/repPICTOS".
NB :
S'assurer que les droits en écriture ont été donnés aux dossiers
(chmod ou via logiciel FTP)
- ouvrir le répertoire,
- lire les fichiers
- redimensionner (si nécessaire) en fonction des conditions requises
--> utilisation de la fonction fct_redim_image(...)
- enregistrer le picto dans le dossier de destination.
Remarque
Par défaut, la fonction fct_redim_image(...) ne redimensionne pas les images plus petites que les dimensions spécifiées.
Pour créer des pictos, pas de problème.
Sinon, Une adaptation de la fonction pourrait être nécessaire ...
<?php // FONCTIONS de redimensionnement "physique" include("fct_redim_image.php"); // include("fct_crop_image.php"); // (inutile ici) // -------------------------------------------------------------------------------------------------- // repertoire Source $rep_Src = "repPHOTOS/"; // repertoire de Destination $rep_Dst = "repPHOTOS/repPICTOS/"; // S'assurer que les droits en écriture ont été donnés aux dossiers (chmod ou via logiciel FTP) // -------------------------------------------------------------------------------------------------- ?> <html><head><title></title></head> <body><center> <?php // -------------------------------------------------------------------------------------------------- // Ouverture du dossier Source $ouvredir = opendir($rep_Src); // -------------------------------------------------------------------------------------------------- // pour chaque fichier du repertoire ... while ($img_Src = readdir($ouvredir)) { // si le fichier existe if(is_file($rep_Src.$img_Src)) { // ------------------------------------------------------------- // CHOIX de redimensionnement : picto de 150 x 100 pixels maxi // nom du picto : pict-(nom photo) $img_Dst = 'pict-'.$img_Src; // ------------------------------------------------------------- // REDIMENSIONNEMENT (si les conditions sont correctes) $RedimOK = fct_redim_image(150, 100, $rep_Dst, $img_Dst, $rep_Src, $img_Src) // ------------------------------------------------------------- if ($RedimOK == 1 ) { // Affichage de confirmation d'écriture echo 'Picto créé : '.$rep_Dst.$img_Dst.'...<br/>'; } } // fin si existe } // fin while // -------------------------------------------------------------------------------------------------- // Fermeture du dossier closedir($ouvredir); // -------------------------------------------------------------------------------------------------- echo '<br/>Les pictos se trouvent dans le dossier '.$rep_Dst.'<br/>'; ?> </center> </body></html>