|
 Routeur ADSL 2/2+ sans fils G D-LINK DSL-2641B, lignes ISDN
Prix: 75.28 € TTC | SWEEX ROUTEUR MODEM SWEEX Routeur ADSL2/2+ Sweex, 4 ports Ethernet 10/100
Prix: 37.57 € TTC |  Switch DGS-1008D D-Link 8 ports Giga Ethernet
Prix: 73.35 € TTC |  Routeur sans fils ADLS2/2+ DSL-2640 B de D-link
Prix: 77.02 € TTC |
|
Formations Privées en informatiques
B-6810 Pin - Chiny
|
|
Création
et référencement Internet
Formation:
apprenez à créer et référencer votre propre site Internet
- Module 1 (Débuter en création de site, HTML): 19 et 26 avril,
3 ,10 et 17 mai.
- Module 2 (Débuts en PHP, MySQL: première partie): 17, 24 et 31
mai, 7, 14 et 21 juin.
Ces modules sont accessibles également à distance. Elles se dérouleront
les lundi soirs de 19 à 22 heures.
|
| Les
chapitres de la formation en ligne PHP - MySQL |
| 1.
Introduction
au Php
|
| 2. Installer et
utiliser easyphp
|
| 3. Première
commande PHP
|
| 4. Fonctions en
PHP
|
| 5. Les tableaux
|
| 6. Fonctions sur
les variables
|
| 7. Formulaires Mail
|
|
8. Base de donnée
MySQL avec easyphp
|
| 9. Première
application de Mysql
|
| 10. Gestion des
tables par PHP
|
| 10.a Exercice:
formulaire de contact
|
| 11. Mise en page
PHP - HTM: include() - require()
|
| 12. Création
automatique de la table utilisateur
|
| 13. Formulaire et
vérification des données
|
| 14. Insertion des
nouveaux membres
|
| 15. Gestion des
catégories
|
| 16. Liste de
choix déroulante
|
|
17. Modification
des tables MySQL
|
|
18. Enregistrer
un fichier via un formulaire
|
| 19. Formulaire
d'insertion
|
| 20. Affichage des
petites annonces
|
| 21. Filtrage des
annonces (1)
|
| 23. Exercice: gérer
des news
|
| 24. Utilisation
des Cookies
|
| 25. Gestion
fichiers et Dossiers (source et FTP)
|
| 26. Cryptage et
décryptage de mots de passe
|
| 27. Base
relationnelle, méthodes Left et Join. |
| Divers |
| Formation
référencement en ligne,
positionnez votre site sur Google, MSN, Yahoo, ... |
| Les
feuilles de styles, utilisation du CSS. |
| FrontPage
et l'HTML, cours en ligne |
| Le
fichier Apache .htaccess, configuration serveur, URL
Rewriting, accès répertoires. |
| Dictionnaire
Internet: les termes et définitions spécifiques. |
| Exemple de site qui utilise de ces notes de cours
Le
Luxembourg belge, intégration des annonces avec
insertion de photo, agenda,
annuaire, découverte de la région, administration, ...
|
|
18. Insérer une image dans une table
MySQL avec PHP
1 Introduction - 2. La commande preg_match
- 3. Vérification si le nom existe - 4. Taille
de l'image - 5. Le fichier est-il une image? - 6. Créer
une image réduite (miniature)
|
Votre
site Internet
Votre site
Internet, 5 pages, formulaire de contact à partir de 250 € hTVA,
Dahut.be |
Prix
informatiques
Exemples de
nos tarifs en pièces détachées, périphériques
|
Herbeumont
Darut.be,
portail du Luxembourg belge, visitez Herbeumont
|
Formation
création site
YBET
informatique, formation en HTML, PHP-MySQL dans notre centre ou en
entreprise
|
Pour notre site de petites annonces, une petite photo peut
être insérée avec chaque entrée. Cette partie va permettre à un utilisateur
de télécharger une image directement sur le serveur, en fait n'importe quel
fichier mais nous n'autoriserons que les images par sécurité. Nous allons en
plus redimensionner l'image téléchargée et en créer une deuxième de format
plus petit. La première sera affichée avec l'annonce, l'image réduite sera
utilisée pour les listes. Pour enregistrer une image dans une base de donnée
MySQL, deux solutions sont
possibles:
- soit directement enregistrer l'image
dans un champ de la base de donnée
- soit enregistrer seulement l'adresse et sauvegarder l'image dans un dossier spécifique.
La première solution va très vite alourdir la
table et augmenter les temps d'accès à la base de donnée. Nous utiliserons
la deuxième solution. Permettre de télécharger un fichier a des risques, notamment si le fichier téléchargé
est un programme php ou un fichier exécutable (virus). Nous devrons
obligatoirement vérifier si le fichier est bien une photo. En pratique, ceci ne
pose pas de problèmes puisque nous allons également modifier la taille de la
photo insérée lors du traitement, et même créer des miniatures.
Examinons le formulaire suivant:
<FORM ACTION="insertion.php" method="POST" ENCTYPE="multipart/form-data">
<input type="hidden" name=\"max_file_size" value="50000">
image:<input TYPE="file" NAME="image"><br>
<INPUT TYPE="submit" NAME="telecharger" VALUE="envoyer">
</form> |
Une large partie est connue, je n'analyse que les
nouvelles:
- ENCTYPE ne peut être utilisé qu'avec ma méthode POST, il spécifie
l'encodage utilisé pour la forme que prendra le contenu du formulaire. les
valeurs possibles de la commande ENCTYPE sont:
- ENCTYPE="application/x-www-form-urlencoded" valeur par défaut;
encode le contenu du formulaire selon une forme URL, difficilement
lisible par le destinataire;
- ENCTYPE="text/plain" le contenu du formulaire sera
retourné en format texte lisible par le destinataire, généralement
utilisé avec ACTION=mailto:
- ENCTYPE="multipart/form-data" permet d'expédier un
fichier attaché au message.
Comme nous souhaitons transférer un fichier, c'est l'option "multipart/form-data"
qui sera utilisé
- type="hidden": permet de masquer (hidden) un paramètre
- Il est suivit de name=\"max_file_size" value="50000" qui
spécifie la taille maximum du fichier à télécharger. C'est une variable
cachée qui est transférée. Elle ne bloque pas le transfert si la taille
du fichier est supérieure. Elle peut être omise si vous ne
récupérez pas la variable dans les tests (par $_POST['max_file_size']).
- <input TYPE="file" NAME="image">: spécifie que le contenu est un
fichier (à ce niveau, le type de fichier n'est pas vérifié.
Le résultat devrais nous donner ceci:
Voyons maintenant la procédure.
- Ce formulaire va télécharger le fichier sur
le serveur WEB sous forme temporaire.
- Une fois enregistré, PHP initialise la
variable $_FILES. Si à la fin de l'exécution le fichier temporaire na
pas été déplacé dans le dossier "image", il est automatiquement
effacé.
- Notre script vérifiera si le fichier est correct. Au moindre doute,
l'image sera laissée telle qu'elle et supprimée automatiquement. La taille
maximum d'un fichier est par défaut de 8 MB et est fixée directement sur le
serveur donc pas modifiable.En cas de dépassement, un message d'erreur est
affiché.
La variable transférée est fournie sous forme de
tableau où (à partir de PHP 4):
-
$_FILES['image']['name'] est le
nom du fichier original sur le PC de l'internaute.
-
$_FILES['image']['type'] est le
type de fichier transféré, de type 'image/gif' par exemple
-
$_FILES['image']['size'] est la
taille du fichier envoyé (en octet).
-
$_FILES['image']['tmp_name'] est
le nom du fichier temporaire.
Si nous permettons de télécharger plusieurs
fichiers images dans le même formulaire, le nombre de tableau sera équivalent: 1
tableau par variable (ici 'image' pour notre formulaire).
C'est la fonction move_uploaded_file($_FILES['image']['tmp_name'],nom
destination) qui transfèrera le fichier s'il est
valide du dossier temporaire vers un dossier de notre choix.
La première chose va être de vérifier le nom du
fichier. Le nom du fichier inclut également son adresse, par exemple C:\document\logo.gif.
Nous allons utiliser la fonction preg_match:
| preg_match
(string pattern, string subject [, array matches]) preg_match() analyse subject
pour trouver l'expression dans pattern. Le résultat
envoyé est TRUE (valeur trouvée) ou False, notamment en cas d'erreur. Si
[array matches] est utilisé, il sera rempli par les résultats
de la recherche. $matches[0] contiendra le texte qui satisfait le masque
complet, $matches[1] contiendra le texte qui satisfait la première
parenthèse capturante, ... |
La grosse difficulté de cette commande est de créer
la pattern. Essayons les scripts suivants:
<?php
$subject = "abcdef";
$pattern = '/dej/';
$matches=preg_match($pattern, $subject);
print($matches);
?> |
Nous vérifions ici si dej est inclus dans la chaîne
abcdef. La valeur est affichée est 0 (False). Si nous remplaçons dej par def,
la valeur affichée sera 1 (True) puisque dej est bien inclus dans la chaîne.
Plusieurs options sont possibles comme:
-
\bchaîne\b: dans l'exemple ci dessus,
\bdef\b qui vérifie si def est inclus comme mot complet et pas inclus dans un mot
-
/i ne fait pas de distinctions entre les
minuscules et les majuscules. Dans l'exemple ci-dessus: $pattern = '/DEF/i'
renverra 1 (True);
-
l'utilisation des parenthèse et du
caractère ? est également utilisé. Dans l'exemple ci-dessus: $pattern = '/(ab)?(ef)/i';
renverra vrai puisque la chaîne de caractère reprend ab et ef.
-
^c oblige que le caractère soit en début
de chaîne. Dans notre exemple: $pattern = '/^c/i'; renverra faux.
-
f$ oblige le caractère f en fin de
chaîne.
-
la mise entre crochet reprend un ensemble
de valeur. Dans notre exemple: $pattern = '/[a-z]/i'; vérifiera si un des
caractère entre a, b, ... z est inclus dans la chaîne. Par contre, $pattern = '/[0-9]/i';
renverra faux (pas de chiffres dans notre message) et $pattern = '/[a-z0-9]/i';
renverra vrai, remarquez que les 2 chaînes sont collées. $pattern = "/[^a-z0-9_\-.]/i";,
plus complet vérifie également les caractères \, . , _ et . en début de
chaîne
-
Le | (pour la fonction OU) est également
accepté. Dans notre exemple, $pattern = "/(.gif$)|(.jpg$)|(.png$)/i";
vérifie que la fin de la chaîne est .gif, .jpg ou .png (les formats
d'images). $pattern = "/(^c)|(^d)|(^e)/i"; vérifie si l'adresse
commence par la lettre c ou la lettre d ou la lettre e
L'utilisation des pattern est suffisamment complexe
pour que nous en restions ici au niveau de ce cours en ligne. Dans notre
téléchargement nous pourrions utiliser
$pattern = '/^[cdef].*.(gif|jpg|png)$/i'; qui oblige une extension +
de débuter la chaîne par c, d, e ou f mais ca pourrait poser des problèmes
aux utilisateurs de Linux ou Mac. Nous n'utiliserons que:
<?php
$subject = "c:\Image.gif";
$pattern = '/(gif|jpg|png)$/i';
$matches=preg_match($pattern, $subject);
print($matches);
?> |
qui n'accepte (renvoie TRUE) que pour les fichiers
terminant par jpg, gif ou png à
l'exception de tous autres (y compris image.gif.exe, un virus en perspective). Par contre,
ça nous obligera à
mettre une image par défaut au cas où l'utilisateur ne rentre pas de photo.
Pour la liste de ces différentes
syntaxes. Attention que c'est assez complexe.
Nous pourrions également utiliser une fonction
conditionnelle $_FILES['image']['type']. Ces pattern seront également
utilisé pour l'Url
Rewriting dans le fichier .HTACCESS, quoique modifiées.
Autre problème, si le fichier existe déjà, la
nouvelle image remplacera le fichier existant. Nous allons commencer par créer
un dossier que nous appellerons images dans le dossier www d'EasyPhp. Ceci nous
évitera de mélanger nos propres images de celles des annonces.
Pour vérifier si le fichier existe déjà dans notre
dossier images, nous pouvons utiliser la fonction file_exists.
| file_exists(dossier-image-serveur.nom_fichier)
Remarquez le point qui n'est pas nécessaire si le fichier est dans
le même dossier. Par contre, nous l'utilisons pour modifier notre
fonction en
file_exists("images/".$_files['image']['name']) |
Une autre solution est d'utiliser comme nom d'image
enregistrée sur le serveur code+nom, le code étant le uid (champ autoindexé)
de chaque annonce. Dans ce cas la vérification si l'image existe ne sert plus
à rien puisqu'elles seront toutes uniques.
Même s'il votre configuration serveur est configuré
pour limiter la taille des fichiers téléchargés 8MB par défaut), mieux vaut faire sa propre
limitation, au moins pour réduire le temps de traitement.
Nous allons utiliser la commande:
| filesize(nom_fichier) et la
comparer par rapport à notre taille maximum acceptée. |
Dans notre cas, ceci deviendra par exemple pour une
limitation de 50 KB:
<?php
if (filesize($_FILES['image'][tmp_name]) >50000){
echo 'image trop grande, limitée à 50 KB';
}
?>ou en récupérant la variable cachée
<?php
$max=$_POST['max_file_size'];
if (filesize($_FILES['image'][tmp_name]) >$max){
echo 'image trop grande, limitée à '.$max;
}
?>
|
Nous avons tester le type de fichier par une fonction
getimagesize(). Cette fonction renvoie en fait un tableau. mais surtout False
si l'image n'est pas reconnue ou l'accès au fichier impossible. Certaines
images en JPG ne sont pas parfois pas reconnues sur les serveurs.
| getimagesize (filename , array imageinfo )
La fonction gère les images de type GIF, JPG, PNG, SWF, PSP et BMP.
Le tableau est constitué de 4 éléments:
array(0): la longueur en pixels
array(1): la largeur en pixels
array(2): le type de l'image 1 = GIF ,2 = JPG , 3 = PNG , 5 = PSD , 6 = BMP , 7 = TIFF (Ordre des octets Intel), 8 = TIFF (Ordre des octets Motorola), 9 = JPC
, 10 = JP2 , 11 = JPX , 12 = JB2, 13 = SWC, 14 = IFF.
array(3): la chaîne à placer dans les balises html ("height=xxx width=xxx").
|
La première vérification va être de vérifier si la taille
de l'image n'est pas trop grande en largeur et en hauteur:
$taille=getimagesize("images/php-111.gif");
if ($taille[0]>300){
echo'Image trop large, maximum 300 pixels';
}
if ($taille[1]>400){
echo'Image trop haute, supérieure à 400 pixels';
} |
Les commandes suivantes utilisent la librairie GD inclue dans PHP. Cette librairie accepte les fichiers de
type JPG, BMP et PNG pour toutes les versions de php. Par contre après avoir
accepté les fichiers GIF, ils ont été enlevés, puis réintroduits. Cette
fonction pourrait ne pas fonctionner sur tous les sites. De plus, son
utilisation en local nécessite d'ajouter une extension qui ne marche pas en local avec easyPhp 1.8.0.1
sur mon ordinateur, mais bien sur l'hébergement.
La librairie inclut de nombreuses fonctionnalités, y
compris de dessiner, fusionner des images, .... Nous ne verrons que
redimensionner une photo.
Le but est de créer une image miniature en gardant
l'image d'origine. Pour cela, nous utiliserons 2 fichiers distincts. Les
commandes sont spécifiques au type d'image (uniquement JPG, GIF, PNG et BMP).
Ca tombe bien, avec la commande getimagesize , tableau[2] nous avons
déjà récupéré le type d'image. Comme en plus nous avons déjà interdit les
autres types d'images par l'extension (au passage, y compris BMP un peu lourd à
charger), il nous suffira de sélectionner la commande en fonction du type
d'image retournée et de ne pas en créer sinon.
La procédure (l'image doit être au
préalablement transférée sur l'hébergement
- récupérer l'image en mémoire par la commande
imagecreatefromgif(adresse de l'image) pour un fichier gif
imagecreatefromjpeg(adresse de l'image) pour un fichier jpg
imagecreatefrompnp(adresse de l'image) pour un fichier png
- Nous créons une image vide aux dimensions voulues, 60 * 60 par
exemple avec la commande imagecreate(largeur en pixel,hauteur en
pixel)
- nous redimensionnons l'image avec la commande imagecopyresized(destination,image
d'origine,coordonnée X de destination, coordonnée y de destination,coordonnée
X de départ, coordonnée Y de départ, largeur finale, hauteur
finale, largeur de départ, hauteur de départ). Si nécessaire,
l'image sera étirée. Dans la majorité des cas, la coordonne de
départ et d'arrivée est 0.
- enregistrons l'image miniaturisé dans le fichier vide en
respectant le format avec les commandes:
imagejpeg ( resource image [, string filename] )
imagegif ( resource image [, string filename] )
imagepng ( resource image [, string filename] )
|
Reste à mettre cette procédure en pratique.
Essayons ceci en utilisant l'image php-111.gif préalablement sauvegardée dans
le même dossier que le programme.
<?php
$taille=getimagesize("php-111.gif");
if ($taille[0]>100){
echo'Image trop large, maximum 300 pixels';
}
if ($taille[1]>100){
echo'Image trop haute, supérieure à 400 pixels';
}
If ($taille[2]==1){
// ceci est une image GIF
$image1=imagecreatefromgif('php-111.gif');
$image2=imagecreate(60,60);
imagecopyresized($image2,$image1,0,0,0,0,60,60,$taille[0],$taille[1]);
imagegif($image2,"mini-php-111.gif");
}elseif ($taille[2]==2){
// ceci est une image JPG
$image1=imagecreatefromjpeg('php-111.jpg');
$image2=imagecreate(60,60);
imagecopyresized($image2,$image1,0,0,0,0,60,60,$taille[0],$taille[1]);
imagejpeg($image2,"mini-php-111.jpg");
}elseif ($taille[2]==3){
// ceci est une image png
$image1=imagecreatefrompng('php-111.png');
$image2=imagecreate(60,60);
imagecopyresized($image2,$image1,0,0,0,0,60,60,$taille[0],$taille[1]);
imagepng($image2,"mini-php-111.png");
}else{
echo'Format non accepté';
}
?> |
L'image mini-php-111.gif est automatiquement créé
même si cet exemple va déformer l'image puisque nous ne tenons pas compte des proportions
hauteur / largeur. La solution passe par un paramètre de rapport comme
ci-dessous:
// nous récupérons la hauteur / largeur de l'image
téléchargée dont le nom est contenue dans $image=$_FILES['image']['name'].
// $rapport permet de redimensionner l'image en 350 de large. L'image a
été préalablement transférée via la commande move_uploaded_file($_FILES['image']['tmp_name'],$image)
$taille=getimagesize($image);
$rapport=round($taille[1]/$taille[0]*350,0);
// le transfert (ici dans le cas d'une image jpg) donne par
exemple
elseif ($taille[2]==2)
$image1=imagecreatefromjpeg('$image);
$image2=imagecreatetruecolor(350,$rapport);
imagecopyresized($image2,$image1,0,0,0,0,350,$rapport,$taille[0],$taille[1]);
imagejpeg($image2,$ref."-".$image); |
L'étape suivante va être de mettre le formulaire en
place (en auto-invocant) pour permettre d'insérer nos annonces dans la table
annonce.
|