Installation et Configuration

PHP Bases

Guide complet pour installer PHP sur Windows, configurer Visual Studio Code et apprendre les bases du langage avec des exercices pratiques.

💻 Installation Windows
🔧 Configuration VS Code
📚 Syntaxe Essentielle

Installation PHP sur Windows

Suivez ce guide étape par étape pour installer PHP et créer votre premier serveur local.

1 Méthode XAMPP (Recommandé pour débuter)

Avantages de XAMPP :

  • Installation tout-en-un (PHP + Apache + MySQL)
  • Configuration automatique
  • Interface graphique simple
  • Parfait pour le développement local

Étapes d'installation :

  1. 1.
    Télécharger XAMPP depuis apachefriends.org
  2. 2. Exécuter l'installateur en tant qu'administrateur
  3. 3. Choisir le dossier d'installation (ex: C:\xampp)
  4. 4. Sélectionner Apache, PHP et MySQL
  5. 5. Terminer l'installation

Configuration XAMPP :

# Lancer XAMPP Control Panel
1. Démarrer Apache (Start)
2. Optionnel: Démarrer MySQL
# Tester l'installation
Ouvrir: http://localhost/
Page d'accueil XAMPP = OK !
# Dossier de travail
C:\xampp\htdocs\
Premier test :
# Créer: C:\xampp\htdocs\test.php
<?php
echo "Hello PHP!";
?>

Tester: http://localhost/test.php

2 Installation Manuelle PHP (Avancé)

Téléchargement PHP :

  1. 1.
    Aller sur php.net/downloads
  2. 2. Télécharger "Thread Safe" pour Windows
  3. 3. Extraire dans C:\php\
  4. 4. Copier php.ini-development vers php.ini
  5. 5. Ajouter C:\php\ au PATH système

Configuration du PATH :

  1. 1. Touche Windows + R, taper "sysdm.cpl"
  2. 2. Onglet "Avancé" → Variables d'environnement
  3. 3. Variables système → Path → Modifier
  4. 4. Nouveau → C:\php\
  5. 5. OK sur tout

Tester l'installation :

# Ouvrir CMD/PowerShell
php -v
PHP 8.x.x (cli) ...
# Tester un fichier
php -f test.php

Serveur de Développement PHP Intégré

Lancer le serveur :

# Dans le dossier de votre projet
php -S localhost:8000
# Avec un dossier spécifique
php -S localhost:8000 -t public
# Résultat
PHP 8.x Development Server started
Listening on http://localhost:8000

Avantages :

  • Pas besoin d'Apache
  • Configuration minimale
  • Parfait pour tests rapides
  • Portable
⚠️ Attention :

Le serveur intégré est uniquement pour le développement, jamais en production !

Configuration Visual Studio Code

Optimisez VS Code pour le développement PHP avec les extensions essentielles.

Installation Visual Studio Code

Installation :

  1. 1. Télécharger depuis code.visualstudio.com
  2. 2. Exécuter l'installateur
  3. 3. Cocher "Ajouter au PATH"
  4. 4. Cocher "Ouvrir avec Code" (menu contextuel)
  5. 5. Finaliser l'installation

Premier lancement :

  • • Choisir le thème (Dark+ recommandé)
  • • Sélectionner les extensions suggérées
  • • Synchroniser avec un compte Microsoft (optionnel)
  • • Configurer les raccourcis clavier

Extensions Essentielles pour PHP

1 PHP Intelephense

Autocomplétion, analyse de code, navigation

ext install bmewburn.vscode-intelephense-client

2 PHP Debug

Débogage avec Xdebug

ext install xdebug.php-debug

3 PHP DocBlocker

Génération automatique de documentation

ext install neilbrayfield.php-docblocker

4 Auto Rename Tag

Renommage automatique des balises HTML

ext install formulahendry.auto-rename-tag

5 Bracket Pair Colorizer

Coloration des parenthèses et crochets

ext install CoenraadS.bracket-pair-colorizer-2

6 Live Server

Serveur de développement avec rechargement automatique

ext install ritwickdey.LiveServer

Configuration settings.json

{
    // PHP Configuration
    "php.suggest.basic": false,
    "php.validate.enable": false,
    "intelephense.environment.phpVersion": "8.0",
    "intelephense.files.maxSize": 5000000,
    
    // Editor
    "editor.fontSize": 14,
    "editor.tabSize": 4,
    "editor.insertSpaces": true,
    "editor.wordWrap": "on",
    "editor.minimap.enabled": true,
    "editor.formatOnSave": true,
    
    // Files
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 1000,
    "files.associations": {
        "*.php": "php"
    },
    
    // Terminal
    "terminal.integrated.defaultProfile.windows": "Command Prompt",
    
    // Emmet
    "emmet.includeLanguages": {
        "php": "html"
    }
}

Pour accéder aux paramètres : Ctrl+, → Ouvrir settings.json (icône en haut à droite)

Les Bases de PHP

Découvrez les concepts fondamentaux de PHP pour commencer à développer.

Qu'est-ce que PHP ?

📝 Définition

PHP (PHP: Hypertext Preprocessor) est un langage de programmation côté serveur conçu pour le développement web.

🌐 Utilisations

  • • Sites web dynamiques
  • • Formulaires de contact
  • • E-commerce
  • • CMS (WordPress)
  • • APIs et services web

Avantages

  • • Facile à apprendre
  • • Gratuit et open source
  • • Large communauté
  • • Compatible multiplateforme
  • • Nombreuses librairies

Comment fonctionne PHP ?

Côté Client vs Côté Serveur :

Côté Client (Browser)
  • • HTML, CSS, JavaScript
  • • Exécution dans le navigateur
  • • Code visible par l'utilisateur
  • • Interactivité immédiate
Côté Serveur (PHP)
  • • PHP, Python, Node.js
  • • Exécution sur le serveur
  • • Code caché à l'utilisateur
  • • Accès aux bases de données

Cycle de traitement PHP :

1 Client demande page.php
2 Serveur exécute le code PHP
3 PHP génère du HTML
4 HTML envoyé au client
5 Browser affiche la page

Syntaxe PHP Essentielle

Maîtrisez les éléments fondamentaux de la syntaxe PHP.

1 Balises PHP

Types de balises :

// Balises complètes (recommandé)
<?php
echo "Hello World";
?>
// Balises courtes (si activées)
<?= "Hello World" ?>
// Dans du HTML
<h1><?= $titre ?></h1>

Bonnes pratiques :

  • Toujours utiliser <?php
  • Pas de ?> en fin de fichier PHP pur
  • <?= pour affichage simple dans HTML
  • Éviter les balises courtes <?
Exemple mélange HTML/PHP :
<!DOCTYPE html>
<html>
<body>
<?php $nom = "Jean"; ?>
<h1>Bonjour <?= $nom ?>!</h1>
</body>
</html>

2 Variables

Déclaration et types :

// Chaînes de caractères
$nom = "Jean Dupont";
$prenom = 'Marie';
// Nombres
$age = 25;
$prix = 19.99;
// Booléens
$actif = true;
$vide = false;
// Null
$inconnu = null;

Règles des variables :

  • • Commence toujours par $
  • • Premier caractère : lettre ou _
  • • Puis lettres, chiffres, _
  • • Sensible à la casse
  • • Pas d'espaces

Exemples valides/invalides :

// Valides
$nom, $age_utilisateur
$Prix, $_token
$user123
// Invalides
$123nom // commence par chiffre
$nom-user // contient -
$nom user // contient espace

3 Affichage (echo, print, printf)

