Vous êtes sur la page 1sur 86

Développement coté

serveur :
Le langage PHP
1

Lotfi KHEDIRI
khediril@gmail.com

Programmation Web 2017-2018 13:25:40


Architecture client-serveur
2

Rappel
 Un client C (p.ex. un navigateur Web), sur une machine X .
 Un serveur Web S sur une machine Y .
 C se connecte à Y .
 C demande à S une URL, accompagnée de paramètres.
 S répond à C en lui renvoyant p.ex. une page Web. Cette
page peut être un document statique (p.ex. un fichier
HTML) ou une page dynamique produite par un
programme (p.ex. un script PHP).
 S ferme la connexion à C .

Programmation Web 2017-2018 13:25:40


Serveurs Web
3
Serveur Part Distribution

Apache 60% libre, Windows, Mac OS, Linux, Unix


Microsoft IIS 30% certaines versions de Windows
lighthttpd 2% libre, Windows, Mac OS, Linux, Unix
Non identifiable 8%

Parts de marché : d’après des études par Opera et Netcraft, chiffres précis
ne signifient pas grand chose.
De nombreuses grandes entreprises de logiciel ont soit leur propre
logiciel, soit leur propre version modifiée d’Apache
(notamment,GFE/GWS pour Google).
lighthttpd est (comme son nom l’indique !) plus léger (c’est-à-dire, moins
riche en fonctionnalités mais plus rapide dans certains contextes)
qu’Apache.
Les versions de Microsoft IIS venant avec les Windows grands publics
sont très limitées.
Programmation Web 2017-2018 13:25:40
HyperText Transfer Protocl : HTTP
4

Protocole de communication à la base du World Wide Web.


Requête du client :
GET /MarkUp/ HTTP/1.1
Host: www.w3.org
 Réponse du serveur :
HTTP/1.1 200 OK
...
Content-Type: text/html; charset=utf-8
<!DOCTYPE html ...>
...
Deux principales méthodes HTTP : GET et POST.
Des en-têtes additionnels, dans la requête et dans la réponse, pour
diverses fonctionnalités.
Possibilité de passer des paramètres dans la requête (clef/valeur).

Programmation Web 2017-2018 13:25:40


La Méthode GET
5

Type de requête la plus simple.


Les paramètres (éventuels) sont passés à la fin de
l’URL, après un ‘ ?’
Ne convient pas quand il y a beaucoup de
paramètres ou que leurs valeurs sont très longues.
Méthode utilisée quand on visite directement une
URL, quand on suit un lien, et pour certains
formulaires.
URL : http://www.google.fr/search?hl=fr&q=hello

Programmation Web 2017-2018 13:25:40


La Méthode POST
6

Méthode utilisée uniquement en soumettant un


formulaire.
Pas de limite au niveau taille des données.

Programmation Web 2014-2015 13:25:40


Encodage des paramètres
7
Par défaut, les paramètres sont passés (en GET ou en POST) sous
la forme : name1=valeur1&name2=valeur2, et les caractères
spéciaux (caractères accentués, espaces. . . ) sont remplacés par
des codes comme +, %20. Cette manière de passer les paramètres
est nommée application/x-www-form-urlencoded.

Pour la méthode POST, on peut aussi choisir un encodage plus


lourd (plusieurs lignes par paramètre), similaire à la façon dont
les e-mails sont construits ; c’est surtout utile pour passer de
grandes quantités d’information. On parle d’encodage
multipart/form-data. Seule méthode utilisable pour transmettre
des fichiers avec un <input type="file"> .

Programmation Web 2017-2018 13:25:40


Codes de statut
8

La réponse HTTP commence toujours par un code


de statut sur trois chiffre, suivi d’un message lisible
par un être humain (p. ex., 200 OK).
Le premier chiffre indique la classe de la réponse:
 1 Information
 2 Succès
 3 Redirection
 4 Erreur client
 5 Erreur serveur

Programmation Web 2017-2018 13:25:40


Codes de statut les plus courants
9

200 OK
301 Redirection permanente
302 Redirection temporaire
304 Pas de modification
400 Requête invalide
401 Non autorisé
403 Interdit
404 Page non trouvée
500 Erreur serveur

Programmation Web 2017-2018 13:25:40


Langages côté serveur
10

Rôle des programmes côté serveur


 Le Web, ce n’est pas qu’un ensemble de documents HTML
statiques !
Les programmes côté serveur permettent :
 de traiter des soumissions de formulaire ;
 d’afficher de manière uniforme l’ensemble des pages d’un site ;
 de proposer des applications interactives ;
 de permettre à l’utilisateur d’ajouter ou modifier du contenu ;
 etc.

Programmation Web 2014-2015 13:25:40


Langages de programmation
11

CGI (Common Gateway Interface) : interface normalisée permettant de


faire communiquer le serveur Web avec un programme s’exécutant sur
le serveur ;
CGI permet d’utiliser n’importe quel langage de programmation
(compilés comme C, C++, Java, ou interprétés comme Perl, Python,
Ruby, etc.) pour écrire des langages côté serveur.
Mais certains langage sont plus adaptés au développement Web :
 comportent des fonctions spécialement dédiées à HTTP, HTML, etc. ;
 s’intègrent de manière plus efficace et plus pratique avec le serveur Web (moyennant des
extensions logicielles) ;
 ont une syntaxe spécialement conçue, qui mêle code HTML envoyé tel quel et
