Cours de révision PHP – BTS SIO SLAM 2e année
Objectif : consolider les bases PHP.
- Variables & constantes
- Conditions, boucles, priorité logique (&& vs and)
- Fonctions (typage paramètres & retour) & PHPDoc
- Portée des variables (locales/globales) & superglobales
- Formulaires & sécurisation
- PDO & requêtes préparées
- Gestion de fichiers
include
&require
- Astuces & mots-clés essentiels
Rappel : la programmation procédurale
La programmation procédurale est un style basé sur :
- Un enchaînement d’instructions séquentielles.
- L’utilisation de structures de contrôle (
if
,for
,while
). - La création de procédures et fonctions pour factoriser le code.
En PHP, c’est le paradigme par défaut (avant l’introduction de la POO).
Code 1 :
<?php
// Exemple procédural simple : calcul du prix TTC
define("TVA", 0.20);
function prixTTC(float $ht): float {
return $ht * (1 + TVA);
}
$prixHT = 100;
echo "Prix TTC = " . prixTTC($prixHT) . " €";
?>
1) Variables & constantes
Différences : une variable peut changer de valeur, une constante est figée (convention en MAJUSCULES et pas de $).
<?php
$produit = "Clavier mécanique"; // variable
$prix = 59.99; // float
define("TVA", 0.20); // constante
echo "$produit coûte $prix € HT<br>";
echo "Prix TTC : " . ($prix * (1 + TVA)) . " €<br>";
?>
2) Conditions, boucles & priorité logique
Conditions
<?php
if ($prix > 100) {
echo "Livraison gratuite !";
} elseif ($prix > 50) {
echo "Réduction de 10%";
} else {
echo "Pas de promotion";
}
?>
Boucles classiques
for
<?php
for ($i = 1; $i <= 5; $i++) {
echo "Produit numéro $i<br>";
}
?>
while
<?php
$stock = 3;
while ($stock > 0) {
echo "Un produit vendu, reste $stock<br>";
$stock--;
}
?>
do…while
<?php
$compteur = 0;
do {
echo "Exécution n°$compteur<br>";
$compteur++;
} while ($compteur < 3);
?>
Boucle sur collections : foreach
<?php
$articles = ["Clavier" => 59.99, "Souris" => 29.99];
foreach ($articles as $nom => $p) {
echo "$nom : $p €<br>";
}
?>
il faut bien rappeler que PHP gère deux types de tableaux :
- tableaux indicés (clés numériques automatiques → 0, 1, 2, …)
-
tableaux associatifs (clés choisies → chaînes ou entiers)
Exemple de foreach avec un tableau indicé
<?php
$fruits = ["Pomme", "Banane", "Cerise"];
foreach ($fruits as $index => $valeur) {
echo "Index $index : $valeur<br>";
}
?>
Priorité des opérateurs logiques (très important)
&&
et ||
ont une priorité plus forte que and
et or
. Préférer && et || dans les conditions.
<?php
$a = true; $b = false;
$result1 = $a && $b; // false
$result2 = $a and $b; // interprété comme ($result2 = $a) and $b → $result2 vaut true
echo $result2 ? "true" : "false"; // affiche true
?>
3) Fonctions, typage & PHPDoc
Depuis PHP 7+, on peut typer paramètres et valeur de retour. PHPDoc améliore la lisibilité et les outils.
Fonction avec typage + PHPDoc
<?php
define("TVA", 0.20);
/**
* Calcule le prix TTC.
*
* @param float $prixHT Prix hors taxes
* @return float Prix TTC
*/
function prixTTC(float $prixHT): float {
return $prixHT * (1 + TVA);
}
echo prixTTC(100); // 120
?>
Variables locales vs globales (à éviter si possible)
<?php
$remise = 0.1; // globale
/**
* Applique une remise globale (exemple pédagogique)
*
* @param float $prix
* @return float
*/
function prixRemise(float $prix): float {
global $remise; // préférez passer $remise en paramètre
return $prix * (1 - $remise);
}
?>
Bonne pratique : passer la remise en paramètre plutôt que d’utiliser global
.
4) Formulaires & sécurisation (10 min)
Formulaire HTML
<form method="post" action="traitement.php">
<label>Produit :</label>
<input type="text" name="produit">
<label>Quantité :</label>
<input type="number" name="quantite" min="1">
<button type="submit">Commander</button>
</form>
Traitement sécurisé côté PHP
<?php
/**
* Nettoie une entrée texte (trim + échappement HTML)
*
* @param string $data
* @return string
*/
function nettoyer(string $data): string {
return htmlspecialchars(trim($data), ENT_QUOTES, 'UTF-8');
}
$produit = isset($_POST['produit']) ? nettoyer($_POST['produit']) : '';
$quantite = isset($_POST['quantite']) ? (int) $_POST['quantite'] : 0;
if (!empty($produit) && $quantite > 0) {
echo "Commande : $quantite x $produit";
} else {
echo "Formulaire incomplet.";
}
?>
Superglobales utiles : $_GET
, $_POST
, $_REQUEST
, $_SERVER
, $_FILES
, $_COOKIE
.
But : convertir certains caractères spéciaux en entités HTML.
Cela empêche qu’un utilisateur injecte du code HTML ou JavaScript dans un formulaire (faille XSS).
Par défaut, la fonction transforme :
-
<
devient<
-
>
devient>
-
&
devient&
-
"
devient"
-
'
devient'
si on ajouteENT_QUOTES
(important !).
Fiche Sécurité PHP – BTS SIO SLAM
Principales bonnes pratiques pour sécuriser vos scripts PHP (utile pour un site e-commerce).
Valider et nettoyer les entrées utilisateurs
- Toujours considérer les données comme non fiables.
- Trim + échappement HTML :
<?php
$nom = htmlspecialchars(trim($_POST['nom']), ENT_QUOTES, 'UTF-8');
?>
Forcer le type attendu :
<?php
$quantite = (int) $_POST['quantite']; // convertit en entier
?>
- Filtrer avec
filter_var()
:
<?php
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
?>
Sécuriser les formulaires
- Utiliser
method="post"
(éviterget
pour des données sensibles). - Vérifier
isset()
ou!empty()
avant de traiter :
<?php
if (isset($_POST['produit']) && !empty($_POST['produit'])) {
// traitement
}
?>
$sql = "SELECT * FROM produits WHERE nom = '" . $_POST['produit'] . "'";
✅ Bon (requêtes préparées) :
<?php
$stmt = $pdo->prepare("SELECT * FROM produits WHERE nom = :nom");
$stmt->execute([":nom" => $_POST['produit']]);
?>
Gestion des mots de passe
- Jamais stocker en clair.
- Utiliser
password_hash()
etpassword_verify()
:
<?php
$hash = password_hash($_POST['mdp'], PASSWORD_DEFAULT);
if (password_verify($_POST['mdp'], $hash)) {
echo "Connexion réussie";
}
?>
Algorithme utilisé
Actuellement (PHP 7.4 → PHP 8.3) :
PASSWORD_DEFAULT
correspond à Bcrypt (PASSWORD_BCRYPT
)
Bcrypt :
-
-
utilise l’algorithme Blowfish en interne, adapté pour les mots de passe.
-
automatiquement salé (sel généré aléatoirement par PHP, inclus dans le hash).
- Longueur : 60 caractères ASCII.
-
Gestion des fichiers
- Ne jamais faire confiance au nom du fichier uploadé.
- Vérifier le type MIME et l’extension :
<?php
$type = mime_content_type($_FILES['fichier']['tmp_name']);
if ($type !== 'image/png' && $type !== 'image/jpeg') {
die("Format interdit");
}
?>
Bonnes pratiques générales
- Activer les erreurs en développement :
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
- Désactiver l’affichage en production, mais loguer les erreurs.
- Utiliser
require
/include
avec__DIR__
pour des chemins fiables. - Ne pas afficher d’infos sensibles (
$e->getMessage()
) en prod → loguer. - Toujours déclarer l’encodage UTF-8 :
<?php
header("Content-Type: text/html; charset=UTF-8");
?>
5) PDO & requêtes préparées
Connexion & requête préparée
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=ecommerce;charset=utf8", "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/**
* Récupère les produits en dessous d’un prix max.
*
* @param PDO $pdo
* @param float $max
* @return array
*/
function getProduits(PDO $pdo, float $max): array {
$sql = "SELECT nom, prix FROM produits WHERE prix < :max";
$stmt = $pdo->prepare($sql);
$stmt->execute([":max" => $max]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
foreach (getProduits($pdo, 100) as $row) {
echo $row['nom'] . " - " . $row['prix'] . " €<br>";
}
} catch (PDOException $e) {
echo "Erreur : " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8');
}
?>
Pourquoi préparées ? Pour éviter les injections SQL et bénéficier d’un binding typé.
6) Gestion de fichiers (lecture/écriture)
Lecture ligne à ligne
<?php
$handle = fopen("produits.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
echo htmlspecialchars($line) . "<br>";
}
fclose($handle);
}
?>
Écriture (append)
<?php
$handle = fopen("produits.txt", "a");
if ($handle) {
fwrite($handle, "Souris;29.99\n");
fclose($handle);
}
?>
Usages typiques : logs, exports simples, stockage temporaire.
7) Factoriser avec include
& require
include
est tolérant (warning si fichier manquant, le script continue). require
est strict (erreur fatale si manquant).
Exemple
<!-- header.php -->
<?php echo "<h1>Mon site e-commerce</h1><hr>"; ?>
<!-- index.php -->
<?php
include __DIR__ . "/header.php"; // continue si manquant
require __DIR__ . "/config.php"; // stoppe si manquant (utile pour la config indispensable)
?>
Astuce : utiliser __DIR__
pour des chemins robustes.
8) Astuces & mots-clés indispensables
- Tests :
isset()
,empty()
- Debug :
var_dump()
,print_r()
- Chaînes :
explode()
,implode()
, concaténation avec.
- Dates :
date("d/m/Y H:i")
- Constantes magiques :
__FILE__
,__DIR__
,__LINE__
- Mots-clés :
function
,return
,global
,const
,define
,try
/catch
,if
/elseif
/else
,for
/foreach
/while
,include
/require
9) Conclusion
Nous avons revu : variables, constantes, fonctions (typage & PHPDoc), portée, formulaires sécurisés, PDO, priorité logique, fichiers, include/require.
Ce contenu est réservé aux membres du site. Si vous êtes un utilisateur existant, veuillez vous connecter. Les nouveaux utilisateurs peuvent s'inscrire ci-dessous.