Le langage PHP, pour PHP Hypertext Preprocessor, (PHP étant un acronyme récursif, voir ci-après) a été créé au début des années 1990 par Rasmus Lerdorf. Initialement PHP signifait Personal Home Page Tools.
PHP est un langage de script open source spécialement conçu pour le développement d'applications web et peut être intégré facilement au (X)HTML. Il est à la base un langage procédural mais dispose également d'une couche objet.
PHP peut être utilisé :
comme langage de script côté serveur
ou comme langage de programmation en ligne de commande
Un sigle ou acronyme récursif n'a de sens que si les lettres qui le composent (sauf la première) correspondent à un programme. Par exemple, FINE pour Fine Is Not Emacs, Fine étant un clone du logiciel EMACS, est un acronyme récursif.
Cependant, GNU n'est, à mon sens, pas un acronyme récursif contrairement à ce que l'on dit. Cela devrait être GINU = GINU Is Not Unix ou GSNU car on écrit GNU's Not Unix, mais on oublie le IS représenté par 's ce qui, selon moi, travestit le sens de l'expression.
Un exemple d'acronyme récursif pourrait être KISS = Kiss Is So Sweet ou MISS = Miss Is So Sad. L'idée étant qu'un acronyme, que l'on pourrait qualifier de parfait, ait un sens et que les lettres qui le composent donnent une définition proche du sens de l'acronyme.
On peut également s'amuser à créer des acronymes récursifs en mixant deux langues comme par exemple SHAME = Shame Honte A Moi Essentiellement.
Nous allons dans la suite de ce cours appréhender trois aspects majeurs du langage, à savoir :
la dynamisation des pages web
l'accès aux bases de données
le traitement des données des formulaires (X)HTML
4.2. Les bases du langage
Mais dans un premier temps, intéressons nous aux bases du langage.
Les caractéristiques du langage sont les suivantes :
on différencie majuscule et minuscule
les noms de variables commencent par un symbole $
les variables ne sont pas typées statiquement mais dynamiquement lorsque l'on affecte une valeur
la syntaxe est très proche de celle du langage C
On introduit le code PHP dans une page (X)HTML ou dans un fichier contenant uniquement du code PHP par les balises :
<?php
.... mon code PHP ...
?>
4.2.1. Les variables
Voici quelques exemples de définition de variables. Les conventions sont les mêmes qu'en C excepté le symbole dollar qui précède chaque nom de variable :
$x=1;
$_x_1=2;
$ma_chaine="coucou";
4.2.2. Les types
On retrouve les types de base comme les booléens, les entiers, les réels, les chaînes de caractères. Pour connaître le type d'une variable, on utilise la fonction gettype() qui retourne une chaîne de caractères.
Etant donné le typage dynamique, on peut réutiliser le même nom de variable et lui affecter des valeurs différentes :
type de x = integer
type de x = boolean
type de y = double
type de z = string
4.2.3. Les chaînes de caractères
Les chaînes de caractères peuvent être introduites de trois manières différentes :
soit par des guillemets simples : 'coucou'
soit par des guillemets doubles : "coucou\n \$x", dans ce cas PHP interprétera \n comme le retour chariot et affichera le contenu de la variable \$x
soit par la syntaxe dite NOWDOC qui permet de décrire une chaîne sur plusieurs lignes sans analyse des caractères, donc avec des guillemets simples
soit par la syntaxe dite HEREDOC qui permet de décrire une chaîne sur plusieurs lignes avec analyse des caractères (doubles guillemets) : prise en compte des séquences d'échappement et des variables
x = \$x\n
x = 3.14
!!!
x = \$x\n
!!!
-+-
x = 3.14
-+-
On notera que le mot clé echo permet l'affichage d'information sur le flux de sortie standard et que le point (.) réalise la concaténation des chaînes.
4.2.4. Les tableaux
Les tableaux en PHP sont des tableaux associatifs de la forme clé => valeur.
Si on insère que des valeurs les indices prendront des valeurs entières.
Les tableaux peuvent également prendre des valeurs de type différents.
L'accès aux bases de données se fait au travers de la couche PDO (PHP Data Object).
La couche PDO est assez lourde à manipuler car il faut gérer les exceptions éventuelles qui seront générées en cas d'erreur. Pour simplifier les traitements, on crée généralement une classe PHP donc le constructeur réalisera la connexion à la base de données et on ajoute à cette classe, un ensemble de fonctions afin de réaliser les opérations de bases que l'on appelle le CRUD :
Create : ajout, qui correspond à l'INSERT de SQL
Retrieve, récupération d'information, le SELECT du SQL
Update, comme en SQL, on modifie une information existante
Delete, comme en SQL, on supprime une information
4.3.1. Connexion à la base de données
On crée un premier fichier database_information.php qui contient les données de connexion :
On crée ensuite une classe DatabaseConnection dans le fichier database_connection.php dont le constructeur établit la connexion avec la base de données au travers de PDO.
// création de la connexion qui sera retournée dans
// la variable $pdo
$this->pdo=new PDO($db_access,$user,$pass);
} catch( PDOException $pdo_exc){
raise( _METHOD_ );
}
}
}
?>
On gère le fait que l'on utilise la classe soit sur le site web, soit en ligne de commande (CLI = Command Line Interface) afin de mettre en forme le message d'erreur.
4.3.2. Insertion des données : INSERT
On peut ensuite insérer des données en utilisant des requêtes paramétrées. Le code ressemblera à cela :
Par le passé, on avait l'habitude de soumettre les données du formulaire à un script PHP qui :
récupérait les données
les analysait
et renvoyait ces mêmes données à la page contenant le formulaire en cas d'erreur (ex: date de naissance invalide, mot de passe sans au moins une lettre majuscule) afin qu'elles soient modifiées
ou enregistrait les données dans une base de données et indiquait que l'ajout ou la modification avait été effectuée
Ce processus se révèle assez lourd et engendre, en cas d'erreur (étape 3), de nombreux transferts entre le client et le serveur.
Avec le développement de Javascript et d'HTML 5, on préfère aujourd'hui vérifier la validité des données du côté client (navigateur) puis les soumettre au serveur si elles sont valides.
4.4.2. Accès aux données
Lorsque l'on soumet les données d'un formulaire (X)HTML à une page PHP sur le serveur, les données sont stockées et accessibles dans des tableaux de chaînes de caractères :
dans la variable \$_POST, si l'attribut action de la balise form a été fixé à post
dans la variable \$_GET, si l'attribut action de la balise form a été fixé à get
dans la variable \$_FILES, si on a un champ input de typefile, il faut également modifier l'attribute enctype (voir ci-après)
Pour faciliter les traitements, la variable \$_REQUEST a été définie et elle prend en compte les valeurs de \$_POST ou \$_GET.
Ces tableaux associatifs ont pour clé le nom du champ associé, il faut pour cela avoir renseigné pour chaque champ l'attribut name dans le formulaire (X)HTML.
La première étape du traitement consiste à récupérer la valeur de chaque champ du formulaire. Toutes ces valeurs sont des chaînes de caractères. Il est en général nécessaire d'éliminer les espaces en début et/ou fin de chaîne en utilisant la fonction trim().
Il peut être ensuite nécessaire de convertir certaines valeurs en entier ou flottant. Pour cela on utilise généralement les fonctions :
intval( string )
floatval( string )
On peut également vérifier si une chaîne représente un nombre en utilisant is_numeric().
4.4.3. Cas des fichiers
4.4.3.a Formulaire
Pour uploader (télécharger) un fichier dans un formulaire, il faut utiliser un champ de type input et de type file. L'attribut accept permet de spécifier les extensions des fichiers autorisés.
Le fichier ne pourra être téléchargé que par la méthode post du formulaire.
On trouvera les informations nécessaires pour uploader un fichier sur cette page.
Le formulaire doit inclure dans sa définition un attribut enctype de valeur multipart/form-data.
Les formulaires HTML fournissent trois méthodes d'encodage des données (attribut enctype de la balise form) qui seront transmises :
application/x-www-form-urlencoded, méthode par défaut, encodage similaire à la méthode get
multipart/form-data, méthode plus complexe qui permet d'inclure des fichiers
text/plain, défini par HTML5 réservé au débogage, à ne pas utiliser de manière générale
On peut limiter la taille du fichier en ajoutant un champ caché (hidden) juste avant le champ de type file de nom MAX_FILE_SIZE (cf. code précédent).
4.4.3.b Traitement des données
Le script PHP qui reçoit les données doit vérifier la variable globale \$_FILES qui contient le ou les fichiers dans le cas où on aura autorisé la sélection de plusieurs fichiers (ajout de l'attribut multiple sans valeur).
Voici un exemple pour lequel on a téléchargé le fichier td1.pdf qui possède une taille de 173292 octets donc bien inférieure à la taille limite de 600000 octets :
$_FILES["champ_fichier"] = Array (of type array)
Array["name"] = td1.pdf (of type string)
Array["type"] = application/pdf (of type string)
Array["tmp_name"] = /tmp/phpJka1R1 (of type string)
Array["error"] = 0 (of type integer)
Array["size"] = 173292 (of type integer)
Le fichier est stocké de manière temporaire dans le répertoire /tmp sous le nom phpJka1R1.
Si le fichier est plus grand que la taille autorisée, il ne sera pas téléchargé : une erreur de valeur 2 est générée et le fichier possède une taille de 0, n'a pas de type et n'est pas stocké de manière temporaire :
$_FILES["champ_fichier"] = Array (of type array)
Array["name"] = cours.pdf (of type string)
Array["type"] = (of type string)
Array["tmp_name"] = (of type string)
Array["error"] = 2 (of type integer)
Array["size"] = 0 (of type integer)
Pour récupérer le fichier, il faudra utiliser la méthode move_uploaded_file() (voir documentation) de PHP afin de le déplacer dans un répertoire adéquat :
Pour cela, on crée généralement dans le répertoire public_html, un sous-répertoire, par exemple upload, auquel il faut attribuer des droits qui sont ceux du serveur web (www-data).
4.5. Exercices
Exercice 4.1
Créer un programme PHP qui permet de trier un tableau d'entiers. On initialisera le tableau avec des valeurs aléatoires et on créera une fonction qui trie le tableau en utilisant un tri à bulles et qui accepte un tableau en paramètre.
Exercice 4.2
Modifiez le programme précédent en implantant le tri sous forme d'un tri rapide.
Exercice 4.3
Récupérez les données d'un formulaire contenant un champ date et afficher la date en français.