Web Avec PHP

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 49

Programmation Web

avec PHP

Fichiers et templates

cours de M. Clergue et S. Verel


Correction exo 2, TP09

la correction est disponible sur la page web de


l'enseignement
Les sessions

Ou comment conserver des informations d'une


page à une autre
Les sessions
• Le transfert d'information d'une page (script) à
un autre n'est pas simple en PHP :
– Le protocole HTTP ne permet pas de conserver les
connections
• Plusieurs solutions :
– Par les formulaires : pas simple, pas sécurisé, pas
toujours possible
– Par les cookies : pas simple, non sécurisé
– Par les sessions : mécanisme dédié interne à PHP
Passage par formulaire
• Deux solutions :
– Des champs de type hidden
– Ajouter des info dans la querystring
• Pas simple :
– Il faut ajouter les infos dans la page
– il faut les récupérer
• Pas sécurisé :
– Tout le monde voit les infos stockées
• Pas toujours possible :
– Grand volume de données
Passage par cookies
• PHP propose des fonctions pour :
Poser un cookie :
<?
$expire = 365*24*3600;// durée du cookie en sec, 1 an
setcookie("lenom","lavaleur",time()+$expire);
?>

Récupérer un cookie :
<? // On affiche la valeur de nickname
echo 'le cookie "lenom" a pour valeur : ';
echo $_COOKIE["lenom"];
?>
Les sessions PHP
• PHP propose un système intégré pour gérer le
passage d'information
• Il est basé sur la notion de session :
– Chaque visiteur accédant à un site se voit assigner
un identifiant unique, appelé "identifiant de
session".
– Il est soit stocké dans un cookie, soit propagé dans
l'URL.
Les sessions PHP
En pratique :
2 fonctions :
session_start();
session_destroy();
1 variable super-globale :
$_SESSION
Les sessions PHP
Exemple :
<?php
// On démarre la session
if(!isset($_SESSION))session_start();

if ( isset($_SESSION['toto'])) {
$_SESSION['toto'] +=1;
}
else {
$_SESSION['toto'] =1;
}
?>
Les sessions PHP
Exemple :
<?php
// On démarre la session
if(!isset($_SESSION))session_start();

$_SESSION['panier'][] = 'champignons';
?>
Application : authentification
Accés authentifié à certaines pages

Authentification.php

deconnexion.php
Application : authentification

Conseils de sécurité :
http://matthieu.developpez.com/authentification/
Upload de fichier
formulaire.html

<!-- Le type d'encodage des données, enctype, -->


<!-- DOIT être spécifié comme ce qui suit -->
<form enctype="multipart/form-data"
action="telechargement.php" method="post">
<!-- MAX_FILE_SIZE doit précéder le -->
<!-- champ input de type file -->
<input type="hidden"
name="MAX_FILE_SIZE" value="3000000" />
<!-- Le nom de l'élément input détermine -->
<!-- le nom dans le tableau $_FILES -->
Envoyez ce fichier :
<input name="userfile" type="file" />
<input type="submit" value="Envoyer le fichier" />
</form>
<?php
//////////////////////////////////////////////////////////
// deux ou trois petites verifications avant tout !!
//////////////////////////////////////////////////////////
// existence du telechargement
if(!isset($_FILES['userfile'])){
// dans ce cas, soit le fichier depasse la limite
// imposee par upload_max_filesize (par defaut 8M),
// soit on ne vient pas a cette page
//par formulaire.php et donc on sort
exit("problème telechargement");
}
//////////////////////////////////////////////////////////
// taille du telechargement
$fsize = $_FILES["userfile"]["size"];
if($fsize == 0 || $fsize > 2621000) {
// la taille depasse le MAX_FILE_SIZE
//du formulaire (==0)
// ou depasse une limite ( > 2621000)
///idealement ldentique a MAX_FILE_SIZE
exit("keep the filesize ($fsize) under 3MB!!");
}

telechargement.php
//////////////////////////////////////////////////////////
// l'extension du fichier :
$path_parts = pathinfo($_FILES['userfile']['name']);
// les echos juste pour montrer les resultats de pathinfo
echo $path_parts['dirname'], "<br />";
echo $path_parts['basename'], "<br />";
echo $path_parts['extension'], "<br />";

if(!preg_match('/(gif|jpg|jpeg|png|bmp)$/i',
$path_parts['extension'])){
// l'extension ne fait pas partie
// des extensions acceptees
exit("type de fichier non reconnu");
}