Echo (le plus utilisé) :

// Texte simple
echo "Hello World";
// Variable
echo $nom;
// Concaténation
echo "Bonjour " . $nom;
echo "Age: " . $age . " ans";
// Plusieurs paramètres
echo "Hello", " ", $nom;
// Dans du HTML
echo "<h1>$nom</h1>";

Autres fonctions d'affichage :

// Print (une seule valeur)
print "Hello World";
print $nom;
// Printf (formatage)
printf("Age: %d ans", $age);
printf("Prix: %.2f €", $prix);
// Var_dump (debug)
var_dump($variable);
// Print_r (debug lisible)
print_r($array);
Recommandations :
  • echo : Usage général
  • printf : Formatage précis
  • var_dump : Débogage complet
  • print_r : Débogage lisible

4 Commentaires

Types de commentaires :

// Commentaire sur une ligne
$nom = "Jean"; // Nom de l'utilisateur
# Autre syntaxe une ligne
$age = 25;
/*
* Commentaire
* sur plusieurs
* lignes
*/
echo "Hello";

Documentation PHPDoc :

/**
* Calcule la TVA
*
* @param float $prix Prix HT
* @param float $taux Taux TVA
* @return float Prix TTC
*/
function calculTVA($prix, $taux) {
return $prix * (1 + $taux);
}
Bonnes pratiques :
  • • Expliquer le "pourquoi", pas le "quoi"
  • • Commenter les parties complexes
  • • Utiliser PHPDoc pour les fonctions
  • • Garder les commentaires à jour

Les Conditions en PHP

Apprenez à utiliser les structures conditionnelles pour contrôler le flux de votre programme.

1 Structure if, else, elseif

Syntaxe de base :

// Structure simple
if ($condition) {
// Code si vrai
}
// Avec else
if ($age >= 18) {
echo "Majeur";
} else {
echo "Mineur";
}
// Avec elseif
if ($note >= 16) {
echo "Très bien";
} elseif ($note >= 12) {
echo "Assez bien";
} else {
echo "Insuffisant";
}

Exemple pratique :

<?php
$heure = date('H');
$message = "";
if ($heure < 6) {
$message = "Bonne nuit !";
} elseif ($heure < 12) {
$message = "Bonjour !";
} elseif ($heure < 18) {
$message = "Bon après-midi !";
} else {
$message = "Bonsoir !";
}
echo $message;
?>
Conseil :

Utilisez elseif plutôt que plusieurs if séparés pour des conditions liées.

2 Opérateurs de Comparaison

Opérateurs disponibles :

$a == $b // Égal (valeur)
$a === $b // Identique (valeur ET type)
$a != $b // Différent
$a < $b // Inférieur à
$a >= $b // Supérieur ou égal

Exemples pratiques :

<?php
$age = 20;
$nom = "Jean";
// Comparaisons numériques
if ($age >= 18) {
echo "Accès autorisé";
}
// Comparaisons de chaînes
if ($nom === "Jean") {
echo "Bonjour Jean !";
}
// Différence == vs ===
$nombre = "10";
if ($nombre == 10) {
echo "Vrai (conversion)";
}
if ($nombre === 10) {
echo "Faux (types différents)";
}
?>

3 Structure Switch

Syntaxe switch :

switch ($variable) {
case 'valeur1':
// Code à exécuter
break;
case 'valeur2':
// Code à exécuter
break;
default:
// Code par défaut
break;
}
Attention au break :

Sans break, le code continue dans les cases suivantes !

Exemple pratique :

<?php
$jour = date('w'); // 0-6 (dim-sam)
switch ($jour) {
case 1:
$nom_jour = "Lundi";
$motivation = "C'est parti !";
break;
case 2:
case 3:
case 4:
$nom_jour = "Milieu de semaine";
$motivation = "Continue !";
break;
case 5:
$nom_jour = "Vendredi";
$motivation = "Weekend arrive !";
break;
default:
$nom_jour = "Weekend";
$motivation = "Repos bien mérité !";
}
echo $nom_jour . ": " . $motivation;
?>

Les Boucles en PHP

Maîtrisez les différents types de boucles pour automatiser et répéter des actions.

1 Boucle for (compteur)

Syntaxe de base :

for ($i = 0; $i < 10; $i++) {
// Code à répéter
echo $i . " ";
}
// Affiche: 0 1 2 3 4 5 6 7 8 9

Variations :

// Compter à rebours
for ($i = 10; $i > 0; $i--) {
echo $i . " ";
}
// Par pas de 2
for ($i = 0; $i <= 20; $i += 2) {
echo $i . " ";
}

Exemple pratique - Table de multiplication :

<?php
$table = 7; // Table de 7
echo "<h3>Table de $table</h3>";
echo "<ul>";
for ($i = 1; $i <= 10; $i++) {
$resultat = $table * $i;
echo "<li>$table x $i = $resultat</li>";
}
echo "</ul>";
?>
Résultat HTML :
  • 7 x 1 = 7
  • 7 x 2 = 14
  • 7 x 3 = 21
  • ... jusqu'à 7 x 10 = 70

2 Boucle while (condition)

Syntaxe while :

$i = 0;
while ($i < 5) {
echo $i . " ";
$i++; // Important !
}
// Affiche: 0 1 2 3 4

Boucle do-while :

$nombre = 10;
do {
echo $nombre . " ";
$nombre--;
} while ($nombre > 0);
// Exécute AU MOINS une fois

Exemple - Jeu de devinette :

<?php
$nombre_secret = rand(1, 100);
$tentatives = 0;
$trouve = false;
echo "Jeu de devinette (1-100)<br>";
// Simulation de tentatives
while (!$trouve && $tentatives < 10) {
$tentatives++;
$essai = rand(1, 100);
if ($essai == $nombre_secret) {
$trouve = true;
echo "Trouvé $essai en $tentatives tentatives!";
} else {
echo "Tentative $tentatives: $essai (raté)<br>";
}
}
?>

3 Boucle foreach (tableaux)

Syntaxe foreach :

// Pour les valeurs seulement
foreach ($array as $valeur) {
echo $valeur;
}
// Pour clé et valeur
foreach ($array as $cle => $valeur) {
echo $cle . ": " . $valeur;
}

Tableau simple :

$fruits = ["pomme", "banane", "orange"];
foreach ($fruits as $fruit) {
echo $fruit . "<br>";
}

Exemple - Liste d'étudiants :

<?php
$etudiants = [
"Jean" => 15,
"Marie" => 18,
"Paul" => 12,
"Sophie" => 16
];
echo "<h3>Notes des étudiants</h3>";
echo "<table border='1'>";
echo "<tr><th>Nom</th><th>Note</th><th>Mention</th></tr>";
foreach ($etudiants as $nom => $note) {
if ($note >= 16) {
$mention = "Très bien";
} elseif ($note >= 12) {
$mention = "Assez bien";
} else {
$mention = "Peut mieux faire";
}
echo "<tr><td>$nom</td><td>$note</td><td>$mention</td></tr>";
}
echo "</table>";
?>

4 Break et Continue

break - Sortir de la boucle :

for ($i = 1; $i <= 10; $i++) {
if ($i == 5) {
break; // Stop la boucle
}
echo $i . " ";
}
// Affiche: 1 2 3 4

continue - Passer au suivant :

for ($i = 1; $i <= 10; $i++) {
if ($i % 2 == 0) {
continue; // Passe au suivant
}
echo $i . " ";
}
// Affiche: 1 3 5 7 9 (impairs seulement)

Exemple pratique :