instructions de programmation interprétées.
Quelle que soit la technologie utilisée, le code du programme n’est pas
accessible par le navigateur Web, seulement le résultat de son exécution.

Programmation Web 2014-2015 13:25:40


Langages côté serveur
12

PHP : un des langages les plus populaires, s’intègre très


facilement avec Apache (libre)
ASP et ASP.NET : destiné à être utilisé avec IIS
(Microsoft, commercial)
ColdFusion (Adobe, commercial)
JSP (Java Server Pages) : permet de mêler instructions
Java et code HTML ; nécessite un serveur d’applications
Java (p. ex., Tomcat) en plus d’Apache
Servlets Java : véritables programmes Java, plutôt pour
les applications complexes côté serveur avec peu
d’interaction côté client ;nécessite un serveur
d’applications Java en plus d’Apache

Programmation Web 2014-2015 13:25:40


PHP: Langage de script pour le Web
13
Qu’est-ce que PHP ?
 Langage de script. Utilisé coté serveur
 Acronyme récursif : PHP: Hypertext Preprocessor
 Créé en 1994-1995 par Rasmus Lerdorf
 Extension utilisée sur certains serveurs Web (33%)
 Langage multi plate-forme (UNIX / Windows…)
 Open Source
 Versions actuelles (source nexen.net) :
 PHP4 (52% en octobre 2008)
 PHP5 (48% en octobre 2008)
 PHP7 très prochainement….

Programmation Web 2017-2018 13:25:40


Utilité et utilisation de PHP
14

Création de pages HTML « dynamiques »,


fabriquées à la volée, construite à la demande

Interface entre un serveur Web et des bases de


données

Création d’applications Web

Programmation Web 2017-2018 13:25:40


Principales fonctionnalités de PHP
15

Manipulation de chaînes et tableaux


Calendrier / dates / heures
Fonctions mathématiques
Accès au système de fichiers
Manipulation d’images
HTTP / FTP / IMAP
Bases de données (Oracle, MySQL, …)
XML
…

Programmation Web 2017-2018 13:25:40


Organisation de PHP
16

PHP ne repose pas sur une hiérarchie de classes


regroupées dans des packages (ou namespace).
PHP est organisé en modules
 Module de base, dit standard (instructions, types de données,
un des fonctions prédéfinies)
 Modules additionnels spécialisés -> autres fonctionnalités : Exp
: l’accès aux bases de données.

Liste des modules disponibles : www.php.net


Pour savoir les modules disponible sur votre
serveur : utiliser la fonction <?php phpinfo() %>

Programmation Web 2014-2015 13:25:40


Fonctionnement de PHP
Rendu
Fermeture
Requête
Localisation
Exécution
Connexion
graphique
Envoi dudeHTTP
du
lasur
de
du
connexion
code
des
le
résultatdu
la
code
serveur
ressource
client
données
PHP
au PHP
client(port
dans80)
le fichier
(hello.php) 17
= réponse HTTP Client
Navigateur
GET /hello.php HTTP/1.0
 HTML
Réseau  JavaScript
Protocole HTTP  CSS

Exécution d’un programme sur le serveur


<html>
<head>
Serveur
<title>Hello</title> <?php
</head>
Serveur Web
<body>Hello world</body>.html
echo <<<HTML hello.php
<html>
</html> .php
<head>
.jpg
<title>Hello</title>
Module PHP </head>
<body>Hello world</body>
MySQL </html>
HTML;

Programmation Web 2017-2018 13:25:40


Fonctionnement de PHP
18

Client  Serveur

1. Connexion TCP sur le serveur (port 80)


2.Requête HTTP du client (mon_fichier.php)
3.Localisation de la ressource
4.Exécution du code PHP
5.Envoi du résultat de l’exécution au client
= réponse HTTP

6.Fermeture de la connexion
7.Rendu graphique des données (HTML, image, …)

Programmation Web 2017-2018 13:25:40


Programme en PHP
19

Délimitation du code PHP dans le fichier .php :


 <?php Code PHP ?>
Fermeture optionnelle
 <script language="PHP">
Code PHP Confusion avec JavaScript
→ à bannir !!
</script>
 <? Code PHP ?> short_open_tag

 <% Code PHP %> Dépend de la configuration


du serveur
asp_tags
→ à bannir !!

Programmation Web 2017-2018 13:25:40


Eléments de syntaxe PHP
20

La syntaxe de PHP ressemble à celle de famille "C"


(C, C++, Java, …)

Chaque instruction se termine par ";"

Commentaires:
/* jusqu’au prochain */
// jusqu’à la fin de la ligne
# jusqu’à la fin de la ligne

Programmation Web 2017-2018 13:25:40


Les variables et les types de données
21
 Une variable est le conteneur d’une valeur
 Chaque variable possède un identifiant qui commence toujours par "$" .
 Les noms des variable sont sensibles à la casse.
 La déclaration n’est pas obligatoire au début du script.
 Les affectations sont réalisées grâce à "=" (affectation par valeur)
 $x= expression ;
 $mavar = " Tunis " ;
 $mavar = 75 ;
 $mavar = 7*3+2/5