telechargement.php
//////////////////////////////////////////////////////////
// debut de l'upload
//////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////
// le repertoire dans lequel le fichier va être uploade
$uploaddir = './upload/' ;
// le chemin complet du fichier :
// $uploaddir : le repertoire
// basename($_FILES['userfile']['name']) :
// le nom du fichier entré par l'utilisateur,
// sans le repertoire
$uploadfile = $uploaddir .
basename($_FILES['userfile']['name']);
//////////////////////////////////////////////////////////
// verification de l'existence du fichier
// par defaut le fichier existant est ecrasé
if(file_exists($uploadfile)){
exit("fichier deja telechargé");
}
telechargement.php
//////////////////////////////////////////////////////////
// $_FILES['userfile']['tmp_name'] :
// le nom du fichier temporaire
// $uploadfile : le nom du fichier
// (Si le fichier de destination existe déjà,
// il sera écrasé)
if (move_uploaded_file(
$_FILES['userfile']['tmp_name'],
$uploadfile)) {
echo "Le fichier est valide, et a été téléchargé
avec succès. Voici plus d'informations :\n";
}
else {
echo "Attaque potentielle
par téléchargement de fichiers.
Voici plus d'informations :\n";
}

telechargement.php
//////////////////////////////////////////////////////////
echo 'Voici quelques informations de débogage :';
print_r($_FILES);
//////////////////////////////////////////////////////////