<?php
$nombres = [2, -5, 8, 0, 12, -3, 15];
$somme = 0;
echo "Traitement des nombres:<br>";
foreach ($nombres as $nombre) {
// Ignorer les nombres négatifs
if ($nombre < 0) {
echo "$nombre ignoré (négatif)<br>";
continue;
}
// Arrêter si on trouve un 0
if ($nombre == 0) {
echo "0 trouvé, arrêt du traitement<br>";
break;
}
$somme += $nombre;
echo "$nombre ajouté, somme: $somme<br>";
}
echo "Somme finale: $somme";
?>

Manipulation de Fichiers Texte

Apprenez à créer, lire et modifier des fichiers texte avec PHP pour persister vos données.

1 Écrire dans un Fichier

Fonctions d'écriture :

// file_put_contents (simple)
file_put_contents('fichier.txt', $contenu);
// fopen/fwrite/fclose (contrôle)
$fichier = fopen('data.txt', 'w');
fwrite($fichier, $texte);
fclose($fichier);

Modes d'ouverture :

'w' - Écriture (écrase le fichier)
'a' - Ajout (à la fin du fichier)
'r' - Lecture seule
'r+' - Lecture/écriture

Exemple - Journal d'activité :

<?php
// Créer un fichier de log
$fichier_log = 'journal.txt';
$timestamp = date('Y-m-d H:i:s');
$message = "Connexion utilisateur";
$ip = $_SERVER['REMOTE_ADDR'] ?? 'inconnue';
$ligne = "[$timestamp] $message - IP: $ip\n";
// Ajouter au fichier existant
file_put_contents($fichier_log, $ligne, FILE_APPEND);
echo "Événement enregistré !";
?>
Contenu de journal.txt :
[2024-01-15 14:30:25] Connexion utilisateur - IP: 192.168.1.100
[2024-01-15 14:35:12] Connexion utilisateur - IP: 192.168.1.101
[2024-01-15 14:40:58] Connexion utilisateur - IP: 192.168.1.102

2 Lire un Fichier

Fonctions de lecture :

// Lire tout le fichier
$contenu = file_get_contents('fichier.txt');
// Lire ligne par ligne
$lignes = file('fichier.txt');
// Lecture avec fopen
$fichier = fopen('data.txt', 'r');
$ligne = fgets($fichier);
fclose($fichier);

Vérifications :

if (file_exists('fichier.txt')) {
// Le fichier existe
}
if (is_readable('fichier.txt')) {
// Le fichier est lisible
}

Exemple - Afficher le journal :

<?php
$fichier_log = 'journal.txt';
if (file_exists($fichier_log)) {
echo "<h2>Journal d'activité</h2>";
echo "<ul>";
// Lire toutes les lignes
$lignes = file($fichier_log, FILE_IGNORE_NEW_LINES);
// Afficher les 10 dernières lignes
$dernieres_lignes = array_slice($lignes, -10);
foreach ($dernieres_lignes as $ligne) {
if (!empty($ligne)) {
echo "<li>" . htmlspecialchars($ligne) . "</li>";
}
}
echo "</ul>";
} else {
echo "Aucun journal trouvé.";
}
?>

Exemple Complet - Gestionnaire de Notes

<?php
/**
 * Gestionnaire de Notes - Exemple complet de manipulation de fichiers
 */

// Configuration
$fichier_notes = 'mes_notes.txt';
$action = $_POST['action'] ?? '';
$message = '';

// Traitement des actions
if ($action === 'ajouter') {
    $nouvelle_note = trim($_POST['note'] ?? '');
    
    if (!empty($nouvelle_note)) {
        $timestamp = date('d/m/Y H:i');
        $ligne_note = "[$timestamp] $nouvelle_note\n";
        
        // Ajouter la note au fichier
        if (file_put_contents($fichier_notes, $ligne_note, FILE_APPEND | LOCK_EX)) {
            $message = "Note ajoutée avec succès !";
        } else {
            $message = "Erreur lors de l'ajout de la note.";
        }
    } else {
        $message = "La note ne peut pas être vide.";
    }
}

if ($action === 'vider') {
    if (file_exists($fichier_notes)) {
        if (unlink($fichier_notes)) {
            $message = "Toutes les notes ont été supprimées.";
        } else {
            $message = "Erreur lors de la suppression.";
        }
    } else {
        $message = "Aucune note à supprimer.";
    }
}