Les noms suivant sont légaux:


 $mavar
 $_mavar
 $mavar2
 M1
 $_123
 Les noms suivant sont illégaux :
 $5mavar
 $*mavar
 $mavar+
 Affectation par référence
 $mavar1 = " Tunis " ;
 $mavar2 = " sousse " ;
 $mavar2 = &$mavar1 ;
 $mavar1 = " Tozeur " ;

Programmation Web 2017-2018 13:25:40


Les variables et les types de données
22

Numérique entier: 12 ou réel: 1.54


Chaîne: "Hello" ou ’Bonjour’
Booléen: true, false (PHP 4)
Tableau: $tab[2]=12
Objet (PHP4, PHP5)
Ressource
NULL

Le type d’une variable est dynamique et est


déterminé par la valeur qui lui est affectée
→ Typage dynamique en php
Programmation Web 2017-2018 13:25:40
Typage faible. Exemple
23

// Pas de déclaration de variable

$test = 1.5 ; // Réel

$test = 12 ; // Entier

$test = array() ; // Tableau

$test = "10" ; // Chaîne

echo $test ; // 10

Programmation Web 2017-2018 13:25:40


Conversion implicite. Exemple
24

$nombre1 = 1.5 ; // Réel


$nombre2 = 12 ; // Entier
$chaine1 = "10" ; // Chaîne
$chaine2 = 'coucou' ; // Chaîne

$total =
$nombre1 + $nombre2 + $chaine1 + $chaine2 ;
1.5 12 "10" 'coucou'

13.5 10

23.5 0
echo $total ; // 23.5 Réel
23.5

Programmation Web 2017-2018 13:25:40


Les chaînes de caractères
25

Substitution de variables dans les chaînes


Guillemets simples
$a='chaîne' ; chaîne
$b='voici une $a'; voici une $a
Guillemets doubles
$a="chaîne" ;
$b="voici une $a"; chaîne
voici une chaîne
Syntaxe HereDoc
$a="chaîne" ;
$b=<<<MARQUE_DE_FIN chaîne
voici une $a
sur deux lignes ;-) voici une chaîne
MARQUE_DE_FIN; sur deux lignes ;-)
Programmation Web 2017-2018 13:25:40
Concaténation de chaînes
26

Permet d’assembler plusieurs chaînes


Réalisé grâce à l’opérateur point : .

"Bonjour " . "Marcel"


→ vaut "Bonjour Marcel"

$nb = 6*2 ;
"Acheter " . $nb . " oeufs"
→ vaut "Acheter 12 oeufs"

Programmation Web 2017-2018 13:25:40


La commande echo
27

Permet d’afficher une chaine de caractères (« écrire


» la page au format HTML résultant de
l’interprétation de PHP)

echo "Bonjour" ;
$nom="Marcel" ; echo "Bonjour $nom" ;

Plus généralement :

echo "Bonjour", $nom , "Bonjour $nom"

Programmation Web 2017-2018 13:25:40


Hello world !
Interprétation du code
28 PHP sur le serveur
<?php Serveur du résultat au client
$debut = et transmission
<<<HTML
<html>
<head> Navigateur
<title>hello</title>
</head> <html>
<body>\n <head>
HTML; <title>hello</title>
$corps = "Hello world!\n"; </head>
$fin = <<<HTML <body>
</body> Hello world!
</html> </body>
HTML; </html>
/* Envoi au client */
echo $debut.$corps.$fin ;

Impossible de voir le code PHP depuis le navigateur !!


Programmation Web 2017-2018 13:25:40
Les opérateurs arithmétiques
29

$a + $b Somme

$a - $b Différence

$a * $b Multiplication

$a / $b Division

$a % $b Modulo (Reste de la division entière)

Programmation Web 2017-2018 13:25:40


Les opérateurs d’in- et de
dé-crémentation pré- et post-fixés
30

$a++ Retourne la valeur de $a puis augmente la


valeur de $a de 1
++$a Augmente la valeur de $a de 1 puis
retourne la nouvelle valeur de $a
$a-- Retourne la valeur de $a puis diminue la
valeur de $a de 1
--$a Diminue la valeur de $a de 1 puis retourne
la nouvelle valeur de $a

Programmation Web 2017-2018 13:25:40


Les opérateurs de comparaison
31

$a == $b Vrai si égalité entre les valeurs de $a et $b

$a != $b Vrai si différence entre les valeurs de $a et $b

$a < $b Vrai si $a inférieur à $b

$a > $b Vrai si $a supérieur à $b

$a <= $b Vrai si $a inférieur ou égal à $b

$a >= $b Vrai si $a supérieur ou égal à $b

$a === $b Vrai si $a et $b identiques (valeur et type)

$a !== $b Vrai si $a et $b différents (valeur ou type)

Programmation Web 2017-2018 13:25:40


Les opérateurs logiques
32

[Expr1] and [Expr2] Vrai si [Expr1] et [Expr2] sont vraies

[Expr1] && [Expr2] idem

