1. Trang chủ
  2. » Công Nghệ Thông Tin

Pratique de MySQL et PHP- P24 pptx

5 257 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 141,19 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Si un fichier est transféré correctement sur le serveur, ce dernier le copie dans un répertoire temporaire sous Unix, /tmp, paramétrable dans le fichier de configuration php.ini.. On ins

Trang 1

<head >

< t i t l e > T r a n s f e r t du f i c h i e r < / t i t l e >

< l i n k r e l = ’ s t y l e s h e e t ’ h r e f = " f i l m s c s s " t y p e = " t e x t / c s s " / >

</ head >

<body >

<h1> R é c e p t i o n du f i c h i e r < / h1>

<? php

r e q u i r e _ o n c e ( " Connect php " ) ;

r e q u i r e _ o n c e ( " Connexion php " ) ;

r e q u i r e _ o n c e ( " E x e c R e q u e t e php " ) ;

r e q u i r e _ o n c e ( " N o r m a l i s a t i o n php " ) ;

/ / N o r m a l i s a t i o n d e s d o n n é e s HTTP

N o r m a l i s a t i o n ( ) ;

/ / R é c u p é r a t i o n du c o d e i n d i c a t e u r du t r a n s f e r t

$ c o d e E r r e u r = $_FILES [ ’ maPhoto ’ ] [ ’ e r r o r ’ ] ;

i f ( $ c o d e E r r e u r == UPLOAD_ERR_OK) {

/ / Le f i c h i e r a b i e n é t é t r a n s m i s

$ f i c h i e r = $_FILES [ ’ maPhoto ’ ] ;

echo " <b>Nom du f i c h i e r c l i e n t : < / b> " $ f i c h i e r [ ’ name ’ ]

" < b r / > " ;

echo " <b>Nom du f i c h i e r s e r v e u r : < / b> " $ f i c h i e r [ ’ tmp_name ’ ]

" < b r / > " ;

echo " <b> T a i l l e du f i c h i e r : < / b> " $ f i c h i e r [ ’ s i z e ’ ] " < b r / > " ; echo " <b>Type du f i c h i e r : < / b> " $ f i c h i e r [ ’ t y p e ’ ] " < b r / > " ;

/ / On i n s è r e l a d e s c r i p t i o n d a n s l a t a b l e Album

$ c o n n e x i o n = Connexion (NOM, PASSE , BASE , SERVEUR) ;

/ / P r o t e c t i o n d e s d o n n é e s à i n s é r e r

$ d e s c r i p t i o n =

h t m l S p e c i a l C h a r s ( m y s q l _ r e a l _ e s c a p e _ s t r i n g ( $_POST

[ ’ d e s c r i p t i o n ’ ] ) ) ;

$ r e q u e t e = " INSERT INTO Album ( d e s c r i p t i o n ) VALUES

( ’ $ d e s c r i p t i o n ’ ) " ;

$ r e s u l t a t = E x e c R e q u e t e ( $ r e q u e t e , $ c o n n e x i o n ) ;

/ / On r é c u p è r e l ’ i d e n t i f i a n t a t t r i b u é p a r MySQL

$ i d = m y s q l _ i n s e r t _ i d ( $ c o n n e x i o n ) ;

/ / C o p i e du f i c h i e r d a n s l e r é p e r t o i r e PHOTOS

copy ( $ f i c h i e r [ ’ tmp_name ’ ] , " / PHOTOS/ $ i d j p g " ) ;

}

e l s e {

/ / Une e r r e u r q u e l q u e p a r t

s w i t c h ( $ c o d e E r r e u r ) {

Trang 2

c a s e UPLOAD_ERR_NO_FILE :

echo " Vous a v e z o u b l i é de t r a n s m e t t r e l e f i c h i e r ! ? \ n " ;

b r e a k ;

c a s e UPLOAD_ERR_INI_SIZE :

echo " Le f i c h i e r d é p a s s e l a t a i l l e max a u t o r i s é e p a r PHP" ;

b r e a k ;

c a s e UPLOAD_ERR_FORM_SIZE :

echo " Le f i c h i e r d é p a s s e l a t a i l l e max a u t o r i s é e p a r l e

f o r m u l a i r e " ;

b r e a k ;

c a s e UPLOAD_ERR_PARTIAL :

echo " Le f i c h i e r a é t é t r a n s f é r é p a r t i e l l e m e n t " ;

b r e a k ;

d e f a u l t :

echo " Ne d o i t p a s a r r i v e r ! ! ! " ;

}

}

? >

</ body >

</ html >

Le script teste soigneusement ces erreurs et affiche un message approprié au cas de figure Si un fichier est transféré correctement sur le serveur, ce dernier le copie dans un répertoire temporaire (sous Unix, /tmp, paramétrable dans le fichier

de configuration php.ini) Le nom de ce fichier temporaire est donné (dans notre cas) par $_FILES[’maPhoto’][’tmp_name’] Notre script affiche alors les quatre informations connues sur ce fichier

On insère ensuite la description du fichier dans la table Album Remarquez que