// Lecture des notes existantes
$notes = [];
if (file_exists($fichier_notes)) {
    $lignes = file($fichier_notes, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $notes = array_reverse($lignes); // Plus récente en premier
}

$nb_notes = count($notes);
$taille_fichier = file_exists($fichier_notes) ? filesize($fichier_notes) : 0;
?>

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gestionnaire de Notes PHP</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 40px auto;
            padding: 20px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
        }
        
        .container {
            background: white;
            padding: 30px;
            border-radius: 15px;
            box-shadow: 0 10px 30px rgba(0,0,0,0.2);
        }
        
        h1 {
            color: #333;
            text-align: center;
            margin-bottom: 30px;
        }
        
        .form-section {
            background: #f8f9fa;
            padding: 20px;
            border-radius: 10px;
            margin-bottom: 30px;
        }
        
        textarea {
            width: 100%;
            padding: 15px;
            border: 2px solid #ddd;
            border-radius: 8px;
            resize: vertical;
            min-height: 100px;
            font-family: inherit;
        }
        
        .btn {
            padding: 10px 20px;
            margin: 5px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-weight: bold;
        }
        
        .btn-primary { background: #007bff; color: white; }
        .btn-danger { background: #dc3545; color: white; }
        
        .message {
            padding: 15px;
            margin: 15px 0;
            border-radius: 5px;
            background: #d4edda;
            color: #155724;
            border: 1px solid #c3e6cb;
        }
        
        .stats {
            display: flex;
            gap: 20px;
            margin: 20px 0;
        }
        
        .stat-box {
            background: #e9ecef;
            padding: 15px;
            border-radius: 8px;
            text-align: center;
            flex: 1;
        }
        
        .notes-list {
            max-height: 400px;
            overflow-y: auto;
            border: 1px solid #ddd;
            border-radius: 8px;
            padding: 15px;
        }
        
        .note-item {
            padding: 10px;
            margin: 10px 0;
            background: #f8f9fa;
            border-left: 4px solid #007bff;
            border-radius: 4px;
        }
    </style>
</head>
<body>

<div class="container">
    <h1>📝 Gestionnaire de Notes PHP</h1>
    
    <?php if ($message): ?>
        <div class="message"><?= htmlspecialchars($message) ?></div>
    <?php endif; ?>
    
    <div class="form-section">
        <h3>Ajouter une nouvelle note</h3>
        <form method="POST">
            <textarea name="note" placeholder="Écrivez votre note ici..." required></textarea>
            <br><br>
            <button type="submit" name="action" value="ajouter" class="btn btn-primary">
                ➕ Ajouter la note
            </button>
        </form>
    </div>
    
    <div class="stats">
        <div class="stat-box">
            <h4><?= $nb_notes ?></h4>
            <p>Notes enregistrées</p>
        </div>
        <div class="stat-box">
            <h4><?= round($taille_fichier / 1024, 2) ?> KB</h4>
            <p>Taille du fichier</p>
        </div>
        <div class="stat-box">
            <h4><?= date('d/m/Y') ?></h4>
            <p>Date du jour</p>
        </div>
    </div>
    
    <div>
        <h3>Mes Notes (plus récentes en premier)</h3>
        
        <?php if (!empty($notes)): ?>
            <div style="margin-bottom: 15px;">
                <form method="POST" style="display: inline;" 
                      onsubmit="return confirm('Êtes-vous sûr de vouloir supprimer toutes les notes ?')">
                    <button type="submit" name="action" value="vider" class="btn btn-danger">
                        🗑️ Vider toutes les notes
                    </button>
                </form>
            </div>
            
            <div class="notes-list">
                <?php foreach ($notes as $index => $note): ?>
                    <div class="note-item">
                        <strong>Note #<?= $nb_notes - $index ?></strong>
                        <p><?= htmlspecialchars($note) ?></p>
                    </div>
                <?php endforeach; ?>
            </div>
        <?php else: ?>
            <div style="text-align: center; color: #666; padding: 40px;">
                <p>📭 Aucune note enregistrée pour le moment.</p>
                <p>Ajoutez votre première note ci-dessus !</p>
            </div>
        <?php endif; ?>
    </div>
    
    <div style="text-align: center; margin-top: 30px; color: #666; font-size: 12px;">
        Gestionnaire de Notes PHP - Fichier: <code><?= $fichier_notes ?></code>
    </div>
</div>

</body>
</html>

Variables $_SERVER

Découvrez les variables superglobales $_SERVER pour accéder aux informations du serveur et de la requête.

1 Qu'est-ce que $_SERVER ?

Définition :

$_SERVER est une variable superglobale PHP qui contient des informations sur les en-têtes HTTP, les chemins et les scripts. Elle est automatiquement remplie par le serveur web.

Caractéristiques :

  • Tableau associatif PHP
  • Accessible partout (superglobale)
  • Remplie automatiquement
  • Lecture seule (ne pas modifier)

Afficher toutes les variables :

// Afficher tout $_SERVER
<?php
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
?>
// Ou avec var_dump pour plus de détails
var_dump($_SERVER);
Conseil :

Testez cet affichage pour découvrir toutes les variables disponibles sur votre serveur !

2 Variables $_SERVER Essentielles

DOCUMENT_ROOT

Répertoire racine du serveur web

echo $_SERVER['DOCUMENT_ROOT'];
// Résultat: C:/xampp/htdocs

SERVER_NAME

Nom du serveur hôte

echo $_SERVER['SERVER_NAME'];
// Résultat: localhost

REQUEST_METHOD

Méthode de requête HTTP

echo $_SERVER['REQUEST_METHOD'];
// Résultat: GET ou POST

REMOTE_ADDR

Adresse IP du client

echo $_SERVER['REMOTE_ADDR'];
// Résultat: 127.0.0.1

HTTP_USER_AGENT

Navigateur du client

echo $_SERVER['HTTP_USER_AGENT'];
// Mozilla/5.0 (Windows NT 10.0...

REQUEST_URI

URL complète de la requête

echo $_SERVER['REQUEST_URI'];
// /mon-site/page.php?id=123

Exemple Pratique : Page d'Information Serveur

<?php
/**
 * Page d'information serveur - Exemple $_SERVER
 */

// Fonction pour afficher une variable $_SERVER de manière sécurisée
function afficher_server($cle, $label) {
    $valeur = isset($_SERVER[$cle]) ? $_SERVER[$cle] : 'Non disponible';
    echo "<tr>";
    echo "<td style='padding: 8px; border: 1px solid #ddd; font-weight: bold;'>$label</td>";
    echo "<td style='padding: 8px; border: 1px solid #ddd;'>" . htmlspecialchars($valeur) . "</td>";
    echo "</tr>";
}
?>

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Informations Serveur - Variables $_SERVER</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 40px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: #333;
        }
        
        .container {
            background: white;
            padding: 30px;
            border-radius: 10px;
            box-shadow: 0 10px 30px rgba(0,0,0,0.2);
            max-width: 800px;
            margin: 0 auto;
        }
        
        h1 {
            color: #333;
            text-align: center;
            margin-bottom: 30px;
        }
        
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        
        th {
            background: #f8f9fa;
            padding: 12px;
            border: 1px solid #ddd;
            text-align: left;
        }
        
        .status {
            display: inline-block;
            padding: 4px 12px;
            border-radius: 20px;
            font-size: 12px;
            font-weight: bold;
            margin: 2px;
        }
        
        .status.get { background: #10b981; color: white; }
        .status.post { background: #3b82f6; color: white; }
        .status.https { background: #8b5cf6; color: white; }
        .status.http { background: #f97316; color: white; }
    </style>
</head>
<body>

<div class="container">
    <h1>🌐 Informations du Serveur</h1>
    
    <div style="text-align: center; margin-bottom: 30px;">
        <span class="status <?= strtolower($_SERVER['REQUEST_METHOD'] ?? 'get') ?>">
            Méthode: <?= $_SERVER['REQUEST_METHOD'] ?? 'GET' ?>
        </span>
        <span class="status <?= (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'https' : 'http' ?>">
            Protocole: <?= (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'HTTPS' : 'HTTP' ?>
        </span>
    </div>

    <table>
        <thead>
            <tr>
                <th style="width: 40%;">Variable</th>
                <th>Valeur</th>
            </tr>
        </thead>
        <tbody>
            <?php
            // Informations sur le serveur
            afficher_server('SERVER_NAME', 'Nom du serveur');
            afficher_server('SERVER_PORT', 'Port du serveur');
            afficher_server('DOCUMENT_ROOT', 'Racine du document');
            afficher_server('SERVER_SOFTWARE', 'Logiciel serveur');
            
            echo "<tr><td colspan='2' style='background: #e3f2fd; padding: 8px; font-weight: bold;'>Informations de la requête</td></tr>";
            
            // Informations sur la requête
            afficher_server('REQUEST_METHOD', 'Méthode de requête');
            afficher_server('REQUEST_URI', 'URI de la requête');
            afficher_server('QUERY_STRING', 'Paramètres GET');
            afficher_server('HTTP_HOST', 'Hôte HTTP');
            
            echo "<tr><td colspan='2' style='background: #f3e5f5; padding: 8px; font-weight: bold;'>Informations client</td></tr>";
            
            // Informations sur le client
            afficher_server('REMOTE_ADDR', 'Adresse IP client');
            afficher_server('REMOTE_PORT', 'Port client');
            afficher_server('HTTP_USER_AGENT', 'Navigateur client');
            afficher_server('HTTP_REFERER', 'Page de provenance');
            afficher_server('HTTP_ACCEPT_LANGUAGE', 'Langues acceptées');
            
            echo "<tr><td colspan='2' style='background: #e8f5e8; padding: 8px; font-weight: bold;'>Informations script</td></tr>";
            
            // Informations sur le script
            afficher_server('SCRIPT_NAME', 'Nom du script');
            afficher_server('SCRIPT_FILENAME', 'Chemin complet du script');
            afficher_server('PHP_SELF', 'Nom du fichier PHP');
            ?>
        </tbody>
    </table>
    
    <div style="margin-top: 30px; padding: 20px; background: #f8f9fa; border-radius: 8px;">
        <h3>🛠 Informations PHP</h3>
        <p><strong>Version PHP :</strong> <?= phpversion() ?></p>
        <p><strong>Date/Heure actuelle :</strong> <?= date('d/m/Y H:i:s') ?></p>
        <p><strong>Timezone :</strong> <?= date_default_timezone_get() ?></p>
        <p><strong>Mémoire utilisée :</strong> <?= round(memory_get_usage() / 1024 / 1024, 2) ?> MB</p>
    </div>
    
    <div style="text-align: center; margin-top: 20px; color: #666; font-size: 12px;">
        Page générée avec PHP - Variables $_SERVER
    </div>
</div>

</body>
</html>

Méthodes HTTP et Superglobales

Maîtrisez les superglobales PHP et les différentes méthodes HTTP pour créer des applications web interactives et des APIs REST.

1 $_GET et $_POST - Les Fondamentaux

$_GET - Paramètres d'URL :

// URL: page.php?nom=Jean&age=25
<?php
$nom = $_GET['nom'] ?? 'Anonyme';
$age = (int)($_GET['age'] ?? 0);
echo "Bonjour $nom, vous avez $age ans";
// Vérifier l'existence
if (isset($_GET['recherche'])) {
$terme = $_GET['recherche'];
// Traiter la recherche
}
?>
Caractéristiques GET :
  • • Visible dans l'URL
  • • Limité en taille (~2000 caractères)
  • • Mis en cache par le navigateur
  • • Idempotent (même résultat à chaque appel)
  • • Parfait pour recherches, filtres, pagination

$_POST - Données de formulaire :

// Formulaire avec method="POST"
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');
if (!empty($email) && !empty($message)) {
// Traitement du formulaire
echo "Message envoyé !";
} else {
echo "Champs obligatoires !";
}
}
// Données de fichiers
if (isset($_FILES['upload'])) {
$fichier = $_FILES['upload'];
// Traitement upload
}
?>
Caractéristiques POST :
  • • Invisible dans l'URL
  • • Taille limitée par php.ini (post_max_size)
  • • Pas mis en cache
  • • Peut modifier des données
  • • Idéal pour formulaires, uploads, actions

2 $_REQUEST et Sécurisation

$_REQUEST (déconseillé) :

// $_REQUEST combine GET, POST et COOKIE
<?php
// ❌ DÉCONSEILLÉ - Source ambiguë
$data = $_REQUEST['param'] ?? '';
// ✅ RECOMMANDÉ - Source explicite
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$data = $_POST['param'] ?? '';
} else {
$data = $_GET['param'] ?? '';
}
?>
Pourquoi éviter $_REQUEST :
  • • Source des données inconnue
  • • Risques de sécurité (pollution de paramètres)
  • • Code moins prévisible
  • • Débogage plus difficile

Validation et sécurisation :

<?php
// 1. Vérification de l'existence
$nom = $_POST['nom'] ?? null;
if ($nom === null) {
die('Paramètre manquant');
}
// 2. Nettoyage des données
$nom = trim($nom); // Espaces
$nom = stripslashes($nom); // Slashes
// 3. Échappement pour affichage HTML
$nom_securise = htmlspecialchars($nom, ENT_QUOTES);
// 4. Validation spécifique
$email = $_POST['email'] ?? '';
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die('Email invalide');
}
// 5. Protection CSRF (optionnel)
if ($_POST['token'] !== $_SESSION['token']) {
die('Token CSRF invalide');
}
?>

3 Méthodes HTTP Avancées

PUT, DELETE, PATCH :

<?php
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
case 'GET':
// Lire/récupérer des données
echo json_encode($users);
break;
case 'POST':
// Créer une nouvelle ressource
$data = $_POST;
createUser($data);
break;
case 'PUT':
// Remplacer complètement une ressource
parse_str(file_get_contents('php://input'), $data);
updateUser($id, $data);
break;
case 'PATCH':
// Modification partielle
$json = file_get_contents('php://input');
$data = json_decode($json, true);
patchUser($id, $data);
break;
case 'DELETE':
// Supprimer une ressource
deleteUser($id);
break;
}
?>

HEAD et OPTIONS :

<?php
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'HEAD') {
// Comme GET mais sans le body
header('Content-Type: application/json');
header('Content-Length: 1250');
header('Last-Modified: ' . date('r'));
exit; // Pas de contenu
}
if ($method === 'OPTIONS') {
// Informations sur les méthodes supportées
header('Allow: GET, POST, PUT, DELETE, PATCH, OPTIONS');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
exit;
}
?>

Récapitulatif des méthodes :

GET - Lecture/récupération
POST - Création de ressources
PUT - Remplacement complet
PATCH - Modification partielle
DELETE - Suppression
HEAD - En-têtes seulement
OPTIONS - Méthodes supportées

Exemple Complet - API REST Simple

<?php
/**
 * API REST Simple - Gestion d'utilisateurs
 * Démontre toutes les méthodes HTTP
 */

// En-têtes CORS et JSON
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

// Données simulées (normalement en base de données)
$users = [
    1 => ['id' => 1, 'nom' => 'Jean', 'email' => 'jean@test.com', 'age' => 25],
    2 => ['id' => 2, 'nom' => 'Marie', 'email' => 'marie@test.com', 'age' => 30],
    3 => ['id' => 3, 'nom' => 'Paul', 'email' => 'paul@test.com', 'age' => 35],
];

// Fonction pour envoyer une réponse JSON
function sendResponse($data, $status = 200) {
    http_response_code($status);
    echo json_encode($data, JSON_PRETTY_PRINT);
    exit;
}

// Fonction pour récupérer les données d'entrée
function getInputData() {
    $input = file_get_contents('php://input');
    return json_decode($input, true) ?: [];
}

// Récupération de la méthode HTTP et de l'ID
$method = $_SERVER['REQUEST_METHOD'];
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$path_parts = explode('/', trim($path, '/'));
$user_id = isset($path_parts[1]) && is_numeric($path_parts[1]) ? (int)$path_parts[1] : null;

// Gestion des requêtes selon la méthode HTTP
switch ($method) {
    case 'OPTIONS':
        // Pré-vol CORS - pas de contenu
        sendResponse(['message' => 'CORS preflight handled']);
        break;
    
    case 'GET':
        if ($user_id) {
            // GET /api/users/1 - Un utilisateur spécifique
            if (isset($users[$user_id])) {
                sendResponse($users[$user_id]);
            } else {
                sendResponse(['error' => 'Utilisateur non trouvé'], 404);
            }
        } else {
            // GET /api/users - Tous les utilisateurs avec filtres
            $filtered_users = $users;
            
            // Filtrer par âge minimum si paramètre présent
            if (isset($_GET['age_min'])) {
                $age_min = (int)$_GET['age_min'];
                $filtered_users = array_filter($filtered_users, function($user) use ($age_min) {
                    return $user['age'] >= $age_min;
                });
            }
            
            // Recherche par nom si paramètre présent
            if (isset($_GET['search'])) {
                $search = strtolower($_GET['search']);
                $filtered_users = array_filter($filtered_users, function($user) use ($search) {
                    return strpos(strtolower($user['nom']), $search) !== false;
                });
            }
            
            sendResponse([
                'total' => count($filtered_users),
                'users' => array_values($filtered_users)
            ]);
        }
        break;
    
    case 'POST':
        // POST /api/users - Créer un nouvel utilisateur
        $data = $_POST ?: getInputData();
        
        // Validation des données
        if (empty($data['nom']) || empty($data['email'])) {
            sendResponse(['error' => 'Nom et email requis'], 400);
        }
        
        if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
            sendResponse(['error' => 'Email invalide'], 400);
        }
        
        // Créer le nouvel utilisateur
        $new_id = max(array_keys($users)) + 1;
        $new_user = [
            'id' => $new_id,
            'nom' => htmlspecialchars(trim($data['nom'])),
            'email' => trim($data['email']),
            'age' => (int)($data['age'] ?? 0)
        ];
        
        $users[$new_id] = $new_user;
        sendResponse($new_user, 201);
        break;
    
    case 'PUT':
        // PUT /api/users/1 - Remplacer complètement un utilisateur
        if (!$user_id) {
            sendResponse(['error' => 'ID utilisateur requis'], 400);
        }
        
        if (!isset($users[$user_id])) {
            sendResponse(['error' => 'Utilisateur non trouvé'], 404);
        }
        
        $data = getInputData();
        
        // Validation (PUT remplace tout)
        if (empty($data['nom']) || empty($data['email'])) {
            sendResponse(['error' => 'Nom et email requis pour PUT'], 400);
        }
        
        // Remplacer complètement l'utilisateur
        $users[$user_id] = [
            'id' => $user_id,
            'nom' => htmlspecialchars(trim($data['nom'])),
            'email' => trim($data['email']),
            'age' => (int)($data['age'] ?? 0)
        ];
        
        sendResponse($users[$user_id]);
        break;
    
    case 'PATCH':
        // PATCH /api/users/1 - Modification partielle
        if (!$user_id) {
            sendResponse(['error' => 'ID utilisateur requis'], 400);
        }
        
        if (!isset($users[$user_id])) {
            sendResponse(['error' => 'Utilisateur non trouvé'], 404);
        }
        
        $data = getInputData();
        $user = $users[$user_id];
        
        // Mettre à jour seulement les champs fournis
        if (isset($data['nom'])) {
            $user['nom'] = htmlspecialchars(trim($data['nom']));
        }
        if (isset($data['email'])) {
            if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
                sendResponse(['error' => 'Email invalide'], 400);
            }
            $user['email'] = trim($data['email']);
        }
        if (isset($data['age'])) {
            $user['age'] = (int)$data['age'];
        }
        
        $users[$user_id] = $user;
        sendResponse($user);
        break;
    
    case 'DELETE':
        // DELETE /api/users/1 - Supprimer un utilisateur
        if (!$user_id) {
            sendResponse(['error' => 'ID utilisateur requis'], 400);
        }
        
        if (!isset($users[$user_id])) {
            sendResponse(['error' => 'Utilisateur non trouvé'], 404);
        }
        
        $deleted_user = $users[$user_id];
        unset($users[$user_id]);
        
        sendResponse([
            'message' => 'Utilisateur supprimé',
            'deleted_user' => $deleted_user
        ]);
        break;
    
    case 'HEAD':
        // HEAD /api/users - Informations sur la collection sans contenu
        $count = count($users);
        header("X-Total-Count: $count");
        header("X-Total-Size: " . strlen(json_encode($users)));
        header("Last-Modified: " . date('r'));
        exit; // Pas de contenu pour HEAD
        break;
    
    default:
        sendResponse(['error' => 'Méthode non supportée'], 405);
}