[Expr1] or [Expr2] Vrai si [Expr1] ou [Expr2] sont vraies

[Expr1] || [Expr2] idem

[Expr1] xor [Expr2] Vrai si [Expr1] ou [Expr2] sont vraies


mais pas les deux

! [Expr1] Vrai si [Expr1] est non vraie

Programmation Web 2017-2018 13:25:40


Les opérateurs sur bits
33

$a & $b ET binaire

$a | $b OU binaire

$a ^ $b XOR binaire

~ $a Inversion bit à bit

$a << $b $a décalé à gauche de $b rangs

$a >> $b $a décalé à droite de $b rangs

Programmation Web 2017-2018 13:25:40


Précédence des opérateurs
34

Opérateurs
new
[
++ --
! ~ - (int) (float) (string) (array) (object) @
*/%
+-.
<< >>
< <= > >=
== != === !==
&

Programmation Web 2017-2018 13:25:40


Précédence des opérateurs
35

Opérateurs
^
|
&&
|| En cas de doute,
? : utilisez les parenthèses ;-)
= += -= *= /= .= %= &= |= ^= <<=
>>=
and
xor
or
Programmation Web 2017-2018 13:25:40
Structure de contrôle Si…Alors…
Sinon…
36

if (condition)
{
/* Bloc d’instructions exécuté si la
condition est vraie */
}
[else
{
/* Bloc d’instructions exécuté si la
condition est fausse */
}]

Programmation Web 2017-2018 13:25:40


Structure de contrôle Tant que…
faire…
37

while (condition)
{
/* Bloc d’instructions répété tant que la
condition est vraie */
}

do {
/* Bloc d’instructions exécuté une fois
puis répété tant que la condition est vraie
*/
} while (condition) ;

Programmation Web 2017-2018 13:25:40


Structure de contrôle Tant que…
faire…
38

for(avant; condition; fin_chaque_itération)


{
/* Bloc d’instructions répété tant que la
condition est vraie */
}

Équivalent à:

avant ;
while (condition)
{
/* Bloc d’instructions répété tant que la
condition est vraie */
fin_chaque_itération ;
}
Programmation Web 2017-2018 13:25:40
Structure de contrôle switch…
39

switch (val)
{
case v1:
instructions exécutées si val==v1
case v2:
instructions exécutées si val==v2
ou si val==v1


default:
instructions dans tous les cas
}

Programmation Web 2017-2018 13:25:40


L’instruction break
40

Permet de sortir d’une structure de contrôle


switch (val)
{
case v1:
instructions exécutées si val==v1
break ; /* On sort du switch si val==v1 */
case v2:
instructions exécutées si val==v2
ou si val==v1
break ; /* On sort du switch si val==v2 */

default:
instructions exécutées dans tous les cas
si val!=v1 et val!=v2
}
Programmation Web 2017-2018 13:25:40
Les tableaux
41

Création / initialisation:
$tab1=array(12, "fraise", 2.5) ;

$tab2[] = 12 ; Clé Valeur


$tab2[] = "fraise" ;
$tab2[] = 2.5 ; 0 12
1 "fraise"
$tab3[0] = 12 ; 2 2.5
$tab3[1] = "fraise" ;
$tab3[2] = 2.5 ;

Programmation Web 2017-2018 13:25:40


Les tableaux « à trous »
42

Les éléments du tableaux ne sont pas forcement


d’indices consécutifs : Clé Valeur
0 12
$tab4[0] = 12 ;
$tab4[1] = "fraise" ; 1 "fraise"
$tab4[2] = 2.5 ; 2 2.5
$tab4[5] = "el5" ; 3
4
5 "el5"
Comment parcourir de tels tableaux ?

Programmation Web 2017-2018 13:25:40


Les tableaux « à trous » (suite)
43
Parcours classique : 4
for ($i=0; $i < sizeof($tab4); $i++)
{ echo "tab4[$i]: "
. $tab4[$i] . "<BR>\n";
}
Clé Valeur
0 12
1 "fraise"
2 2.5
3
4
? 5 "el5"
Programmation Web 2017-2018 13:25:40
Structure de contrôle « foreach »…
44

foreach ($tableau as $element)


{
/* Bloc d’instructions répété pour
chaque élément de $tableau */
/* Chaque élément de $tableau est
accessible grâce à $element */
}

Programmation Web 2017-2018 13:25:40


Parcours de tableau : foreach
45

PHP … HTML

… Val:12<br>\n
Val:fraise<br>\n
$tab4[0] = 12 ;
Val:2.5<br>\n
$tab4[1] = "fraise" ; Val:el5<br>\n
$tab4[2] = 2.5 ; …
$tab4[5] = "el5" ;
foreach($tab4 as $v)
{ Navigateur
echo "Val: $v<br>\n";
}

Programmation Web 2017-2018 13:25:40


Tableaux associatifs
46

Tableaux dont l’accès aux éléments n’est plus


réalisé grâce à un index (0,1,…) mais grâce à une clé
de type entier ou chaîne.
Exemples de clés:
$tab['un'] = 12 ;
$tab[205] = "bonjour" ;
$tab["la valeur"] = 3.0 ;
Création
$tab = array(cle1 => val1,
cle2 => val2,
…);
Programmation Web 2017-2018 13:25:40
Tableaux associatifs - Exemples
47