l’attribut id n’est pas donné dans la commande INSERT : MySQL se charge d’at-tribuer automatiquement un identifiant aux champs AUTO_INCREMENT La fonction mysql_insert_id() permet de récupérer l’identifiant attribué par le dernier ordre INSERT effectué

Finalement, on copie (fonction copy()) le fichier temporaire dans le

sous-répertoire PHOTOS, en lui donnant comme nom l’identifiant de la description

dans MySQL, et comme extension « jpg » On a supposé ici pour simplifier que tous les fichiers transmis sont au format JPEG, mais il serait bon bien sûr de choisir l’extension en fonction du type MIME du fichier transmis

Attention : le processus qui effectue cette copie est le programme serveur Ce programme doit impérativement avoir les droits d’accès et d’écriture sur les réper-toires dans lesquels on copie les fichiers (ici c’est le répertoire PHOTOS situé sous le répértoire contenant le scriptTransfertFichier.php)

Trang 3

Quelques précautions

Le transfert de fichiers extérieurs sur une machine serveur nécessite quelques précau-tions Il est évidemment très dangereux d’exécuter un script PHP ou un programme reçu via le Web Faites attention également à ne pas permettre à celui qui transfère

le fichier d’indiquer un chemin d’accès absolu sur la machine (risque d’accès à des ressources sensibles) Enfin il est recommandé de contrôler la taille du fichier transmis, soit au niveau du navigateur, soit au niveau du serveur

Du côté navigateur, un champ caché de nom max_file_size peut précéder le champ de type file (voir l’exemple deFormTransfert.htmlci-dessus) Le navigateur doit alors en principe interdire le transfert de fichier plus gros que la taille maximale indiquée Comme tous les contrôles côté client, il ne s’agit pas d’une garantie absolue,

et il est préférable de la doubler côté serveur Le paramètre upload_max_filesize dans le fichierphp.iniindique à PHP la taille maximale des fichiers recevables

Le transfert de fichiers sur le serveur peut être dangereux, et mérite que vous consacriez du temps et de la réflexion à vérifier que la sécurité n’est pas compromise Tenez-vous également au courant des faiblesses détectées dans les différentes versions

de PHP en lisant régulièrement les informations sur le sujet publiées dans les forums

spécialisés ou sur http://www.php.net.

2.4.2 Transfert du serveur au client

Voyons maintenant comment transférer des fichiers du serveur au client À titre d’illustration, nous allons afficher la liste des photos disponibles et proposer leur téléchargement

En principe il existe autant de lignes dans la table Album que de fichiers dans

le répertoire PHOTOS On peut donc, au choix, parcourir la table Album et

accé-der, pour chaque ligne, au fichier correspondant, ou l’inverse Pour les besoins de l’exemple, nous allons adopter ici la seconde solution

PHP propose de nombreuses fonctions pour lire, créer, supprimer ou modifier des fichiers et des répertoires Nous utilisons ici les fonctions opendir() , qui renvoie un identifiant permettant d’accéder à un répertoire, readir() qui permet de parcourir les fichiers d’un répertoire, et closedir() qui ferme l’accès à un répertoire Voici ces fonctions à l’œuvre dans le scriptListePhotos.php

Exemple 2.23 exemples/ListePhotos.php:Affichage de la liste des photos

<? xml v e r s i o n = " 1 0 " e n c o d i n g = " i s o−8959−1 " ? >

<!DOCTYPE html PUBLIC "−//W3C/ / DTD XHTML 1 0 S t r i c t / / EN"

" h t t p : / / www w3 o r g / TR / xhtml1 /DTD/ xhtml1−s t r i c t dtd ">

<html xmlns= " h t t p : / / www w3 o r g / 1 9 9 9 / xhtml " xml : l a n g = " f r " >

<head >

< t i t l e > L i s t e e t t é l é c h a r g e m e n t d e s p h o t o s < / t i t l e >

< l i n k r e l = ’ s t y l e s h e e t ’ h r e f = " f i l m s c s s " t y p e = " t e x t / c s s " / >

</ head >

Trang 4

<body >

<h1> L i s t e e t t é l é c h a r g e m e n t d e s p h o t o s < / h1>

<? php

r e q u i r e _ o n c e ( " UtilBD php " ) ;

$ c o n n e x i o n = Connexion (NOM, PASSE , BASE , SERVEUR) ;

/ / On a f f i c h e l a l i s t e d e s p h o t o s

echo " < t a b l e b o r d e r = ’ 4 ’ c e l l s p a c i n g = ’ 2 ’ c e l l p a d d i n g = ’2 ’ > "

" < c a p t i o n ALIGN= ’ bot t om ’ > L e s p h o t o s d i s p o n i b l e s < / c a p t i o n > " " < t r ><th > V i g n e t t e < / th ><th > D e s c r i p t i o n < / th ><th > T a i l l e < / th > " " <th > A g r a n d i r < / th ><th >Compteur < / th ><th >Action < / th > </ t r >\n " ;

$ d i r = o p e n d i r ( "PHOTOS" ) ;