/* 
EXEMPLES D'UTILISATION AVEC CURL :

# Lister tous les utilisateurs
curl -X GET http://localhost/api/users

# Rechercher des utilisateurs
curl -X GET "http://localhost/api/users?search=jean&age_min=20"

# Récupérer un utilisateur spécifique
curl -X GET http://localhost/api/users/1

# Créer un nouvel utilisateur
curl -X POST http://localhost/api/users \
  -H "Content-Type: application/json" \
  -d '{"nom":"Sophie","email":"sophie@test.com","age":28}'

# Remplacer complètement un utilisateur
curl -X PUT http://localhost/api/users/1 \
  -H "Content-Type: application/json" \
  -d '{"nom":"Jean Dupont","email":"jean.dupont@test.com","age":26}'

# Modifier partiellement un utilisateur
curl -X PATCH http://localhost/api/users/1 \
  -H "Content-Type: application/json" \
  -d '{"age":27}'

# Supprimer un utilisateur
curl -X DELETE http://localhost/api/users/1

# Récupérer seulement les en-têtes
curl -I http://localhost/api/users

# Vérifier les méthodes supportées
curl -X OPTIONS http://localhost/api/users
*/
?>

Formulaire HTML Multi-méthodes

<!DOCTYPE html>
<html lang="fr">
<head>
    <title>Test des Méthodes HTTP</title>
    <style>
        .form-section { margin: 20px 0; padding: 20px; border: 1px solid #ddd; }
        input, textarea { padding: 8px; margin: 5px; }
        button { padding: 10px 15px; margin: 5px; cursor: pointer; }
        .get { background: #28a745; color: white; }
        .post { background: #007bff; color: white; }
        .put { background: #fd7e14; color: white; }
        .delete { background: #dc3545; color: white; }
    </style>
</head>
<body>

<h1>Test des Méthodes HTTP avec PHP</h1>

<!-- Méthode GET -->
<div class="form-section">
    <h3>GET - Recherche d'utilisateurs</h3>
    <form method="GET" action="api.php">
        <input type="text" name="search" placeholder="Rechercher un nom" value="<?= $_GET['search'] ?? '' ?>">
        <input type="number" name="age_min" placeholder="Âge minimum" value="<?= $_GET['age_min'] ?? '' ?>">
        <button type="submit" class="get">🔍 Rechercher (GET)</button>
    </form>
</div>

<!-- Méthode POST -->
<div class="form-section">
    <h3>POST - Créer un utilisateur</h3>
    <form method="POST" action="api.php">
        <input type="text" name="nom" placeholder="Nom complet" required>
        <input type="email" name="email" placeholder="Email" required>
        <input type="number" name="age" placeholder="Âge">
        <button type="submit" class="post">➕ Créer (POST)</button>
    </form>
</div>

<!-- Simulation PUT/PATCH/DELETE avec JavaScript -->
<div class="form-section">
    <h3>Méthodes avancées (JavaScript + Fetch)</h3>
    <input type="number" id="user-id" placeholder="ID utilisateur" value="1">
    <input type="text" id="user-nom" placeholder="Nouveau nom">
    <input type="email" id="user-email" placeholder="Nouvel email">
    <input type="number" id="user-age" placeholder="Nouvel âge">
    <br><br>
    <button onclick="updateUser('PUT')" class="put">🔄 Remplacer (PUT)</button>
    <button onclick="updateUser('PATCH')" style="background: #6f42c1; color: white;">✏️ Modifier (PATCH)</button>
    <button onclick="deleteUser()" class="delete">🗑️ Supprimer (DELETE)</button>
</div>

<div id="result" style="margin-top: 20px; padding: 20px; background: #f8f9fa;">
    Résultats apparaîtront ici...
</div>

<script>
function updateUser(method) {
    const id = document.getElementById('user-id').value;
    const nom = document.getElementById('user-nom').value;
    const email = document.getElementById('user-email').value;
    const age = document.getElementById('user-age').value;
    
    const data = {};
    if (nom) data.nom = nom;
    if (email) data.email = email;
    if (age) data.age = parseInt(age);
    
    fetch(`api.php/${id}`, {
        method: method,
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(data)
    })
    .then(response => response.json())
    .then(data => {
        document.getElementById('result').innerHTML = 
            `<strong>${method} Résultat:</strong><pre>${JSON.stringify(data, null, 2)}</pre>`;
    })
    .catch(error => {
        document.getElementById('result').innerHTML = `<strong>Erreur:</strong> ${error}`;
    });
}

function deleteUser() {
    const id = document.getElementById('user-id').value;
    
    if (!confirm(`Supprimer l'utilisateur ${id} ?`)) return;
    
    fetch(`api.php/${id}`, {
        method: 'DELETE'
    })
    .then(response => response.json())
    .then(data => {
        document.getElementById('result').innerHTML = 
            `<strong>DELETE Résultat:</strong><pre>${JSON.stringify(data, null, 2)}</pre>`;
    })
    .catch(error => {
        document.getElementById('result').innerHTML = `<strong>Erreur:</strong> ${error}`;
    });
}

// Charger les utilisateurs au démarrage
fetch('api.php')
    .then(response => response.json())
    .then(data => {
        document.getElementById('result').innerHTML = 
            `<strong>Utilisateurs existants:</strong><pre>${JSON.stringify(data, null, 2)}</pre>`;
    });
</script>

</body>
</html>

4 Conseils et Bonnes Pratiques

✅ Sécurité

  • • Toujours valider et nettoyer les données
  • • Utiliser htmlspecialchars() pour l'affichage
  • • Implémenter des tokens CSRF pour POST/PUT/DELETE
  • • Limiter la taille des données POST
  • • Vérifier les permissions utilisateur

🎯 Performance

  • • Utiliser GET pour la mise en cache
  • • Éviter $_REQUEST (source ambiguë)
  • • Implémenter la pagination pour les listes
  • • Utiliser les codes de statut HTTP appropriés
  • • Compresser les réponses JSON (gzip)

📐 Architecture REST

  • • GET pour lire (idempotent)
  • • POST pour créer (non-idempotent)
  • • PUT pour remplacer complètement
  • • PATCH pour modifications partielles
  • • DELETE pour supprimer (idempotent)

🛠 Debugging

  • • Utiliser var_dump($_GET, $_POST) pour debug
  • • Vérifier $_SERVER['REQUEST_METHOD']
  • • Logger les requêtes importantes
  • • Tester avec curl ou Postman
  • • Valider les en-têtes Content-Type

Include et Require

Apprenez à organiser votre code PHP en incluant des fichiers externes avec les différentes méthodes disponibles.

1 Concepts de Base

Pourquoi inclure des fichiers ?

  • Éviter la répétition de code
  • Organiser le code en modules
  • Faciliter la maintenance
  • Réutiliser les fonctions
  • Séparer la logique de la présentation

Structure typique :

projet/
├── index.php
├── config/
│ └── database.php
├── includes/
│ ├── header.php
│ └── footer.php
└── functions/
└── utils.php

Les 4 méthodes d'inclusion :

include

Inclut un fichier, continue si erreur

require

Inclut un fichier, ARRÊTE si erreur

include_once

Include seulement si pas déjà fait

require_once

Require seulement si pas déjà fait

2 Comparaison des Méthodes

include vs require :

include (souple)
<?php
include 'fichier.php';
echo "Ceci s'affiche même si fichier.php n'existe pas";
?>
  • ✓ Continue si fichier manquant
  • ✓ Génère un WARNING
  • ✓ Pour fichiers optionnels
require (strict)
<?php
require 'fichier-essentiel.php';
echo "Ceci ne s'affiche PAS si fichier manquant";
?>
  • ✗ ARRÊTE si fichier manquant
  • ✗ Génère une ERREUR FATALE
  • ✓ Pour fichiers indispensables

Avec ou sans _once :

Sans _once (répétition)
<?php
include 'functions.php';
include 'functions.php'; // Re-inclus !
// Peut causer erreurs de redéfinition
?>
  • ⚠ Inclusion multiple possible
  • ⚠ Risque de redéfinition
  • ✓ Plus rapide (pas de vérification)
Avec _once (protection)
<?php
include_once 'functions.php';
include_once 'functions.php'; // Ignoré
// Pas de problème de redéfinition
?>
  • ✓ Inclusion unique garantie
  • ✓ Pas de redéfinition
  • ⚠ Léger coût de vérification

Exemple Complet : Site Modulaire

1. config/database.php

<?php
// Configuration base de données
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'mon_site');

2. functions/utils.php

<?php
function securiser($texte) {
return htmlspecialchars($texte);
}
function debug($data) {
echo "<pre>";
var_dump($data);
echo "</pre>";
}

3. includes/header.php

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title><?= $titre ?? 'Mon Site' ?></title>
</head>
<body>
<nav>
<a href="/">Accueil</a>
<a href="/contact">Contact</a>
</nav>

4. includes/footer.php

<footer>
<p>© <?= date('Y') ?> Mon Site</p>
<p>Dernière mise à jour : <?= date('d/m/Y') ?></p>
</footer>
</body>
</html>

5. index.php (assemblage final)

<?php
// Configuration et fonctions (OBLIGATOIRES)
require_once 'config/database.php';
require_once 'functions/utils.php';
// Variables pour la page
$titre = 'Accueil - Mon Premier Site Modulaire';
$nom_utilisateur = 'Jean';
// En-tête (peut être optionnel selon le design)
include 'includes/header.php';
?>
<main>
<h1>Bienvenue <?= securiser($nom_utilisateur) ?> !</h1>
<p>Ceci est un exemple d'inclusion de fichiers PHP.</p>
<div>
<h2>Informations de configuration :</h2>
<p>Base de données : <?= DB_NAME ?></p>
<p>Serveur : <?= DB_HOST ?></p>
</div>
</main>
<?php
// Pied de page (recommandé include)
include 'includes/footer.php';
?>

3 Recommandations et Bonnes Pratiques

Quand utiliser quoi ?

require_once

Pour les fichiers critiques (config, fonctions)

require_once 'config/database.php';
require_once 'functions/auth.php';
include

Pour les templates et parties visuelles

include 'templates/header.php';
include 'templates/sidebar.php';
include_once

Pour éviter les inclusions doubles

include_once 'widgets/menu.php';

Erreurs à éviter :

Chemins relatifs fragiles
include '../includes/header.php'; // Fragile !

Solution : Utiliser __DIR__ ou chemins absolus

Include dans des boucles
for ($i=0; $i<10; $i++) {
include 'functions.php'; // 10 fois !
}

Solution : Utiliser *_once ou inclure avant la boucle

Bonnes pratiques :
  • • Utiliser des chemins absolus avec __DIR__
  • • Organiser les fichiers par catégorie
  • • require_once pour les dépendances critiques
  • • include pour les templates
  • • Toujours tester l'existence avec file_exists()

Premier Projet : Page Personnalisée

Créons votre première page PHP interactive avec formulaire simple.

salutation.php - Générateur de Salutations

<?php
/**
 * Premier projet PHP - Générateur de salutations personnalisées
 * Apprend : variables, conditions, formulaires, affichage
 */

// VARIABLES D'INITIALISATION
$nom = '';
$age = '';
$couleur = '';
$salutation = '';
$heure_actuelle = date('H'); // Heure actuelle (0-23)

// DÉTERMINER LA PÉRIODE DE LA JOURNÉE
if ($heure_actuelle < 12) {
    $periode = "Bonjour";
    $emoji = "☀️";
} elseif ($heure_actuelle < 18) {
    $periode = "Bon après-midi";
    $emoji = "🌞";
} else {
    $periode = "Bonsoir";
    $emoji = "🌙";
}

// TRAITEMENT DU FORMULAIRE
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
    // Récupération des données
    $nom = trim($_POST['nom'] ?? '');
    $age = (int)($_POST['age'] ?? 0);
    $couleur = $_POST['couleur'] ?? 'blue';
    
    // Génération de la salutation personnalisée
    if (!empty($nom) && $age > 0) {
        
        // Message basé sur l'âge
        if ($age < 18) {
            $message_age = "Tu es encore jeune, profite bien !";
        } elseif ($age < 65) {
            $message_age = "Tu es dans la fleur de l'âge !";
        } else {
            $message_age = "L'expérience, ça n'a pas de prix !";
        }
        
        // Création de la salutation complète
        $salutation = "$periode $emoji $nom ! $message_age";
    }
}

// COULEURS DISPONIBLES
$couleurs = [
    'blue' => ['#3b82f6', 'Bleu'],
    'red' => ['#ef4444', 'Rouge'],
    'green' => ['#10b981', 'Vert'],
    'purple' => ['#8b5cf6', 'Violet'],
    'orange' => ['#f97316', 'Orange'],
    'pink' => ['#ec4899', 'Rose']
];

// Récupérer la couleur sélectionnée
$couleur_selectionnee = $couleurs[$couleur] ?? $couleurs['blue'];
?>

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Générateur de Salutations - Premier Projet PHP</title>
    <style>
        /* Code à déplacer dans un fichier style.css. */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 20px;
        }
        
        .container {
            background: rgba(255, 255, 255, 0.95);
            padding: 40px;
            border-radius: 20px;
            box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            max-width: 500px;
            width: 100%;
            text-align: center;
        }
        
        h1 {
            color: #333;
            margin-bottom: 30px;
            font-size: 2.5em;
        }
        
        .form-group {
            margin-bottom: 25px;
            text-align: left;
        }
        
        label {
            display: block;
            margin-bottom: 8px;
            font-weight: bold;
            color: #555;
        }
        
        input, select {
            width: 100%;
            padding: 15px;
            border: 2px solid #ddd;
            border-radius: 10px;
            font-size: 16px;
            transition: border-color 0.3s;
        }
        
        input:focus, select:focus {
            outline: none;
            border-color: <?= $couleur_selectionnee[0] ?>;
        }
        
        .color-preview {
            display: inline-block;
            width: 20px;
            height: 20px;
            border-radius: 50%;
            margin-right: 8px;
            vertical-align: middle;
        }
        
        button {
            background: <?= $couleur_selectionnee[0] ?>;
            color: white;
            padding: 15px 30px;
            border: none;
            border-radius: 10px;
            font-size: 18px;
            font-weight: bold;
            cursor: pointer;
            transition: transform 0.2s;
            width: 100%;
            margin-top: 10px;
        }
        
        button:hover {
            transform: translateY(-2px);
        }
        
        .salutation {
            background: linear-gradient(45deg, <?= $couleur_selectionnee[0] ?>, <?= $couleur_selectionnee[0] ?>88);
            color: white;
            padding: 30px;
            border-radius: 15px;
            margin: 30px 0;
            font-size: 1.3em;
            animation: slideIn 0.5s ease-out;
        }
        
        @keyframes slideIn {
            from {
                opacity: 0;
                transform: translateY(20px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }
        
        .info {
            background: #f8f9fa;
            padding: 20px;
            border-radius: 10px;
            margin-top: 20px;
            font-size: 14px;
            color: #666;
        }
        
        .emoji {
            font-size: 2em;
            margin: 10px 0;
        }
    </style>
</head>
<body>

<div class="container">
    <h1>🎉 Générateur de Salutations</h1>
    
    <p style="color: #666; margin-bottom: 30px;">
        Mon premier projet PHP ! Il est actuellement <strong><?= date('H:i') ?></strong>
    </p>
    
    <?php if ($salutation): ?>
        <div class="salutation">
            <div class="emoji"><?= $emoji ?></div>
            <div><?= htmlspecialchars($salutation) ?></div>
        </div>
    <?php endif; ?>
    
    <form method="POST">
        <div class="form-group">
            <label for="nom">👤 Votre prénom :</label>
            <input 
                type="text" 
                id="nom" 
                name="nom" 
                value="<?= htmlspecialchars($nom) ?>"
                placeholder="Entrez votre prénom"
                required
            >
        </div>
        
        <div class="form-group">
            <label for="age">🎂 Votre âge :</label>
            <input 
                type="number" 
                id="age" 
                name="age" 
                value="<?= $age ?>"
                min="1" 
                max="120"
                placeholder="Votre âge"
                required
            >
        </div>
        
        <div class="form-group">
            <label for="couleur">🎨 Couleur préférée :</label>
            <select id="couleur" name="couleur">
                <?php foreach ($couleurs as $code => $info): ?>
                    <option value="<?= $code ?>" <?= ($couleur === $code) ? 'selected' : '' ?>>
                        <?= $info[1] ?>
                    </option>
                <?php endforeach; ?>
            </select>
        </div>
        
        <button type="submit">
            ✨ Générer ma salutation personnalisée !
        </button>
    </form>
    
    <div class="info">
        <h3>Ce que j'ai appris dans ce projet :</h3>
        <ul style="text-align: left; margin-top: 10px;">
            <li>📝 Variables PHP ($nom, $age, $couleur)</li>
            <li>🔄 Conditions if/elseif/else</li>
            <li>📋 Récupération de données POST</li>
            <li>🎨 Intégration HTML/CSS/PHP</li>
            <li>⏰ Fonction date() de PHP</li>
            <li>🛡️ Sécurité avec htmlspecialchars()</li>
        </ul>
    </div>
    
    <p style="margin-top: 20px; color: #888; font-size: 12px;">
        Code source : salutation.php | Mon premier projet PHP 🚀
    </p>
</div>

</body>
</html>

Instructions

  1. 2.
    Dans le dossier "projet_web" qui se trouve à la racine de votre OneDrive (crée le s'il n'existe pas), créer dans un dossier "projet_php" :
    OneDrive : C:\Users\fabri\OneDrive - Lycée Saint Joseph LA SALLE\projets_web\
  2. 2.
    Dans le dossier "projet_php" créer un autre dossier "first_form"" :
    OneDrive : C:\Users\fabri\OneDrive - Lycée Saint Joseph LA SALLE\projets_web\first_form\
  3. 1.
    Créer le fichier "salutation.php" dans le dossier "first_form" :
    Copiez le code dans salutation.php
  4. 3.
    Faites un clic droit sur le fichier "salutation.php" et cliquer sur "open in integred terminal" pour ouvrir votre terminal :
  5. 4.
    Tester :
    Dans votre terminal taper la commande suivante php -S localhost:8000 et cliquez en ensuite sur (http://localhost:8000) dans votre navigateur pour voir le résultat.
  6. 5.
    Experimenter :
    Modifier les couleurs, messages et conditions

Concepts PHP abordés

Variables et types

$nom (string), $age (int), $couleur (string)

Conditions

if/elseif/else basé sur l'heure et l'âge

Formulaires

$_POST, $_SERVER['REQUEST_METHOD']

Fonctions PHP

date(), htmlspecialchars(), trim()

Sécurité basique

Échappement HTML, validation des données

Intégration

PHP dans HTML, CSS dynamique

Exercices d'Amélioration

Niveau Débutant :

  • 🟡 Ajouter plus de couleurs dans le tableau
  • 🟡 Changer les messages selon l'âge
  • 🟡 Ajouter un champ "Ville" dans le formulaire
  • 🟡 Modifier les styles CSS

Niveau Intermédiaire :

  • 🟠 Sauvegarder les salutations dans un fichier
  • 🟠 Ajouter une validation plus poussée
  • 🟠 Créer un historique des utilisateurs
  • 🟠 Ajouter un système de thèmes

PHP Installé, VS Code Configuré !

Maintenant que votre environnement est prêt, il est temps de créer des formulaires interactifs et d'apprendre la sécurisation.

🎯 Prochaines étapes recommandées :

1. Maîtriser les formulaires PHP • 2. Apprendre la sécurisation • 3. Connecter une base de données • 4. Créer un projet complet