if ($_FILES['nom_du_fichier']['error']) {
switch ($_FILES['nom_du_fichier']['error']){
case 1: // UPLOAD_ERR_INI_SIZE
case 2: // UPLOAD_ERR_FORM_SIZE
case 3: // UPLOAD_ERR_PARTIAL
case 4: // UPLOAD_ERR_NO_FILE
}
}
else {
// $_FILES['nom_du_fichier']['error'] vaut 0
//soit UPLOAD_ERR_OK
// ce qui signifie qu'il n'y a eu aucune erreur }

telechargement.php
Gestion des fichiers

• Nombreuses applications utilisent fichiers

• Nombreuses fonctions php :


– lecture/ecriture
– manipulation sur le disque

• Accés local rapide :


– mieux que BD si peu de traitements et tris
Lecture rapide

• Lecture de l'ensemble du fichier :

<?php
$contenu = file_get_contents('name.txt');
echo $contenu;
?>
Ecriture rapide

• Ecriture de l'ensemble du fichier :

<?php
$contenu = 'non rien de rien';
file_put_contents('name.txt', $contenu);
?>
Ouverture
Création d'un flux fichier :
<?php
$ressource = fopen($filename, $mode);
?>
Mode : ‘r’, ‘r+’, ‘w’, ‘w+’, ‘a’, ‘a+’
+ : lecture et écriture
r : lecture, pointeur au début du fichier
w : écriture, pointeur au début du fichier
a : écriture, pointeur à la fin du fichier
w, a : si le fichier n’existe pas, création
Adressage : absolu (http:// ou ftp://) ou relatif
fopen : faux en cas de problème (et warning)
Fermeture
Fermeture d'un flux fichier :
<?php
$succes = fclose($ressource);
?>

– true : no problem
– false : en cas de problème

--> Ecriture physique sur le disque à la fermeture


Lectures

• Fin de fichier :
<?php
while (feof($ressource)) ....

– TRUE si le pointeur est à la fin du fichier (ou si une erreur


survient)
– FALSE : le pointeur n'est pas à la fin
Lectures
Lecture d'un caractères :
$caractere = fgetc($ressource);

Lecture d'une ligne


$ligne = fgets($ressource, 1024);

– 1024 : nombre d'octects maximal

Lecture de « html »
$ligne = fgetss( $ressource, $length, $tag_ok )

– Idem que fgets, mais en supprimant les tag html, sauf ceux dans $tag_ok

Lecture d'octects
$octet50 = fread($ressource, 50);
$tout = fread($ressource, filesize('name.txt'));
Ecriture

Ecriture d'une chaine :

fwrite($ressource, $chaine, $length);

– $length (optionnel) :
• $length octets maximum
– valeur finale :
• nombre d'octets écrits ou FALSE en cas d'erreur.
Accés concurrents

• Plusieurs scripts peuvent utiliser le même fichier :


– en lecture : aucun problème
– en écriture : résultat imprévisible

• Utilisation de verrous :
– utilisation de la ressource par ceux qui possède un verrou

• Prise de verrou :
– verrou partagé en lecture : LOCK_SH
– verrou exclusif en écriture : LOCK_EX
• Libération de verrou :
– quelquesoit le type : LOCK_UN
Accés concurrents

<?php
$ressource = fopen('name.txt', 'r');
flock($ressource, LOCK_SH);
...
flock($ressource, LOCK_UN);
fclose($ressource);
?>

remarque :
– script mis en attente d'un verrou
– flock($ressource, LOCK_SH, TRUE);
• pas d'attente
• valeur FALSE si le verrou n'est pas disponible
Positionnement

Donne la position du pointeur du fichier


$position = ftell($ressource);

Place le pointeur du fichier au début


rewind($ressource)
– TRUE en cas de succès, FALSE en cas d'échec.

Changer la position dans le fichier :


fseek($ressource, $offset , $whence)
– $whence (optionnel) : permet de calculer la position
• SEEK_SET : $offset octets.
• SEEK_CUR : position courante + $offset octets.
• SEEK_END : fin – $offset octets
• par défaut : SEEK_SET.
Gestion des fichiers

Séparation du nom du fichier du nom de dossier


basename($path, $suffix);

$suffix (optionel) :
• Si suffix est fourni, le suffixe sera aussi supprimé.

<?php
$path = "/home/html/index.php";
$file = basename($path); // $file is set to "index.php"
$file = basename($path, ".php"); // $file is set to "index"
?>
Gestion des fichiers
• copy( $source , $destination)
– copy() fait une copie du fichier source vers le fichier destination.
– TRUE en cas de succès, FALSE en cas d'échec.
– Utilisez rename( ) pour un déplacement
• delete -- Effacer  unlink 
• dirname( $path )
– Renvoie le nom du dossier du chemin complet $path
– contraire de basename( )
• disk_free_space( $dossier )
– Renvoie l'espace disque disponible dans le répertoire $dossier
• disk_total_space ( $dossier )
– lit récursivement toutes les tailles du répertoire $dossier et retourne la somme.
– $dossier peut être aussi une partition de disque.
• file_exists ( $filename)
– Vérifie si un fichier $filename existe
– Le résultat est mis en cache
• fileatime ( $filename)
– renvoie la date (un entier) de dernier accès au fichier $filename ou FALSE en cas d'erreur.
– Utilisez date( ) sur le résultat
– Le résultat est mis en cache
Template PHPlib
Pourquoi ? Comment ?
• Simplifier la génération du code html
• Séparer le HTML du PHP
• Utilisation d'une bibliothèque : PHPlib
• Définition d'un template en html pur
• Ajout
Le fichier HTML
<html>
<head> <title>Ma page</title> </head>
<body>
<table width="600" border="0">
<tr> <td>Nom</td> <td>Tel</td> </tr>
<tr> <td></td> <td></td> </tr>
</table>
</body>
</html>
<html>
<head> <title>Ma page client</title> </head>
<body>
<table width="600" border="0">
<tr> <td>Nom</td> <td>Tel</td> </tr>
<!-- BEGIN personne -->
<tr> <td> {nom} </td> <td> {tel} </td> </tr>
<!-- END personne -->
</table>
</body>
</html>
Le fichier PHP
<?php
include "librairies/template.inc";
include("mysql_connect.inc");
mysql_select_db('repertoire');
$sql = 'SELECT nom,tel FROM Personne';
$req = mysql_query($sql) or die(mysql_error());
$tpl = new Template("."); // chemin vers template
$tpl->set_file("gliste","liste.html");
$tpl->set_block('gliste','personne','personnes');
while($data = mysql_fetch_array($req)) {
$tpl->set_var("nom", $data['nom']);
$tpl->set_var("tel", $data['tel']);
$tpl->parse('personnes','personne',true);
}
mysql_close();
$tpl->pparse("affichage","gliste");
?>
Les fonctions de template
Template($root = ".", $unknowns = "remove")
Création du template. $root : le chemin pour accéder au fichier
de template. $unknows : comment sont traitées les variables
template non définies ("remove", "comment", "keep").
set_root($root)
Définition du chemin d'accès aux fichiers template
set_unknowns($unknowns = "remove")
Définition de la manière de traiter les variables de template non
définies
Les fonctions de template
set_file($varname, $filename = "")
Création d'une variable template portant le nom défini par
$varname, à partir du contenu du fichier portant le nom
$filename.
set_var($varname, $value = "")
Création d'une variable template portant le nom défini par
$varname, à partir du contenu de la variable $value
set_block($parent, $varname, $name = "")
La variable bloc nommée $varname dans $parent est
remplacée par une variable template nommée $name. Une
variable template nommée $varname est crée à partir du
contenu du bloc.
Les fonctions de template
parse($target, $varname, $append = false)
Toutes les variables template apparaissant dans $varname sont
remplacées par leur valeur, et le résultat est soit la nouvelle
valeur de $target ($append : false), soit mis à la suite de $target
($append = true).
pparse($target, $varname, $append = false)
Même chose que parse, mais le résultat est en plus envoyé au
navigateur (print).
<html>
<head> <title>Ma page client</title> </head>
<body>
<table width="600" border="0">
<tr> <td>Nom</td> <td>Tel</td> </tr>
<!-- BEGIN personne -->
<tr> <td> {nom} </td> <td> {tel} </td> </tr>
<!-- END personne -->
</table>
</body>
</html> variable template
(emplacement)
<html>
<head> <title>Ma page client</title> </head>
<body>
<table width="600" border="0">
<tr> <td>Nom</td> <td>Tel</td> </tr>
<!-- BEGIN personne -->
<tr> <td> {nom} </td> <td> {tel} </td> </tr>
<!-- END personne -->
</table>
</body>
</html> bloc
(emplacement)
Le fichier PHP
<?php
Création template
include "librairies/template.inc"; Récupération fichier
include("mysql_connect.inc");
mysql_select_db('repertoire');
Création du bloc
$sql = 'SELECT nom,tel FROM Personne';
$req = mysql_query($sql) or die(mysql_error());
$tpl = new Template(".");
$tpl->set_file("gliste","liste.html"); Affectation variable
$tpl->set_block('gliste','personne','personnes');
while($data = mysql_fetch_array($req)) {
$tpl->set_var("nom", $data['nom']);
$tpl->set_var("tel", $data['tel']);
$tpl->parse('personnes','personne',true);
}
mysql_close();
$tpl->pparse("affichage","gliste"); Substitution des var
?>
$tpl->set_file("gliste","liste.html");

<html>
<head> <title>Ma page client</title> </head>
<body>
<table width="600" border="0">
<tr> <td>Nom</td> <td>Tel</td> </tr>
<!-- BEGIN personne -->
<tr> <td> {nom} </td> <td> {tel} </td> </tr>
<!-- END personne -->
</table>
</body>
</html>
gliste
$tpl->set_block('gliste','personne','personnes');

<html>
<head> <title>Ma page client</title> </head>
<body>
<table width="600" border="0">
<tr> <td>Nom</td> <td>Tel</td> </tr>
{personnes}
</table>
</body>
</html>
gliste

<tr> <td> {nom} </td> <td> {tel} </td> </tr>


personne
$tpl->set_var("nom", "toto");
$tpl->set_var("tel", "1111");
$tpl->parse('personnes','personne',true);

<tr> <td> toto </td> <td> 1111 </td> </tr>

personnes
$tpl->set_var("nom", "tata");
$tpl->set_var("tel", "1112");
$tpl->parse('personnes','personne',true);

<tr> <td> toto </td> <td> 1111 </td> </tr>


<tr> <td> tata </td> <td> 1112 </td> </tr>

personnes
$tpl->set_var("nom", "titi");
$tpl->set_var("tel", "1113");
$tpl->parse('personnes','personne',true);

<tr> <td> toto </td> <td> 1111 </td> </tr>


<tr> <td> tata </td> <td> 1112 </td> </tr>
<tr> <td> titI </td> <td> 1113 </td> </tr>

personnes
$tpl->pparse("affichage","gliste");

<html>
<head> <title>Ma page client</title> </head>
<body>
<table width="600" border="0">
<tr> <td>Nom</td> <td>Tel</td> </tr>
<tr> <td> toto </td> <td> 1111 </td> </tr>
<tr> <td> tata </td> <td> 1112 </td> </tr>
<tr> <td> titI </td> <td> 1113 </td> </tr>
</table>
</body>
</html>
affichage

Vous aimerez peut-être aussi