w h i l e ( $ f i c h i e r = r e a d d i r ( $ d i r ) ) {

i f ( e r e g ( " \ j p g \$ " , $ f i c h i e r ) ) {

$ i d = s u b s t r ( $ f i c h i e r , 0 , s t r p o s ( $ f i c h i e r , " " ) ) ;

$ r e q u e t e = " SELECT ∗ FROM Album WHERE i d = ’ $i d ’ " ;

$ r e s u l t a t = E x e c R e q u e t e ( $ r e q u e t e , $ c o n n e x i o n ) ;

$ p h o t o = O b j e t S u i v a n t ( $ r e s u l t a t ) ;

echo " < t r ><td ><img s r c = ’PHOTOS/ $ f i c h i e r ’ h e i g h t = ’ 7 0 ’ w i d t h

= ’ 7 0 ’ / > < / td > "

" <td >$photo−>d e s c r i p t i o n </ td >"

" <td > " f i l e s i z e ( "PHOTOS/ $ f i c h i e r " ) " </ td > "

" <td ><a h r e f = ’PHOTOS/ $ f i c h i e r ’ > $ f i c h i e r < / a > </ td > "

" <td >$photo−>compteur </ td >"

" <td ><a h r e f = ’ C h a r g e r P h o t o php ? i d = $ i d ’ > "

" T é l é c h a r g e r c e t t e photo < / a > </ td >\n " ;

}

}

echo " </ t a b l e >\n " ;

c l o s e d i r ( $ d i r ) ;

? >

<a h r e f = ’ F o r m T r a n s f e r t html ’ > A j o u t e r une photo < / a >

</ body >

</ html >

L’accès aux fichiers du répertoire se fait avec la boucle suivante :

$ d i r = o p e n d i r ( "PHOTOS" ) ;

w h i l e ( $ f i c h i e r = r e a d d i r ( $ d i r ) ) {

/ / On n e p r e n d q u e l e s f i c h i e r s JPEG

i f ( e r e g ( " \ j p g \$ " , $ f i c h i e r ) ) {

}

}

c l o s e d i r ( $ d i r ) ;

Trang 5

À l’intérieur de la boucle on veille à ne prendre que les fichiers JPEG en testant avec une expression régulière (voir section précédente) que l’extension est bien

« jpg » Notez que le caractère réservé PHP « $ » est précédé de \ pour s’assurer

qu’il est bien passé littéralement à la fonction ereg(), ó il indique que la chaỵne doit se terminer par « jpeg » Le point, « » est lui un caractère réservé dans les expressions régulières (il représente n’importe quel caractère), et on « l’échappe » donc également pour qu’il soit interprété littéralement

On récupère ensuite l’identifiant de la photographie en prenant, dans le nom du fichier, la sous-chaỵne précédant le « », dont on se sert pour chercher la description

et le compteur de la photographie dans la base Il ne reste plus qu’à afficher une ligne

du tableau HTML

Pour afficher une vignette (format réduit) de la photo, on utilise la balise

<img>en indiquant une hauteur et une largeur limitée à 70 pixels

On peut accéder à l’image complète avec l’ancre qui fait référence au fichier JPEG Si l’utilisateur choisit cette ancre, le serveur envoie automatiquement

un fichier avec un en-tête image/jpeg qui indique au navigateur qu’il s’agit d’une image et pas d’un fichier HTML

Enfin, la fonction filesize() renvoie la taille du fichier passée en argument

Le téléchargement du fichier image nous montre pour conclure comment compter

le nombre d’accès à un fichier Il y a deux problèmes à résoudre Le premier est « d’in-tercepter » la demande de téléchargement pour pouvoir exécuter l’ordre SQL qui va incrémenter le compteur Le second est d’éviter que le fichier s’affiche purement et simplement dans la fenêtre du navigateur, ce qui n’est pas le but recherché Il faut

au contraire que, quel que soit le type du fichier transmis, le navigateur, au lieu de l’afficher, propose une petite fenêtre demandant dans quel répertoire de la machine client on doit le stocker, et sous quel nom

La solution consiste à utiliser un script intermédiaire,ChargerPhoto.phpqui, contrai-rement à tout ceux que nous avons vus jusqu’à présent, ne produit aucune ligne HTML Ce script nous permet d’intercaler l’exécution d’instructions PHP entre

la demande de l’utilisateur et la transmission du fichier On peut donc résoudre facilement les deux problèmes précédents :

1 l’identifiant du fichier à récupérer est passé au script en mode get (voir le scriptListePhotos.phpci-dessus) : on peut donc incrémenter le compteur dans la

table Album ;

2 on donne explicitement l’en-tête du fichier transmis grâce à la fonction Header()

Exemple 2.24 exemples/ChargerPhoto.php:Script de téléchargement d’une photo

<? php

r e q u i r e _ o n c e ( " Connect php " ) ;

r e q u i r e _ o n c e ( " Connexion php " ) ;

r e q u i r e _ o n c e ( " E x e c R e q u e t e php " ) ;

Ngày đăng: 06/07/2014, 00:20

TỪ KHÓA LIÊN QUAN

w