Sessions Php et Mysql - Le serveur Dept25

Transcription

Sessions Php et Mysql - Le serveur Dept25
Programmation PHP
Sessions, Mysql
David Gross-Amblard - Philippe Rigaux
6 novembre 2002
Conservatoire national des arts et métiers
Transparents disponibles la semaine prochaine sur
http://dept25.cnam.fr:8080/PROJET3I
Programmation PHP – p.1/56
Contenu
1. Rappels sur HTTP
2. Sessions PHP
Cookies
Sessions PHP
3. PHP et bases de données
mySQL
Interconnexion PHP/mySQL
Programmation PHP – p.2/56
Rappels sur HTTP
Programmation PHP – p.3/56
Fonctionnement du Web
HTTP
PHP, Java, Perl, ...
requetes
Programme
client
Machine du client
HTML
CSS
Javascript
Programme
serveur
Internet
document
document(s)
Documents
Machine du serveur
Programmation PHP – p.4/56
Quelques mots sur HTTP
Protocole (langage) d’échange d’informations
propre au Web
On ouvre une connexion
On envoie un en-tête
Puis une ligne blanche
Puis éventuellement un contenu
Et on ferme la connexion
Pas de connexion permanente !
Programmation PHP – p.5/56
Les requêtes HTTP
Principaux types de requêtes :
GET : on demande quelque chose au serveur
GET /index.html HTTP/1.0
POST : on envoie quelque chose au serveur
POST /cgi-bin/prog.php HTTP/1.0
nom=rigaux&prenom=philippe
HEAD : on demande des infos sur un
document
Programmation PHP – p.6/56
Les réponses HTTP
En-tête/ligne blanche/contenu (Démo) :
Date: Tue, 05 Jun 2001 20:39:56 GMT
Server: Apache/1.3.17 (Unix) mod\_jk PHP/4.0.2
Last-Modified: Tue, 05 Jun 2001 20:13:39 GMT
Content-Length: 159
Connection: close
Content-Type: text/html
<HTML><HEAD>
<TITLE>Page d’accueil</TITLE></HEAD>
<BODY><H1>Page d’accueil</H1></BODY></HTML>
Programmation PHP – p.7/56
Informations d’une réponse HTTP
Dans l’en-tête :
Le type de contenu Content-type
indique si le contenu est du HTML, du
gif,du pdf, du XML...
la longueur du contenu (permet de savoir
combien de temps ça va prendre)
la date de dernière modification (pour gérer le
cache)
Programmation PHP – p.8/56
Limitation de HTTP
HTTP n’établit pas de connexion permanente !
un serveur peut difficilement suivre le parcours
de l’utilisateur dans le site
Chaque connexion est vue comme une demande
d’un utilisateur différent
Programmation PHP – p.9/56
Une solution possible : les
sessions, avec ou sans cookies
Programmation PHP – p.10/56
Les cookies
Le serveur demande au navigateur de
stocker une variable (nom,valeur), pour une
durée déterminée
Serveur : "stocker la variable ’maVariable’
avec la valeur ’100’ pendant 2 jours"
Le navigateur transmet ensuite
systématiquement la variable au serveur qui
l’a créée
Navigateur : "maVariable=100, ..."
Programmation PHP – p.11/56
Cookies et sessions web
Les cookies sont utiles pour établir une
continuité dans le dialogue client/serveur
Quand un client se connecte la première
fois : le serveur lui associe un identifiant de
session
Le serveur transmet cet identifiant au client
sous la forme d’un cookie
On conserve un historique des actions du
client, associé à l’identifiant de session
Quand le client se connecte à nouveau :
on sait l’identifier grâce au cookie
Programmation PHP – p.12/56
Cookie avec HTTP
L’en-tête HTTP Set-Cookie
Il comprend les éléments suivants:
nom=valeur : définition du cookie
expires : date de fin de validité
domain : le domaine pour lequel le cookie
est visible. Par défaut : nom du serveur qui
créé le cookie
(path,secure,...)
Programmation PHP – p.13/56
Exemple d’un en-tête avec cookie
Set-Cookie:
MonCookie=200;
expires=Mon,24-Dec-2000 12:00:00 GMT;
domain=cnam.fr
Tout est optionnel, à l’exception de la première
directive
Programmation PHP – p.14/56
Un script PHP pour définir des cookies
La fonction setcookie, en début de script,
permet de modifier la réponse HTTP
<?php setcookie("MonCookie","chocolat");
?>
<HTML>
<BODY>
<P>Vous venez d’avaler un gâteau.</P>
</BODY>
</HTML>
démo
Programmation PHP – p.15/56
Test des cookies
<HTML>
<BODY>
<P>
<?php if (isset($MonCookie)) echo
"Vous avez déjà eu du gâteau $MonCookie, vous !";
else echo "Pas de gâteau";
?>
</P>
</BODY>
</HTML>
démo
Programmation PHP – p.16/56
Moins "bas niveau": sessions PHP
<?php
session_start();
session_register("maVariable");
$maVariable="chocolat";
?>
Gloup.
démo
Programmation PHP – p.17/56
Récupération
<?php
session_start();
if (session_is_registered("maVariable"))
echo "Vous avez mangé du $maVariable";
else
echo "Puni. Pas de gâteau.";
?>
démo
Programmation PHP – p.18/56
Remarque
Avec les sessions PHP, seul l’identifiant de
session est transmis au navigateur
Les variables sont stockées sur le serveur
Par défaut dans un fichier, mais paramétrage
possible
Programmation PHP – p.19/56
En résumé
Suivre une interaction avec le même
utilisateur
Enregistrer une ou des variables sur le client
Autre solution : champs HIDDEN des
formulaires
Programmation PHP – p.20/56
PHP et les bases de données
1. MySQL
Programmation PHP – p.21/56
Pourquoi une BD
Stocker de grandes quantité de données structurées
Persistance (pannes)
Langage de requête simple et expressif
Efficacité (optimisation,index)
Applications
Donnéees pour l’application (Films, Tel,...)
Pour le fonctionnement du site
Stocker des variables de session
Stocker des statistiques d’accès (pub $$ !)
Programmation PHP – p.22/56
Attention
Ne pas construire une base n’importe
comment...
cf cours du Cnam en ligne cyles A et B
Programmation PHP – p.23/56
Qu’est-ce que MySQL ?
C’est un SGBD relationnel
Gratuit (www.mysql.com) GNU GPL
Disponible sous Windows et tous les Unix
Propose le minimum vital
(Presque) tout le langage SQL
Stockage, indexation, optimisation
Qualités reconnues (outre la gratuité):
Simplicité
Efficacité pour requêtes simples
Programmation PHP – p.24/56
Quelques limites de MySQL
Pas de transactions !
Inadapté pour les applications
transactionnelles (finances, réservations)
Ni commit, ni rollback, une reprise sur
panne rudimentaire
Pas de requêtes imbriquées
Pas très grave !?
Pas d’environnement de développement
Alternative : PostgreSQL
(www.postgresql.org)
Programmation PHP – p.25/56
Statut de MySQL à l’heure actuelle
Très prisé pour les sites web
Très bonne intégration avec Apache et PHP
Tout est gratuit !
En fort développement
Intégration des transactions ?
Beaucoup de " contributions " extérieures
API en C++, Perl, PHP, Java (JDBC)
Des clients graphiques, des utilitaires
En résumé, un moteur SQL, simple et efficace
Programmation PHP – p.26/56
Architecture de MySQL
Le serveur mysqld
Il est en écoute sur un port réseau (le 3306
par défaut)
Il gère une ou plusieurs bases de données
La base mysql est le "dictionnaire de
données"
Les autres bases sont des bases utilisateur
Il dialogue avec ses clients en multi-threading
(processus léger)
Programmation PHP – p.27/56
Client mySQL
Le client mysql permet de communiquer avec le
serveur mySQL en ligne de commandes
% mysql -u rigaux -p MaBase
Password:*****
mysql> [ici, n’importe quelle commande]
On indique l’utilisateur et la base désirée
Programmation PHP – p.28/56
Utilisateurs :puissant mais compliqué
Un utilisateur MySQL est défini par
Son nom
Le nom (Internet) de sa machine
Problèmes :
[email protected], [email protected] ne
sont pas les mêmes utilisateurs !
Si le serveur tourne sous cortes, il faut utiliser le
synonyme localhost !
On peut utiliser des ’%’ : %.cnam.fr désigne toutes
les machines du CNAM
Programmation PHP – p.29/56
Les droits
Un utilisateur peut avoir plusieurs types de
droits:
Sur le serveur (administration)
Sur les bases et tables (création,
destruction)
Sur les données (lecture, écriture)
Sur d’autres utilisateurs (transmission de
droits)
Le compte root est le DBA: il a tous les droits
sur tout
Programmation PHP – p.30/56
Création d’utilisateurs : GRANT
Pour créer un utilisateur avec tous les droits
sur la base Film:
GRANT ALL ON Film.*
TO admin@localhost
IDENTIFIED BY ’mdpAdmin’
Pour créer un utilisateur avec des droits en
lecture sur la table Artiste:
GRANT select ON Film.Artiste
TO visiteur@localhost
IDENTIFIED BY ’mdpVisiteur’
Programmation PHP – p.31/56
Création de bases et de tables
On crée des bases sous root :
% mysql -u root -p
mysql> CREATE DATABASE Films;
Tout utilisateur ayant des droits peut créer
des tables dans une base:
% mysql -u adminFilms -p Films
mysql> CREATE TABLE Film (...);
Les commandes SQL CREATE, ALTER,
DROP sont reconnues
Programmation PHP – p.32/56
Types de données MySQL
MySQL reconnaît les principaux types SQL2,
et quelques autres:
INTEGER : les entiers
FLOAT : numériques flottants
DECIMAL (M, D) : numériques exacts
CHAR : chaînes de longueur fixe
VARCHAR :chaînes de longueur variable
TEXT : textes longs
DATE : dates
TIME : moments
Programmation PHP – p.33/56
Exemple de création de table
Insertion dans une table
Il vaut mieux placer toutes les commandes
dans un fichier de script, script.sql
% mysql -u MonNom -p MaBase < script.sql
Programmation PHP – p.34/56
Exemple d’un fichier de script
create table Carnet(
nom text,
prenom text,
age integer);
insert into Carnet values (’Truquemuche’,’Jean’,18);
insert into Carnet values (’Chose’,’Alice’,39);
...
Programmation PHP – p.35/56
MySQL en résumé
Tout à fait conforme à la norme SQL ANSI
CREATE TABLE, DROP TABLE, ALTER
TABLE
SELECT, INSERT, DELETE, UPDATE
Avec des extensions (très utiles)
Types de données (TEXT, BLOB)
Contraintes (AUTO_INCREMENT)
Beaucoup de fonctions
Programmation PHP – p.36/56
PHP et les bases de données
2. Interconnexion PHP/MySQL
Programmation PHP – p.37/56
mySQL et PHP
Principe : création de documents web à partir
d’une BD
MySQL se charge du stockage, de la
protection des données, de l’interface SQL
PHP
extrait des données et les met en forme
reçoit des données et les stocke
Le navigateur fournit l’interface graphique
Architecture à trois pôles, à la sauce Web
Programmation PHP – p.38/56
Architecture avec base de données
HTTP
données
Programme
client
Machine du client
Processus
serveur
Internet
document
3
document
Machine
du serveur
données
1
Interpreteur
PHP
Base de données
2
Requete SQL
serveur Mysql
Programmation PHP – p.39/56
Connexion à MySQL avec PHP
mysql_pconnect (serveur, nom, passe)
établit une connexion
si OK, renvoie un identifiant non nul cnx
mysql_select_db(base, cnx)
se place dans une base et renvoie vrai si OK
mysql_query (requete, cnx)
exécute une requête et renvoie un identifiant
mysql_fetch_object (resultat)
renvoie la ligne suivante sous forme d’objet
Programmation PHP – p.40/56
Exemple : interrogation et affichage (1)
<?php
$cnx=mysql_pconnect("dept25.cnam.fr","rigaux","4fRf*");
if (!$cnx){
echo "probleme de connexion."; exit; }
mysql_select_db("Film",$cnx);
$res=mysql_query("select nom,age from Artiste",$cnx);
...
Programmation PHP – p.41/56
Exemple : interrogation et affichage (2)
...
echo "<TABLE>";
while($nuplet=mysql_fetch_object($res){
echo "<TR>";
echo "<TD>$nuplet->nom</TD>";
echo "<TD>$nuplet->age</TD>";
echo "</TR>";
}
echo "</TABLE>";
?>
Programmation PHP – p.42/56
Association avec formulaire
<FORM ACTION="mysql.php" METHOD=POST>
Nom de l’artiste : <INPUT TYPE=TEXT NAME=nom> <BR>
Prenom : <INPUT TYPE=TEXT NAME=prenom> <BR>
Age : <INPUT TYPE=TEXT NAME=age> <BR>
<INPUT TYPE=SUBMIT NAME=ajout VALUE="ajouter">
<INPUT TYPE=SUBMIT NAME=suppression VALUE="supprimer">
</FORM>
Programmation PHP – p.43/56
Traitement
On récupère donc les variables $nom,
$prenom, $age, $ajout et $suppression
On construit la bonne requête SQL
Un ordre INSERT pour des insertions
Un ordre DELETE pour une destruction
Dans tous les cas la fonction mysql_query
permet d’exécuter l’ordre
Programmation PHP – p.44/56
Traitement : mysql.php
<?php
...............(partie connexion)
if ($ajout)
$requete="insert into Artiste values
(’$nom’,’$prenom’,’$age’)";
else
if ($supression)
$requete="delete from Artiste where
nom=$nom and prenom=$age";
mysql_query($requete,$cnx);
?>
Programmation PHP – p.45/56
Informations sur le schéma
Etant donné le résultat d’une requête :
mysql_num_fields($res) donne le
nombre d’attributs
mysql_field_name($res, $i) donne
le nom de l’attribut
mysql_fetch_row ($res) renvoie une
ligne du résultat sous la forme d’un tableau
indicé.
Application : phpMyAdmin
Programmation PHP – p.46/56
Conclusion
mySQL : sgbd libre, puissant, répandu
Interconnexion avec PHP :
production de documents HTML à partir de
requêtes SQL
gestion des interactions avec l ’utilisateur
(requêtes/données de formulaires)
Programmation PHP – p.47/56
Promenades PHP:
Internationalisation
PDF
Images
Programmation PHP – p.48/56
Internationalisation
Gerer facilement les sites multi-lingue
Utilise la librairie Gettext
...ou se simule facilement
Programmation PHP – p.49/56
Principe
Scripts en anglais
Table de traduction anglais
...
Centralisé dans un repertoire
Programmation PHP – p.50/56
Repertoire
locale/
fr/
en/
es/
de/
Dans chacun, un fichier myPHPApp.
Programmation PHP – p.51/56
Exemple
Dans locale/fr/myPHPApp:
Welcome to my PHP Application:Bienvenue
dans mon application PHP
Hello:Bonjour
email:mél
...
Programmation PHP – p.52/56
Exemple
<?php
putenv ("LANG=fr");
bindtextdomain ("myPHPApp", "./locale");
textdomain ("myPHPApp");
print (gettext ("Welcome to My PHP Application"));
?>
Programmation PHP – p.53/56
Production d’images
Exemple : un bouton dont le contenu varie
Contenu en paramètre, appelé par :
<img src="button.php?text">
Programmation PHP – p.54/56
Production d’images
<?php
Header("Content-type: image/png");
$string=implode($argv," ");
$im=imageCreateFromPng("images/button1.png");
$orange=ImageColorAllocate($im,220,210,60);
$px=(imagesx($im)-7.5*strlen($string))/2;
ImageString($im,3,$px,9,$string,$orange);
ImagePng($im);
ImageDestroy($im);
?>
Programmation PHP – p.55/56
Production de PDF
$pdf = pdf_new();
pdf_open_file($pdf, "test.pdf");
pdf_set_info($pdf,"Title","Test for PHP");
pdf_begin_page($pdf,595,842);
pdf_add_outline($pdf,"Page 1");
pdf_set_font($pdf, "Times-Roman",30,"host");
pdf_show_xy($pdf, "Times Roman outlined",50,750);
pdf_moveto($pdf,50,740);
pdf_lineto($pdf,330,740);
pdf_stroke($pdf);
pdf_end_page($pdf);
pdf_close($pdf);
pdf_delete($pdf);
Programmation PHP – p.56/56