PHP pour débutant
D’installer PHP à écrire sa première page dynamique : le langage pas à pas.
- Syntaxe PHP
- Conditions et boucles
- Superglobales
- Premier projet
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. Télécharger XAMPP depuis apachefriends.org
- 2. Exécuter l'installateur en tant qu'administrateur
- 3. Choisir le dossier d'installation (ex: C:\xampp)
- 4. Sélectionner Apache, PHP et MySQL
- 5. Terminer l'installation
Configuration XAMPP :
php
# 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 :
php
# Créer: C:\xampp\htdocs\test.php
<?php
echo "Hello PHP!";
?>
2 Installation Manuelle PHP (Avancé)
Téléchargement PHP :
- 1. Aller sur php.net/downloads
- 2. Télécharger "Thread Safe" pour Windows
- 3. Extraire dans C:\php\
- 4. Copier php.ini-development vers php.ini
- 5. Ajouter C:\php\ au PATH système
Configuration du PATH :
- 1. Touche Windows + R, taper "sysdm.cpl"
- 2. Onglet "Avancé" → Variables d'environnement
- 3. Variables système → Path → Modifier
- 4. Nouveau → C:\php\
- 5. OK sur tout
Tester l'installation :
php
# 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 :
php
# 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. Télécharger depuis code.visualstudio.com
- 2. Exécuter l'installateur
- 3. Cocher "Ajouter au PATH"
- 4. Cocher "Ouvrir avec Code" (menu contextuel)
- 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
{
// 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 :
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 :
php
// 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 :
php
<!DOCTYPE html>
<html>
<body>
<?php $nom = "Jean"; ?>
<h1>Bonjour <?= $nom ?>!</h1>
</body>
</html>
2 Variables
Déclaration et types :
php
// 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 :
php
// 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é) :
php
// 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 :
php
// 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 :
php
// Commentaire sur une ligne
$nom = "Jean"; // Nom de l'utilisateur
# Autre syntaxe une ligne
$age = 25;
/*
* Commentaire
* sur plusieurs
* lignes
*/
echo "Hello";
Documentation PHPDoc :
php
/**
* 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 :
php
// 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
<?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 :
bash
$a == $b // Égal (valeur)
bash
$a === $b // Identique (valeur ET type)
bash
$a != $b // Différent
bash
$a < $b // Inférieur à
bash
$a >= $b // Supérieur ou égal
Exemples pratiques :
php
<?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 :
php
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
<?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 :
php
for ($i = 0; $i < 10; $i++) {
// Code à répéter
echo $i . " ";
}
// Affiche: 0 1 2 3 4 5 6 7 8 9
Variations :
php
// 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
<?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 :
bash
$i = 0;
while ($i < 5) {
echo $i . " ";
$i++; // Important !
}
// Affiche: 0 1 2 3 4
Boucle do-while :
bash
$nombre = 10;
do {
echo $nombre . " ";
$nombre--;
} while ($nombre > 0);
// Exécute AU MOINS une fois
Exemple - Jeu de devinette :
php
<?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 :
php
// Pour les valeurs seulement
foreach ($array as $valeur) {
echo $valeur;
}
// Pour clé et valeur
foreach ($array as $cle => $valeur) {
echo $cle . ": " . $valeur;
}
Tableau simple :
bash
$fruits = ["pomme", "banane", "orange"];
foreach ($fruits as $fruit) {
echo $fruit . "<br>";
}
Exemple - Liste d'étudiants :
php
<?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 :
php
for ($i = 1; $i <= 10; $i++) {
if ($i == 5) {
break; // Stop la boucle
}
echo $i . " ";
}
// Affiche: 1 2 3 4
continue - Passer au suivant :
php
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
<?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 :
php
// 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
<?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 :
php
[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 :
php
// 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 :
php
if (file_exists('fichier.txt')) {
// Le fichier existe
}
if (is_readable('fichier.txt')) {
// Le fichier est lisible
}
Exemple - Afficher le journal :
php
<?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
<?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 :
php
// 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
php
echo $_SERVER['DOCUMENT_ROOT'];
// Résultat: C:/xampp/htdocs
SERVER_NAME
Nom du serveur hôte
php
echo $_SERVER['SERVER_NAME'];
// Résultat: localhost
REQUEST_METHOD
Méthode de requête HTTP
php
echo $_SERVER['REQUEST_METHOD'];
// Résultat: GET ou POST
REMOTE_ADDR
Adresse IP du client
php
echo $_SERVER['REMOTE_ADDR'];
// Résultat: 127.0.0.1
HTTP_USER_AGENT
Navigateur du client
php
echo $_SERVER['HTTP_USER_AGENT'];
// Mozilla/5.0 (Windows NT 10.0...
REQUEST_URI
URL complète de la requête
php
echo $_SERVER['REQUEST_URI'];
// /mon-site/page.php?id=123
Exemple Pratique : Page d'Information Serveur
php
<?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 :
php
// 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 :
php
// 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é) :
php
// $_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
<?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
<?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
<?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
<?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
php
<!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 :
php
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
<?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
<?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
<?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
<?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
<?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
<?php
function securiser($texte) {
return htmlspecialchars($texte);
}
function debug($data) {
echo "<pre>";
var_dump($data);
echo "</pre>";
}
3. includes/header.php
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
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
<?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)
php
require_once 'config/database.php';
require_once 'functions/auth.php';
include
Pour les templates et parties visuelles
php
include 'templates/header.php';
include 'templates/sidebar.php';
include_once
Pour éviter les inclusions doubles
php
include_once 'widgets/menu.php';
Erreurs à éviter :
✗ Chemins relatifs fragiles
php
include '../includes/header.php'; // Fragile !
Solution : Utiliser __DIR__ ou chemins absolus
✗ Include dans des boucles
php
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
<?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
- 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. 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\
- 1. Créer le fichier "salutation.php" dans le dossier "first_form" : Copiez le code dans salutation.php
- 3. Faites un clic droit sur le fichier "salutation.php" et cliquer sur "open in integred terminal" pour ouvrir votre terminal :
- 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.
- 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
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
PHP installé, VS Code configuré
Syntaxe, structures de contrôle, fichiers et superglobales : vous avez de quoi écrire vos premières pages dynamiques.