2
www.phpsolmag.org 3
TABLE DES MATIÈRES
VARIA
6 Actualités
Actualités du monde du développement.
8 Description du CD
Présentation du contenu du CD joint au magazine.
OUTILS
12 Tester et nettoyer les données grâce à FilterPHP
Jérémy Rafflin DOSSIER
La sécurité dans PHP est un point qui est très important. Avant
d’effectuer la requête vous devez tester l’id pour vérifier qu’il s’agit 32 Démarrez avec FireBug et FirePHP
bien d’un nombre pour éviter de générer une erreur. N’oubliez Christophe Villeneuve
pas de tester et/ou nettoyer vos données afin d’éviter les erreurs Être assisté pendant les développements permet de gagner des
lors de l’exécution de vos scripts et d’éviter les injections de co- heures de corrections intensives. De nombreux outils existent
des malveillants. Dans cet article, nous allons voir que la classe permettant d’accélérer l’écriture de vos projets PHP. C’est le cas de
FilterPHP est plutôt bien adaptée aux problèmes courants. FirePHP qui vous est présenté dans ce numéro.
4
www.phpsolmag.org
5
Actualités
PHP 5.2.13
Une nouvelle version de la branche PHP
5.2 vient de sortir. Cette nouvelle version HipHop
H
est une version mineure, mais très impor-
ipHop est le nom du nouveau projet an va diminuer car Facebook aura besoin de
tante. Elle corrige de nombreux bugs dont
certains liés à la sécurité et c’est pourquoi de Facebook, réalisé en PHP. Ce nou- moins de serveurs : http://developers.face-
il est encouragé de passer à cette version veau projet est un optimiseur pour book.com/news.php?blog=1&story=358.
pour l’ensemble des utilisateurs. améliorer les performances de son réseau social. Mais lorsqu’un projet majeur apparaît, il
http://www.php.net/releases/5_2_13.php Depuis 2 ans, le projet a été commencé pour ar- n’est jamais seul et c’est le cas. Facebook
PHP TV émission 5 river au résultat présenté aujourd’hui. Il trans- exploite XHP, une autre façon d’écrire du
PHP TV la web TV, a publié la nouvelle ver- forme le le code source de PHP dans un langage PHP. XHP est par conséquent une exten-
sion de son site internet. Une refonte avec C++ optimisé et compiler en utilisant G++. Le sion utilisée par Facebook qui va augmen-
un nouveau logo et beaucoup d’amélio- résultat obtenu permet de soulager l’affichage ter la syntaxe de PHP et permettre d’écrire
rations.... Il vous reste juste à le consulter des pages sur le serveur et ainsi de gagner 50 % des fragments HTML dans un même script
http://www.phptv.fr.
de consommation. comme ceci :
Migration PHP 5.2 vers PHP 5.3 Bien entendu, si les serveurs sont moins
Avec le déploiement de PHP 5.3, de nom- sollicités, la consommation des kWh par <?php
breux ajouts et de modifications importan- if ($_POST[‘name’]) {
tes à PHP sont apparus. Pour faciliter le pas-
?>
sage de PHP 5.2 à PHP 5.3, Stas Malyshev
propose un petit script. <span>Hello, <?=$_
Ce script concerne les points les plus ré- POST[‘name’]?>.</span>
pandus, et répond à une grande partie des <?php
évolutions. } else {
http://github.com/smalyshev/migrate
?>
Bluefish 2.0 <form method=”post”>
Bluefish est un IDE (éditeur de texte). Cette What is your name?<br>
nouvelle version est orientée développe- <input type=”text” name=”name”>
ment Web en 17 langues. Son souhait est <input type=”submit”>
d’être léger, rapide, libre mais aussi ouvert.
</form>
Grâce à cette ouverture, de nombreux lan-
gages Open Source sont supportés dont <?php
PHP. Une large gamme de fonctionnalités }
est disponible comme la coloration syn- ?>
taxique, une interface multiple documents,
intégration de programmes externes, syn-
chronisation, barre d’outils...
http://bluefish.openoffice.nl
PHP Firewall
P
Zend Server 5.0 HP Firewall est une API qui va vous • Les attaques de XSS, les injections SQL,
Zend Server 5.0 est la nouvelle version
aider à contrôler un certain nom- les inclusions de fichiers.
que Zend propose avec de nombreuses
évolutions, comme une amélioration des bre de points de sécurité connus, • Une protection contre les robots dange-
performances et un résolution plus rapide touchant entre autres la détection des reux.
des problèmes. Par ailleurs, cette nouvelle PROXYs. Il s’agit d’un script à insér- • Une protection contre les attaques de re-
version supporte PHP 5.3 er dans votre site internet en PHP. Il va quêtes à distance.
http://zend.com/fr.
avoir le rôle de parefeu. Bien entendu, il • Une détection de certains types de vers
EGGcrm 1.50 ne faut pas perdre de vue les bonnes pra- comme Santy et même pouvant venir de
EGGcrm est un logiciel de gestion relation tiques de programmation, car même si votre serveur d'hébergement.
en PHP / MySQL. Il permet de gérer des fi- vous utilisez ce script, il faut penser qu’il
chiers clients, suivre des affaires, prospec-
est un complément de votre programma- Bien entendu, il s'occupera du nettoyage des
ter et éditer les documents. Une gestion
e-mailing est aussi proposée et compatible tion sécurisée. cookies, des variables POST ou GET. A cette oc-
PHP 5.3 Les nouvelles fonctionnalités pro- Il propose un système de logs et la possibi- casion, il pourra mémoriser les IP qui essayeront
posées sont une gestion de stocks amélio- lité d’être alerté par email en cas d’opérations de vous attaquer par l’intermédiaire de Spams
rée, une organisation du menu avec des non souhaitées. PHP Firewall repère et détec- ou sous la forme de différentes attaques.
raccourcis, un éditeur Wysiwyg...
te les points suivants : http://fr.php-firewall.info/
http://www.eggcrm.net
Memq
MEMQ est basé sur l’utilisation de Mem-
cache et de PHP. Cette nouvelle approche
va vous permettre de mettre en place un
système de file d’attente que vous pouvez
utiliser dans vos propres applications.
http://abhinavsingh.com/blog/2010/02/
memq-fast-queue-implementation-using-
memcached-and-php-only/
6 3/2010
Actualités
L
’ENSEEIHT est une école d’ingé- formation d’ingénieurs et une obligation de Slow show
nieurs centenaire qui délivre 5 diplô- mobilité internationale pour tous nos étu- Slow Show est un outil Open Source qui va
mes d’ingénieurs dans les domaines diants élèves ingénieurs. Classée dans les 20 vous permettre de prendre différentes me-
du génie électrique, de l’électronique, de l’in- premières écoles françaises (220 écoles d’in- sures de performances de vos sites inter-
net. Ces différentes mesures pourront vous
formatique, de l’hydraulique et des télécom- génieurs en France), l’ENSEEIHT est un ac- aider à analyser l’ensemble de vos sites sur
munications, proposant une formation scien- teur important de la formation d’ingénieurs une période donnée. Il capture les résultats
tifique et technique très fortement reconnue en particulier dans les domaines relevant des en utilisant YSlow et les classe en rapidité
et de renommée nationale ou internationale. technologies de l’information et de la com- sous forme graphique.
Les différentes évolutions scientifiques munication. Dans ces domaines, l’école a su http://groups.google.com/group/showslow
de l’école l’ont amenée à anticiper régulière- anticiper les besoins industriels en intégrant Drupal 7
ment les domaines et les besoins du monde dans ses formations les nouvelles technolo- Drupal est un CMS écrit en PHP. Sa nouvelle
industriel. C’est ainsi que, dès le début du gies avant même qu’elles deviennent incon- version est maintenant disponible. Elle pré-
20ème siècle, l’école a répondu aux besoins tournables ; tel a été le cas dans les années 70 sente une interface utilisateur repensée.
Quelques nouveaux modules très utilisés
d’énergie hydro-électrique. Très rapidement, avec le génie logiciel, dans les années 80 avec
dans les versions actuelles ont été intégrés
dans les années 50, elle s’est positionnée dans les technologies objet ou aujourd’hui avec les en standard dans ce CMS comme les mo-
les domaines de l’électronique, au début des technologies web 2.0 ou 2.5. dules CCK et ImageField. Maintenant, cette
années 60, elle a été la première école fran- L’école aujourd’hui délivre 380 diplômes nouvelle version supporte l’ensemble des
çaise à se positionner dans le domaine de d’ingénieurs par an (dont 200 dans les domai- bases de données en intégrant une couche
d’abstraction avec PDO. Par ailleurs, la ges-
l’informatique et tout récemment, elle s’est nes TIC) et 80 doctorats par an. L’ENSEEIHT
tion des fichiers est maintenant basée sur
positionnée dans les domaines des télécom- propose également les formations suivantes : SimpleTest. http://www.drupal.org
munications et réseaux. le Master spécialisé en informatique et une for-
L’école s’ouvre très largement à l’interna- mation par l’apprentissage en informatique PHPMD – PHP Mess Detector
tional avec 30 % d’étudiants étrangers en et réseaux. Pour en savoir plus www.enseeiht.fr. PHPMD est une API inspirée de l’outil Java
PMD. Cette API va essayer de repérer les pro-
blèmes éventuels d’une page PHP. Les pro-
blèmes détectés sont : les bugs éventuels,
C
onstruire un site web pour un évé- • Buzz et communication. HMVC
nement n’est pas destiné qu’aux • Inscription de l'évènement sur des sites Le modèle MVC est très utilisé dans de nom-
développeurs ou développeuses car spécifiques. breux outils, Frameworks... Ce modèle peut
encore évoluer. Si vous modifiez légèrement
lorsque vous désirez organiser un évènement,
le modèle existant en appliquant une option
quelque soit le type, et la cible que vous sou- hiérarchisée, vous obtenez le modèle HMVC
haitez toucher, de nombreuses opérations (Hierarchical-Model-View-Controller pattern).
sont nécessaires. Sam de Freyssinet publie la mise en place de
Anna Filina de PHP Quebec donne dix HMVC. Il nous présente les avantages à utiliser
cette technique. Par ailleurs, vous verrez, sous
points que toutes équipes organisatrices
la forme de scripts, différents concepts de
d’évènements doivent connaître à la perfec- base pour les insérer dans vos applications.
tion. http://techportal.ibuildings.com/2010/02/22/
Les différentes étapes à réfléchir sont : scaling-web-applications-with-hmvc/
Maarch entreprise
• Logo et design de l'évènement. Maarch Entreprise est un application écrite
• Appel à conférenciers. en PHP 5 sous licence GPL 3. Elle est basée
• Choisir les sélections. sur le Framework du même nom. Cette API
• Vente des billets d'entrées. est destinée pour une utilisation métier et
plus exactement pour l’archivage électro-
• Outils de suivi.
nique (SAE), la gestion des archives phy-
• Ventes flash. siques et la gestion documentaire (GED).
• Planification. L’ensemble des possibilités qui vous sont
• Répartition des postes avec l'équipe orga- offertes répondent à la norme NF Z42-013.
nisatrice. http://www.maarch.org
www.phpsolmag.org 7
Description de CD
Joomla! 1.5
Joomla! est un système de gestion de contenu (en anglais CMS
pour Content Management System) libre, open source et gratuit. Il
est écrit en PHP et utilise une base de données MySQL. Joomla! in-
clut des fonctionnalités telles que des flux RSS, des news, une ver-
sion imprimable des pages, des blogs, des sondages, des recherches.
Joomla! est sous licence GNU GPL. Il est créé à partir du CMS
Open Source Mambo en août 2005.
Vos produits web et logiciels seront plus modernes et at- Bon apprentissage !
trayants avec Business Icon Set. L’ensemble inclut des icônes
d’envoi ou financières tels que dollar, euro, du yen, la monnaie
sac, de l’argent, guichet, caisse enregistreuse, paiement, tirelire,
coffre-fort, diamant, la balance, banque, billets de banque, lias-
se de billets de banque, serviette, calculatrice, calendrier, carte
de crédit, télécopieur, poignée de main, livres, bus, voiture, ca-
mion, chariot élévateur, pick-up, remorque, pelle, hélicoptère,
cadis, à pièces, pièces de monnaie, monnaie fengshui, téléphone
cellulaire, téléphone, porte ouverte, serrure, cadenas ouvert, clé
, maison, réservoir, montre, coeur, avion, bateau, train, camion
ou panneau, satellite, base de données, recherche, ingénieur, ges-
tionnaires, options, paramètres, outils, tournevis, pinceau, stylo,
crayon, propriétés de la souris, du globe, la Terre, boussole, fau-
teuil, microscope, caméscope, imprimante, serveur, ordinateur
portable, e-mail, recyclage.
8 3/2010
S’il vous est impossible de lire un CD,
alors qu’il n’a pas de défaut apparent,
essayez de le lire dans un autre lecteur.
www.phpsolmag.org 9
Interview
10 3/2010
Interview
de beaucoup d’éditeurs qui font évoluer courantes des sites Internet, portails Web
leur CMS vers une vraie plateforme de ou Intranet/extranet. Ce nombre va bien PS : Cognix Systems met beaucoup
développement. En concevant WebGa- sûr augmenter en fonction des retours de l’accent sur le développement du-
zelle® CMS 2.0 comme une brique du nos utilisateurs. On dispose par exemple rable ?
FrameWork CS 2.0, cela nous permet de d’un module Newsletter pour les entrepri- FS : Derrière ce concept marketing ac-
concevoir d’autres applications et mo- ses qui souhaitent gérer leurs campagnes tuel, nous pensons qu’il s’agit avant tout
dules nativement compatibles les uns de mailing. On peut également citer des d’un état d’esprit qui vise à avoir une ré-
avec les autres. Les curieux trouveront modules comme notre médiathèque, no- flexion sur le moyen/long terme et non
un descriptif complet du Framework tre annuaire, notre agenda partagé, ou en- sur le court voir le très court terme. C’est
CS 2.0 sur notre site Internet. core une messagerie interne avec gestion une démarche que nous avons engagée
de membres pour les portails communau- en 2005. Depuis cette date, nous arri-
PS : Quelles sont les autres applications taires. vons à avoir des résultats concrets, qui
et modules dont vous disposez ? par exemple nous ont permis de réduire
FS : On dispose aujourd’hui de 14 appli- PS : Sur quoi travaillez-vous en ce mo- de moitié notre parc de serveurs, tout en
cations et modules qui ont pour vocation ment ? améliorant la vitesse d’affichage de nos
de répondre aux problématiques les plus FS : Nous continuons à beaucoup inves- sites. A court terme, cela a représenté un
tir en R&D sur WebGazelle® CMS 2.0 et le investissement en R&D important, mais
Framework CS 2.0. Nous pensons que qui aujourd’hui permet de réduire l’em-
nous sommes à l’aube d’une révolu- preinte écologique et le coût d’héberge-
tion dans le domaine des logiciels Web ment de nos sites.
dont les CMS font partie. Tout d’abord,
les infrastructures deviennent de plus
en plus performantes et cela ouvre des
perspectives vraiment passionnantes, in-
dispensables pour les calculs lourds com-
me le traitement des vidéos, l’indexation
de contenu, ou le calcul des systèmes de
cache. D’un autre coté, les navigateurs
deviennent de plus en plus performants
et le HTML5 va ouvrir de nouvelles pos-
Notre palette de modules sibilités.
www.phpsolmag.org 11
Outils
Tester et nettoyer
les données grâce à FilterPHP
La sécurité dans PHP est un point qui est très
important dans une application. Dans cet article,
nous allons voir que la classe FilterPHP est plutôt
bien adaptée aux problèmes courants.
V
ous le savez sûrement déjà, PHP s’exécuter et enregistre ensuite ces données
n’est pas un langage typé. C’est-à- dans un fichier, qui va être lu par un script
dire que contrairement à d’autres Java. Java ne fonctionne pas comme PHP, un
langages, les données n’ont pas de type dé- script qui est inoffensif pour PHP ne le sera
fini lors de leurs déclarations. C’est un des pas forcément pour Java. Dans cet article,
points qui fait que PHP est plus simple à ap- vous verrez principalement comment être
prendre qu’un autre langage comme Java ou certain que les données traitées sont bien du
C++. C’est également un handicap en ce qui type souhaité. Pour plus de détails concer-
concerne la sécurité, en effet, vous ne savez nant les injections et autres problèmes de
pas ce que contiennent vos variables. Sup- sécurité, je vous renvoie aux nombreux arti-
posons par exemple, qu’une requête SQL cles qui sont déjà parus dans PHP Solutions.
vous permette de sélectionner le nom d’un
client en fonction de son id. Avant d’effec- Contrôles des données
tuer la requête vous devez tester l’id pour Le contrôle des données est le fait de véri-
vérifier qu’il s’agit bien d’un nombre pour fier les données. Par exemple, lors de la va-
éviter de générer une erreur. Vous devez lidation d’un formulaire vous devez dans un
donc tester et/ou nettoyer vos données afin premier temps tester si tous les champs obli-
d’éviter les erreurs lors de l’exécution de vos gatoires sont remplis et s’ils le sont correcte-
scripts et d’éviter les injections de codes mal- ment. Si vous demandez une adresse e-mail,
veillants. vous devez vérifier qu’elle est au bon format,
L’une des questions les plus importantes si vous demandez une année de naissance,
à se poser lorsque l’on traite la question de vérifier que vous récupérez bien une date va-
la sécurité d’une application PHP est : quel- lide (c’est-a-dire un nombre entier).
les sont les données de l’application à sécu- Il existe une extension PHP nommée Fil-
riser ? En réalité toutes les données entran- terPHP qui permet d’effectuer une vali-
tes et sortantes sont à sécuriser. Les données dation ou un nettoyage de données. Pour
entrantes doivent être sécurisées pour que pouvoir utiliser cette extension vous aurez
votre application n’encourt aucun risque, besoin d’une version de PHP supérieure ou Figure 1. Résultat de l’affichage des différents
cela paraît assez simple à comprendre. Par égale à la version 5.2.0. Pour les versions an- filtres et leurs ID
12 3/2010
FilterPHP
www.phpsolmag.org 13
Outils
Ou
Listing 6. Contrôler un flottant filter_var($valeurHexa,FILTER_
<?php VALIDATE_INT, FILTER_FLAG_ALLOW_HEX
//on initialise un tableau de différentes valeurs
);
$tableau = array(10.6, "deux virgule trois", "0", "-98745,123", "skdfj41,gg2",
-255);
//on filtre le tableau Vous pouvez bien évidemment combiner le
$tableauDeValidation = filter _ var($tableau ,FILTER _ VALIDATE _ FLOAT
,FILTER _ REQUIRE _ ARRAY); test des entiers octaux et hexadécimaux avec
//on affiche le résultat le test dans une plage de valeurs. Le Listing 5
var _ dump($tableauDeValidation); présente le test d’un nombre octal dans une
?>
plage de valeurs. Attention vous devez gar-
Listing 7. Contrôler un flottant en choisissant le séparateur decimal der à l’esprit que vous ne testez pas un entier
<?php décimal, par conséquent vous devez effec-
$flottant='15-9'; tuer une conversion pour définir le mini-
$dec _ sep='-';
echo filter _ var ( $flottant , FILTER _ VALIDATE _ FLOAT , array( "options" mum et le maximum de la plage de valeurs.
=>array( "decimal" => $dec _ sep )));
//affichera 15.9 Contrôler un nombre flottant
?>
(nombre avec virgule)
Listing 8. Contrôler les URL avec Filter PHP Vous commencez à avoir l’habitude des
<?php contrôles de nombres, pour les nombres
$url = "http://phpsolmag.org" ; flottants, il faut utiliser le filtre FILTER_
if(filter _ var($url, FILTER _ VALIDATE _ URL) === FALSE )
{ VALIDATE_FLOAT. Pour cet exemple, nous al-
echo 'l\'URL '.$url.' n\'est pas valide' ; lons voir comment tester plusieurs nombres
} flottants. Pour cela, nous allons créer un ta-
else
{ bleau de valeurs et le passer en paramètre
echo 'l\'URL '.$url.' est valide'; à la place de la variable habituelle. Pour que
}
//affiche l'URL http://phpsolmag.org est valide
le tableau soit analysé par FilterPHP il faut
?> ajouter un troisième argument, FILTER_
REQUIRE_ARRAY, qui permet de signaler à la
Listing 9. Contrôler des URL avec le Flag FILTER_FLAG_SCHEME_REQUIRED
fonction que le premier argument est un ta-
<?php bleau et non un nombre. Le Listing 6 est un
$url = "x://x" ;
if(filter _ var( $url, FILTER _ VALIDATE _ URL, FILTER _ FLAG _ SCHEME _ REQUIRED exemple de contrôle de plusieurs flottants.
) === FALSE) Ce code affichera ce résultat :
{
echo 'l\'URL '.$url.' n\'est pas valide' ;
} array(6) {
else [0]=> float(10.6)
{
echo 'l\'URL '.$url.' est valide'; [1]=> bool(false)
} [2]=> float(0)
//si vous faites le test, vous remarquez que cette URL est valide, ce qui [3]=> bool(false)
démontre bien que seulement la syntaxe caractère://caractère est testée.
?> [4]=> bool(false)
[5]=> float(-255) }
Listing 10. Contrôler des URL avec le flag FILTER_FLAG_HOST_REQUIRED
<?php Seulement les éléments du tableau qui sont
$url = "http://phpsolmag.org" ;
if(filter _ var($url, FILTER _ VALIDATE _ URL, FILTER _ FLAG _ HOST _ REQUIRED) === des flottants restent des flottants, les autres
FALSE) sont retournés en booléens avec la valeur
{ false.
echo 'l\'URL '.$url.' n\'est pas valide' ;
} Le séparateur décimal n’est pas le même
else dans tous les pays, et il faut savoir en tenir
{
echo 'l\'URL '.$url.' est valide';
compte. Les créateurs de FilterPHP l’ont éga-
} lement remarqué et ont pensé à donner la
//ici l'url est validée possibilité de choisir le séparateur décimal.
?>
Pour cela, il suffit de mettre dans le tableau
Listing 11. Contrôler des URL avec le Flag FILTER_FLAG_PATH_REQUIRED d’options, une clé ‘décimale’ ayant pour va-
<?php leur le séparateur utilisé . Attention, le sépa-
$url = "http://phpsolmag.org/dosier/" ; rateur doit être un caractère unique, en effet,
if(filter _ var($url ,FILTER _ VALIDATE _ URL ,FILTER _ FLAG _ PATH _ REQUIRED) ===
FALSE )
si vous choisissez ‘, ,’ comme séparateur, Fil-
{ terPHP retournera une erreur. Le Listing 7
echo 'l\'URL '.$url.' n\'est pas valide' ; présente comment contrôler un nombre
}
else flottant ayant pour séparateur décimal un -.
{
echo 'l\'URL '.$url.' est valide';
}
Contrôler une URL
//l'URL est validée car il y a un chemin dans l'URL Les URL sont très complexes à vérifier de
?> par le nombre de formes qu’elles peuvent
prendre. En effet, aucune norme n’a été
14 3/2010
FilterPHP
faite pour les URL. FilterPHP aide à vérifier Listing 12. Contrôler des URL avec le Flag FILTER_FLAG_QUERY_REQUIRED
les différents composants d’une URL grâce
à différents filtres. Le filtre à appliquer est <?php
FILTER_VALIDATE_URL. Plusieurs flags sont $url = "http://phpsolmag.org/info.php?id=1" ;
disponibles pour pouvoir valider telle ou if(filter _ var($url ,FILTER _ VALIDATE _ URL ,FILTER _ FLAG _ QUERY _ REQUIRED)
telle chose. Je vous les décris ci-dessous : === FALSE )
{
echo 'l\'URL '.$url.' n\'est pas valide' ;
• FILTER _ FLAG _ SCHEME _ REQUIRED – }
indique qu’il faut que l’URL soit de la else
{
forme x://x, couramment on souhaite echo 'l\'URL '.$url.' est valide';
avoir http://x (ou x est un caractère quel- }
?>
conque). Ce flag est l’équivalent du fil-
tre FILTER _ VALIDATE _ URL sans flag Listing 13. Contrôler une adresse IP
supplémentaire.
• FILTER _ FLAG _ HOST _ REQUIRED – <?php
d’après les tests effectués, ce flag fait $ip = "192.168.1.1";//une adresse IPV4
exactement la même chose que le flag if(filter _ var($ip, FILTER _ VALIDATE _ IP) === FALSE)
{
FILTER _ FLAG _ SCHEME _ REQUIRED.
echo "$ip est une adresse IP valide";
• FILTER _ FLAG _ PATH _ REQUIRED – ce }
flag permet de tester si un chemin est else
{
présent dans l’URL. echo "$ip n'est pas une adresse IP valide";
• FILTER _ FLAG _ QUERY _ REQUIRED – ce }
flag vérifie qu’une requête est de la for- //se script affichera : 192.168.1.1 est une adresse IP valide
?>
me php?id.
Listing 14. Contrôler une adresse IPV4
Des exemples s’imposent. Le Listing 8 est le
<?php
contrôle d’une URL avec FILTER_VALIDATE_
URL sans aucun flag. Dans l’exemple l’URL $ip = "192.168.0";//une adresse IPV4
est validée. Comme dit précédemment
if(filter _ var($ip, FILTER _ VALIDATE _ IP, FILTER _ FLAG _ IPV4) === FALSE)
l’URL sera validée si elle est de la forme x://x {
(ou x est un caractère quelconque). echo "$ip est une adresse IPV4 valide";
Le Listing 9 est l’exemple avec le flag }
else
FILTER_FLAG_SCHEME_REQUIRED, ce flag fait la
{
même chose que la fonction sans flag, en fait echo "$ip n'est pas une adresse IPV4 valide";
c’est le flag par défaut de FILTER_VALIDATE_ }
//se script affichera : 192.168.0 n'est pas une adresse IPV4 valide
URL. Pour l’exemple, x://x est bien validé. Le ?>
Listing 10 est l’application du flag FILTER_
FLAG_HOST_REQUIRED. Comme son nom l’in- Listing 15. Contrôler une adresse IPV6
dique, ce flag vérifie qu’un nom d’hôte est <?php
spécifié, il vérifie également la syntaxe carac-
tère://caractère. Le flag FILTER_FLAG_PATH_ $ip = "1fff:0000:0a88:85a3:0000:0000:ac1f:8001";//une adresse IPV6
REQUIRED est utilisé dans le Listing 11. Ici, le
if(filter _ var($ip , FILTER _ VALIDATE _ IP) === FALSE )
test est validé car l’URL contient un chemin {
après l’URL de base. Pour finir le contrôle echo " $ip est une adresse IP valide";
}
des URL, le Listing 12 présente l’utilisation else
du flag FILTER_FLAG_QUERY_REQUIRED qui {
permet de vérifier qu’il y a des options à la echo " $ip n'est pas une adresse IP valide";
}
requête d’un fichier PHP. //se script affichera : 1fff:0000:0a88:85a3:0000:0000:ac1f:8001 est une adresse
IPV6 valide
Contrôler une adresse IP ?>
Le contrôle d’adresse IP se fait également Listing 16. Contrôler si une adresse IP est privée
grâce à la fonction filter_var(), et s’utilise
avec le filtre FILTER_VALIDATE_IP. De nou- <?php
veaux flags sont utilisés comme arguments. $ip = "192.168.1.1";//une adresse IPV4 privée
Bien entendu, il est possible de contrôler if(filter _ var($ip , FILTER _ VALIDATE _ IP, FILTER _ FLAG _ NO _ PRIV _ RANGE)
=== FALSE )
simplement une adresse IP via des expres- {
sions régulières, mais conserver le même echo " $ip est une adresse IPV4 privée";
outil de contrôle est parfois plus pratique }
else
voire cohérent. Voici les flags utilisés pour {
contrôler différentes IP : echo " $ip est une adresse IPV4 publique";
}
//se script affichera : 192.168.1.1 est une adresse IPV4 privée
• FILTER _ FLAG _ IPV4 – permet de tes- ?>
ter si l’adresse Ip est une IPV4,
www.phpsolmag.org 15
Outils
16 3/2010
FilterPHP
caractères contenue dans $texte commen- Listing 22. Temps d’exécution des expressions régulières
ce par H. C’est donc le cas puisque Hello
world! commence par H. <?php
for($n=0;$n<5;$n++)
Affiner le contrôle des URL et des {
adresses e-mail en conjugant FilterPHP $string = "Hello world!";
$debutF = microtime();
et expressions régulières. for($i=0;$i<10000;$i++)//une grosse boucle pour pouvoir minimiser les
Dans la partie Contrôler une URL et Contrô- erreurs aléatoires
ler une adresse e-mail nous avons vu que Fil- {
//on effectue le test avec FilterPHP
terPHP ne contrôlait pas la totalité de l’URL $b=fi lter _ var($string, FILTER _ VALIDATE _ REGEXP,
ou de l’e-mail. Pour des contrôles plus précis, array("options"=>array("regexp"=>"/^H(.*)/")));
je vous conseille d’utiliser les expressions ré- }
$fi nF= microtime();
gulières. $debutR = microtime();
Pour les mails, l’expression régulière est as- for($i=0;$i<10000;$i++)//une grosse boucle pour pouvoir minimiser les
sez simple et le Listing 20 permet de contrôler erreurs aléatoires
{
une adresse e-mail en utilisant les expressions //on effectue le test avec preg _ match()
régulières dans la fonction preg_match(). $c=preg _ match("/^T(.*)/",$string);
Cette fonction prend comme premier argu- }
$fi nR=microtime();;
ment l’expression régulière et comme second echo "Test ".$n."<br />";
argument la chaîne de caractères à tester. Ici, echo "temps d'exécution avec FilterPHP = ".($fi nF-$debutF)."<br />";
echo "temps d'exécution avec pregmatch = ".($fi nR-$debutR)."<br /><br
l’expression régulière correspond à tester :
/>";
une chaîne de caractères composée de : chif- /* on voit clairement que les expressions régulières avec fi lterPHP
fres, lettres minuscules ou majuscules et cer- sont plus lentes qu'avec preg _ match()*/
}
tains caractères spéciaux comme -, _, suivie ?>
d’un @’ puis une chaîne de caractères compo-
sée des mêmes éléments que précédemment, Listing 23. Assainir un nombre entier
puis un . et qui se termine par une chaîne de
<?php
caractères de deux à six caractères composée
de lettres minuscules et majuscules. //on déclare un faux nombre entier
$entier = "72+5sldslkd€" ;
Malheureusement l’expression régulière
echo fi lter _ var($entier ,FILTER _ SANITIZE _ NUMBER _ INT);
permettant de valider les URL est très com- //affiche 72+5 (notez que le '+' est conservé)
pliquée à trouver, dû au très grand nombre de ?>
possibilités. Je vous recommande donc de re-
Listing 24. Assainir un nombre flottant grâce aux différents Flags
chercher les expressions régulières qui permet-
tent de contrôler les URL acceptées pour votre <?php
site (par exemple, il est possible que votre site
/*on déclare un faux nombre flottant avec un séparateur des milliers, un
n’accepte que les URL valides effectuant une séparateur décimal et une puissance e */
requête sur les fichiers .gif). Il existe cependant $flotant = "87,472.598+5e12 et des caractères qui seront supprimés" ;
une méthode simple pour vérifier si une URL echo fi lter _ var($flotant , FILTER _ SANITIZE _ NUMBER _ FLOAT)."<br />";
/* affiche 87472598+512 (tous les caractères non numériques sont supprimés
existe. Elle nécessite l’utilisation de fopen() sauf le + et le -)*/
(si votre serveur ne le permet pas, vous ne echo fi lter _ var($flotant , FILTER _ SANITIZE _ NUMBER _ FLOAT, FILTER _ FLAG _
pourrez pas utiliser cette méthode) et deman- ALLOW _ FRACTION)."<br />";
/* affiche 87472.598+512 (cela effectue la même chose qu'avant sauf que l'on
de plus de ressources au serveur. Le but de cet garde le séparateur décimal)*/
article n’étant pas de présenter la lecture de echo fi lter _ var($flotant , FILTER _ SANITIZE _ NUMBER _ FLOAT, FILTER _ FLAG _
fichiers, je vous renvoie à l’article sur la lec- ALLOW _ THOUSAND)."<br />";
/* affiche 87,472598+512 (cela effectue la même chose qu'avant sauf que l'on
ture de fichiers du magazine PHP Solutions garde le séparateur des milliers) */
4/2009. Le Listing 21 vous présente cette mé- echo fi lter _ var($flotant , FILTER _ SANITIZE _ NUMBER _ FLOAT, FILTER _ FLAG _
thode. Quelques explications sur ce code : ALLOW _ SCIENTIFIC)."<br />";
/* affiche 87472598+5e12eeee (permet l'écriture scientifique, on garde donc
le 'e'. Notez que s'il y a plusieurs 'e', ils sont tous conservés)*/
• dans un premier temps on définit ?>
l’URL à tester,
Listing 25. Assainir et encoder une URL
• ensuite on teste si on arrive à lire le fi-
chier correspondant à l’URL grâce <?php
à fopen()(Le second argument est le
//une URL avec des caractères interdits
mode à effectuer, ici ‘r’ veut dire que $url = "http://w¥ww.googlÆe.fr" ;
l’on souhaite lire le fichier (il existe echo fi lter _ var($url, FILTER _ SANITIZE _ URL);
d’autres méthodes)),
// affiche http://www.google.fr
• l'arobase permet de ne pas afficher les $url = "http://test.free.fr/dossier/fichier.php?id=1&nom=prenom";
erreurs s'il y en a, en effet si l'URL ne echo fi lter _ var($url, FILTER _ SANITIZE _ ENCODED);
peut pas être lue, une erreur sera affi-
//affiche http%3A%2F%2Ftest.free.fr%2Fdossier%2Ffichier.php%3Fid%3D1%26nom%3D
chée si vous ne mettez pas le '@’. prenom
?>
Avec l’URL du listing, le test est validé.
www.phpsolmag.org 17
Outils
Listing 27. Assainir une chaîne de caractères de toutes les balises Listing 26. Assainir et encoder une URL
<?php <?php
//utilisation de FILTER _ SANITIZE _ STRING seul
$string = chr(165).' ? <>!@#$%^&*"()}<toto> "\'HIHI\'"</toto>{~bobthebuilder $email = "moi&mes£amis@)toto(.fr\\
'.chr(20); titi.com" ;
echo filter _ var ($string, FILTER _ SANITIZE _ STRING); echo fi lter _ var($email, FILTER _
/*affiche : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder SANITIZE _ EMAIL);
code source : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder
Notez que les guillements sont encodés dans le code source //affiche moi&mesamis@toto.frtiti.
*/ com
?>
?>
Listing 28. Assainir une chaîne de caractères sans encoder les guillemets
<?php
$string = chr(165).' ? <>!@#$%^&*"()}<toto> "\'HIHI\'"</toto>{~bobthebuilder Comparaison des expressions
'.chr(20);
echo filter _ var ($string, FILTER _ SANITIZE _ STRING, FILTER _ FLAG _ NO _
régulières avec FilterPHP
ENCODE _ QUOTES); et preg_match()
/*affiche : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder Maintenant que nous avons vu rapidement
code source : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder
Notez que les guillemets ne sont pas encodés dans le code source que les expressions régulières peuvent être
*/ utilisées via preg_match() ou FilterPHP,
?> parlons performance. L’extension FilterPHP
est vraiment pratique, mais face à la fonction
Listing 29. Assainir une chaîne de caractères en encodant les caractères dont le code ASCII est
prog_match() elle est vraiment beaucoup
inférieur à 32 et supérieur à 127
trop lente. Le Listing 22 permet de tester le
<?php temps d’exécution d’une expression réguliè-
$string = chr(165).' ? <>!@#$%^&*"()}<toto>"\'HIHI\'"</toto>{~bobthebuilder
'.chr(20);
re via les deux méthodes présentées ici. Le
echo filter _ var ($string, FILTER _ SANITIZE _ STRING, FILTER _ FLAG _ ENCODE _ résultat de ce code est présent sur la Figure
LOW); 2. On voit clairement que preg_match() est
/*affiche : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder
code source : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder nettement plus rapide à chacun des cinq
 tests. FilterPHP n’est cependant pas complè-
Notez que les guillemets et le caractère dont le code ASCII est inférieur à tement terminé et il y a régulièrement des
32 sont codés
*/ mises à jour, on peut donc espérer une mise
echo '<br />'.filter _ var ($string, FILTER _ SANITIZE _ STRING, FILTER _ FLAG _ à jour pour que l’utilisation des expressions
ENCODE _ HIGH); régulières via FilterPHP soit concurrente vis-
/*affiche : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder
code source : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder à-vis des autres fonctions équivalentes.
Notez que les guillemets et le caractère dont le code ASCII est supérieur
à 127 sont codés Filtrer les données
*/
?> Contrôler les données est très pratique dans le
cas où l’on peut demander une correction de
Listing 30. Assainir une chaîne de caractères en supprimant les caractères dont le code ASCII est celles qui ne sont pas correctes. Par exemple,
inférieur à 32 et supérieur à 127 dans le cas du traitement d’un formulaire, on
<?php peut demander à l’utilisateur de corriger les
$string = chr(165).' ? <>!@#$%^&*"()}<toto> "\'HIHI\'"</toto>{~bobthebuilder données. Mais, si les données proviennent
'.chr(20);
echo filter _ var ($string, FILTER _ SANITIZE _ STRING, FILTER _ FLAG _ STRIP _
LOW);
/*affiche : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder
code source : ¥ ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder
Notez que le caractère dont le code ASCII est inférieur à 32 est supprimé
*/
echo '<br />'.filter _ var ($string, FILTER _ SANITIZE _ STRING, FILTER _ FLAG _
STRIP _ HIGH);
/*affiche : ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder
code source : ? !@#$%^&*"()} "'HIHI'"{~bobthebuilder
Notez que le caractère dont le code ASCII est supérieur à 127 est supprimé
*/
?>
18 3/2010
FilterPHP
d’une base de données ou d’une autre appli- Listing 32. Sécuriser les guillemets
cation que l’on ne contrôle pas, on ne peut
pas forcément demander une correction en <?php
cas d’erreur. Il faut alors filtrer les données, $string = " des guillemets ' ' \'\"";
c’est-à-dire éliminer tout ce que l’on ne sou- echo filter _ var($string, FILTER _ SANITIZE _ MAGIC _ QUOTES);
haite pas. Par exemple, une application nous
/* affiche : des guillemets \' \' \\\'\" */
fournit le prix d’un article, ce prix doit être
un entier et ne doit pas contenir de lettres. ?>
Je vous conseille toutefois d’utiliser les filtres
Listing 33. Utilisation des filtres de rappels
en supplément du contrôle de données (il
vaut mieux deux protections plutôt qu’une, <?php
cela compliquera la tâche d’un éventuel hac- //1ère partie
ker). Comme pour le contrôle de données, function espaceEnTiret($string)
le filtrage se fait grâce à la fonction filter_ {
return str _ replace(" ", "-", $string);
var(). }
www.phpsolmag.org 19
Outils
20 3/2010
FilterPHP
www.phpsolmag.org 21
Projets
La gestion
du multilinguisme
dans le développement web
Le multilinguisme est un sujet très présent dans
le développement web. Or, cette notion peut s’avérer
bien plus complexe qu’il n’y paraît. Nous allons voir
dans cet article quels cas de figure peuvent être
rencontrés et quels sont les moyens d’y répondre.
pays. Dans ce cas, il ne s’agit pas d’avoir une
Cet article explique : Ce qu’il faut savoir : traduction des news mais bien d’avoir une lis-
• Les problématiques de multilinguisme en • Les noms de domaine te de news différente pour chaque pays. Cela
développement web et des exemples de • Les modèles de base de données revient à afficher des lignes différentes d’une
techniques de prise en charge. • L'url rewriting même table en fonction du pays qui demande
• Le référencement la page.
• L'IOC Les quelques exemples que nous venons de
• L'ORM Doctrine. voir concernent le front-office des sites web,
mais on peut très bien imaginer des besoins
de localisation au niveau du back-office ou du
robots. Une même page présente dans plu- CMS.
sieurs langues devra donc disposer d’une url Notons que tous les CMS (Open Source
Niveau de difficulté spécifique à chaque langue. Il en est de même ou commerciaux) ne sont pas égaux devant le
pour les méta-informations de la page com- multilinguisme. Nous ne rentrerons pas dans
me le title, les meta-description, meta-keywords, le détail de l’implémentation des fonctionna-
… tout comme les titles des hyperliens, les alt lités mais dresserons dans cet article un aper-
L
e multilinguisme est souvent assimilé des images, etc … çu des principaux enjeux de la discipline.
à une simple traduction de texte. Or, La structure d’une page peut également va- Nous laisserons au lecteur la liberté d’évaluer
nous allons voir que la réalité des pro- rier d’un pays à l’autre (instances différentes les capacités natives de son CMS favori.
jets web nous expose à une plus grande com- d’un même site sur des domaines différents).
plexité. Nous verrons que des variations lin- Un site qui vend des produits soumis à des Les principaux enjeux du
guistiques peuvent être appliquées aussi bien textes de lois locaux va devoir dans certains multilinguisme
aux contenus qu’à la structure et au compor- cas afficher un bloc contextuel d’informa- Nous voyons dans ce paragraphe les princi-
tement du site. En guise de premier exemple, tion. Dans ce cas la localisation de la page re- paux enjeux du multilinguisme. Il est assez
imaginons un site contenant des images. Il est vient à afficher ou à masquer certaines zones rare qu’un site doivent assumer tous ces en-
très fréquent qu’une image contienne du tex- en fonction du pays d’où elle est consultée. jeux, mais nous avons ici une couverture as-
te. La localisation du site nous imposera de De plus, un même pays peut avoir plusieurs sez complète de l’univers des possibles.
produire une version traduite de l’image. De langues. Il en est de même pour les processus
même, un site peut contenir des vidéos. La lo- métier. Le tunnel d’achat d’un site eCom- Proposer une liste de langues
calisation de vidéos devra passer soit par un ré- merce peut comporter un nombre d’étapes La première responsabilité d’un site multilin-
encodage avec doublage dans une autre langue, différent d’un pays à un autre. gue est de nous proposer la liste des langues
soit par la mise en place de sous-titres. La structure globale d’un site peut égale- supportées. Cette liste peut être proposée
La traduction quant-à-elle des textes pour- ment varier d’un pays à un autre. Une page sous forme d’une série de petits drapeaux,
ra être sujette à des jeux de caractères exoti- d’informations légales peut être ajoutée sur d’une liste déroulante (combo), de radio-bou-
ques ou à des sens d’écriture différents. Les seulement certaines versions pays d’un si- tons, … l’ergonomie étant à adapter en fonc-
documents structurés (multi-attributs) affi- te. En plus de la traduction et des variations tion du nombre de langues et du look’n feel
chés sur le site peuvent aussi subir des varia- de structure et de processus, les données de du site. Il sera parfois plus pratique de propo-
tions. Ainsi, le classique binôme FirstName la base peuvent être filtrées différemment ser une liste déroulante pour un site offrant
– Lastname dans un pays pourra devenir Firs- d’une localisation à une autre. Sur le site cor- un grand nombre de langues, plutôt que d’af-
tName – MiddleName – LastName dans un poratif d’une entreprise ayant des bureaux ficher la série de drapeaux qui occuperait une
autre pays. dans différents pays, on peut imaginer une place conséquente sur la page.
Lors du référencement par les moteurs de fenêtre de News sur la page d’accueil qui af- De plus, à la sélection de la langue, celle-ci
recherche, les urls des pages sont lues par les fiche des informations locales au bureau du devra être persistante afin que l’internaute la
22 3/2010
Gestion du multilinguisme
www.phpsolmag.org 23
Projets
24 3/2010
Gestion du multilinguisme
ké dans une area via sa clé étrangère vers la Listing 3. Accès à la langue et au pays
table Area. Chaque attribut localisable du
produit est stocké dans la table translation // Accès à la langue
LanguageHelper::getCurrentLanguage();
correspondante. L’architecture multi-pays
multi-langues est donc posée : les données // Accès au pays
remontées de la base sont obtenues par une LanguageHelper::getCurrentMarket();
réunion ensembliste de droits sur les areas,
Listing 4. Lecture de données localisée
croisée avec un éventuel paramètre de lan-
gue. Toutes les combinaisons pays/langue $query = Doctrine _ Query::create()
sont alors possibles avec cette architecture. ->from('Entity e')
->innerJoin('e.Translation et')
En ajoutant un écran d’administration des ->where('et.lang = ?', strtoupper($lang))
areas dans le back-office central, nous obte- ->andWhereIn('e.area',array ($market, 'int'));
nons un système souple et puissant.
www.phpsolmag.org 25
Projets
26 3/2010
Rejoignez le Club .PRO
Gestion du multilinguisme
header('Content-type: text/html;
charset=utf-8'); WEB82
Création et hébergements de sites web pour particuliers, associations, entreprises, e-commerce.
Le fichier .htaccess d’Apache permet aussi de Développement entierement aux normes W3C (www.w3.org) de sites web de qualité, au graphisme
soigné et employant les dernieres technologies du web (PHP5, MySQL5, Ajax, XHTML, CSS2).
préciser les encodages spécifiques des pages
http://www.web82.net
servies. Dans la majorité des cas, le format
UTF-8 sera à privilégier.
Conclusion
Core-Techs
Expert des solutions de gestion et de communication d’entreprise en Open Source, Core-Techs
Nous avons vu dans cet article que les pro- conçoit, integre, déploie et maintient des systemes de Gestion de Contenu Web, de Gestion
blématiques multilingues peuvent nécessi- Documentaire, de Gestion de la Relation Client (CRM), d’ecommerce et de travail ollaboratif.
ter parfois la mise en place d’architectures http://www.core-techs.fr
complexes. Même si les cas les plus simples
se résument à de la traduction de labels,
une vraie réflexion est nécessaire au ni- POP FACTORY
veau base de données si l’on veut garder un PoP Factory,SSII spécialisée Web. Développement de solutions applicatives spéciques ; offre de
maximum de souplesse. Il est important de solutions packagées : catalogue numérique, e-commerce, livre/magazine numérique, envoi SMS. Nous
accompagnons nos clients tout au long de leur projet : audit, conseil, développement, suivi et gestion.
planifier ce type de méthode avant de com-
http://www.popfactory.com / info@popfactory.fr
mencer tout développement. La question
initiale étant d’identifier quel sera l’impact
du multilinguisme sur le comportement
Blue Note Systems
global du site. Spécialistes en CRM Open Source, nous proposons une offre complète de prestations sur la
Dans tous les cas, il faudra résister à la ten- solution SugarCRM. Notre valeur ajoutée réside dans une expertise réactive et une expérience des
tation de dupliquer simplement un site pour problématiques de la GRC. Nous vous aidons à tirer le meilleur parti de votre solution CRM.
le traduire car cette action génère de la redon- http://www.bluenote-systems.com
dance et complexifie les évolutions post-loca-
lisations. La règle principale sera donc de tou-
jours viser un niveau de factorisation le plus Intelligence Power
haut possible pour ne pas s’enliser dans les Conseil, Expertises, Formations et Projets E-business centrés au tour du cśur de métier : la Business
Intelligence. Intelligence Power vous propose des solutions innovantes pour aligner la technologie sur
maintenances ultérieures.
la stratégie de votre entreprise.
http://www.intelligencepower.com
Web Alliance
Vous souhaitez être en première page des moteurs de recherche ? Rejoignez-nous, 100% des clients
CHRISTOPHE CADIC Web Alliance sont en 1ère page de Google. Web Alliance, société de conseil spécialisée dans le
Christophe Cadic est Directeur Technique France référencement internet, vous propose son expertise (référencement, liens sponsorisés, web-marketing).
de l’agence de marketing interactif Nurun. Il ren- www.web-alliance.fr
Club .PRO
contre régulièrement les problématiques du mul-
tilinguisme lors de la mise en place de dispositifs
digitaux pour ses clients et partenaires.
Contact : christophe.cadic@nurun.com
www.phpsolmag.org 27 49
Projets
Découvrez
SimpleXml
Le XML est un langage informatique dit de balisage
générique. Il est principalement utilisé pour structurer
des données. Voyons ensemble comment utiliser
la librairie SimpleXml afin de créer et lire des documents
XML assez simplement.
tion simplexml_load_file() renverra False
Cet article explique : Ce qu’il faut savoir : si elle détecte un problème de lecture. Ain-
• Comment utiliser la librairie SimpleXml. • Bases de PHP. si, vous pouvez inclure la boucle foreach()
• Un lecteur de flux RSS. • Des connaissances en Xml sont un plus. dans un if comme fait dans le code du Listing
3. Comme vous pouvez le voir, cela risque de
poser des soucis dans la localisation des er-
reurs : simplexml_load_file() s’occupe de
l’ouverture du fichier, de l’analyse XML ain-
suite est on ne peut plus simple : pour cha- si que la création de la ressource. Une seule
que personne présente, on affiche le nom et le fonction pour gérer tout cela et dont les sour-
Niveau de difficulté prénom. Il est possible que le document Xml ces d’erreurs sont énormes ce qui peut géné-
soit mal construit et que la lecture du fichier rer des affichages d’erreurs indésirables. Il
Xml ne soit pas possible. Pour éviter des er- existe la méthode bien connue du @ devant
reurs, dès la lecture du fichier Xml, la fonc- la fonction mais cela ne règlera pas les soucis
C
ommençons par un exemple simple :
Le Listing 1 présente un fichier Xml Listing 1. Une petite famille: famille.xml
appelé famille.xml. Comme vous pou-
vez le voir, un fichier xml possède une structure <?xml version=”1.0” encoding=”utf-8”?>
<personnes >
bien définie en suivant plusieurs règles. Le Ta- <personne>
bleau 1 rassemble quelques unes de ces règles. <nom>Simpson</nom>
L’on pourrait ajouter d’autres règles à respecter <prenom>Homer</prenom>
<age>40</age>
lorsqu’on construit un fichier Xml. </personne>
Revenons à notre Listing 1. Comme l’on <personne>
<nom>Simpson</nom>
peut tout de suite le remarquer, la simplicité
<prenom>Marge</prenom>
du Xml fait qu’un humain comprend facile- <nomJeuneFille>Bouvier</nomJeuneFille>
ment le contenu du fichier. Ainsi l’on retrou- <age>41</age>
</personne>
ve les membres principaux de la famille Simp- <personne>
son caractérisés par plusieurs données : Nom, <nom>Simpson</nom>
prénom, âge pour tous et nom de jeune fille <prenom>Bart</prenom>
<age>10</age>
pour Marge uniquement. Il est évident que la </personne>
liste aurait pu être bien plus longue mais cel- <personne>
le-ci sera suffisante à notre étude. <nom>Simpson</nom>
<prenom>Lisa</prenom>
<age>8</age>
Débutons SimpleXml </personne>
La première chose à vérifier, c’est que Sim- <personne>
<nom>Simpson</nom>
pleXml est activée dans php.ini. Ensuite, <prenom>Maggie</prenom>
nous pourrons écrire un petit script qui aura <age>1</age>
pour objet d’ouvrir le fichier Xml, et de lister </personne>
<personne>
les membres de la famille en affichant seu- <nom>Simpson</nom>
lement le nom et le prénom. C'est ce qui est <prenom>Abraham</prenom>
réalisé avec le code du Listing 2. La premiè- <age>83</age>
</personne>
re ligne de code charge le contenu du fichier </personnes>
famille.xml dans la variable $personnes. La
28 3/2010
SimpleXml
Règle 1 Un document Xml commence toujours par une déclaration XML qui précise la version de la norme XML utilisée.
Exemple : <?xml version="1.0" encoding="utf-8"?>
L’encodage peut y être précisé. Par défaut, il est supposé que le fichier est encodé en UTF-8.
Règle 2 Un fichier Xml est constitué de balises contenant des informations : <balise>information</balise>
Règle 3 Une information est encadrée par une balise ouvrante et une balise fermante qui possède un slash : <balise>info</ba-
lise>
Règle 4 Un fichier Xml peut contenir plusieurs éléments et donc plusieurs balises.
Règle 5 L’ordre d’ouverture des balises doit être respecté. Le nom de la balise de fin d’un élément doit correspondre à celui de la
balise de début.
et vous permettra encore moins de gérer ces simple pour réaliser la recherche. Le résultat ment, nous n’avons qu’à donner le nom de la
erreurs. Il y a donc deux cas possibles : le fi- retourné est un tableau d’objet de type per- balise à prendre : //element. Le Listing 7 pré-
chier XML est valide, ou ne l’est pas. sonne. A titre informatif, les personnes sont sente cette utilisation.
listées suivant l’ordre de lecture et les balises
Puisons nos informations famille ne contenant rien sont bien entendu Lecture d’un flux RSS : Le Monde
Nous partons désormais dans le cas ou le fi- ignorées. Cependant elle ignorera les person- Les flux rss proposent des informations dans
chier Xml est supposé valide. Il nous reste nes qui ne sont pas contenues dans une archi- un fichier xml mis à jour fréquemment. Ain-
maintenant la possibilité de puiser les infor- tecture qui n’est pas ‘/personnes/famille/’. Sup- si de grands sites (tels que les quotidiens) pro-
mations nécéssaires dans le contenu retourné posons maintenant que nous nous aurions posent ces flux. Nous allons étudier la lectu-
par la fonction simplexml_load_file(). Là un Xml dénaturalisé avec des personnes qui re d’un flux RSS distant avec l’utilisation de
ou SimpleXml simplifie les choses, c’est que ne sont pas inclues dans des familles. (le ven- SimpleXml. Le Listing 8 démontre la struc-
le contenu retourné est à la fois un tableau et deur de Bds ferait l’affaire). Via le code pré- ture d’un fichier RSS.
un objet dont l’arborescence ressemble à la cédent, il n’aurait pas pu être trouvé. Nous La première ligne est la ligne de déclaration
structure du fichier Xml. Le Listing 4 présen- avons donc besoin de rechercher simplement xml. Ensuite nous avons l’ouverture d’une ba-
te un fichier Xml qui contient plusieurs per- toutes les <personne>. Au lieu de spécifier une lise RSS qui spécifie la version à laquelle le do-
sonnes regroupées en 2 familles : la famille architecture du type : /dossier/sous-dossier/ele- cument RSS est conforme. Puis, se trouve une
Simpson et la famille Flanders. Le Listing 5
permet d’afficher avec un print_r, à la ma- Listing 2. Comment lister les membres de la famille
nière d’un tableau, l’ensemble d’une famille.
Dans l’exemple, nous avons affiché la seconde <?php
$personnes = simplexml_load_file('famille.xml');
famille. Nous vous rappelons que l’on com- foreach ($personnes->personne as $personne)
mence à compter à partir de 0 et non 1. La fa- {
mille Simpson serait donc la famille[0]. //print_r($personne);
echo "Nom : ".$personne->nom;
echo " Prenom : ".$personne->prenom." <br />";
Engageons nous dans }
la recherche avec Xpath ?>
Là où SimpleXml simplifie le traitement du Listing 3. Gestion d'une éventuelle erreur
Xml, c’est qu’il fonctionne comme si les bali-
ses étaient des dossiers ou fichiers. Ainsi, une <?php
$personnes = @simplexml_load_file('famille.xml');
balise qui contient une ou plusieurs autres if($personnes)
balises est un dossier sinon c’est un fichier. { foreach ($personnes->personne as $personne) {
L’on va continuer notre exercice sur le Xml print "Nom : {$personne->nom} ";
print "Prenom : {$personne->prenom} <br />\n";
du Listing 4 appelé famille2.xml. Nous vou- }
drions lister toutes les personnes. Pour cela }
nous allons travailler avec Xpath. Une person- else
{
ne est contenue dans une famille elle même echo 'il semble que le fichier Xml soit incorrect';
contenue dans la liste des personnes. Une ar- }
chitecture dossiers donnerait ceci : /personnes/ ?>
famille/personne. Le Listing 6 est un exemple
www.phpsolmag.org 29
Projets
<?php
$personnes = simplexml_load_file('famille2.xml');
foreach($personnes->famille[1] as $familles)
{
echo print_r($familles)."<br>";
}
?>
<?php
$personnes = simplexml_load_file('famille2.xml');
// on recherche <personnes><famille><personne>
$liste_personnes = $personnes ->xpath('/personnes/famille/personne');
print_r($liste_personnes);
?>
<?php
$personnes = simplexml_load_file('famille2.xml');
// on recherche <personnes><famille><personne>
$liste_personnes = $personnes ->xpath('//personne');
print_r($liste_personnes);
?>
30 3/2010
SimpleXml
<?php
try
{
//on charge le fichier xml
if(!@$fluxrss=simplexml_load_file('http://www.lemonde.fr/rss/une.xml')){
throw new Exception('Flux introuvable'); //on lève une exception si erreur
}
echo '<h3>'.$fluxrss->channel->title.'</h3>
<p>'.$fluxrss->channel->description.'</p>';
unique balise <channel> qui contiendra les Comme vous pouvez le voir, nous utili- pleXml pour lire un fichier Xml ou rechercher
diverses informations du flux RSS, obligatoires sons ici un try/catch pour gérer les erreurs. dans son contenu. Le Xml prend aujourd’hui
ou non, ainsi que la liste des différents articles. Dans le try, on commence d’abord par char- une part de plus en plus importante et savoir
Chaque article est identifié comme un objet ger le fichier contenant le flux rss du journal travailler avec est aujourd’hui un avantage fa-
<item> qui pourra contenir une balise <title> via l’adresse indiquée un peu plus haut. Si cile à intégrer au développement d’un projet.
et <description>. Il peut y avoir d’autres ba- lors de la lecture du rss, il y a la moindre er- Sachant que la lecture dans un fichier est plus
lises comme <pubDate> qui spécifie la date de reur (le fichier n’existe pas, ou structure xml rapide que la réalisation d’une requête Sql, il
publication, <guid> qui spécifie l’identifiant incorrecte) on lève une exception. Par la sui- convient de se poser la question si parfois, des
unique de l’article, <link> qui donne l’adresse te l’on vérifie le contenu des balises <title> données constantes seraient mieux dans un fi-
url de l’article complet en ligne. Ces trois der- et <description> contenues dans <channel>. chier au lieu d’une BDD.
nières balises sont optionnelles. Si ces balises sont vides, on lève là aussi une
Passons maintenant au Listing 9. Grâce à la exception. Enfin, dans une boucle nous allons
trentaine de lignes de ce listing, il est possible de parcourir l’ensemble des items pour afficher NICOLAS TURMEAU
lister les articles à la une du site du journal Le Mon- leur <title>, la date de publication ainsi que le Passionné du Web, Nicolas Turmeau est étudiant
de. En effet, le site propose un flux rss disponi- lien menant à l’article sur le site du journal. à l’Institut d’Informatique Appliqué de Laval. Il
ble à cette adresse : http://www.lemonde.fr/rss/une. Dans le code, nous nous sommes limités utilise le langage PHP tous les jours depuis plu-
xml . Le site propose d’autres flux rss spécifiques à l’affichage des 15 premiers articles. sieurs années et participe à divers projets en li-
(international, planète, france, économie ...). gne dont Numénor Online. Il aime partager ses
L’objectif du Listing 9 est donc de lire le fichier Conclusion connaissances et écrit par passion différents livres
xml et d’en extraire certaines informations à sa- Nous avons vus ici de manière aussi courte liés ou pas à l’informatique.
voir le titre, l’url et la date de publication. que simple comment utiliser la librairie Sim- Contact : nturmeau@iia-laval.fr
www.phpsolmag.org 31
Dossier
Démarrez
avec FireBug et FirePHP
Être assisté pendant les développements permet
de gagner des heures de corrections intensives.
De nombreux outils existent permettant d’accélérer
l’écriture de vos projets PHP. C’est le cas de FirePHP
qui vous est présenté dans ce numéro.
torer et déboguer toute la partie client (par
Cet article explique : Ce qu’il faut savoir : exemple du code Javascript), en gardant le
• Firebug. • Quelques notions de PHP. principe de console de commande. Bien sûr,
• FirePHP. • Utiliser Mozilla Firefox. vous pouvez obtenir une vue des échanges ef-
• Deux méthodes. fectués entre le serveur et le navigateur.
Il existe d’autres extensions se position-
nant autour de Firebug comme :
L
ors de la réalisation d’un site inter- teurs. Les principaux outils de débogage du
net, les développeurs sont souvent marché les plus connus sont :
confrontés à des erreurs de saisie ou
de frappes, donc des bugs. Ces bugs, pour • xDebug.
être corrigés, peuvent être résolus en utilisant • Zend Debug.
différentes techniques et outils : • FirePHP.
32 3/2010
FireBug et FirePHP
<?php
L’article va se pencher sur l’utilisation de Fi- require_once('FirePHPCore/fb.php');
rePHP car c’est le point principal qui nous in- $var="PHP Solutions";
téresse. fb($var, FirePHP::getInstance(true));
?>
www.phpsolmag.org 33
Dossier
FireBug, utilisation
Avec FireBug, vous pouvez contrôler le code HTML, le Javascript
et aussi le CSS via la console. Cette console va lister les différentes
actions à chaque opération lorsque la page s’affiche. Pour illustrer
cet exemple, l’article va charger la page suivante : http://www.php-
solutions.fr/. Lorsque que vous ouvrez la console, vous visualisez
la source de la page internet, voir le résultat à la Figure 3 (source
d’une page).
Décomposition
La console est décomposée en différents onglets. Elle va vous montrer :
• la partie HTML,
• la partie Javascript (JS),
• la partie CSS.
FirePHP
Avec FirePHP, il existe plusieurs façon d’utiliser ce plug-in, soit en mo-
Figure 7. Les méthodes de procédural soit en mode objet. La méthode procédurale se décom-
pose en différentes étapes :
34 3/2010
FireBug et FirePHP
Utilisation classique
FirePHP propose une seule fonction pour Listing 5. Les méthodes
aider à utiliser l’outil. La syntaxe proposée est <?php
fb() qui se décompose de la façon suivante :
require_once 'FirePHPCore/FirePHP.class.php';
fb (object, [type]). Le premier paramé-
$firephp = FirePHP::getInstance(true);
trage concerne l’objet variable et le deuxiè- $var = "Alter Way solutions";
me est une option paramétrable qui indique
$firephp->fb("Début du script pour PHP Solutions");
comment le contenu sera montré. $firephp->fb($var,FirePHP::TRACE);
Les différentes méthodes qui existent ac-
tuellement sont : info, warn, error. $firephp->fb("fin du script");
?>
<?php
Les exceptions
Les exceptions vont vous aider dans la gestion des require_once 'FirePHPCore/FirePHP.class.php';
ob_start();
erreurs, car en utilisant la fonction FIREPHP::
EXCEPTION, elle va vous permettre d’afficher les $firebug = FirePHP::getInstance(true);
?>
erreurs si vous utilisez les fonctions Try/Catch,
<html>
mais au lieu de l’afficher à l’écran avec la fonc- <head>
tion die, ces informations seront affichées dans <style type="text/css">
h1 { color : #FF0000; }
votre barre de console comme le présente le Lis- </style>
ting 4 (les exceptions). <script>
Nous forçons la main au code pour signa- document.write ("votre magazine : ");
</script>
ler une erreur, comme ceci, le résultat obtenu </head>
est représenté par la Figure 8. Nous pouvons <body>
rajouter un message de début et de fin, ce qui
<?php
permet de repérer plus facilement la partie $var="<h1>PHP Solutions</h1>";
du code à vérifier. $firebug->fb($var);
echo $var;
?>
Suivre le code </body>
L’identification des lignes ou de la fonction qui </html>
pose problème, peut se repérer de différentes
www.phpsolmag.org 35
Dossier
CHRISTOPHE VILLENEUVE
Consultant, auteur du livre PHP & MySQL-MySQLi-
PDO, Construisez votre application, livre français
aux Éditions ENI, et spécialiste des nombreux sec-
teurs PHP (CMS, CRM...) pour Alter Way solutions
et contributeur pour de nombreux sites touchant
PHP dont Nexen, PHP Team, PHPTV...
Figure 11. Les tableaux Figure 12. Résultat mixe Contacter l’auteur : http://www.hello-design.fr
36 3/2010
Sécurité d’un serveur
La sécurité
de base d’un serveur
Tout webmaster doit avoir un minimum de connaissances,
un minimum de compétences au niveau de la sécurité.
Car il existe seulement deux sortes de webmasters :
ceux qui ont déjà été victime d’un pirate et ceux qui n’ont
jamais eu de soucis mais qui en auront forcément un jour.
Le premier conseil
Cet article explique : Ce qu’il faut savoir : Tout au long de cet article, vous aurez des
• Des points de sécurité d'un serveur. • Connaître l'existence du fichier phpinfo. conseils pour mieux paramétrer votre ser-
veur. Alors, commençons par le premier. Il
peut paraître anodin mais comme le dit l’ada-
ge : C’est évident mais c’est mieux en le disant.
Voici ce conseil :
ronnement (lorsqu’il est compilé comme mo- • il ne faut jamais publier la fonction
dule), environnement PHP, informations sur phpinfo, il ne faut jamais publier un fi-
Niveau de difficulté le système, chemins, valeurs générales et lo- chier phpinfo.php avec cette fonction.
cales de configuration, en-têtes HTTP et la Même si vous permettez l’accès à une pa-
licence PHP. ge spéciale à partir d’un mot de passe, il
Les systèmes et les serveurs sont confi- faut être toujours prudent.
S
oyons francs et sincères : combien gurés différemment, phpinfo() sert donc
de fois avez-vous lu des articles sur à vérifier la configuration pour une pla- Par souci de simplicité, de nombreux web-
la sécurité d’un serveur ? Combien te-forme donnée. Si vous installez un ser- masters publient ce document. Ceci peut
de temps avez-vous passé à améliorer la sé- veur Apache en local (avec EasyPhp, Wamp leur permettre de préparer leurs modifica-
curité de votre serveur ? Combien de fois ou XAMP par exemple), vous avez facile- tions à un endroit avant de les répercuter en
vous vous êtes dit Ce site a été piraté, pas le ment accès à cette fonction. Par exemple, réel plus tard sur leur propre serveur. Ceci
mien ? A partir de ces questions simples, on avec Wamp, la fonction phpinfo est acces- est une faute importante car si vous, vous
peut conclure votre état d’esprit sur la sécu- sible à partir de la partie Outils de la page voyez bien votre phpinfo, tout le monde
rité. Si vous avez déjà passé pas mal d’heu- d’accueil. Voir les Figures 1, 2 et 3 et le peut le voir, tout le monde peut y accéder
res à batailler dans les fichiers de confi- Listing 1. et donc voir des informations cruciales de
guration, si vous avez lu dans le dernier
trimestre plusieurs articles sur la sécurité,
votre sensibilité semble correcte. Mais il y a
un hic et il est de taille : la grande majorité
des webmasters qui ont un serveur dédié ne
s’occupent pas assez – voire pas du tout –
de cet aspect du métier. Ceci est une faute,
il faut y remédier le plus tôt possible et du
mieux possible.
Examinons une dizaine de directives, fai-
sons connaissance avec les mesures de sécu-
rité de base. 3, 2, 1, c’est parti !
PhpInfo()
Tout part de la fonction phpinfo(). Cette
fonction affiche de nombreuses informations
sur PHP, concernant sa configuration cou-
rante : options de compilation, extensions,
version, informations sur le serveur, et l’envi- Figure 1. Un exemple de page d’accueil
www.phpsolmag.org 37
Dossier
allow_url_fopen
et allow_url_include
Ces options permettent de traiter les URL
comme des fichiers. A partir de la version 5
de PHP, il est largement conseillé de désacti-
ver ces deux directives. Pour faire ce travail,
vous devez modifier le fichier php.ini . Pour
savoir exactement où se trouve ce fichier sur
votre serveur, il est préférable de contacter vo-
tre hébergeur. Le plus souvent, ses deux di-
rectives sont valorisées à On (ou 1). Il est pré-
férable – quand on écrit préférable au niveau
sécurité, on peut en conclure que c’est obli-
gatoire - de les passer toutes les deux à Off
(ou 0). Mettez plutôt Off, cette option per-
met une meilleure compréhension. Voici le
code attendu dans le Listing 2.
Maintenant, votre sécurité est déjà renfor-
cée mais ce changement a peut-être modifié le
comportement de votre site. En effet, ce type
d’appel n’est plus possible, voir le Listing 3.
Les fonctions require(), require_once(),
include() et include_once() sont de fonc-
tions que l’on qualifie d’inclusion. Par défini-
tion, elles permettent d’atteindre des fichiers Figure 3. Un autre extrait du résultat, avec des lignes que l’on va modifier
distants. Evidemment, qui dit appel à des fi-
chiers distants dit menace si l’appel est piraté. Ainsi, il est conseillé de désactiver les directi- ini. Ouvrez ce fichier et cherchez l’extension
Dans ce cas, une injection par ces fonctions ves allow_url_fopen et allow_url_include cURL. Si elle est en commentaire (le caractè-
est tout à fait possible. et pour communiquer, on utilisera la bibliothè- re ; en premier), enlevez le. On doit ainsi ob-
Les includes sont dangereux quand ils sont que cURL, dont c’est le principe de communi- tenir le code : extension=php_curl.dll. Si
fait sur une variable qui reçoit une valeur en quer avec l’extérieur d’une façon sécurisée. elle avez fait une modification, relancez votre
POST ou bien encore en GET. Même si l’utili- Pour faire un travail correct au niveau sé- serveur afin de prendre en compte cette mo-
sation de variables en dur permet de réduire curité, il faut maintenant activer l’extension dification. Mais cette partie n’est pas termi-
le risque, il n’est pas annihiler pour autant. cURL. Là aussi, il faut modifier le fichier php. née. Il faut maintenant que vous modifiez le
38 3/2010
Sécurité d’un serveur
www.phpsolmag.org 39
Dossier
40 3/2010
Sécurité d’un serveur
disable_functions
Au-delà des directives que l’on a vu dans
cet article, il est intéressant de connaître
disable_functions. Celle-ci permet d’en
désactiver toute une série en faisant simple-
ment une liste. En effet, avec la version 5 de
PHP, toute une série de fonctions peuvent
être désactivées pour une meilleure sécurité.
Citons les fonctions :
Conclusion
Il est obligatoire de passer du temps pour s’oc-
cuper de la sécurité de son serveur. Bien sûr,
il ne faut pas le faire tous les jours mais il ne
faut pas non plus le faire une fois dans l’an-
née, histoire de se donner bonne conscience.
Internet évolue tous les jours et à ce titre un
bon webmaster doit faire de la veille technolo-
gique, y compris au niveau de la sécurité. Car
si ce n’est pas avec ce temps passé qu’il gagne-
ra de l’argent, c’est en minimisant cette partie
qu’il en perdra énormément, tout comme des
heures dans un autre temps et ses nerfs dans
un dernier temps. Une passe de sécurité par
trimestre ou par semestre (au maximum) est
une bonne fourchette de temps.
Pour vous convaincre de passer du temps
pour mettre en place cette configuration de
base de votre serveur et donc d’avoir la sécu-
rité minimale, faîtes des recherches avec l’ex-
pression mon site piraté sur votre moteur de
recherche favori : on obtient près de 700 000
articles ! Lisez en détails quelques exemples
et vous constaterez que la mise en pratique de
cet article est essentiel.
ERIC VINCENT
Eric VINCENT est informaticien de gestion à l’origi-
ne et il s’est orienté vers l’Internet aux débuts des
années 2000. Il a crée plusieurs sites Internet thé-
matiques et s’intéresse aujourd’hui à la sécurité.
Pour contacter l’auteur : ericvincent@nomade.fr
www.phpsolmag.org 41
Pratique
L
e design pattern Observateur est un de la station de ski. puisque c’est la classe StationSki qui pré-
des patterns les plus utilisés car il ré- Deux solutions s’offrent alors à nous vient du changement d’état. Cette informa-
pond à une problématique souvent pour tenir informé les classes Skieurs et tion est transmise en temps réel et seulement
rencontrée dans le développement orienté SiteStation lors de l’ouverture ou de la fer- quand cela est nécessaire, c’est-à-dire quand
objet : comment tenir informé des objets meture de la station : l’état de la station change. Lors du développe-
du changement d’état d’un autre objet tout ment, cela va se traduire par un attribut dans
en respectant le principe d’un couplage fai- • Soit ce sont les classes Skieurs et SiteSta- StationSki qui va contenir les objets à infor-
ble ? Observateur est donc classé dans la tion qui vont régulièrement lire l’état de mer lors d’un changement d’état.
catégorie des patterns comportementaux la station. A noter, qu’il serait intéressant qu’un
puisqu’il permet d’organiser des objets • Soit c'est la classe StationSki qui prévient nombre quelconque de classes puisse res-
pour qu’ils collaborent facilement entre Skieurs et SiteStation lorsque son état ter informé de l’état de la station de ski.
eux. Pour illustrer ce pattern, nous allons change. Actuellement, seules les classes Skieurs
développer une application autour d’une
station de ski.
Lexique
Exemple d’une station de ski Design pattern : Présente une solution pour répondre à un problème récurent dans la concep-
Cette application sera un extranet afin d’être tion d’applications orientées objets.
accessible depuis n’importe quel équipement
Couplage faible : On parle de couplage faible lorsque deux composants (classes, interfaces...)
pouvant se connecter à Internet (PC, smart- échangent peu d’informations. On peut alors faire évoluer un composant sans que cela im-
phone...). Le choix du langage côté serveur pacte l’autre composant.
se portera évidemment sur PHP dans sa ver- Objet Observateur : Objet qui se tient à l’écoute des changements d’états d’une classe afin
sion 5. d’effectuer certaines actions.
La première brique de notre extranet se-
Objet Observable : Objet qui facilite l’observation de son état car il est susceptible d’intéres-
ra la classe StationSki qui possède un at- ser d’autres objets.
tribut booléen nommé $stationOuverte
MVC : Le Modèle Vue Contrôleur est une architecture qui vise à séparer une application en
et qui permet de savoir si la station de trois couches : le traitement des données (modèles), l’affichage des données (vues) et la ges-
ski est ouverte ou fermée. On souhaite tion des événements (contrôleurs). Cette séparation permet de faire évoluer une couche en
qu’un certain nombre de classes puisse fa- minimisant les impacts sur les autres (par exemple modifier la présentation des données).
cilement se tenir informé du changement
42 3/2010
Design patterns
Le pattern Observateur
La problématique que nous venons de ren-
contrer correspond exactement à celle que
propose de résoudre le pattern Observateur
(en anglais Observer) : Le pattern Observa-
teur définit une relation entre objets de ty- Figure 2. Le diagramme UML de la station de ski basé sur le pattern Observateur
pe un-à-plusieurs, de façon que, si un objet
change d’état, tous ceux qui en dépendent té comme observateur grâce à la méthode ObservableConcret étant déclaré en privé.
en soient informés et mis à jour automati- ajouterObservateur(Observateur). La mé- Voyons maintenant comment appliquer cet-
quement. thode notifierObservateurs() de la clas- te solution à notre extranet pour gérer la sta-
Le diagramme UML du pattern Obser- se ObservableConcret est appelée lors du tion de ski.
vateur présenté dans la Figure 1 schémati- changement de valeur de l’état, c’est-à-dire
se la solution à mettre en place. Celui-ci est de l’attribut, et appelle toutes les méthodes Le pattern Observateur pour
composé de deux interfaces et deux clas- actualiser(Observable) des observateurs la station de ski
ses. Toute classe qui souhaite être tenue in- abonnés. Pour finir la méthode getEtat() est On reprend le digramme UML du pattern
formée d’un état doit implémenter l’inter- un simple accesseur en lecture qui permettra Observateur et on l’applique à notre sta-
face Observateur (c’est le cas de la classe aux observateurs de récupérer la valeur de tion de ski (voir Figure 2). On conserve les
ObservateurConcret) et donc déclarer la l’état, l’attribut correspondant dans la classe deux interfaces Observateur et Observable.
méthode actualiser(Observable). C’est
cette méthode qui sera appelée automatique- Listing 1. L’interface Observable
ment lors du changement d’état de la classe
observée. // Interface qu'une classe doit implémenter pour que ses objets soient
observables.
A l’inverse, toute classe disposant d’un état interface Observable
et qui souhaite pouvoir informer d’autres clas- {
// Ajoute un observateur à l'objet courant.
ses lors de son changement doit implémenter public function ajouterObservateur(Observateur $observateur);
l’interface Observable (c’est le cas de la clas- // Supprime un observateur à l'objet courant.
se ObservableConcret). Cette classe dispose public function supprimerObservateur(Observateur $observateur);
// Notifie l'ensemble des observateurs du changement d'état de
alors d’au moins deux attributs, le premier l'objet courant.
correspond à l’état et le deuxième à un ta- public function notifierObservateurs();
bleau des observateurs de cet état. Les mé- }
www.phpsolmag.org 43
Pratique
// Station de ski qui souhaite pouvoir être observée afi n de communiquer sur ses ouvertures/fermetures.
class StationSki implements Observable
{
// Vrai si la sation est ouverte, faux sinon.
private $stationOuverte;
// Tableau des observateurs de l'objet.
private $observateurs;
// Accesseur en écriture qui permet de mettre à jour l'état de la station puis de notifier les observateurs.
public function setStationOuverte($ouverture)
{
if($this->stationOuverte != $ouverture)
{
$this->stationOuverte = $ouverture;
$this->notifierObservateurs();
}
}
}
La classe StationSki fera office d’observable me appelé typage d’objet implicite (en an- La méthode ajouterObservateur(Observ
concret et les classes Skieurs et SiteStation glais Type Hinting) est disponible depuis la ateur) est utilisée pour ajouter un objet com-
d’observateurs concrets. version 5 de PHP. me observateur, ce qui se traduit par son inser-
Débutons la présentation du code de Le Listing 3 présente la classe StationSki tion dans le tableau $observateurs. A noter
notre extranet par les deux interfaces Lis- qui implémente l’interface Observable. L’at- que si cet objet observe déjà la station on gé-
ting 1 et 2. Pas de surprise, il y a seulement tribut $stationOuverte est un booléen nère une exception. En effet, dans notre cas,
la signature des méthodes présentées dans (initialisé par défaut à faux par le construc- on ne souhaite pas qu’un objet observateur
le diagramme UML. A noter tout de même teur) qui correspond à l’état présenté dans puisse être informé plusieurs fois du même
que le type des paramètres des méthodes est le pattern Observateur. Puis l’attribut changement d’état (par exemple on risquerait
indiqué. Cela permet de déléguer à PHP la $observateurs est un tableau qui permet de d’envoyer les mails en double aux skieurs). La
vérification du type des paramètres et le cas stocker l’ensemble des objets souhaitant ob- méthode supprimerObservateur(Observate
échéant de générer une erreur. Ce mécanis- server l’état de la station de ski. ur) est bâtie sur le même principe et génère
44 3/2010
Design patterns
www.phpsolmag.org 45
Pratique
la méthode ajouterObservateur(Observat
Listing 7. Le résultat affiché lors de l’exécution de l’application eur). Une fois cet ajout effectué, lorsqu’on
Mail envoyé à jean@example.com avec le message suivant : La station de ferme la station, l’information est propagée
ski est maintenant ouverte. à la fois aux skieurs et sur le site web de la
Mail envoyé à pierre@example.com avec le message suivant : La station de
ski est maintenant ouverte. station.
Mail envoyé à jean@example.com avec le message suivant : Désolé mais la
station de ski vient de fermer.
Mail envoyé à pierre@example.com avec le message suivant : Désolé mais la
Approfondissement du pattern
station de ski vient de fermer. Observateur
Publication d'un article sur le site Internet de la station annonçant la Maintenant que nous savons utiliser le pat-
fermeture de la station.
tern Observateur, voyons un peu les dif-
Listing 8. La classe station de ski en utilisant la SPL férentes variantes que l’on pourra rencon-
trer et leurs avantages et inconvénients.
// Station de ski qui souhaite pouvoir être observée afi n de communiquer
sur ses ouvertures/fermetures. Tout d’abord il est tout à fait possible
class StationSki implements SplSubject d’ajouter plusieurs attributs dans un ob-
{
// Vrai si la sation est ouverte, faux sinon.
servable concret. Par exemple, en plus de
private $stationOuverte; l’attribut $stationOuverte de la classe
// Tableau des observateurs de l'objet. StationSki, on pourrait rajouter un attri-
private $observateurs;
but $dateOuverture afin de connaître la da-
// Constructeur d'une station de ski qui permet d'initialiser les te de la première ouverture de cette saison.
attributs.
public function _ _ construct() On informera alors les observateurs lors de
{ l’ouverture ou de la fermeture de la station
$this->stationOuverte = false; mais s’ils le souhaitent, ils pourront égale-
$this->observateurs = array();
} ment accéder à ce nouvel attribut grâce à un
accesseur en lecture. Par exemple, on pourra
// Permet d'ajouter un observateur à la station de ski.
public function attach(SplObserver $observateur) publier sur le site internet de la station la da-
{ te d’ouverture de la station cette saison.
// Si on le souhaite on peut vérifier que l'observateur Dans certaines applications et dans cer-
à ajouter n'observe pas déjà la station de ski.
if(false !== array _ search($observateur, $this-> tains exemples sur internet, les deux in-
observateurs, true)) terfaces Observable et Observateur sont
{
throw new Exception("Cet observateur observe
remplacées par des classes abstraites.
déjà la station de ski."); Cette implémentation a pour but de dé-
} placer une partie du code au niveau des
$this->observateurs[] = $observateur;
} classes abstraites. En effet, on peut alors
déplacer l’attribut $observateurs dans
// Permet de supprimer un observateur de la station.
public function detach(SplObserver $observateur) la classe abstraite Observable ainsi que le
{ corps des méthodes ajouterObservateur
$clef = array _ search($observateur, $this->observateurs, (Observateur) , supprimerObservateur
true);
if(!is _ int($clef)) (Observateur) et notifierObservateur().
{ Le principal inconvénient est que l’on res-
throw new Exception("Cet observateur n'observe
pas la station de ski.");
treint la possibilité d’utilisations de ces clas-
} ses. En effet, PHP ne supporte pas l’héritage
unset($this->observateurs[$clef]); multiple et donc si l’on souhaite utiliser le pat-
}
tern Observateur sur une classe qui hérite déjà
// Notification des observateurs du changement d'état de la d’une autre classe cela s’avère impossible.
station (ouverte/fermée).
public function notify()
On trouve également des cas où le pat-
{ tern Observateur est appliqué mais sans
foreach($this->observateurs as $observateur) interface ni classe abstraite (uniquement
{
$observateur->update($this); avec les deux classes concrètes). Il est forte-
} ment déconseillé d’utiliser cette implémen-
}
tation car on est alors dépendant des types
// Accesseur en lecture afi n de savoir si la station est ouverte. concrets des classes utilisées et toute évolu-
public function getStationOuverte() tion est rendue plus difficile. En effet, pour
{
return $this->stationOuverte; s’assurer que les observateurs implémentent
} bien la méthode actualiser() on va de-
// Accesseur en écriture qui permet de mettre à jour l'état de la voir lister leurs types concrets dans la classe
station puis de notifier les observateurs. ObservableConcret (car ils n’implémentent
public function setStationOuverte($ouverture) pas une interface commune). Il ne sera alors
{
if($this->stationOuverte != $ouverture) plus possible d’ajouter des observateurs sauf
{ à modifier l’implémentation de la classe
$this->stationOuverte = $ouverture;
ObservableConcret. Dans la mesure du pos-
$this->notify();
} sible, il faut donc privilégier l’utilisation des
} interfaces qui couplent faiblement les obser-
}
vateurs à l’observable.
46 3/2010
Design patterns
// Classe représentant les skieurs qui veulent rester informés de l'état de la station.
class Skieurs implements SplObserver
{
// Tableau contenant les mails des skieurs.
private $mails;
www.phpsolmag.org 47
Pratique
48 3/2010
Design patterns
www.phpsolmag.org 49
Pratique
PHP
et les expressions régulières
Les expressions régulières ont été grâce à leur puissance
adoptées par de nombreux langages de programmation et ont
vues leur champ d’utilisation s’étendre des fichiers htaccess
aux feuilles de style CSS. Voyons comment tirer profit des
nombreux avantages qu’offrent les expressions régulières.
• preg _ match _ all - Expression ration-
Cet article explique : Ce qu’il faut savoir : nelle globale.
• L'utilisation des expressions régulières en • Avoir une connaissance minimum de la • preg _ match - Expression rationnelle
PHP. syntaxe de base des expressions réguliè- standard (Listing 1).
res et des fonctions PHP qui les utilisent. • preg _ quote - Protection des caractères
spéciaux des expressions rationnelles.
• preg _ replace _ callback - Recherche
et remplace par expression rationnelle
Règles générales : en utilisant une fonction de callback.
• preg _ replace - Recherche et remplace
Niveau de difficulté • il faut le faire précéder par un \ (antis- par expression rationnelle standard (Lis-
lash) pour utiliser un métacaractère ting 2).
dans une recherche, • preg _ split - Éclate une chaîne par ex-
• Les métacaractères n'ont pas besoin pression rationnelle (Listing 3).
L
es expressions régulières sont une sui- d'être échappés dans une classe, sauf • preg _ fi lter - Recherche et remplace
te d’expressions logiques qui permet- pour # (symbole de fin de la regex) et ] avec une expression rationnelle.
tent de vérifier le format d’une chaine (symbole de la fin de la classe) que l’on
de caractères devant correspondre à un mo- doit faire précéder d’un antislash. Ces fonctions utilisent des délimiteurs qui
dèle précis (pattern en anglais). La manipula- • Le crochet fermant et le tiret garde leur servent à indiquer le début du masque et sa
tion des expressions régulières est assurée par statut de métacaractère dans une classe. fin. Ces délimiteurs peuvent être suivis d’op-
deux bibliothèques : POSIX et PCRE. Ces Par contre en dehors de la classe, chacun tions.
fonctions seront présentées dans cet article. d'eux est un simple littéral. Un masque classique se présente de la for-
me suivante : délimiteur | motif | délimi-
Structure d’une expression Tableau des classes prédéfinies teur, options.
régulière Les classes prédéfinies sont contenues entre N.B : il faut tout de même préciser qu’un
Une Regex est composée de deux parties sépa- des doubles crochets, elle permettent de sim- délimiteur ne doit en aucun cas être un al-
rées par des délimiteurs (séparateurs) : plifier la syntaxe des regex. pha-numérique ou un antislash \ qui est ré-
servé car il sert de caractère d’échappement
• la première constitue le modèle qui sera Les classes abrégées au délimiteur.
appliqué à la chaîne de caractères. Les classes abrégées permettent de réduire la Bien qu’autorisés depuis la version 4.0.4
• la seconde correspond aux options possi- longueur des expressions régulières. de PHP, les délimiteurs symétriques (), [] , {}
bles qui peuvent suivre le modèle. et <>, il serait plus prudent d’éviter de les
Les fonctions PCRE utiliser, de même que le point d’exclama-
Le caractère # est le plus utilisé comme délimi- PCRE est l’acronyme de Perl Compatible Re- tion !. Le jeu de caractères installé sur le ser-
teur mais il est possible de choisir ce qu’on veut. gular Expressions. Les fonctions PCRE com- veur peut également poser des problèmes.
Une Regex a donc la structure suivante : mencent toutes par preg_. Ces fonctions
#Regex#Options. PCRE sont : Les options de PCRE
Les options de PCRE sont listées ci-dessous
Tableau des métacaractères • preg _ grep - Retourne un tableau conte- (cette liste est tirée de la documentation PHP ).
Les métacaractères ou caractères spéciaux nant les éléments recherchés. Les noms entre parenthèses sont les noms in-
ont une signification particulière dans la • preg _ last _ error - Retourne le code ternes à PCRE. Les espaces et les caractères de
construction des motifs de recherche. Ils per- erreur de la dernière expression PCRE nouvelles lignes sont ignorés dans les modifica-
mettent de créer des noms génériques. exécutée. teurs, les autres caractères causent des erreurs.
50 3/2010
Expressions régulières
$ (Dollar) La fin d’une chaîne de caractères ou de ligne, en mode multilignes (option m).
. (Point) Remplace n’importe quel caractère, hormis un saut de ligne (sauf si l’option s est active) .
* (Astérisque) Quantificateur de 0 ou plus.
+ (Plus) Quantificateur de 1 ou plus.
| (Barre verticale) Caractère de début d’alternative
? (Point d’interrogation) Nombre d’occurence de 0 ou 1 du caractère ou de la séquence de caractère qui le précède.
() (Parenthèses) Caractère de début et de fin de sous-masque.
[] (Crochets) Caractère de début et de fin de définition de classe
{} (Accolades) Caractère de début et de fin de quantificateur minimum/maximum.
! (Point d’exclamation) Sert de délimiteur.
i (PCRE_CASELESS) : Effectue une recher- la ligne, et le métacaractère fin de ligne ($) ne précédent immédiatement un caractère de
che insensible à la casse. sera valable qu’à la fin de la chaîne, ou avant nouvelle ligne, en plus du début et de la fin
m (PCRE_MULTILINE) : Par défaut, PCRE le retour chariot final (à moins que l’option de la chaîne. C’est le même fonctionnement
traite la chaîne sujet comme une seule ligne D ne soit activée). C’est le même fonction- que l’option Perl /m. S’il n’y a pas de caractère
(même si cette chaîne contient des retours nement qu’en Perl. Lorsque cette option de nouvelle ligne \n dans la chaîne sujet, ou
chariot). Le métacaractère début de ligne (^) est activée, début de ligne et fin de ligne cor- s’il n’y a aucune occurrence de ^ ou $ dans le
ne sera valable qu’une seule fois, au début de respondront alors aux caractères suivant et masque, cette option ne sert à rien.
www.phpsolmag.org 51
Pratique
<?php
//isset() permet de vérifier si le champ carte bancaire est renseigné
if (isset($ _ POST['carteBancaire']))
{
// htmlspecialchars() permet d'éviter que des données fournies par les utilisateurs contiennent des //balises HTML.
$ _ POST['carteBancaire'] = htmlspecialchars($ _ POST['carteBancaire']);
/*
Notre expression régulière est : #^([0-9]{4}){4}$#
"#" (dièse) : il sert à indiquer le début et la fin de la Regex.
^ (Accent circonflexe) : Représente le début d'une chaîne de caractères.
( ) (Parenthèses) : Indique respectivement l'ouverture et la fermeture d'un sous-masque ou séquence de caractères.
[0-9]{4} pour indiquer que l'on veut 4 chiffres pouvant aller de 0 à 9.
{4} pour indiquer que tout ça doit se répéter 4 fois.
$ (Dollar) : Représente la fin d'une chaîne de caractères
*/
if (preg _ match("#^([0-9]{4}){4}$#", $ _ POST['carteBancaire']))
{
echo $ _ POST['carteBancaire'] . ' est un numéro de carte bancaire valide!';
}
else
{
echo $ _ POST['carteBancaire'] . ' n\'est pas un numéro de carte bancaire valide, recommencez !';
}
}
?>
</p>
<form method="post">
<p>
<label for="carteBancaire">Votre numéro de carte bancaire ?</label> <input id="carteBancaire" name="carteBancaire"
/><br />
<input type="submit" value="Vérifier le numéro" />
</p>
</form>
<?php
$string = 'Je kiffe Homer Simpson.';
$patterns[0] = '/kiffe/';
$patterns[1] = '/Homer/';
$patterns[2] = '/Simpson/';
$replacements[2] = 'préfère';
$replacements[1] = 'Peter';
$replacements[0] = 'Griffin';
echo preg _ replace($patterns, $replacements, $string);
// "Je préfère Peter Griffin" au lieu de "Je kiffe Homer Simpson". Ça se passe de commentaires.
?>
<?php
$string = 'je code donc je suis';
/*
PREG _ SPLIT _ OFFSET _ CAPTURE retournera l'offset de début de résultat, en plus de la chaîne résultat. Cela change la
nature du résultat retourné en un tableau contenant une chaîne à l'offset 0 et une chaîne contenant un offset à 1.
*/
$chars = preg _ split('/ /', $string, -1, PREG _ SPLIT _ OFFSET _ CAPTURE);
print _ r($chars);
?>
Listing 4. Extraction des données d’une table: cas des variables numériques.
<?php
try{
//chaine de connexion
$cnx=new PDO('mysql:host=localhost; dbname=catalogue', 'root', '');
/*
Imaginons que nous ayons une table des catégories et que nous souhaitions récupérer toutes les
catégories qui contiennent 4 chiffres mais uniquement de 2 à 9 MySQL utilise les expressions
rationnelles étendues avec les opérateurs REGEXP et NOT REGEXP
*/
$sql="SELECT * FROM categories where ID _ CAT REGEXP '([2-9]{4})'";
foreach($cnx->query($sql) as $row){
echo $row['ID _ CAT'] .'-'. $row['NOM _ CAT'] .'-'. $row['DESCRIPTION'] '<br />';
}
$cnx=null;
}
//capture et affichage des exceptions
catch(PDOException $error){die($error->getMessage());}
?>
52 3/2010
Expressions régulières
www.phpsolmag.org 53
Pratique
DONY CHIQUEL
Sur Internet Dony Chiquel est ingénieur développeur spécia-
lisé en technologies .NET et en conception objet
• http://www.expreg.com/mysql.php – Le site des expressions régulières en PHP,
• http://www.php.net/manual/fr/book.regex.php – Documentation officielle PHP, avec UML. Il travaille depuis près de six ans dans
• http://lumadis.be/regex/tuto_pcre.php – Les expressions régulières PCRE. le développement d’outils de gestion en tant que
prestataire.
54 3/2010
Expressions régulières
www.phpsolmag.org 55
Fiche technique
Les nouveautés
de PHP 5.3
Dans cet article, nous verrons les nouveautés de PHP 5.3,
notamment celles liées à la programmation orientée objet.
Nous verrons aussi les précautions à prendre dans le cadre
de migration de PHP 5.2 vers PHP 5.3.
D
epuis l’introduction de PHP 5, les • certaines fonctions de tri de tableau qui Pour plus d’informations sur les incompati-
développeurs se sont beaucoup pouvaient prendre indifféremment des bilités entre PHP 5.2 et PHP 5.3, vous pou-
concentrés sur de nouvelles fonc- tableaux ou des objets en arguments vez consulter la documentation officielle
tionnalités permettant de faire de PHP un n'acceptent désormais plus que des ta- de PHP.
langage supportant de manière complète bleaux. C'est le cas des fonctions de type
et élégante la programmation orientée objet. sort ( natsort(), natcasesort(), usort(), Améliorations et nouveautés
En effet, PHP est surtout comme un langage uasort(), uksort() ), ainsi que les fonc- de la SPL et de la gestion
de programmation procédurale, avec PHP 5, tions array _ flip() et array _ unique(), des dates
PHP devient aussi un langage orienté objet. • les méthodes magiques introduites dans Avec PHP 5.3, la SPL (Standard PHP Libra-
PHP 5.2 s’est beaucoup concentré sur des les versions précédentes doivent désor- ry), qui est la base du support de la POO sous
nouveautés pas forcément visibles pour l’uti- mais être déclarées obligatoirement en PHP, a connu quelques améliorations. Désor-
lisateur, notamment pour améliorer les per- tant que méthode publique, et ne peu- mais avec PHP 5.3, la SPL est toujours acti-
formances. PHP 5.3 apporte de nombreuses vent plus être déclarées en tant que mé- vée et il est impossible de la désactiver : le but
nouveautés directement visible pour l’utili- thode private, protected ou statique. est de favoriser son usage par les développeurs
sateur final : les espaces de noms, le support Pour rappel, cela concerne les métho- d’applications PHP.
de Late Static Bindings, les fonctions ano- des _ _ get(), _ _ set(), _ _ call(), _ PHP 5.3 ajoute quelques classes supplé-
nymes, les étiquettes (goto), le collecteur de _ isset(), _ _ unset(). La gestion des mentaires à la SPL. Ainsi on retrouve des
références circulaires, de nouvelles exten- méthodes statiques se fait avec la nou- itérateurs au niveau du système de fichiers :
sions (ext/phar, ext/intl, ext/fileinfo...), un pi- velle méthode magique introduite dans FilesystemIterator qui permet de parcourir le
lote natif de MySQL pour PHP (mysqlnd), la PHP 5.3 : _ _ callStatic(), système de fichier, et BlobIterator qui per-
syntaxe NOWDOC pour les chaînes en plus • la méthode magique _ _ toString() qui met de parcourir des fichiers dont les noms
de la syntaxe HEREDOC, ainsi que de nom- permet de convertir un objet en chaîne correspondent à un masque. De nouvelles
breuses nouveautés et améliorations au ni- de caractères n’accepte désormais plus structures de données font aussi leur appari-
veau de la SPL (Standard PHP Library). d’arguments, tion telles que SplDoublyLinkedList qui per-
Dans cet article nous allons avant tout nous • PHP 5.3 comporte aussi son lot de fonc- met de gérer des listes doublement chaînées.
concentrer sur les nouveautés concernant la tions marquées comme étant dépré- Elle est utilisée par deux autres nouvelles
programmation orientée objet de PHP 5.3. ciées, et qui seront supprimées dans le classes de la SPL : SplStack, qui implémente
56 3/2010
PHP 5.3
www.phpsolmag.org 57
Fiche technique
58 3/2010
PHP 5.3
{
protected static $name = 'Bar';
FABRICE FACORAT
} L’auteur est administrateur réseaux et intervient
occasionnellement pour le CESI afin de don-
echo Bar::test2(); // affiche 'Foo' car self fait référence à la
ner des formations à des futurs informaticiens.
classe parente qui l'a défi nie
Contributeur Mandriva et spécialiste du monde
echo Bar::test(); // affiche 'Bar' Linux, il développe depuis une dizaine d’année
?> en PHP après être passé par d’autres langages tels
que le C, Java ou encore Visual Basic.
www.phpsolmag.org 59
Fiche technique
Coupler la puissance
de Java EE et PHP grâce à GlassFish
La tendance actuelle est au développement
d'applications Internet avec la plate-forme Java EE 6
ou PHP. Mais pourquoi ne pas coupler la puissance
de ces deux langages de programmation ?
L
a principale architecture Open Source moteur de persistance Java Persistence API et
actuelle pour le développement d'ap- plusieurs autres outils. Actuellement, Glass-
plications Internet de grande envergu- Fish est le seul serveur totalement compatible
re est Java EE 6 avec ses API comme : Servlets, Java EE 6, il est d’ailleurs utilisé comme ser-
JavaServer Pages, JavaServer Faces, Entreprise veur de référence par plusieurs sociétés com-
JavaBean, Java Persitence API et son serveur me PSA Peugeot Citroën et RTL.
standardisé : GlassFish. Le concurrent large- Depuis quelques années, les serveurs d’ap-
ment utilisé sur le Web est le langage PHP plications sont devenus de plus en plus com-
et le serveur Apache. plexes et offrent un nombre croissant de ser-
Les entreprises développent des projets de vices. Les fonctionnalités et services proposés
toutes tailles à l’aide de ces deux architectures ont augmenté en même temps que le coût des
et acquiert de facto des connaissances appro- serveurs. Le serveur Sun GlassFish propose
fondies dans l’une ou l’autre des technologies. un logiciel serveur pour les applications Web
Les développeurs travaillent avec des IDE évo- et un développement rapide pour un coût
lués et utilisent en production le serveur Apa- moindre. La dernière version de GlassFish
che pour l’architecture LAMP et GlassFish v3 implémente en standard la dernière pla-
pour l’architecture Java EE. Cependant, le te-forme Java EE 6, mais en plus, le serveur
serveur GlassFish permet, par l’intermédiai- GlassFish fournit une plate-forme complète
re d’une librairie, de coupler la puissance de de type LAMP/SAMP (Sun Apache MySQL
Java EE et PHP pour le développement d’ap- PHP) avec le support multi-langages (PHP, Ja-
plications Internet. va, JRuby ou Groovy/Grails). Le serveur Glas-
sFish est également compatible et permet un
GlassFish, le serveur Java EE fonctionnement avec le serveur Apache en
de référence frontal (mod_jk).
GlassFish (http://glassfish.org) est le nom du L’administration de GlassFish est basée sur
nouveau serveur Java EE 6 d’applications le concept de domaines gérés par un Domain
Open Source Java EE 6 développé par la so- Administration Server (DAS). Le DAS permet
ciété Sun MicroSystems. Le serveur GlassFish de gérer le système central contenant les ap- Figure 1. Arborescence du serveur GlassFish
60 3/2010
Java EE et PHP
www.phpsolmag.org 61
Fiche technique
62 3/2010
Java EE et PHP
www.phpsolmag.org 63
Fiche technique
Fichier : com.gdawj.BoiteOutils.java
package com.gdawj;
import java.util.Calendar;
Fichier : com.gdawj.ejb.ClientEJBBean.java
package com.gdawj.ejb;
import java.util.Calendar;
import javax.ejb.Stateless;
@Stateless
public class ClientEJBBean implements ClientEJB{
Calendar calendar=Calendar.getInstance();
Fichier : com.gdawj.servlets.ServletClientEJB.java
package com.gdawj.servlets;
import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.gdawj.ejb.ClientEJB;
// utiliser l'EJB
@EJB
private ClientEJB clientEJB;
64 3/2010
Java EE et PHP
www.phpsolmag.org 65
Fiche technique
Listing 10. Page PHP responsable de la génération de l'image // creer la vignette avec les infos du pojo
$destination=imagecreatetruecolor($pojo->getHauteur(),
Fichier : /image.php $pojo->getLargeur());
<?php
// importation du paquetage Java // les fonctions imagesx et imagesy renvoient la
import com.gdawj.ImageMiniature; largeur et la hauteur d'une image
$largeur _ source=imagesx($source);
// instanciation de la classe Java $hauteur _ source=imagesy($source);
$pojo=new ImageMiniature(); $largeur _ destination=imagesx($destination);
$hauteur _ destination=imagesy($destination);
// declenchement de methodes
$pojo->setChemin("images/image.jpg"); // on cree la miniature
imagecopyresampled($destination, $source, 0, 0, 0, 0,
// afficher l'image d'origine $largeur _ destination, $hauteur _ destination,
$largeur _ source, $hauteur _ source);
echo "Image d'origine<br/><img src=\"".$pojo->
getChemin()."\"/>"; // on enregistre la miniature sous le nom "miniature.jpg"
imagejpeg($destination, "miniature.jpg");
// retailler l'image avec PHP GD
$pojo->setHauteur(150); // afficher l'image miniature
$pojo->setLargeur(150);
echo "<br/>Image miniature<br/><img src=\"miniature.jpg\"/>";
// recuperer la source avec Java
$source=imagecreatefromjpeg($pojo->getChemin()); ?>
Pour cet exemple, nous utilisons une clas- tement l’EJB depuis le code PHP. Le résul- exemple. Le serveur GlassFish Open Source
se EJB Java EE nommée ClientEJBBean (Lis- tat est présenté dans les Figures 7 et 8. totalement compatible Java EE 6, permet de
ting 6) fournissant deux services simples. Remarque : L’API Java Naming and Direc- coupler la puissance de ces deux langages.
Dans un cas professionnel, ces services pour- tory Interface (JNDI) fournie un mécanisme De même, l'exécution des applications
raient accéder à un SGBD ou un ERP. Ce de nommage de type annuaire pour l’accès PHP avec un serveur d'applications comme
code représente la couche Modèle du design aux ressources. Ces ressources peuvent être GlassFish permet d'augmenter les perfor-
pattern MVC. de différents types mais le but étant d’asso- mances, la sécurité et de rationaliser l'utilisa-
Nous allons maitenant dans le Listing 7, cier les objets à un nom (bind) et de retrouver tion des serveurs.
présenter la couche Contrôleur avec une Ser- ces objets (lookup) dans un annuaire de nom- Un projet existant pourra par exemple mi-
vlet nommée ServletClientEJB. Cette Servlet mage semblable à LDAP, DNS ou NIS. grer de PHP vers Java EE, ou conserver les
invoque l’EJB à partir du paramètre entré meilleurs services de chaque langage afin d’op-
dans la vue PHP. Enfin, la dernière partie Profiter de la souplesse de PHP timiser le produit. Ainsi dans le cas d’une mi-
(Listing 8) est codée en PHP et représente en Java gration totale de PHP vers Java EE, le passage
la couche Vue du modèle MVC. Cette page Le paragraphe précédent montre le princi- pourra être progressif et réalisé service par ser-
déclenche la Servlet et affiche le résultat de pe d’utilisation de Java avec PHP mais il est vice. Enfin, dans le meilleur des cas, les servi-
l’exécution de l’EJB Java en PHP. Nous uti- également possible d’utiliser des techniques ces optimisés pour Java seront développés avec
lisons également JNDI pour appeler direc- PHP avec Java. Par exemple, la librairie de gra- Java EE et les autres resteront en PHP. Plus rien
phisme GD est très simple à utiliser en PHP ne nous empêche désormais de développer des
et peut être ajoutée à Java. projets en MVC I ou II avec Java EE pour les
Nous allons dans cet exemple utiliser PHP parties Contrôleur et Modèle et de conserver la
et la librairie GD à l’aide d’une classe Java couche Vue en PHP/XHTML.
afin de générer une image à la volée. Pour ce-
la, nous allons créer une nouvelle classe Pojo
Java nommée ImageMiniature.java (Listing 9) JÉRÔME LAFOSSE
composée de ses attributs et accesseurs. Ingénieur en informatique et diplômé du CNAM,
La page PHP nommé image.php utilise le Jérôme Lafosse intervient comme consultant,
POJO Java pour les informations et génère concepteur et formateur sur les technologies Java.
une miniature de l’image source à l’aide de Spécialiste des technologies web, il travaille à pro-
PHP / GD. mouvoir les outils et solutions Open Source pour
le développement de projets Internet. Il enseigne
Conclusion également la plate-forme Java Entreprise Edition
La plate-forme Java EE 6 et le langage PHP et la conception de projets web en Licence et Mas-
ont actuellement le monopole pour les déve- ter. Son expérience pédagogique s’allie à ses com-
loppements Internet Open Source, et il est pétences techniques et offrent au lecteur un gui-
courant de trouver des codeurs pro Java EE de réellement opérationnel sur le développement
ou PHP. Java EE est utilisé pour les grosses d’applications web en Java. Auteur des ouvrages
infrastructures et permet de gérer des pools Java EE – Guide de développement d’applications
de connexion, Entreprise JavaBean, Java Per- web en Java et Struts 2 Le framework de dévelop-
sistence API ou encore des WebServices évo- pement d’applications Java EE, Jérôme Lafosse
lués quand PHP permet un développement propose son site dédié aux langages du web à cet-
Figure 9. Génération d'images avec Java, rapide de vues ou l’utilisation simplifiée de te adresse : http://www.gdawj.com et travaille sur
PHP et GD librairies pour la manipulation d’images par un nouvel ouvrage consacré à Java EE 6.
66 3/2010
Java EE et PHP
www.phpsolmag.org 67
Pour les débutants
Télécharger
un fichier depuis un script PHP
Cet article présente trois méthodes alternatives
de téléchargement de fichiers à partir d’un script PHP.
La première méthode utilise des fonctions PHP natives,
la seconde emploie la bibliothèque gratuite et open source
CURL, la dernière établit une communication par sockets.
nibles sur un serveur ont tous un numéro de
Cet article explique : Ce qu'il faut savoir : port, celui-ci peut être modifié par l’adminis-
• Comment télécharger un fichier sur le ser- • Vous devez connaître les bases du langage trateur système dans le fichier de configura-
veur. PHP. tion de chaque service. Les ports des services
les plus courants ont été fixés par le IANA (In-
ternet Assigned Numbers Authority) : 80 pour
HTTP, 21 pour FTP, … Par exemple, lorsque
le navigateur émet une requête vers un ser-
serveur est une application qui attend que veur web, il communique par défaut sur le
des requêtes soient émises vers un port dédié, port 80. Le serveur reçoit des données desti-
Niveau de difficulté qui traite la requête et envoie une réponse au nées au port 80, il les transmet à l’application
client (Figure 1). Dans le cadre du web, le serveur Web (Apache). La communication
client est généralement un navigateur. entre le serveur web et le client utilise le pro-
Un serveur peut fournir plusieurs servi- tocole de transport HTTP.
V
ous avez appris, dans les précédents ces (web, base de données, ftp, ssh, mail,...).
articles de cette série sur les fichiers, Lorsqu’un client veut utiliser un service, il Protocole HTTP
comment lire et écrire dans des fi- doit envoyer une requête vers le nom d’hôte Le protocole de transport HTTP (HyperText
chiers situés sur le disque dur du serveur web ou l’adresse IP du serveur (identifiant uni- Transfer Protocol) est utilisé pour l’échange de
et comment manipuler les fichiers reçus par que sur Internet) en précisant un numéro de données entre un client et un serveur web. Le
le biais d’un formulaire HTML. PHP permet port (identifiant unique de l’application sur client émet une requête HTTP vers le serveur
également de télécharger des fichiers situés le serveur demandé, à laquelle les données web, celui-ci la traite et envoie une réponse.
sur des serveurs distants, afin de les stocker, sont destinées). Le numéro de port est un en- Le client peut être un navigateur ou bien un
les analyser et incorporer leurs données dans tier codé sur 16 bits, tout ordinateur a donc autre serveur. Les requêtes et les réponses
le résultat envoyé au navigateur. Il est ainsi 65536 ports disponibles. Les services dispo- comportent deux parties toujours séparées
possible de récupérer automatiquement des
pages web externes, des images, etc. Cet arti-
cle présente trois méthodes alternatives de té-
léchargement de fichiers distants, depuis un
script PHP.
Afin de mieux comprendre les mécanismes
de téléchargement utilisés, l’article présente
dans un premier temps l’architecture client/
serveur et le protocole HTTP. Chaque métho-
de de téléchargement est ensuite présentée
avec ses avantages et ses inconvénients. Enfin
l’article montre comment implémenter un
téléchargement de fichier distant fonction-
nant dans la majorité des configurations.
Architecture client/serveur
Un client est une application qui émet une
requête vers une autre application atteigna-
ble par le réseau et qui attend sa réponse. Un Figure 1. Architecture client/serveur web
68 3/2010
Téléchargement de fichiers
Requête HTTP
La requête est composée d’une ou plusieurs
lignes d’en-tête et éventuellement d’un corps,
en fonction de la méthode HTTP utilisée (GET
ou POST). A l’exception de la première ligne,
chaque ligne d’en-tête comporte un champ
HTTP, le caractère deux points et la valeur as- Figure 2. Méthode HTTP GET
sociée au champ. Il ne peut y avoir qu’un seul
champ HTTP par ligne d’en-tête.
La première ligne de l’en-tête de la requête
précise la méthode HTTP à appliquer, l’adres-
se de la ressource et la version du protocole
HTTP. Dans la version 1.0, la connexion est
fermée après la réponse du serveur. Avec la
version 1.1, la connexion reste établie. En
fonction du choix de la version du protocole
HTTP, la partie adresse de la première ligne de
l’en-tête diffère. En 1.0, l’adresse correspond
à l’URL de la ressource. En 1.1 il faut indiquer Figure 3. Méthode HTTP POST
le chemin de la ressource à partir de la racine
du serveur web (document root). Une seconde
ligne d’en-tête, préfixée par Host, est alors né-
cessaire pour indiquer le nom du serveur web.
Les deux requêtes suivantes sont identi-
ques, elles demandent au serveur factice mo-
nEphemeride.com la ressource info_soleil.php,
par la méthode GET. La première requête uti-
lise la version 1.0 du protocole :
Figure 4. Architecture utilisée dans l’article
GET http://monEphemeride.com/info _
soleil.php HTTP/1.0 Dans le cas de la méthode GET, cette chaîne de GET /info _ soleil.php?ville=Rome&zone
données est envoyée dans la partie argument =Europe HTTP/1.1
La seconde requête utilise la version 1.1 : (query string) de l’URL. Les données sont pla- Host:monEphemeride.com
cées après le point d’interrogation et le corps
GET /info _ soleil.php HTTP/1.1 de la requête est vide (Figure 2). La ligne sui- Avec la méthode POST (Figure 3), les données
Host:monEphemeride.com vante utilise la méthode GET et la version 1.1 doivent être placées dans le corps de la requête
du protocole HTTP, pour demander les infor- et des informations sur la taille et le type des
Ces deux requêtes retournent la page web gé- mations sur les heures de lever et coucher de données doivent être précisées dans l’en-tête.
nérée par le script PHP info_soleil.php. Par dé- soleil à Rome en Europe : Le champ Content-Length de l’en-tête HTTP
faut ce script, s’il ne reçoit pas de données en
paramètres, retourne l’heure du coucher et du Listing 1. fonctions_url_open.php
lever du soleil à Paris pour le jour courant. <?php
L’en-tête de la requête HTTP peut conte- /**
nir d’autres informations optionnelles, sur le * Telecharge une ressource a partir d'un serveur distant en utilisant une
fonction PHP native
client (préférences de langue, jeux de caractè- * @param $url (string) URL de la ressource sur le serveur distant
res, ...) et sur le corps (encodage, ...). * @param $donnees (array) tableau de donnees a passer en parametres au
serveur distant
* @param $resultat (string) contenu du fichier (var affectee par
Envoi d’arguments à la ressource reference dans la fonction)
Le script info_soleil.php peut prendre en argu- * @param $erreur (string) message d'erreur eventuel (var affectee par
reference dans la fonction)
ments deux données, la zone géographique * @return booleen true si la ressource a ete telechargee, false sinon
dans le monde (Europe, Asia, America, Africa, ...) */
et un nom de ville en anglais située dans la function utiliserURLFopen($url, $donnees, &$resultat, &$erreur){
zone demandée. Pour envoyer des données // generer la query string
$arguments = @http_build_query($donnees);
à une ressource, il faut les formater sous la // recuperer le fichier sur le serveur distant
forme de paires nom=valeur, séparées par des $resultat = @file_get_contents($url.'?'.$arguments);
if (!$resultat) {
caractères &. Par exemple pour obtenir l’éphé- $erreur = 'Impossible de recuperer le fichier';
meride de la ville de Rome (Europe), la chaî- }
ne d’arguments est : return empty($erreur);
}
?>
ville=Rome&zone=Europe
www.phpsolmag.org 69
Pour les débutants
70 3/2010
Téléchargement de fichiers
www.phpsolmag.org 71
Pour les débutants
72 3/2010
Téléchargement de fichiers
www.phpsolmag.org 73
Pour les débutants
74 3/2010
Téléchargement de fichiers
Listing 8. exemple.php
<?php
// inclusion de fonctions
require_once 'utils.php';
/**
* Telecharge un fichier sur un serveur distant et extrait l'heure du coucher
* du soleil a partir du contenu du fichier telecharge
* @param $host (string) nom du serveur distant hebergeant la ressource
* @param $chemin_fichier (string) chemin de la ressource sur le serveur distant
* @param $donnees (array) tableau de donnees a passer en parametres au serveur distant
* @param $methode (string) methode d'envoi de la requete HTTP (methode GET par defaut)
*/
comme valeur le numéro de port voulu. Par Dans le cas d’une requête effectuée avec la est utilisée, les options sont définies grâce à
exemple pour communiquer avec le serveur méthode POST, les données doivent être pla- la fonction curl_setopt_array, comme dans
Web monEphemeride.com sur le port 80, afin cées dans le corps de la requête. Ceci est ef- l’exemple suivant :
de récupérer les informations pour la ville de fectué en donnant la valeur true à l’option
Londres, l’option CURLOPT_URL est paramé- CURLOPT_POST. Les données elles-mêmes sont $options = array(CURLOPT _ URL => $url,
trée ci-dessous : placées dans un tableau associatif ou dans CURLOPT _ POST => true,
une chaîne de caractères sous la forme de pai- CURLOPT _ POSTFIELDS => $donnees );
curl _ setopt($curl _ ref, CURLOPT _ res nom=valeur. Ces données sont affectées à curl _ setopt _ array($curl _ ref,
URL, 'http://monEphemeride.com:80/ l’option CURLOPT_POSTFIELDS. $options);
info _ soleil.php?ville=London&zone=E Dans le Listing 4, la seconde opération
urope'); effectuée dans le script demande l’éphémé- Envoyer la requête HTTP
ride pour la ville d’Oslo, en utilisant la mé- et récupérer la réponse du serveur
Par défaut les serveurs web écoutent sur le thode POST. La fonction setOptions va être La fonction curl_exec envoie la requête
port 80 donc il est rarement nécessaire de de nouveau appelée pour définir les options HTTP au serveur distant. Elle prend en pa-
préciser cette information. de transfert CURL. Lorsque la méthode POST ramètre une référence à la session CURL.
www.phpsolmag.org 75
Pour les débutants
76 3/2010
Téléchargement de fichiers
www.phpsolmag.org 77
Pour les débutants
PHP
et Delphi
Cet article présente les différentes possibilités pour faire
interagir votre application locale en Delphi avec PHP
et ainsi permettre le communication entre logiciels
et serveurs simplement.
procedure TForm1.FormCreate(Sender:
voir tous les objets placés sur l‘application vi- TObject);
sible en direct. begin
Niveau de difficulté Le code source de l‘application en ques- WebBrowser1.Navigate('http://w w w.
tion peut être modifié avant la compilation, google.fr/');
deux choix s‘offrent à vous, soit vous codez end;
manuellement les événements des boutons
D
elphi est un langage de program- ou autres objets de l‘application en passant • // Dès qu'on clique sur l'Edit1, le texte
mation orientée objet (POO) créé du Design au Code grâce aux onglets en bas, s‘efface pour pouvoir marquer une url.
et édité par Borland en 1995 pour soit vous pouvez utiliser l‘onglet Events visi-
les premières versions de Windows, en 2001, ble dans l‘inspecteur d‘objets (voir à gauche procedure TForm1.Edit1Click(Sender:
une version linux du nom de Kylix fît son de la Figure 1). TObject);
apparition. Borland créa ensuite CodeGear Je vous conseille de suivre quelques tu- begin
possédant ses propres moyens pour créer des toriaux sur Delphi avant de poursuivre si Edit1.Clear;
outils destinés aux développeurs, après deux vous n‘avez jamais utilisé l‘IDE, vous pou- end;
ans de recherches, CodeGear fût racheté par vez pour cela, consulter des sites comme
la société Embarcadero pour 23 millions de phidels.com. • // Dès qu'on clique le bouton1 (Ok), le
dollards. WebBrowser1 va sur l‘url indiquée dans
Delphi posséde un EDI (Environnement Le composant TwebBrowser l‘Edit1.
de Développement Intégré) ou encore IDE, il Le composant WebBrowser est un composant
existe plusieurs versions de cet IDE. Dans de Delphi permettant de visualiser des pages procedure TForm1.Button1Click(Sender:
cet exemple, nous utiliserons Embarcadero web depuis une application, ce composant se TObject);
Delphi 2010 fonctionnant sous Windows, trouve dans l‘onglet Internet. Grâce à ce com- begin
sachez tout de même que plusieurs ver- posant, nous pouvons facilement faire un na- WebBrowser1.Navigate(Edit1.Text);
sions linux existent comme Kylix ou encore vigateur fonctionnant avec le moteur d‘Inter- end;
Lazarus. net Explorer (voir Figure 2).
L‘application est composée comme ceci : • // Dès qu'on clique sur le bouton2 (Back),
Prise en main de l‘IDE le WebBrowser1 va à la page précèdente.
Embarcadero Delphi 2010 • Deux composants Tpanel sans captions
La prise en main de l‘IDE est assez simple, (un en Align Center et un autre en Align procedure TForm1.Button2Click(Sender:
l‘IDE possède deux grandes parties, Top). TObject);
Tout d‘abord, nous pouvons aperçevoir la • Un composant TwebBrowser en Align begin
vue arborescente des objets (Structuration des Center par dessus le Tpanel en Align Cen- WebBrowser1.GoBack;
composants de l‘application) qui permettent de ter aussi. end;
78 3/2010
Delphi
• // Dès qu'on clique sur le bouton3 const pDisp: IDispatch; var URL: TidHTTP de la librairie. Voici un exemple
(Forward), le WebBrowser1 va à la page OleVariant); basique de code avec Google :
suivante. begin
uses
procedure TForm1.Button3Click(Sender: // On efface le texte du Memo1 et IdHTTP; // À rajouter dans votre code si
TObject); on affiche la source de la page n‘est pas présent.
begin à l'intérieur. type
WebBrowser1.GoForward; Memo1.Clear;
end; Memo1.Text := WebBrowser1.OleObject. IdHTTP1: TIdHTTP; // A rajouter dans votre
Document.body.innerHTML; code aussi si n‘est pas présent.
Avant de poursuivre, assurez vous de sa- end;
voir faire un navigateur basique comme le • // Dès que vous cliquerez sur le bouton1,
mien. Nous pouvons maintenant aussi ré- Le résultat est montré dans la Figure 3. une requête GET sera envoyée sur la re-
cupérer le code source d‘une page grâce au Il est aussi possible d‘utiliser ce compo- cherche google en fonction de ce que
WebBrowser. sant sans être connecté à Internet soit avec vous avez tapé dans l‘Edit1.
un serveur xampp local afin d‘utiliser PHP,
• // Au lancement de l'application, le Web- soit en mettant la propriété Offline du com- procedure TForm1.Button1Click(Sender:
Browser1 va sur Google. posant à True pour charger des pages HTML TObject);
se trouvant sur un disque dur. begin
procedure TForm1.FormCreate(Sender:
TObject); La librairie Indy // http://www.google.fr/#hl=fr&source=
begin La librairie Indy (Internet Direct) est une h p& q = %s& b t n G = R e c h e r c h e + G o o gle
WebBrowser1.Navigate('http://w w w. librairie Open Source pour les déve- &meta=&aq=f&oq='+ le mot tapé (Exemple :
google.fr/'); loppeurs Delphi qui permet d‘établir des Sofia Rezgui Villaume clonée) +'&fp=
end; connexions sockets entre clients et ser- f8ad601b167bde66
veurs. Dans cet article, j‘aborderais seule- IdHttp1.Get('http://www.google.fr/
• // Dès que le WebBrowser est allé sur une ment quelques fonctionnalités d‘Indy en # h l= f r& s o u r c e = h p & q = % s & b t n G =
page et qu‘il a fini son chargement... rapport avec PHP et non toutes les possi- Recherche+Google&m eta=&aq =f&oq =
bilités d‘Indy. '+ IdHTTP1.URL.PathEncode(Edit1.Text)
procedure TForm1.WebBrowser1Docume Avec Indy, il est possible par exemple de +'&fp=f8ad601b167bde66');
ntComplete(ASender: TObject; transmettre un $_GET grâce au composant end;
www.phpsolmag.org 79
Pour les débutants
La partie Design de l‘application doit donc parametres.Add('Param1=Valeur1'); Vous pouvez par la même occasion faire un
ressembler à ceci (voir Figure 4). Il est aus- parametres.Add('Param2=Valeur2'); système de mise à jour automatique grâce
si possible avec Indy de remplir des formu- à Indy et PHP comme ceci :
laire $_POST avec la méthode Post() du Tid- • // On envoie les données sur le formu-
HTTP. laire. • // À l'ouverture de l'application ...
• // Dès que l'on clique sur le bouton 1... IdHttp1.Request.ContentTy pe := procedure TForm1.FormCreate(Sender:
'application/x-www-form-urlencoded'; TObject);
procedure TForm1.Button1Click(Sender: begin
TObject); IdHTTP1.Post('http://site.com/page.
var php',parametres); • // On dit que la version de l'application
est la première.
• // On dit que la variable parametres est une • // Finalement, on libère la TStringList.
TStringList. version := '1';
finally
parametres : TStringList; parametres.free; • // On envoie une requête $ _ GET à la pa-
begin end; ge index.php avec le numéro de la versi-
end; on de notre application.
// On créer donc la TStringList.
parametres := TStringList.Create;
try
Sur Internet :
• https://downloads.embarcadero.com/free/delphi – Téléchargement des versions d‘évalu-
• // On ajoute les parametres que l'on tion,
souhaite envoyer sur le formulaire • http://delphi.developpez.com/ – Site d‘apprentissage complet sur le langage.
$ _ POST.
80 3/2010
Delphi
Conclusion
Dans cet article, vous avez normalement pu
constater que Delphi et PHP se marient très
bien ensemble mais Delphi ne s‘arrête pas
là, de nombreuses autres intéractions avec
PHP sont possibles ainsi que différentes uti-
lisations avec d‘autres langages comme l‘As-
sembleur, Sql, Perl ou intégrer de l‘Ajax à nos
pages.
FAURE YANN
Faure Yann est un développeur passionné de sé-
curité informatique depuis plusieurs années, pro-
grammant dans plusieurs langages, il aimerait
poursuivre ses études dans la programmation ou
Figure 5. Communication logiciel/serveur dans la sécurité informatique.
www.phpsolmag.org 81
Dans le prochain numéro de
Le périodique phpsolutions est publié par Bêta-testeurs : Fabrice Gyre, Brice Favre, Valérie Viel, Aymeric Lagier,
Software Press Sp. z o.o. SK Christophe Milhau, Alain Ribault, Stéphane Guedon, Eric Boulet, Mickael Puyfages,
Bokserska 1, 02-682 Varsovie, Pologne Christian Hernoux, Isabelle Lupi, Antoine Beluze, Timotée Neullas, Yann Faure,
Tél. 0975180358, Fax. +48 22 244 24 59 Adrien Mogenet, Jean-François Montgaillard, Turmeau Nicolas, Jonathan Marois,
www.phpsolmag.org Wilfried Ceron, Wajih Letaief, François Van de Weerdt, Jeremy Rafflin, Eric Vincent.
Président de Software Press Sp. z o.o. SK : Paweł Marciniak Les personnes intéressées par la coopération sont priées de nous contacter :
editor@phpsolmag.org
Directrice de la publication : Ewa Łozowicka
Fabrication : Andrzej Kuca andrzej.kuca@software.com.pl
Imprimerie, photogravure : Diffusion : Ilona Lepieszka ilona.lepieszka@software.com.pl
ArtDruk www.artdruk.com Publicité : publicite@software.com.pl
Imprimé en Pologne/Printed in Poland
La rédaction fait tout son possible pour s’assurer que les logiciels sont
Dépôt légal : à parution à jour, pourtant elle décline toute responsabilité pour leur utilisation. Elle ne
ISSN : 1731-4593 fournit pas de support technique lié à l’installation ou l’utilisation des logiciels
enregistrés sur le CD-ROM. Tous les logos et marques déposés sont la
Distribution : MLP propriété de leurs propriétaires respectifs.
Parc d’activités de Chesnes, 55 bd de la Noirée
BP 59 F - 38291 SAINT-QUENTIN-FALLAVIER CEDEX Pour créer les diagrammes on a utilisé le programme
(c) 2010 Software Press, tous les droits réservés
Rédacteur en chef : Łukasz Bartoszewicz Le CD-ROM joint au magazine a été testé avec AntiVirenKit de la société G
Préparation du CD : Andrzej Kuca Data Software Sp. z o.o
Maquette : Agnieszka Marchocka
Couverture : Agnieszka Marchocka AVERTISSEMENT
Les techniques présentées dans les articles ne peuvent être utilisées qu’au
DTP : Sławomir Sobczyk Studio2W@gmail.com sein des réseaux internes. La rédaction du magazine n’est pas responsable
Composition : Sławomir Sobczyk de l’utilisation incorrecte des techniques présentées. L’utilisation des techniques
Correction : Aymeric Lagier présentées peut provoquer la perte des données !
DOSSIER PROJETS
Programmation orientée objet Sélection des meilleurs extensions
Nous allons parcourir ensemble les bases de la programmation
sur Joomla!
orientée objet et les illustrer par des exemples. Nous aborderons Le CMS Joomla! est connu pour la diversité de ses extensions.
la création d’une classe et des ces propriétés et méthodes, les Parmi eux, on distingue les composants et les modules qui
méthodes magiques, l’héritage, la durée de vie des objets ainsi représentent la partie fonctionnelle d’un site. Depuis, il existe plus de
que la gestion des exceptions. 5000 extensions et le choix peut être parfois difficile. C’est pourquoi,
je vous propose une sélection des meilleurs extensions disponible
pour le CMS Joomla en passant par les composants et modules les
plus fiables et intéressants pour la création de votre site.