Anis Boubaker, Ph.D.
Prof. Enseignant en informatique
Le modèle client/serveur est une architecture distribuée où les tâches et les charges de travail sont réparties entre les fournisseurs de ressources ou de services, appelés serveurs, et les demandeurs de service, appelés clients.
Le client est généralement un navigateur web qui envoie des requêtes au serveur et affiche les ressources reçues, comme les pages web.
Le serveur traite les requêtes des clients et renvoie les réponses appropriées. Il peut s'agir de fichiers statiques, de documents générés dynamiquement, ou d'autres types de ressources.
HTTP (Hypertext Transfer Protocol) est le protocole utilisé pour la communication entre clients et serveurs dans le web.
// Requête HTTP du client
GET /index.html HTTP/1.1
Host: www.exemple.com
// Réponse HTTP du serveur
HTTP/1.1 200 OK
Content-Type: text/html
<html>...</html>
Cet exemple montre une requête HTTP simple pour une page web et la réponse du serveur.
Le cycle de vie d'une requête HTTP décrit le processus complet depuis l'envoi d'une requête par un client jusqu'à la réception et l'affichage de la réponse.
Source: medium.com
Le processus commence lorsque le client (navigateur) envoie une requête HTTP au serveur. Cette requête peut être déclenchée par l'utilisateur en chargeant une page web, en soumettant un formulaire, etc.
GET /page.php HTTP/1.1
Host: www.exemple.com
Le serveur reçoit la requête et la traite. Si la requête demande une ressource PHP, le serveur exécute le script PHP correspondant.
<html lang="fr">
<head>...</head>
<body>
<?php
// Traitement PHP
echo "<h1>Bonjour, monde!</h1>";
?>
</body></html>
Ce script PHP pourrait générer du contenu dynamique en fonction de la requête (interrogation de la BD).
Après avoir traité la requête, le serveur envoie une réponse au client. Cette réponse inclut généralement un en-tête HTTP et un corps de message, qui peut être le HTML généré par le script PHP.
HTTP/1.1 200 OK
Content-Type: text/html
<html lang="fr">
<head>...</head>
<body>
<h1>Bonjour, monde!</h1>
</body></html>
Une fois la réponse reçue, le navigateur client l'interprète et affiche le contenu. Si la réponse est du HTML, le navigateur rend la page pour l'utilisateur.
PHP est un langage de script côté serveur utilisé pour développer des sites web dynamiques.
<?php //Début d'un script PHP
/*
* Votre code PHP ici
*/
?> //Fin d'un script PHP
<html>
...
<p>
<?php
for($i=0; $i<10; $i++){
echo "Bonjour le monde ".$i." fois!<br />";
}
?>
</p>
<p>
<?= 'Ceci aussi est interprété en PHP'?>
</p>
</html>
<?php
$variable = "Hello, World!";
echo $variable;
?>
Les variables en PHP commencent par le signe $.
Comme en Javascript, les variables en PHP sont typées dynamiquement.
<?php
// Structure if
if ($a > $b) {
echo "a est plus grand que b";
}
// Boucle for
for ($i = 0; $i < 10; $i++) {
echo $i;
}
// Boucle while
$i = 0;
while ($i < 10) {
echo $i;
$i++;
}
?>
Écrivez un script PHP qui génère un tableau HTML de 10x10 cellules, avec des numéros de 1 à 100. Coloriez les cellules en alternance pour créer un effet damier.
Les fonctions en PHP sont des blocs de code réutilisables conçus pour effectuer une tâche spécifique.
Une fonction est déclarée avec le mot-clé
function
suivi du nom de la fonction et des
parenthèses.
<?php
function saluer() {
echo "Bonjour, monde!";
}
?>
Cette fonction nommée saluer
affiche un message.
Une fonction est appelée en utilisant son nom suivi de parenthèses.
<?php
saluer(); // Affiche "Bonjour, monde!"
?>
Cet exemple montre comment appeler la fonction saluer
.
Les fonctions peuvent prendre des paramètres pour agir différemment selon les valeurs passées.
<?php
function salutation($nom) {
echo "Bonjour, " . $nom . "!";
}
salutation("Alice");
?>
Cette fonction utilise un paramètre $nom
pour
personnaliser le message.
En PHP, les variables peuvent avoir différentes portées (globale, locale, statique).
<?php
$x = 5; // Variable globale
function tester() {
$y = 10; // Variable locale
echo $x; // Erreur: $x n'est pas accessible ici
}
?>
Cet exemple montre la différence entre les variables globales et locales.
Les variables définies à l'extérieur d'une fonction ont une portée globale, tandis que celles définies à l'intérieur d'une fonction ont une portée locale.
<?php
$x = 5; // Variable globale
function tester() {
global $x; // Référence à la variable globale $x
$y = 10; // Variable locale
echo $x; // Affiche 5
}
tester();
?>
Cet exemple montre comment accéder à une variable globale à l'intérieur d'une fonction.
Les variables statiques conservent leur valeur entre les appels de fonction.
<?php
function compter() {
static $compte = 0;
$compte++;
echo $compte;
}
compter(); // 1
compter(); // 2
?>
Cet exemple montre comment une variable statique conserve sa valeur.
$produits = [
["nom" => "Produit A",
"prix" => 20.99,
"categorie" => "Catégorie 1"],
["nom" => "Produit B",
"prix" => 15.69,
"categorie" => "Catégorie 2"],
//...
];
Les variables superglobales en PHP sont des variables intégrées qui sont toujours disponibles dans tous les contextes du script.
$_SESSION est une superglobale PHP qui stocke des informations de session qui peuvent être utilisées sur plusieurs pages.
<?php
session_start();
$_SESSION["utilisateur"] = "Alice";
echo $_SESSION["utilisateur"]; // Affiche "Alice"
?>
Cet exemple montre comment stocker et accéder à des données de session.
$_REQUEST est une superglobale PHP qui contient les données de $_GET, $_POST, et $_COOKIE.
<?php
// Supposons que le formulaire a été soumis avec
// une méthode GET ou POST
echo "Bonjour " . $_REQUEST["nom"];
?>
Cet exemple montre comment accéder aux données soumises via un formulaire.
$_GET est une superglobale PHP qui contient les données envoyées via l'URL (méthode GET).
<?php
// URL: http://exemple.com?nom=Alice
echo "Bonjour " . $_GET["nom"]; // Affiche "Bonjour Alice"
?>
Cet exemple montre comment récupérer des données envoyées dans l'URL.
$_POST est une superglobale PHP qui contient les données envoyées via un formulaire HTML (méthode POST).
<?php
// Supposons qu'un formulaire a été soumis avec ces données
echo "Bonjour " . $_POST["nom"];
?>
Cet exemple montre comment accéder aux données soumises par un formulaire POST.
Le reste du cours sera vu autour du cas d'étude d'un Babillard de PostIts
PHP offre plusieurs moyens d'interagir avec les bases de données, notamment via MySQLi et PDO (PHP Data Objects).
MySQLi
MySQLi est une extension PHP qui permet l'interaction avec les bases de données MySQL.
<?php
$conn = new mysqli("hostname", "username", "password",
"database");
if ($conn->connect_error) {
die("Connexion échouée: " . $conn->connect_error);
}
echo "Connexion réussie";
?>
Cet exemple montre une connexion de base à une base de données MySQL avec MySQLi.
MySQLi
La gestion des erreurs est cruciale pour déboguer et maintenir la sécurité de l'application.
// Exemple avec MySQLi
if ($conn->connect_error) {
die("Erreur de connexion: " . $conn->connect_error);
}
PDO offre une couche d'abstraction pour l'accès aux bases de données, permettant d'utiliser plusieurs types de bases de données.
<?php
try {
$conn = new PDO("mysql:host=hostname;dbname=database",
"username", "password");
$conn->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
echo "Connexion réussie";
} catch(PDOException $e) {
echo "Connexion échouée: " . $e->getMessage();
}
?>
Cet exemple montre une connexion de base à une base de données en utilisant PDO.
Rappels sur les commandes SQL de base pour interagir avec les bases de données.
<?php
$result = $conn->query("SELECT * FROM table");
while($row = $result->fetch_assoc()) {
echo $row["colonne1"]." ".$row["colonne2"]."<br>";
}
?>
Cet exemple montre comment exécuter une requête SELECT et afficher les résultats avec MySQLi.
<?php
$stmt = $conn->query("SELECT * FROM table");
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row["colonne1"]." ".$row["colonne2"]."<br>";
}
?>
Cet exemple montre comment exécuter une requête SELECT et afficher les résultats avec PDO.
$requete = $connexion->prepare(
"SELECT * FROM etudiants WHERE age > :age"
);
// Liaison des paramètres
$age = 30;
$requete->bindParam(':age', $age);
// Exécution de la requête
$requete->execute();
bindParam
bindParam
relie les paramètres à une
variable par référence
$requete = $connexion->prepare(
"SELECT * FROM etudiants WHERE age > :age"
);
// Liaison des paramètres
$age = 30;
$requete->bindParam(':age', $age);
$requete->execute(); //exécution avec :age = 30
$age = 25
$requete->execute(); //exécution avec :age = 25
bindValue
bindValue
relie les paramètres à
la valeur d'une variable
$requete = $connexion->prepare(
"SELECT * FROM etudiants WHERE age > :age"
);
// Liaison des paramètres
$age = 30;
$requete->bindValue(':age', $age);
$requete->execute(); //exécution avec :age = 30
$age = 25
$requete->execute();//Aucun changement
//exécution avec :age = 30
execute
bindParam
ou
bindValue
$requete = $connexion->prepare(
"SELECT * FROM etudiants
WHERE age > :ageMin AND age < :ageMax"
);
// Liaison des paramètres
$requete->execute([
'ageMin' => 20,
'ageMax' => 30
]);
fetch
1/4
fetch
permet de récupérer une ligne du
résultat de la requête
// Exécution de la requête
$requete->execute();
// Récupération d'une seule ligne
$ligne = $requete->fetch(PDO::FETCH_ASSOC);
if ($ligne) {
print_r($ligne);
} else {
echo "Aucun résultat trouvé.";
}
fetch
2/4
while
:
// Exécution de la requête
$requete->execute();
// Boucle à travers chaque ligne de résultat
while ($ligne = $requete->fetch(PDO::FETCH_ASSOC)) {
print_r($ligne);
}
fetch
2/4
PDO::FETCH_ASSOC
):
$requete = $connexion->prepare(
"SELECT `nom`, `prenom`, `age` FROM etudiants"
);
// Liaison des paramètres
$requete->execute();
$ligne = $stmt->fetch(PDO::FETCH_ASSOC);
echo "Nom: ".$ligne['nom']." Prénom: ".$ligne['prenom'];
fetch
Option | Chaque ligne est... |
---|---|
PDO::FETCH_ASSOC | Un tableau associatif, les clés correspondent aux noms de colonnes |
PDO::FETCH_NUM | Un tableau indexé par numéro d'ordre des colonnes |
PDO::FETCH_OBJ | Un objet anonyme, les noms des attributs qui correspondent aux noms des colonnes. |
fetch
fetch
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
//mode par défaut: FETCH_ASSOC
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
die("Erreur de connexion BD: ".$e->getMessage);
}
execute
$req = "INSERT INTO etudiants (`nom`, `prenom`)
VALUES (:nom, :prenom)";
$req = $conn->prepare($sql);
$req->bindParam(':nom', $leNom);
$req->bindParam(':prenom', $lePrenom);
$req->execute();
lastInsertId
permet
d'obtenir la dernière valeur d'une clé primaire auto-incrémentée
$idEtudiantAjoute = $conn->lastInsertId();
PHP est fréquemment utilisé pour recueillir et traiter les données de formulaire, permettant une interaction dynamique avec les utilisateurs.
Les formulaires HTML sont utilisés pour collecter les entrées de l'utilisateur.
<form action="traitement.php" method="post">
Nom: <input type="text" name="nom"><br>
Email: <input type="email" name="email"><br>
<input type="submit" value="Soumettre">
</form>
Ce formulaire envoie les données à traitement.php
via
POST.
Les données soumises via POST sont accessibles via la superglobale $_POST en PHP.
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$nom = $_POST['nom'];
$email = $_POST['email'];
// Traiter les données...
}
?>
Cet exemple montre comment accéder aux données de formulaire soumises.
Les données soumises via GET sont accessibles via la superglobale $_GET en PHP.
<?php
if ($_SERVER["REQUEST_METHOD"] == "GET") {
$parametre = $_GET['parametre'];
// Traiter les données...
}
?>
Cet exemple montre comment accéder aux données envoyées via la méthode GET.
Il est important de valider et de nettoyer les données reçues pour éviter les failles de sécurité.
<?php
$nom = $email = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$nom = htmlspecialchars($_POST['nom']);
$email = filter_input(INPUT_POST, 'email',
FILTER_VALIDATE_EMAIL);
// Autres validations...
}
?>
Cet exemple montre une validation et un nettoyage des données reçues.
htmlspecialchars
htmlspecialchars
remplace les caractères
(&, ", ', < et >) par leurs entités HTML correspondantes
filter_var
$email = $_POST['email'];
// Nettoyage
$emailNettoye = filter_var($email, FILTER_SANITIZE_EMAIL);
// Validation
if (!filter_var($emailNettoye, FILTER_VALIDATE_EMAIL)) {
echo "L'adresse email n'est pas valide.";
}