Seb-Info

Rappels PHP procédurale

Rappels PHP procédurale

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 &lt;

  • > devient &gt;

  • & devient &amp;

  • " devient &quot;

  • ' devient &#039; si on ajoute ENT_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" (éviter get pour des données sensibles).
  • Vérifier isset() ou !empty() avant de traiter :
<?php
if (isset($_POST['produit']) && !empty($_POST['produit'])) {
    // traitement
}
?>
Protéger la base de données (PDO & requêtes préparées) — voir le cours après❌ Mauvais (injection SQL possible) :

$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() et password_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.

Connexion pour les utilisateurs enregistrés
   
Nouvel utilisateur ?
*Champ requis
Powered by WP-Members