Compléments de PHP Manipulation des images Générer une image avec PHP * Besoin du module graphique GD2 * Avec EasyPHP, modifier le fichier "php.ini" * Faire un lien sur une image générée par PHP * <img src="image.php"/> * Indiquer que PHP génère une image * header("Content-type: image/png"); * header("Content-type: image/gif"); * ... * Exemple $heure = date("H"); if ($heure < 8) $image = "nuit.gif"; else if ($heure < 12) $image = "matin.gif"; else if ($heure < 14) $image = "midi.gif"; else if ($heure < 18) $image = "apres-midi.gif"; else $image = "soir.gif"; readfile($image); Dessiner avec PHP * Créer un objet image * Fournir la taille en pixels * $image = imageCreate($largeur,$hauteur); * Créer des couleurs associées à l'objet image * Couleur = code RGB (Red-Green-Blue) * $rouge = imageColorAllocate($image,255,0,0); * Dessiner dans l'objet image * Produire un fichier image à partir de l'objet * A la requête HTTP "image.php" le serveur renvoie une image * imagePNG($image); * imageGIF($image); * ... * Détruire l'objet image (libérer la mémoire) * imageDestroy($image); Quelques fonctions pour dessiner * Tracer une ligne * imageLine($image,$x1,$y1,$x2,$y2,$couleur); * ($x1,$y1): première coordonnée * ($x2;$y2): seconde coordonnée * Tracer un rectangle plein * imageFilledRectangle($image,$x1,$y1,$x2,$y2,$couleur); * ($x1,$y1): coin supérieur gauche * ($x2;$y2): coin inférieur droit * Dessiner un texte * imageString($image,$fonte,$x,$y,$texte,$couleur); * $fonte: numéro de la fonte * ($x;$y): coordonnée de départ du texte * Copier une image * imageCopy($cible,$source,$x1,$y1,$x2,$y2,$largeur,$hauteur); * $cible: image cible * $source: image source * ($x1;$y1): coordonnée où copier la source dans la cible * ($x2;$y2): coin supérieur gauche de la zone de la source à copier * ($largeur;$hauteur): dimension de la zone de la source à copier * Créer un objet image à partir d'un fichier * imageCreateFromPNG($chemin); Compteur des visites (1/2) * Identification basée sur l'IP du visiteur * $ip = $_SERVER["REMOTE_ADDR"]; * Table "trace" stocke adresses IP + dates des visites * Utiliser fonction "time" (date courante en secondes) * Table "global" stocke les variables globales du site * Compteur mémorisé dans table "global" * Compteur incrémenté si l'IP ne s'est pas connectée depuis 1 heure * A chaque visite, nettoyage de la table * Si date courante > date visite + 1 heure ==> suppression trace * Nettoyage effectué avant chaque comptabilisation de visite * IP non présente dans "trace" ==> incrémentation compteur Compteur des visites (2/2) * Ecrire un code PHP qui compte les visites * Lien sur ce code dans toutes les pages * Code HTML <img src="trace.php"/> * Code JavaScript image = new Image(); image.src = "trace.php"; * Ecrire une page qui génère une image du compteur * Utilisation: <img src="compteur.php"/> * Un fichier image par chiffre stocké sur le serveur * A partir de ces images, générer le nombre du compteur Fichiers binaires en base de données * Avantages * Pas de problèmes avec les droits des fichiers * Sauvegarde des données facilitée * Plus de risque d'incohérence entre les fichiers et la base * Données protégées: elles ne sont pas accessibles par URL * Inconvénients * Taille importante de la base de données * Ralentissement de la base de données * Impossible d'accéder aux fichiers directement par URL * Attention à la requête "SELECT * from image" Côté MySQL * Attribut de type "BLOB" * Binary Large OBject * BLOB, TINYBLOB, MEDIUMBLOB, LONGBLOB * Déterminer le type MIME au moment du dépôt * $type = $_FILES[$image]["type"]; * Base de données "image" * Nom ("nom") * Taille en octets ("taille") * Type MIME ("type") * Contenu binaire ("contenu") Côté PHP * Récupérer le contenu binaire * $contenu = file_get_contents($_FILES[$image]["tmp_name"]); * Insertion en base de données * Attention aux caractères spéciaux * $contenu = addSlashes($contenu); * INSERT INTO image (nom,taille,type,contenu) VALUES ('$nom','$taille','$type','$contenu') * Génération image $requete = "SELECT * FROM image WHERE nom='$nom'"; $resultat = @mysql_query($requete); $enr = @mysql_fetch_array($resultat); if ($enr) { header("Content-type: $enr['type']"); echo $enr["contenu"]; } Galerie de photos * Modéliser une galerie de photographies * Diagramme des cas d'utilisation * Diagramme de classes * Modèle de données entité-association * Hypothèses * Plusieurs rubriques * Possibilité de dépôt des images * Stockage des images en base de données * Possibilité de se déplacer dans une rubrique |