$tab5['un'] = 12 ;
Clé Valeur
$tab5['trois'] = "fraise" ;
"un" 12
$tab5["deux"] = 2.5 ;
$tab5[42] = "el5" ; "trois" "fraise"
"deux" 2.5
42 "el5"

$tab6 = array('un' => 12,


'trois' => "fraise",
"deux" => 2.5,
42 => "el5") ;

Programmation Web 2017-2018 13:25:40


Structure de contrôle « foreach… »
48

foreach($tableau as $cle => $element)


{
/* Bloc d’instructions répété pour
chaque élément de $tableau */
/* Chaque élément de $tableau est
accessible grâce à $element */
/* La clé d’accès à chaque élément est
donnée par $cle */
}

Programmation Web 2017-2018 13:25:40


Parcours de tableau
49
<?php
$html = <<<HTML
<html>
<head><title>foreach clé</title>
</head>
<body>
HTML;
$tab6 = array('un' => 12,
'deux' => "fraise",
"trois" => 2.5,
"quatre" => "el5") ;
foreach ($tab6 as $cle => $val)
{
$html .= "tab[$cle]: $val<br>\n" ;
}
echo $html . "</body>\n</html>" ;

Programmation Web 2017-2018 13:25:40


Exemple de génération de code
HTML
50
<?php
$html = <<<HTML
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<title>Boucle</title>
</head>
<body>
HTML;
for ($i=1; $i<20; $i++) {
$html .= "Le serveur compte... "
. $i . "<br>\n" ;
}
$html .= <<<HTML
</body>
</html>
HTML;
echo $html ;

Programmation Web 2017-2018 13:25:40


Traitement des données de
formulaires
51

PHP permet de traiter les données saisies grâce à un


formulaire HTML si le champ ACTION du formulaire
désigne une page PHP du serveur.

Après récupération par le serveur Web, les données sont


contenues dans l'une des variables superglobales de type
tableau associatif $_GET ou $_POST (ou $_REQUEST).

La valeur peut être trouvée grâce à une clé qui porte le
même nom que le champs du formulaire de la page HTML
de saisie (attribut name).

Programmation Web 2017-2018 13:25:40


Traitement des données de
formulaires
52
Client
Navigateur
Réseau  HTML
nomPers=robert
 JavaScript
 CSS

<html>
<head>
Serveur
<title>bonjour</title> nomPers
</head>
Serveur Web
<body> <?php
Bonjour robert ! $html = <<<HTML
</body> <html>
</html> <head><title>bonjour</title></head>
Module PHP <body>
HTML;
robert
$html .= "Bonjour ".$_GET['nomPers']." !\n" ;
echo $html . "</body>\n</html>" ;

Programmation Web 2017-2018 13:25:40


Exemple – Formulaire HTML
53

<!DOCTYPE html>
<html>
<head>
<title>formulaire</title>
</head>
<body>
<form action="valide1.php" method="get">
Nom: <input type="text" name="nomPers">
<input type="submit" value="Envoyer">
</form>
</body>
</html>

Programmation Web 2017-2018 13:25:40


Exemple – Traitement en PHP
54
<?php
$html = <<<HTML
<!DOCTYPE html>
<html>
<head>
<title>Validation</title> $_GET['nomPers']
</head> est-il défini ?
<body>
HTML;
if (isset($_GET['nomPers'])) $_GET['nomPers']
{
if (!empty($_GET['nomPers'])) est-il vide ?
{
$html .= "Vous avez saisi '"
.$_GET['nomPers']."'\n" ;
}
else
$html .= "Aucune valeur saisie\n";
}
else
$html .= "Utilisation incorrecte\n" ;
echo $html . "</body>\n</html>" ;
Programmation Web 2017-2018 13:25:40
Formulaires contenant des champs
« SELECT »
55

Programmation Web 2017-2018 13:25:40


Formulaires contenant des champs
« SELECT unique»
56

<!DOCTYPE html>
<html>
<head>
<title>Formulaire de saisie des fruits</title>
</head>
<body>
<form action="valide3.php" method="get">
Choisissez des fruits:&nbsp;
<select name="sel">
<option>Fraise
<option>Pomme
Envoyer <option>Poire
<option>Banane
<option>Cerise
</select>
<input type="submit" value="envoyer">
</form>
</body> valide3.php?sel=Pomme
</html>
Programmation Web 2017-2018 13:25:40
Formulaires contenant des champs
« SELECT multiple»
57
<!DOCTYPE html>
<html>
<head>
<title>Formulaire de saisie des fruits</title>
</head>
<body>
<form action="valide3.php" method="get">
Choisissez des fruits:&nbsp;
<select name="sel" multiple>
<option>Fraise
<option>Pomme
<option>Poire
Envoyer <option>Banane
<option>Cerise
</select>
<input type="submit" value="envoyer">
</form>
</body>
</html>
valide3.php?sel=Pomme&sel=Poire ???
Programmation Web 2017-2018 13:25:40
Formulaires contenant des champs
« SELECT multiple»
58
<html>
<head>
<title>Formulaire de saisie des fruits</title>
</head>
<body>
<form action="valide3.php" method="get">
Choisissez des fruits:&nbsp;
<select name="sel[]" multiple>
<option>Fraise
<option>Pomme
<option>Poire
Envoyer <option>Banane
<option>Cerise
</select>
<input type="submit" value="envoyer">
</form>
</body> valide3.php?sel%5B%5D=Pomme&sel%5B%5D=Poire
</html>
valide3.php?sel[]=Pomme&sel[]=Poire

