Cours de PHP - univ-lille.frlagis-vi.univ-lille1.fr/~lo/ens/ancien/emsi_mp/php_cours.pdf ·...
Transcript of Cours de PHP - univ-lille.frlagis-vi.univ-lille1.fr/~lo/ens/ancien/emsi_mp/php_cours.pdf ·...
1
P H PP H P
Olivier LOSSON
École Marocaine des Sciences de l'Ingénieur (EMSI) Master Maintenance et Production (MP)
2
Introduction (1)Introduction (1)
Architecture client/serveur
3
Interprétation d'unepage HTML
client
serveur web
Requête (URL)
Envoi de la page HTML
Interprétation et affichage de la page par le navigateur
Introduction (2)Introduction (2)
4
Interprétation d'unepage PHP
clientserveur web
Requête (URL)
Envoi de la page HTML
Interprétation et affichage de la page par le navigateur
Interprétation
Interpréteur PHP
Page HTML aveccode PHP intégré
Page HTML complétée du résultat de
l’exécution du code PHP
Base dedonnées
Introduction (2)Introduction (2)
5
Introduction (3)Introduction (3)
Principe de PHP langage interprété exécuté côté serveur
Atouts gratuit, performant, open source création de pages web dynamiques script inclus au sein d'une page HTML interfaçage avec BDs
MySQL Oracle
intégration à plusieurs serveurs web (Apache, IIS, …) extensions et fonctions (>2000) très documentées
dBase … (ODBC) Informix
requête
résultat
www.domaine.fr/page.php
interpréteur
page.phprequête
résultat
www.domaine.fr/page.php
interpréteur
page.php
page (HTML)
6
Introduction (4)Introduction (4)
Codage 1 seul fichier ".php" = code HTML + code PHP inclusion dans le code HTML par les balises
<?php…
?> Exécution par le serveur
lecture du fichier PHP rencontre de "<?php" ⇒ passage en mode PHP exécution de chaque instruction par l'interpréteur transmission du résultat au client (code HTML pur)
Le script PHP n’est jamais visible par l’utilisateur
7
Code PHP<html><head><title>Exemple simple</title></head><body><?phpprint "Bonjour tout le monde";
?></body></html>
Début desection PHP
Fin desection PHP
Fin d'instruction
Introduction (5) : ex. simpleIntroduction (5) : ex. simple
8
Introduction (5) : ex. simpleIntroduction (5) : ex. simple
Code HTML résultant de l’interprétation<html><head><title>Exemple simple</title></head><body>Bonjour tout le monde</body></html>
9
I. BasesI. Bases
1. Syntaxe Commentaires
// sur une ligne /* sur plusieurs
lignes */ Expressions terminées par un ; Variables
Noms– introduits par un $– commencent par _ ou une lettre– sensibles à la casse
Déclaration : aucune, seult. initialisation (typage faible) Conversions de type automatiques : $age=18+ "2";
10
I. BasesI. Bases
2. Opérateurs affectation = comparaison
égalité = = identité (même type) = = = inégalité > , < , <= , >= différence != logiques && , | | , !
arithmétiques + , - , * , / , % concaténation . (point)
Exemple : print "Age : ".$age." ans" ;
11
I. BasesI. Bases
3. Production de code source HTML production (affichage) de texte brut
print "Bonjour tout le monde"; production de code HTML (texte+balises)
print "<b>Bonjour</b> tout le monde"; code HTML : <b>Bonjour</b> tout le monde page web : Bonjour tout le monde
print "<i>Salut</i><br>à\ntous"; code HTML : <i>Salut</i><br>à
tous page web : Salut
à tous
12
I. BasesI. Bases
3. Production de code source HTML (2) affichage d'une variable
instruction print ou echo (nombres et chaînes)$ch = "Bonjour tout le monde";print $ch;
fonction print_r (toutes variables, dont tableaux)$tab = array(3,2,1);print_r ($tab); code HTML : Array
( [0] => 3 [1] => 2 [2] => 1)
page web :Array ( [0] => 3 [1] => 2 [2] => 1 )
13
I. BasesI. Bases
3. Production de code source HTML (3) Guillemets simples ou doubles ?
simples : pas d'interprétation des variables internes (VI) doubles : interprétation des VI et séquences d'échappement
Exemples
code PHP code HTML page web$age = ٢٣;$nom = 'toto'; //ou : $nom="toto";
mon nom est toto mon nom est toto mon nom est $nom mon nom est $nom mon nom est toto mon nom est toto mon nom est <b>toto</b> mon nom est <b>$nom</b>
print "mon nom est $nom";print 'mon nom est $nom';print 'mon nom est '.$nom;print "mon nom est <b>$nom</b>"; mon nom est totoprint 'mon nom est <b>$nom</b>'; mon nom est $nom
14
I. BasesI. Bases
3. Production de code source HTML (4) Échappement
Nécessité d'échapper certains caractères :Exemple : print "<a href=\"page.php\">";
Le caractère \ affiche tel quel celui qui suit Exceptions : séquences ayant une signification particulièr
\t = tabulation\n = retour à la ligne (DANS LE SOURCE HTML)
Exemplecode PHP code HTML page web
$age = ٢٣;$nom = 'toto'; //ou : $nom="toto"; print "Je m'appelle\n \"$nom\" <br>et j'ai ".$age.' ans';
je m'appelle "toto" <br>et j'ai 23 ans
je m'appelle "toto" et j'ai 23 ans
15
I. Bases -I. Bases - Structures de contrôle (1) Structures de contrôle (1)
Structures de contrôle testsif (condition1) {
instructions1}elseif (condition2) {
instructions2}...else {
instructionsN}
sélectionswitch (variable) {
case valeur1:instructions1break;
case valeur2:instructions2break;
...default:
instructionsbreak;
}
16
I. Bases -I. Bases - Structures de contrôle (2) Structures de contrôle (2)
Boucles for
for(<initialisations>;<test continuer tq>;<faire a chaque tour>) {
instructions} ex. for ($i=1; $i<6; $i++){
echo "$i<br>";}
whilewhile (condition) {
instructions}
do {instructions
} while (condition)
17
PHP - Tableaux (1)PHP - Tableaux (1)
Généralités types de tableaux
tableau " numérique" (index num., à partir de 0) tableau associatif (hash array) (associations clé=>valeur)
principe : pointeur interne repérant l'élément courantTableau numérique Tableau associatif
décl
arat
ion
(opt
ionn
elle
)
$nomTab = array(elt١,elt٢,…); $nomTab = array(cle١=>elt١,cle٢=>elt٢,…);
affe
ctat
ion
$nomTab[٠] = "pomme";$nomTab=("pomme","banane");
$nomTab["fruit١"] = "pomme";$nomTab=("fruit٢"=>"banane","fruit١"=>"pomme");
ajou
t élt
$nomTab[] = "orange"; $nomTab["fruit٣"] = "orange";
18
PHP - Tableaux (2)PHP - Tableaux (2)
Accès et parcours accès dans "…" : print "Salut {$tab['clef']}"; créer tab à partir de variables : list($var1, $var2,…) retourner élément courant et pointer sur suivant : each()
retourne FALSE si pointeur au-delà de la fin du tableau parcourir
tableau numériquewhile (list(, $value) = each($arr)) {//ou: foreach ($arr as $value){ echo "Valeur : $value<br>\n";}
tableau associatifwhile (list($key,$value) = each($arr)) { //ou: foreach ($arr as $key => $value){ echo "Clé : $key; Valeur : $value<br>\n";}
19
PHP - Tableaux (3)PHP - Tableaux (3)
Fonctions nb éléments : sizeof() ou count() élément courant : index : key() , valeur : current() déplacer le pointeur : reset() , end() , next() , prev() trier : sort() , rsort() , usort() scinder chaîne en tableau : explode() , split() fusionner tableau en chaîne : implode() alias join()
et aussi … retrouver clé, valeur : array_key_exists() , array_search() ensembles des clés, valeurs : array_keys() , array_values() différence de tableaux : array_diff() , array_diff_assoc() intersection : array_intersect() , array_intersect_assoc() fusionner, inverser : array_merge() , array_reverse()
20
PHP - Fonctions (1)PHP - Fonctions (1)
Principe pas de différence fonction/procédure à déclarer avant utilisation (pas de prototypes) 0..n paramètresfunction nom_fonc($arg1, ... ) {instructions}
retour d'un résultatreturn $resultat;
appel[$retour = ] nom_fonc ($valArg1, ... );
21
PHP - Fonctions (2)PHP - Fonctions (2)
Paramètres portée des variables
paramètres : visibles que dans la fonction utilisation d'une variable globaleglobal $varGlobale //déclaration dans fonction
optionnels (en fin de liste): donner une valeur par défaut, qui peut être scalaire, tableau ou NULL function myfunc( $param1="inconnu", $param2="" ) {
echo "param1=$param1 param2=$param2\n"; }
myfunc("toto", "titi");myfunc("toto");myfunc();
22
PHP - Fonctions (3)PHP - Fonctions (3)
Passage de paramètres par valeur (défaut) par référence (=par adresse) : ajouter un & au param.
dans les paramètres transmis à l'appel pr un passage ponctuel dans l'en-tête (déclaration) pour un passage systématique
function my_func( &$chaine ) {$chaine.=', etc.";
}$str = 'bla bla';my_func($str);echo $str;//'bla bla, etc.'
function my_func( $chaine ) {$chaine.=', etc.";
}$str = 'bla bla';my_func($str);echo $str; //'bla bla'my_func(&$str);echo $str; //'bla bla, etc.'
23
PHP - Traitement des erreursPHP - Traitement des erreurs
Gestionnaire d'erreur standard dès l'erreur, PHP envoie le message (script, ligne, …)
au navigateur sans tenir compte du code HTML en cours de sortie
Gestion d'erreur personnalisée But
Ne pas exposer l'utilisateur à des messages d'erreur Les msgs PHP/MySQL peuvent renseigner un pirate
Implantation simple @ devant un nom de f° évite les messages d'erreur PHP die() alias exit() termine le script et affiche son arg. Utilisation : @nom_fonc(…) or die("message si err");
24
PHP et pages web dynamiques (1)PHP et pages web dynamiques (1)
Interfaçage avec formulaire HTML Principe
nommer les éléments du formulaire donnée lue dans $_POST[] ou $_GET[], selon la méthode utilisée
Illustration form.html
<FORM action='traiter.php' method='POST'> Prénom <INPUT name='prenom' type='text'> <INPUT type='submit'></FORM>
25
PHP et pages web dynamiques (1)PHP et pages web dynamiques (1)
Interfaçage avec formulaire HTML Principe
nommer les éléments du formulaire donnée lue dans $_POST[] ou $_GET[], selon la méthode utilisée
Illustration form.html
<FORM action='traiter.php' method='POST'> Prénom <INPUT name='prenom' type='text'> <INPUT type='submit'></FORM>
traiter.php<?php print_r($_POST);?>
Olivier|Array ( [prenom] => Olivier )
26
PHP et pages web dynamiques (1)PHP et pages web dynamiques (1)
Interfaçage avec formulaire HTML Principe
nommer les éléments du formulaire donnée lue dans $_POST[] ou $_GET[], selon la méthode utilisée
Illustration form.html
<FORM action='traiter.php' method='GET'> Prénom <INPUT name='prenom' type='text'> <INPUT type='submit'></FORM>
traiter.php<?php print_r($_GET);?>
Array ( [prenom] => Olivier )
Les données de formulaire figurent dans l'URL
29
PHP - Interfaçage avec un SGBD (1)PHP - Interfaçage avec un SGBD (1)
Principales étapes (ex. de mySQL)
se connecter au serveur de la BD :mysql_connect($host, $user,$password)
choisir la base : mysql_selectdb($bdd) exprimer une requête : $id_rq=mysql_query($ch_req) lire une ligne du résultat (pour une requête sélection) : mysql_fetch_row($id_rq) ou mysql_fetch_object($id_rq)
se déconnecter : mysql_close()
30
PHP - Interfaçage avec un SGBD (2)PHP - Interfaçage avec un SGBD (2)
Exemple<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//FR"><html><head><title>Promotion</title></head><body><table border="1" cellpadding="0" cellspacing="0"><tr><th>Nom</th><th>Adresse mail</th></tr><?php
//Paramètres de connexion$host="localhost"; //machine hébergeant le SGBD$user="lo"; //votre login$password="cmoi"; //mot de passe$bdd="etudiants"; //nom de la basemysql_connect($host, $user,$password) or
die("erreur de connexion au serveur");mysql_selectdb($bdd) or
die("erreur de connexion à la base");
31
PHP - Interfaçage avec un SGBD (3)PHP - Interfaçage avec un SGBD (3)
// Création et envoi de la requête$ch_req ="SELECT nom,mail FROM Promo ORDER BY nom";$result = mysql_query($ch_req);// Récupération des résultatswhile($ligne = mysql_fetch_row($result)){
$nom=$ligne[0];$mail=$ligne[1];print "<tr>\n<td>";print "<a href=\"$mail\">$nom</a>";print "</td>\n<td>$mail</td>\n</tr>\n";
}// Déconnexion de la base de donnéesmysql_close();
?></tr></table></body></html>
29
Sessions (1)Sessions (1)
Utilité Transmettre des variables de page en page (ex. login) Conserver des informations le temps d'une visite
Mécanisme Session = fichier sur le serveur Accessible de tous les scripts
Caractérisée par un identifiant généré à la création de la session une période de validité limitée
maximale détruite à la fermeture du navigateur du client
30
Sessions (2)Sessions (2)
Tableau et fonctions $_SESSION
tableau associatif global contenant toutes les variables de session pour la sessions courante (clés = noms)
session_start() démarre une session ou en rappelle une existante doit être appelée dans tous les scripts, avant tout écho
session_destroy() détruit une session (mais pas les variables associées) destruction explicite des variables (ex. deconnexion.php)$_SESSION = array();
31
Conseils (1)Conseils (1)
PHP et HTML De HTML à PHP
Former le code HTML souhaité (mentalement ou par écrit) Identifier les parties statiques (HTML) / dynamiques (PHP) Dans les parties dynamiques, identifier
– les boucles– l'utilisation de données issues de formulaires/de BD
Section PHP ou HTML ? PHP pour les parties dynamiques et statiques limitées HTML pour les parties statiques étendues Éviter une alternance trop fréquente HTML/PHP, donc les
sections PHP très courtes
32
Conseils (2)Conseils (2)
Optimiser le code Utiliser au maximum les fonctions intégrées. Ex.:
print '<tr>';foreach ($tab as $value){
print '<td>'.$value.'</td>';}print '</tr>';peut être remplacé parprint '<tr><td>'.join('</td><td>',$tab).'</td></tr>';
Créer du code générique Écriture de pages paramétrées Écriture de fonctions paramétrées Création de bibliothèques de fonctions Création de scripts
33
Conseils (3)Conseils (3)
Erreurs courantes Erreurs de syntaxe
Message : Parse error: syntax error, unexpected <TYPE> on line <L>Sol.: point-virgule manquant à la fin de la ligne L-1
Message : Parse error: syntax error, unexpected <CAR> in ...Sol.: oubli du $ introduisant les noms de variables
Message : Parse error: syntax error, unexpected $end on line <L>Sol.: chaîne/bloc non refermé (bien avant la fin de section PHP en L)
Erreurs MySQL Message : Warning: mysql_fetch_row(): supplied argument is not a
valid MySQL result ressource in ... on line <L>Pb.: requête incorrecte dans le mysql_query($ch_req) précédant L.Sol.: 1) print($ch_req);
2) tester et corriger la requête $ch_req sous phpMyAdminou: if ($res==FALSE) print mysql_error();
34
Conseils (4)Conseils (4)
Erreurs courantes (suite) Autres
dans tests : = au lieu de ==, oubli des parenthèses dans boucles do ou while : oubli d'incrémentation de la variable testée
Niveau de rapport d'erreurs Niveaux : E_ERROR, E_WARNING, E_PARSE, E_NOTICE Fixer
dans php.ini : error_reporting=E_ALL ou =E_ALL & ~E_NOTICE à l'exécution (dans script) : error_reporting(<niveau>)
Conseillés en développement (débogage) : E_ALL ou E_ALL & ~E_NOTICE en production (en ligne) : - dans php.ini : display_errors FALSE
- dans le script : error_reporting(0)
35
RéférencesRéférences
Manuels en ligne : http://www.php.net/manual/fr/ compilés : http://fr3.php.net/download-docs.php
Tutoriels http://fr.wikibooks.org/wiki/Programmation_PHP http://www.phpfrance.com/tutoriaux/index.php/toc/home http://www.toutestfacile.com
Cours en ligne http://www.cdprof.com/formation/formation_php.php http://www.grappa.univ-lille3.fr/polys/php/ http://thierrylhomme.developpez.com/php/ultra_php/ http://www.laltruiste.com/coursphp/sommaire.html http://php.developpez.com/cours/
36
Compléments (1)Compléments (1)
Tests sur variables test : variable définie ? isset($var) désallocation unset($var) connaître le typegettype(), is_array(), is_int(), is_float()
Conversions de type automatiques, en fonction de la valeur de la variable manuelles
fonction settype() casting : (string) (int) (real) (array)
37
Compléments (2)Compléments (2)
Fonctions de protection de chaînes addslashes()
Échappe les caractères ( ' , " , \ , NUL) qui doivent l'être pour être utilisés dans une requête de base de données
Fonction inverse : stripslahes() Rem. si la directive magic_quotes_gpc est à on dans
php.ini, la fonction addlslashes() est appliquée sur toutes les données GET, POST, COOKIE
htmlspecialchars() Convertit les caractères spéciaux HTML ( & , " , ' , < , > )
en leur entité HTML (& , " , ' , < , > ) htmlentities() traduit en entité HTML tous les caractères
ayant un équivalent. Inverse : html_entity_decode()
38
Compléments (3)Compléments (3)
Dates et heures Timestamp UNIX
nb secondes écoulées depuis le 01/01/1970 00:00:00 GMT générer un timestamp : time(), mktime()ou strtotime()
Fonctions de dates/heures ajout de périodes : strtotime() formatage : date() ou strftime() test de validité de date : checkdate() retour d’un tableau associatif (clés)
– getdate (seconds, minutes, hours, mday, wday, mon, year, yday, weekday, month)
– gettimeofday (sec,usec, minuteswest, dsttime)
39
Compléments (4)Compléments (4)
Variables prédéfinies (tableaux superglobaux) $_SERVER
['SERVER_NAME']=nom du serveur exécutant le script ['DOCUMENT_ROOT']=chemin du rép racine du serveur ['PHP_SELF']=nom complet du script courant ['REMOTE_ADDR']=adresse IP du client ['HTTP_USER_AGENT']=navigateur du client
$GLOBALS=variables globales déclarées $_POST, $_GET=valeurs saisies par formulaire $_SESSION=valeurs des variables de session
40
Compléments (5)Compléments (5)
Constantes déclaration : define("nom_const","valeur") utilisation : echo "nom_const vaut ".nom_const;
Constantes prédéfinies (extrait) __FILE__ : chemin complet de la page en cours __LINE__ : n° de ligne en cours d'exécution
41
Compléments (6)Compléments (6)
Configuration (php.ini) paramètre register_globals à off par sécurité
évite de définir les variables GET et POST comme globales ⇒$id non définie dans http://www.ex.com/test.php?id=3
paramètre track_vars à on récupère les variables dans les tableaux associatifs (variables superglobales) $_GET[] ⊂ données envoyées par méthode GET (params) $_POST[] ⊂ données envoyées par méthode POST
42
PHP - Traitement avancé des erreurs (1)PHP - Traitement avancé des erreurs (1)
Niveaux d'erreurs Constantes prédéfinies
E_ERROR : Fatale (stoppe le script), rapportée par défaut E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR = erreurs du noyau, à gérer de la même façon que E_ERROR
E_PARSE : erreur de syntaxe, fatale, rapportée par défaut E_WARNING : non fatale mais assez sérieuse, rapportée
Ex. passage de paramètres de types incorrects à une fonction E_NOTICE : non fatale, non rapportée par défaut mais à
rapporter en phase de développementEx. référence à une variable non définie
E_ALL : regroupe tous les types d'erreurs Fixer le niveau de rapport d'erreur
– directive (php.ini): error_reporting=E_ALL ou =E_ALL & ~E_NOTICE– à l'exécution (dans script) : error_reporting()
43
PHP - Traitement avancé des erreurs (2)PHP - Traitement avancé des erreurs (2)
Gestion d'erreur personnalisée (suite) utilité : messages d'erreurs standards par types d'err. set_error_handler(<nom_fonc>)
spécifie une f° utilisateur comme gestionnaire d'erreurs. retourne un ptr sur l'ancien gestionnaire (FALSE si aucun)
restore_error_handler() réactive l'ancien gestionnaire écrire un gestionnaire d'erreurs
function monGE ($errno, $errstr[, $errfile[,$errline[,$context]]]) {…} $old_error_handler=set_error_handler("monGE");
Erreurs MySQL sous PHP mysql_errno() : n° de dernière erreur MySQL mysql_error() : texte de la dernière erreur MySQL