Guide complet pour installer PHP sur Windows, configurer Visual Studio Code et apprendre les bases du langage avec des exercices pratiques.
Suivez ce guide étape par étape pour installer PHP et créer votre premier serveur local.
Tester: http://localhost/test.php
Le serveur intégré est uniquement pour le développement, jamais en production !
Optimisez VS Code pour le développement PHP avec les extensions essentielles.
Autocomplétion, analyse de code, navigation
ext install bmewburn.vscode-intelephense-client
Débogage avec Xdebug
ext install xdebug.php-debug
Génération automatique de documentation
ext install neilbrayfield.php-docblocker
Renommage automatique des balises HTML
ext install formulahendry.auto-rename-tag
Coloration des parenthèses et crochets
ext install CoenraadS.bracket-pair-colorizer-2
Serveur de développement avec rechargement automatique
ext install ritwickdey.LiveServer
{
// 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)
Découvrez les concepts fondamentaux de PHP pour commencer à développer.
PHP (PHP: Hypertext Preprocessor) est un langage de programmation côté serveur conçu pour le développement web.
Maîtrisez les éléments fondamentaux de la syntaxe PHP.
Apprenez à utiliser les structures conditionnelles pour contrôler le flux de votre programme.
Utilisez elseif plutôt que plusieurs if séparés pour des conditions liées.
Sans break, le code continue dans les cases suivantes !
Maîtrisez les différents types de boucles pour automatiser et répéter des actions.
Apprenez à créer, lire et modifier des fichiers texte avec PHP pour persister vos données.
<?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>
Découvrez les variables superglobales $_SERVER pour accéder aux informations du serveur et de la requête.
$_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.
Testez cet affichage pour découvrir toutes les variables disponibles sur votre serveur !
Répertoire racine du serveur web
Nom du serveur hôte
Méthode de requête HTTP
Adresse IP du client
Navigateur du client
URL complète de la requête
<?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>
Maîtrisez les superglobales PHP et les différentes méthodes HTTP pour créer des applications web interactives et des APIs REST.
<?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
*/
?>
<!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>
Apprenez à organiser votre code PHP en incluant des fichiers externes avec les différentes méthodes disponibles.
Inclut un fichier, continue si erreur
Inclut un fichier, ARRÊTE si erreur
Include seulement si pas déjà fait
Require seulement si pas déjà fait
Pour les fichiers critiques (config, fonctions)
Pour les templates et parties visuelles
Pour éviter les inclusions doubles
Solution : Utiliser __DIR__ ou chemins absolus
Solution : Utiliser *_once ou inclure avant la boucle
Créons votre première page PHP interactive avec formulaire simple.
<?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>
C:\Users\fabri\OneDrive - Lycée Saint Joseph LA SALLE\projets_web\
C:\Users\fabri\OneDrive - Lycée Saint Joseph LA SALLE\projets_web\first_form\
salutation.php
php -S localhost:8000
et cliquez en ensuite sur
(http://localhost:8000)
dans votre navigateur pour voir le résultat.
$nom (string), $age (int), $couleur (string)
if/elseif/else basé sur l'heure et l'âge
$_POST, $_SERVER['REQUEST_METHOD']
date(), htmlspecialchars(), trim()
Échappement HTML, validation des données
PHP dans HTML, CSS dynamique
Maintenant que votre environnement est prêt, il est temps de créer des formulaires interactifs et d'apprendre la sécurisation.
1. Maîtriser les formulaires PHP • 2. Apprendre la sécurisation • 3. Connecter une base de données • 4. Créer un projet complet