PHP
Programmation web avec PHP (Personal Home Page)
Olivier Le Cadet
IUT Vélizy SRC2
Le HTML
HTML est un langage de marquage indiquant au navigateur comment doit afficher une page web.
Il permet de mettre en forme des textes,
d'afficher des images, de créer des tableaux etc...
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Le titre de la page web</title>
</head>
<body>
Ceci est une <b>page web</b> avec des <big> mots </big> en gras, en <i>italique</i> et
<table width="20%" border="1">
<tr>
<td>un</td>
<td>tableau</td>
</tr>
</table>
</body>
Code source de la page web
Protocole http
Rendre dynamique le html
Afficher l'heure actuelle
Ne pas avoir à réécrire une page web dès qu'un fichier y est rajouté
Traiter les formulaires
Envoyer automatiquement des news quand une modification est faite
Gérer une base de données
Nombre de visiteurs
etc...
Oui, mais comment :
Une solution : le PHP
+
Langage de script interprété (pas compilé)
Donc, portable (le même script marchera sur plusieurs plateformes)
Simple à apprendre
Librairies riches
Open Source (gratuit)
Peu robuste : éviter pour les très gros projets!
-
Historique du PHP
1994 : création de PHP par Rasmus Lerdorf (compter le nombre de visiteurs de son cv!).
Même année : connexion à des bases de données rendue possible.
1995 : PHP 2
1998 : PHP3 (prog. Orientée Objet).
2000 : PHP 4
2004 : PHP 5 (15 millions de pages web!)
Un exemple : horloge.
Page présente sur le serveur.
<html>
<head>
<title>Horloge</title>
</head>
<body>
<p> Nous sommes le
<?php setlocale(LC_TIME,'fr_FR');
echo strftime("%A %e %B %Y")?>.<br>
Il est <?php echo strftime("%H h %M") ?>
</p>
</body>
</html>
Ex2: traitement des formulaires
<form name="formulaire" method="POST"action="ResultatRequete.php">
<table width="80%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Matière
<select name="matiere[]" multiple>
<option value="tout" selected>Tout</option>
<option value="geometrie">Géométrie</option>
</select>
</td>
<td></td>
<td>Niveau
<select name="niveau[]" id="niveau" multiple>
<option value="tout" selected>Tout</option>
<option value="seconde">Seconde</option>
</select>
</td>
</tr>
<tr>
<td><input type="submit" name="Submit" value="Envoyer"></td>
</tr>
Page vue par le client
<html>
<head>
<title>Horloge</title>
</head>
<body>
<p> Nous sommes le
mercredi 3 septembre 2008.<br />
Il est 21 h 13 </p>
</body>
Lorsqu'un client requiert la page précédente, le serveur
traite les instructions php et les traduit en html. On obtient :
PHP à grands traits
Code entre <?php et ?>
Inclus dans du html
Sensible à la casse : header() ≠ Header() Instructions terminées par ;
Blocs d'instructions délimités par { . . . }
Commentaires avec // en fin de ligne ou /* . . . */
Toujours se référer à la documentation officielle:
http://fr.php.net/manual/fr/
Premiers pas en PHP
Les données
Variables
Préfixées par $
Déclaration :
La déclaration n'est pas obligatoire
Règles de nommage identiques à java.
La variable est créée à la première utilisation (ex: $var = 1).
Par défaut, elle vaut NULL
Quelques fonctions utiles :
isset() teste l'existence d'une variable
unset() supprime une variable
Constantes
Définies grâce à define Ex : define('PI', 3.14);
On ne peut pas les modifier.
define('CARRE',$a*$a) //ERREUR
Par convention, on les écrit en majuscules.
Types de données
PHP est faiblement typé (typage implicite)
PHP connaît en interne différents types :
Entiers : -152 Flottants : 13.2
Chaînes : " Ceci est une chaine "
Booléens : TRUE, FALSE Tableaux
Objets
Fonctions utiles : get_type(), is_integer(), is_string() ...
Les nombres
Opérateurs numériques :
identiques à ceux du C et du java.
Affectation : =
Calcul : + - * /
Combiné : += -= *= /=
Modulo : %
Comparaison : == < <= > >= !=
Incrémentation/décrémentation : ++ --
Exemple :
$a = 1;
$a++;
Les chaînes de caractères
Sans interpolation : ' . . . '
$a="Leduc"; // affichera :
$t='Salut à toi M. $a'; // salut à toi M. $a
Avec interpolation " . . . "
$a="Leduc"; // affichera :
$t="Salut à toi M. $a"; // salut à toi M. Leduc
Les chaînes de caractères (string)
Affichage : echo / printf()
Exemple : echo "<p>La variable $a</p>";
Opérateur :
Concaténation : . // $t = "Bonjour ".$a;
Comparaison : == < <= >= !=, strcmp() Caractères spéciaux pour contrôler le flux affiché :
\n saut de ligne \t tabulation \' \"
Tests et boucles
PHP utilise la syntaxe du C (et du java)
for ($i=0;$i<100; $i++){ if ($a>10){
. . . . . . } }
else{
switch($var){ . . .
case 'a' : . . . }
break;
default: . . .
break; while ($i<100){
} . . .
}
Exercices
1. Qu'affichent les instructions suivantes?
$a=1;
$b="2+$a";
$a=2;
echo $b . $a;
2. Ecrivez un programme, qui en fonction de la valeur d'une variable $jour (entier compris entre 1 et 7) affiche le jour de la semaine.
3. Faites afficher la table de multiplication par 7.
Attention aux comparaisons!
Pour comparer deux variables de types différents, PHP effectue des conversions implicites.
if (3=="3") echo "1\n";
if (0=="") echo "2\n";
if ("FALSE"==TRUE) echo "3\n";
Pour interdire les conversions lors d'une comparaison il faut utiliser les opérateurs === et !==
if (3==="3") echo "1\n"; //FALSE if (0==="") echo "2\n"; //FALSE
if ("FALSE"===TRUE) echo "3\n"; //FALSE
Les fonctions
Les fonctions
Syntaxe similaire au C (et java), sans le typage
Définition d'une fonction :
Appel d'une fonction : $nombre= fact(4);
Les variables définies à l'extérieur de la fonction n'y sont pas connues (sauf var. globales).
Récursivité possible.
En sortie, les paramètres passés à la fonction sont inchangés (passage par valeur).
Mais on peut passer les paramètres par référence (&):
function factoriel($n){
. . .
return $res;
}
Function puissance(&$nombre,&$indice){ . . . }
Exemples et exercices
Ecrivez la fonction qui calcule le carré d'un nombre.
Qu'affiche le programme ci-dessous? Et si l'on rajoute un & devant chacun des paramètres?
function puissance($nombre,$indice){
$resultat=$nombre;
for ($x=$indice; $x>0; $x--){
$resultat = $resultat * $nombre;
}
$nombre=$resultat;
return $nombre;
}
$nombre=2; $indice=5;
echo $nombre." puissance ".$indice." vaut ".puissance($nombre,
Variables globales
On peut déclarer des variables qui seront
connues dans tout le script, y compris dans le champ de définition des fonctions : global
global $var=3;
function test($n){
return $n+$var;
}
A éviter autant que possible!!
Les tableaux
Les tableaux
Un tableau est une collection ordonnée de couples clé/valeur. La clé peut être de type entier ou de type chaîne de caractères (tableaux associatifs)
Déclarations : $fruits=array();
Affectations :
$fruits[0]="pommes";
$fruits[1]= "poires";
$fruits[]="oranges";
Déclaration+affectation :
$fruits=array("pommes", "poires", "oranges");
Quelques fonctions utiles sur les tableaux : sizeof(), sort(), count(), in_array() ...
Les tableaux associatifs
Déclaration : $calories=array();
Affectations :
Affectation + déclaration :
$calories=array("pommes"=>300, "bananes"=>500);
Exemple : $tab["nom"]="Le Cadet";
echo $tab["nom"];
$calories["pommes"]=300;
$calories["bananes"]=500;
Parcours de tableau
Pour un tableau numérique, méthode classique:
Pour un tableau associatif : foreachforeach
for ($i=0; $i<count($tab); $i++){
echo "$tab[$i]\n";
}
foreach ($tableau as $indice => $valeur){
echo "$indice : $valeur\n";
}
Tableaux multidimensionnels
On peut créer des tableaux de tableaux (voir TDs) => tableaux multidimensionnels.
Pour parcourir de tels tableaux, il faut en général imbriquer plusieurs boucles foreach
Exemple :
$couleurs=array("vives"=>array("rouge"=>"FF0000", "vert"=>"00FF00", "bleu"=>"0000FF"), "douces" => array("rose"=>"FE9ABC", "jaune"=>"FDF189"));
Exercice (tableau)
Créez un tableau qui associe à la France, à l'Allemagne, et à l'Angleterre leurs capitales (Paris, Berlin, Londres), puis faites écrire une phrase qui recense les villes présentes dans le tableau et affiche leurs capitales ("la capitale de la France est Paris", etc…)
Compléments sur les tableaux
On peut parcourir un tableau à l'aide d'un pointeur grâce aux fonctions current(), next(), prev()
key($tab) renvoie l'indice courant de $tab.
Exo : écrire une fonction qui affiche le contenu d'un tableau grâce à current() et next()
shuffle() mélange aléatoirement les val. d'un tableau
Un tableau peut être géré comme une pile (fonction array_push() et array_pop() ).
Compléments sur les chaînes de caractère. Expressions régulières.
$chaine{$i} -> ième (en commençant à 0..) caractère de la chaîne
strlen($chaine) -> longueur de la chaîne
strtolower(), strtoupper() -> met en minuscule, majuscule
substr($chaine,$debut,$n) -> extrait $n caractères de $chaine
ereg() -> Teste des expressions régulières. Exemple :
^[a-z|\.|\-]+@[a-z|\.|\-]+\.(org|com|net|fr)$ désigne toutes les adresses mails composées d’un mot en lettres en minuscules avec éventuellement des . Et des -, suivies du caractère @, suivi d’un nouveau mot composé de minuscule, de . Et de tirets. Le mail doit se terminer par .org, .com, .net, ou .fr.
Ainsi, ereg("^[a-z|\.|\-]+@[a-z|\.|\-]+\.(org|com|net|fr)$« ,$courrier)
va tester si la chaîne de caractère $courrier suit bien le patron indiqué en premier argument.
ereg_replace($expr_reg,$nouvelle_chaine,$texte)
Les Formulaires
Formulaire HTML
Balise <form>. Attributs obligatoires method et action.
Peut être composé de (INPUT type=…):
Texte (text)
Cases à cocher (checkbox)
Bouton d'envoi, reset (submit, reset)
Password (password)
Bouton radio (radio)
Ou de liste de sélection (SELECT name=), zone de texte (textarea)
Traitement d'un formulaire grâce à PHP
Exemple 1
Poster ce formulaire se traduira par un accès à la page
http://localhost/formulaire.php?login="Jean"&form=1
Accéder à ces infos en php : $_GET["login"]
<form action="http://localhost/formulaire.php method="GET">
<p>
<input type="text" name="login" value="" />
<button type="submit" name="form" value="1">OK</button>
</p>
</form>
Variables super-globales
Les valeurs saisies sont enregistrées dans un tableau associatif $_GET (ou
$_POST pour la méthode POST). Ce sont des variables super-globales (toujours accessibles).
Méthode POST plus sure : les variables n'apparaissent pas en clair dans la barre d'adresse…
Le tableau $_REQUEST est la fusion de $_GET et $_POST.
Afficher le login entré par l'utilisateur, dans l'exemple précédent :
Il existe d'autres variables super-globales : $_FILES (tableau pour les fichiers envoyés), $_SERVER (info diverses sur le serveur), $_COOKIE et
$_SESSION (voir plus loin). Ce sont des tableaux.
<?php if (isset($_GET["login"])
echo "<br />Bonjour, ".$_GET["login"]." !\n";
?>
Traitement des valeurs multiples
Certains champs autorisent la saisie de plusieurs valeurs sous le même nom
(checkbox, listes à choix multiple).
Il faut récupérer les infos sous forme de tableau.
Exemple 2
Formulaire html de l'exemple 2
<form name="formulaire" method="POST" action="ResultatRequete.php">
<table width="80%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td></td>
<td>Niveau
<select name="niveau[]" id="niveau" multiple>
<option value="tout" selected>Tout</option>
<option value="terminale">Terminale</option>
<option value="universite">Université</option>
</select>
</td>
<td></td><td>
<td>N'afficher que les <br>
pdf <input name="format[]" type="checkbox" value="pdf">
tex <input name="format[]" type="checkbox" value="tex">
doc <input name="format[]" type="checkbox" value="doc">
</td>
<td></td>
<td><input type="submit" name="Submit" value="Envoyer"></td>
</tr>
Traitement des données multiples
$_POST["niveau"] et $_POST["format"] sont eux-mêmes des tableaux.
Les valeurs qu'ils contiennent peuvent être
récupérées à l'aide d'un foreach, par exemple.
foreach ($_POST["niveau"] as $indice=>$valeur){ … }
Exercices :
en parcourant le tableau $_POST["format"] de
l'exemple précédent, faites afficher les formats demandés par l'utilisateur.
Ecrire un formulaire d'authentification avec mot de passe
Les fichiers
Ouvrir/fermer/lire/écrire un fichier
Ouvrir en lecture: fopen() $fp=fopen("fichier.txt","r");
Ouvrir en écriture: $fp=fopen("fichier.txt","w");
Lire : fread(), fgets() $ligne=fgets($fp,256);
Fin de fichier : feof() while (!feof($fp)){…};
Ecrire : fwrite() fwrite($fp,"Bonjour");
Fermer : fclose() fclose($fp);
Copier : copy() copy("un.txt","deux.txt");
Effacer : unlink() unlink("un.txt");
Renommer : rename() rename("un.txt","deux.txt");
Charger des fichiers
Charger sur le serveur :
Télécharger :
<HTML><BODY>
<form action="charger.php" method="POST" enctype="multipart/form-data">
Introduire le fichier : <input type="file" name="fichier"><br />
<input type="hidden" name="taille_max" value=1000>
<input type="submit">
</BODY></HTML>
<?php
$fichier="ex.zip";
$mimeType="application/zip";
header("content-disposition: attachment; filename="ex.zip");
header("content-type: ".$mimeType);
header("content-length: ".filesize($fichier));
readfile($fichier);
Exercices sur les fichier
Faites un script qui affiche à l'écran le contenu d'un fichier texte.txt, ligne par ligne (fgets()).
Soit un tableau $peinture dont chaque élément est un tableau comprenant un champ oeuvre contenant le nom d'une œuvre et un champ
artiste qui contient le nom de l'artiste qui l'a réalisé. Créez un fichier peinture.txt qui à
chaque ligne contient un doublon œuvre-artiste du tableau $peinture.
Fonctions diverses :
include, date, …
Inclusion de fichiers, die
include("fichier.php") : le contenu de ce fichier est inséré ici. (ex : include("en_tete.inc")).
include_once() : le fichier est inclus s'il ne l'a pas encore été.
require() : en cas d'absence du fichier, arrêter tout sur une erreur.
require_once() : fusion des deux précédents.
die("message") : stoppe l'exécution du script avec le message d'erreur indiqué.
Mail, date
Exemple simple pour le mail :
Dates (cf manuel) :
date($format,$dateheure) : formate une date/heure (par défaut, maintenant)
strftime($format,$dateheure) : idem,
localisé. Précéder d'un setlocale(LC_TIME,
"fr_FR");
$message="Bonjour\n Au revoir";
Mail('[email protected]', 'Sujet',$message);
programmation objet en
PHP
Définition de classes (class)
Syntaxe et principes similaires à java.
Définition de classe :
class page_web{
private $titre; //attribut
function setTitre($titre){ //méthode setTitre
$this->titre=$titre;
}
function getTitre($titre){ //méthode getTitre return $this->titre;
}
function __construct($titre){ //constructeur
$this->setTitre($titre);
Instances de classe
Créer une instance de classe : new()
$ma_page=new page_web("nouvelle page");
C'est la fonction constructeur (__construct, avec deux _) qui est appelée lors de la
création d'une instance de classe.
private, public, protected gèrent la visibilité des méthodes et attributs (public par défaut).
Héritage
Mot clef extends : class felin extends animal
Pas d'héritage multiple
La classe fille hérite des méthodes de la classe mère (mais ne peut utiliser ses méthodes private), et peut en redéfinir.
$formulaire = new page_formulaire("formulaire");
class page_formulaire extends page_web{
function débutFormulaire($action){
echo "<form action=\"$action\">";
}
function finFormulaire(){
echo "</form>";
} }
Quelques fonctions utiles
get_class()
get_parent_class()
class_exists()
is_subclass_of()
method_exists()
get_class_method()
PHP et les bases de
données (MySQL)
Généralités
Intérêt des bases de données :
Stocker les données persistantes de l'application (ex : gestion de CDs).
Facilité de traitement de ces données
Principe de fonctionnement :
Le script PHP ouvre une connexion à un serveur MySQL ou PostgreSQL.
Le script exécute une ou plusieurs requêtes.
Les résultats de la requête sont reçus ligne par ligne dans des tableaux PHP.
Connexion
mysql_connect($serveur,$user, $pass)
mysql_select_db($data_base,$link)
Fermeture avec mysql_close($link);
$dbhost = 'venus';
$dbuser = 'olecadet';
$dbpass = ''; //Pas de mot de passe ici
$link = mysql_connect($dbhost, $dbuser, $dbpass);
$data_base='Médiathèque';
$db =mysql_select_db($data_base, $link);
Envoyer une requête
mysql_query($requete,$link)
Lire le résultat de la requête : ligne par ligne avec
mysql_fetch_array($resultat)
MYSQL_ASSOC élimine la possibilité de récupérer les données avec un indice numérique.
$requete="SELECT titre FROM Cds WHERE auteur=\"$auteur\" ";
$resultat=mysql_query($requete,$link);
while ($ligne=mysql_fetch_array($resultat, MYSQL_ASSOC)){
$titre=$ligne["titre"]; //etc…
}
Gestion de bases de données en objet
Exo Complétez la classe suivante :
Class Serveur_Base_Donnees{
private $serveur; private $user; private $pass; private $bd; private $link; private $resultat;
function __construct($serveur,$user,$pass,$bd){
. . . }
function connexion_bd(){
. . . // Ouvre la connexion; selectionne la bd$bd;
}
function interroger($requete){
. . . // Envoie la requete $requete
}
function extraire_un_resultat(){
. . . // Retourne une ligne de résultat
}
Requêtes SQL :
révisions.
Généralités
• Données regroupées dans des tables, chaque élément représenté sur une ligne.
• Chaque objet caractérisé par des attributs, ou champs (colonnes)
• Ex : Acheteurs – Produits – Chariots.
id_user nom compte
1 Marc 701
2 Jean 202
3 Pierre 803
id_produit nom prix
1 souris 6
2 ordi 1000
id_achat id_user id_produit
1 1 2
2 1 1
Généralités
Les colonnes sont typées :
Numérique (BOOLEAN, INT, DOUBLE, …)
Texte (VARCHAR(taille), TEXT, …)
Date/Heure (DATE, TIMESTAMP)
Outil web pour gérer la base : phpMyAdmin
Gestion des utilisateurs, permissions,
Création de bases de données,
Visualisation et recherche,
La requête SELECT
Renvoie une "table" : résultats en lignes/colonnes
SELECT expression FROM matable WHERE condition;
* : tout
Exemples :
SELECT * FROM Acheteurs;
SELECT nom FROM Produits WHERE id_produit=1;
Exo : faites une requête pour extraire les noms de tous les produits de la table Produits dont le prix est > 18 euros.
Compléments sur SELECT
ORDER BY : trier les résultats
SELECT * FROM Produits ORDER BY nom ASC;
LIMIT : limiter le nombre de résultats.
DISTINCT : supprimer tout doublon dans les résultats (SELECT DISTINCT …)
LIKE : chaînes contenant un motif donné :
SELECT id_user from Acheteurs WHERE nom LIKE 'J %';
SELECT count(*) FROM Produits -> pour compter le nombre de résultats.
Jointures (JOIN)
• But : interroger plusieurs tables à la fois.
– SELECT * FROM Acheteurs JOIN Chariots WHERE Acheteurs.id_user = Chariots.id_user;
• Autre exemple :
nom id_pays
Federer 1
Nadal 2
Ferrer 2
id_pays pays
1 Suisse
2 Espagne
3 France
id_pays pays nom
1 Suisse Federer
2 Espagne Nadal
SELECT * from Joueurs; SELECT * from Pays; SELECT * from Pays JOIN
Joueurs WHERE
Pays.id_pays=Joueurs.id_pays;
INSERT
Insérer une ligne dans une table
2 syntaxes :
INSERT INTO Joueurs (id_pays,nom) VALUES (3,'Gasquet');
INSERT INTO Joueurs SET nom='Gasquet', id_pays=3;
Si un champ n'a pas de valeur, s'il est en AUTOINCREMENT il vaudra 1 de plus que le précédent, sinon valeur par défaut
UPDATE, DELETE
UPDATE : mettre à jour une ligne dans une table
UPDATE Joueurs SET nom='Tsonga' WHERE id_pays=3;
DELETE : supprimer une ligne (attention…)
DELETE FROM Joueurs WHERE nom LIKE 'Fe%';
On peut créer une table avec CREATE.
Sessions et cookies
Garder des valeurs d'une page à l'autre
Pour passer des valeurs d'une page à l'autre, la méthode POST est sure, mais il faut utiliser à chaque fois un formulaire.
Solution : les sessions, les cookies.
Les cookies sont de petits fichiers conservés du côté client (ordi du visiteur). Ils permettent de
conserver par exemple ses préférences.
Une session est un fichier conservé sur le serveur et accessible par les scripts en fonction d'un
identifiant généré à sa création.
Les cookies et leurs limites
Créer un cookie : setcookie($var,$valeur,..)
Effacer un cookie : setcookie($var,..) (pas de valeur).
Cookies écrits sur le disque du visiteur : permissions limitées voire interdites suivant les paramètres du
navigateur.
Pas plus de 20 cookies sur un même poste client. Taille d'un cookie limitée.
Mécanisme des sessions
Ouverture d'une session dans chaque page de l'application avec session_start(). A placer tout au début des pages.
Stockage des variables de session dans le tableau super-global $_SESSION.
Lecture des variables de la session possible
dans les différentes pages de l'appli à l'aide du tableau $_SESSION.
Fermeture de la session : session_destroy()
Exemple élémentaire
page1.php <?php session_start();
$_SESSION['nom']='Paul';
echo "<a href=\"page2.php\">Vers la page 2</a>";
?>
page2.php <?php session_start();
echo "<br />Bonjour, ".$_SESSION['nom']."!";
?>
Fin!
Beaucoup d'autres possibilités avec php :
Lecture et écriture de fichiers XML (->RSS)
Génération de graphique, manipulation d'images (créer des miniatures,…)
Gestion des erreurs (classe Exception, throw, try.. catch)
Connexion ftp
Création de fichiers pdf (librairie FPDF).