Programmation Web 2017-2018 13:25:40


Traitement des données des champs
« SELECT »
59

<?php
$html = <<<HTML
<!DOCTYPE html>
<html>
<head>
<title>Liste de fruits</title>
</head> $_GET[‘sel']
<body> est un tableau
HTML;
if (isset($_GET['sel']) && !empty($_GET['sel']))
{/* La variable $_GET['sel'] est définie
et elle n'est pas vide */
foreach($_GET['sel'] as $fruit)
$html .= "Vous avez choisi $fruit<br>\n" ;
}
else
$html .= "Vous n'avez pas choisi de fruit\n" ;
echo $html . "</body>\n</html>" ;

Programmation Web 2017-2018 13:25:40


Résultat
60

Programmation Web 2017-2018 13:25:40


Formulaires contenant des champs
« CHECKBOX »
61

Programmation Web 2017-2018 13:25:40


Formulaires contenant des champs
« CHECKBOX »
62

<!DOCTYPE html>
<html>
<head>
<title>Formulaire de saisie des fruits</title>
</head>
<body>
<form name="formu" action="valide3.php" method="get">
Choisissez des fruits&nbsp;:<br>
<input type="checkbox" name="sel[]" value="Fraise">Fraise<br>
<input type="checkbox" name="sel[]" value="Pomme" >Pomme <br>
<input type="checkbox" name="sel[]" value="Poire" >Poire <br>
<input type="checkbox" name="sel[]" value="Banane">Banane<br>
<input type="checkbox" name="sel[]" value="Cerise">Cerise<br>
<input type="submit" value="Envoyer">
</form>
</body>
</html>

Programmation Web 2017-2018 13:25:40


Résultat
63

Programmation Web 2017-2018 13:25:40


Références
64

$a = 12 ;
$a 84
12
$b = $a ;
$c = &$a ; $b "coucou"
12
$b = "coucou" ;
$c "hello"
$c = 84 ;
echo "\$a : $a\n" ; $a : 84
echo "\$b : $b\n" ; $b : coucou
echo "\$c : $c\n" ;
unset($c) ; $c : 84
$c = "hello" ;

Programmation Web 2017-2018 13:25:40


Fonctions utilisateur
65

Description d’une fonctionnalité dépendant


éventuellement de paramètres et retournant
éventuellement un résultat
Définition
function moyenne($a,$b)
{
return ($a+$b)/2. ;
}
Utilisation
$resultat = moyenne(2,4) ;
echo $resultat ; // vaut 3
Programmation Web 2017-2018 13:25:40
Fonctions utilisateur
66
Valeur de retour
function moyenne($a,$b)
{ … }

Typage faible de PHP :


Aucune information
Arguments
function moyenne( $a, $b)
{ … }
Typage faible de PHP :
Aucune information

Programmation Web 2017-2018 13:25:40


Mode de passage des arguments (types
natifs)
67

<?php
function permutation($x, $y) {
echo "permutation..." ;
$t = $x ; Permutation impossible :
$x = $y ;
$y = $t ; Passage des arguments
} des fonctions par valeur
$a = 12 ;
$b = 210 ;
echo "\$a = $a" ;
echo "\$b = $b" ; $a = 12
permutation($a, $b) ; $b = 210
echo "\$a = $a" ; permutation...
echo "\$b = $b" ; $a = 12
?> $b = 210

Programmation Web 2017-2018 13:25:40


Mode de passage des arguments (types
natifs)
68

<?php
function permutation(&$x, &$y) {
echo "permutation..." ;
$t = $x ;
$x = $y ; Permutation
$y = $t ;
} réussie
$a = 12 ;
$b = 210 ;
echo "\$a = $a" ;
echo "\$b = $b" ; $a = 12
permutation($a, $b) ; $b = 210
echo "\$a = $a" ; permutation...
echo "\$b = $b" ; $a = 210
?> $b = 12

Programmation Web 2017-2018 13:25:40


Arguments par défaut des fonctions
69
Valeur par défaut d’un argument s’il n’a pas été
défini lors de l’appel de la fonction
function bonjour($nom="inconnu")
{ echo "Bonjour cher $nom" ; }

Utilisation
bonjour() ;
Bonjour cher inconnu
bonjour("Marcel") ;

Bonjour cher Marcel

Programmation Web 2017-2018 13:25:40


Définition de fonctions fréquemment
utilisées
70

Certaines fonctions sont utilisées dans plusieurs


scripts PHP
Comment faire pour ne pas les définir dans chacune
des pages ?
Utilisation de :
 include("fichier") ;
 require("fichier") ;
 include_once("fichier") ;
 require_once("fichier") ;
Permet d’inclure le contenu de fichier dans le
script courant

Programmation Web 2017-2018 13:25:40


include et require
71 Fichier utilisation1.php

Fichier mafonction.php require("mafonction.php")
<? mafonction(true) ;
function mafonction($arg) …
{
if (isset($arg)) Fichier utilisation2.php
{
echo ("Vrai") ; …
} include("mafonction.php")
else …
{ $var=false ;
echo ("Faux") ; mafonction($var) ;
} …
}
?> Fichier utilisation3.php

require("mafonction.php")

Programmation Web 2017-2018 13:25:40


Définition de constantes
72
<?php
define("ma_constante", "Bonjour à tous") ;

nom valeur

Définition d'une constante


echo ma_constante ;
?>

Utilisation de la constante (sans $)

Programmation Web 2017-2018 13:25:40


Gestion des erreurs
73

Dans certains cas, il n’est ni possible ni utile de


poursuivre l’exécution du code PHP (variables non
définies, valeurs erronées, échec de connexion, …)
Arrêt brutal de l’exécution du code:
 die(message)
 exit(message)

Envoie message au navigateur et termine


l’exécution du script courant

Programmation Web 2017-2018 13:25:40


Gestion des erreurs – (Mauvais) Exemple
74

<?php PHP <html> HTML


$html = <<<HTML <head>
<html> <title>die-exit</title>
<head> </head>
<title>die-exit</title> <body>
</head> problème val
<body>
HTML;
if (!isset($val)) { HTML non valide…
die($html."problème val") ;
/* Au delà de ce point, Navigateur
fin du script */
} problème val
$html .= <<<HTML
Choix: $val
</body>
</html>

Programmation Web 2017-2018 13:25:40


Gestion de l'affichage des erreurs
75
int error_reporting ( [int level] )
Constante
Ancien niveau d'erreur E_ERROR
E_WARNING
Sur un serveur en E_PARSE
Débogag
production, toute E_NOTICE
erreur affichée E_CORE_ERROR
donne des indices sur E_CORE_WARNING
les scripts et rend le E_COMPILE_ERROR
site vulnérable E_COMPILE_WARNING
E_USER_ERROR
php.ini E_USER_WARNING
E_USER_NOTICE
display_errors boolean E_ALL
Programmation Web 2017-2018 E_STRICT
13:25:40
Opérateur de contrôle d'erreur
76

$v = file("dummy.txt") Fichier absent


or die("Problème de lecture") ;
Warning: file(dummy.txt): failed to open
stream: No such file or directory in
dummy.php on line 68
Problème de lecture

$v = @file("dummy.txt")
or die("Problème de lecture") ;
Problème de lecture

Programmation Web 2017-2018 13:25:40


Chargement de fichiers (I)
77
 Les formulaires permettent de transmettre
 des informations sous forme de chaînes de caractères
 un fichier vers le serveur.
 C’est la balise HTML suivante : <input type=‘’file’’ /> qui permet le chargement de fichiers.
La balise FORM doit nécessairement posséder l’attribut ENCTYPE de valeur
‘’multipart/form-data’’. La méthode utilisée sera POST. De plus, il est utile d’imposer au
navigateur une taille de fichier limite par le paramètre MAX_FILE_SIZE dont la valeur
numérique a pour unité l’octet.
 Exemple :
echo ‘’<form action=\‘’ $_SERVER['PHP_SELF']
\’’ method=\‘’POST\’’ ENCTYPE=\‘’multipart/form-data\’’>\n
<input type=\‘’hidden\’’ name=\‘’MAX_FILE_SIZE\’’ value=\‘’1024000\’’
/>\n
<!-- MAX_FILE_SIZE doit précéder le champ input de type file -->
<input type=\‘’file\’’ name=\‘’mon_fichier\’’ /><br />\n
<input type=\‘’submit\’’ value=\‘’envoyer\’’ />\n
</form>\n’’;

Programmation Web 2014-2015 13:25:40


Chargement de fichiers (II)
78
 Pour récupérer le fichier, il faut utiliser la variable d’environnement $_FILES qui
est un tableau associatif dont les champs sont les noms des champs HTML file du
formulaire. Par exemple : $_FILES[‘mon_fichier‘] où mon_fichier est le
nom donné au champs du formulaire HTML de type file.
 La variable $_FILES[‘mon_fichier‘] est elle aussi un tableau associatif
possédant les champs suivants :

Champ Description
name nom du fichier chez le client
type type MIME du fichier
size taille du fichier en octets
tmp_name nom temporaire du fichier sur le serveur
 Si aucun fichier n’a été envoyé par le client, la variable mon_fichier vaudra la
chaîne de caractères : ‘’none’’ ou bien ‘’’’ (chaîne vide).
 La durée de vie du fichier temporaire sur le serveur est limitée au temps
d’exécution du script. Pour pouvoir exploiter ultérieurement le fichier sur le
serveur, il faut le sauvegarder dans un répertoire et lui donner un vrai nom.

Programmation Web 2014-2015 13:25:40


Classes (I)
79
 Php supporte la programmation orientée objet à l’aide de classes.

 Exemple :
class Voiture { // déclaration de la classe
private $couleur; // déclaration d’un attribut
private $belle = TRUE; // initialisation d’un attribut
function voiture() { // constructeur
$this->couleur = ‘’noire’’;
} // le mot clé $this faisant référence à l’objet est obligatoire
function Set_Couleur($couleur) {
$this->couleur = $couleur;
}
}
$mavoiture = new Voiture(); // création d’une instance
$mavoiture->Set_Couleur(‘’blanche’’); // appel d’une méthode
$coul = $mavoiture->couleur; // appel d’un attribut

Programmation Web 2014-2015 13:25:40


Les Cookies
80
Le protocole HTTP est dit "stateless", ou autrement dit sans état. Pour
un serveur, chaque requête qu'il reçoit est indépendante de la
précédente, ainsi que de la suivante
Un cookie est un petit fichier texte (inoffensif donc), crée par le serveur.
En rajoutant l'en-tête Set-cookie, dans sa réponse, le serveur indique au
client qu'il souhaite y stocker un cookie. Le client peut décider, ou
non, de s’exécuter et de créer le cookie demandé.
S'il l'accepte, le navigateur client va ensuite joindre le cookie à l'en-tête
de toutes ses requêtes vers le même domaine.
Un cookie est cependant limité en taille, 4Ko maximum.
Lorsque PHP récupère les cookies en début de traitement, il les place
dans un tableau superglobal accessible via $_COOKIE.
Les cookies sont classés par site web

Programmation Web 2014-2015 13:25:40


Utilisation des Cookies
81
Un cookie est crée avec setcookie() qui doit être appelée avant toute
sortie
setcookie(name, value, expire, path, domain);
Exemple :
<?php
$cookie_name = "user";
Valeur du cookie
$cookie_value = "John Doe";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/");
// 86400 = 1 day
?> Nom du cookie
<html> Date d’expiration

<body>
Le chemin pour lequel
le cookie est valable
<?php
echo "Cookie is set.";
?>
Programmation Web 2014-2015 13:25:40
Utilisation des Cookies
82
On retrouve le cookie dans le tableau superglobal $_COOKIES
Exemlpe : retrouver le cookie nommé « user »
<?php
$cookie_name = "user";
if(!isset($_COOKIE[$cookie_name]))
{
echo "Cookie named '" . $cookie_name . "' does not exist!";
}
else
{
echo "Cookie is named: " . $cookie_name . "<br>Value is: " .
$_COOKIE[$cookie_name];
}
?>

Programmation Web 2014-2015 13:25:40


Utilisation des Cookies
83

Pour modifier un cookie on utilise la fonction setcookie


avec le même nom du cookie.
Pour supprimer un cookie utiliser setcookie avec une date
d’expiration dans le passé.
<?php
$cookie_name = "user";
unset($_COOKIE[$cookie_name]);
// empty value and expiration one hour before
$res = setcookie($cookie_name, '', time() - 3600);
?>

Programmation Web 2014-2015 13:25:40


Les sessions
84
 La session est un mécanisme qui permet à PHP de garder "en mémoire" un
nombre illimité de valeurs entre plusieurs requêtes d'un même utilisateur.
 Cette méthode permet de sécuriser un site, d’espionner le visiteur, de
sauvegarder son panier (e-commerce), etc.

 Les informations de sessions sont conservées sur le serveur tandis qu’un


identifiant de session est posté sous la forme d’un cookie chez le client (ou via
l’URL si le client refuse les cookies).

 Quelques fonctions :
 session_start() : démarre une session
 session_destroy() : détruit les données de session et ferme la session
 $_SESSION[‘’var’’]=val : enregistre la variable $var dans la session en
cours,
 Unset($_SESSION[‘’var’’]) : détruit la variable $_SESSION[‘’var’’] de la
session en cours

Programmation Web 2014-2015 13:25:40


Les sessions
85
Pour débuter une session il existe deux façons:
automatique sur toutes vos pages si l'option session.auto_start est égale
à 1 ou on. Cette option a pour valeur par défaut 0 ou off.
démarrage explicite et manuel de la session en utilisant la fonction
session_start(). Elle permet non seulement de créer une session, mais
aussi de restaurer une session via l'identifiant de session.
Session_start doit être appelée avant toute sortie (echo,print…)
Pour sauvegarder une variable on utilise le tableau superglobal
$_SESSION
<?php
session_start(); // Création de la session
$_SESSION['prenom'] = 'Jean-Pierre'; // Sauvegarde dans la session la variable "prenom"
?>
 Récupérer une variable :
 <?php echo $_SESSION['prenom']; ?>

Programmation Web 2014-2015 13:25:40


Les sessions
86
Une session est automatiquement fermée si aucune requête n’a été
envoyée au serveur par le client durant un certain temps (2 heures
par défaut dans les fichiers de configuration Apache).
Les données de session étant sauvegardées sur le serveur, l’accès aux
pages n’est pas ralenti même si des données volumineuses sont
stockées
pour supprimer une variable de session :
Unset($_SESSION[‘prenom’]);
La fonction session_destroy() met fin à une session (en cas de
déconnexion)
<?php
if (session_destroy())
{ echo 'Session détruite !'; }
else
{ echo 'Erreur : impossible de détruire la session !'; } ?>

Programmation Web 2014-2015 13:25:40