Connecter PHP à MySQL étape par étape
Connecter PHP à MySQL est l’une des premières compétences qui transforme un simple script en véritable application web. C’est le moment où votre site commence à manipuler des données vivantes, à enregistrer des utilisateurs, à afficher des produits, à conserver des messages, à faire circuler des informations entre un formulaire et une base de données. Beaucoup de développeurs débutants voient cette étape comme quelque chose de purement technique, presque froid, alors qu’en réalité elle marque le début d’une grande liberté : celle de construire des applications utiles, interactives et durables. Quand on comprend vraiment comment PHP parle à MySQL, tout devient plus clair. On cesse de copier des morceaux de code sans les comprendre, et on commence enfin à bâtir une logique solide, propre et sûre.
Dans cet article, je vais vous guider pas à pas, avec une approche simple, humaine et complète. Nous allons voir ce qu’est MySQL, pourquoi PHP et MySQL s’associent si bien, comment préparer votre environnement local, comment créer une base de données, comment vous connecter avec PHP, comment éviter les erreurs fréquentes, comment sécuriser vos requêtes, comment insérer, lire, modifier et supprimer des données, et surtout comment écrire un code qui ne vous trahira pas au premier changement de contexte. L’objectif n’est pas seulement de “faire marcher” une connexion, mais de comprendre ce que l’on fait, afin de pouvoir ensuite adapter la méthode à n’importe quel projet.
Pourquoi relier PHP à MySQL ?
PHP est un langage de script côté serveur très utilisé pour créer des sites web dynamiques. MySQL, de son côté, est un système de gestion de base de données relationnelle. Ensemble, ils forment un duo particulièrement efficace pour stocker et récupérer des informations. PHP génère les pages, traite les formulaires, exécute la logique métier et communique avec la base. MySQL conserve les données de manière structurée, comme dans des tables composées de colonnes et de lignes. Cette séparation des responsabilités est précieuse : le code gère le comportement, la base gère la mémoire.
Imaginez un site de blog. PHP se charge d’afficher les articles, de recevoir les commentaires, d’authentifier les utilisateurs et de vérifier les droits d’accès. MySQL enregistre les articles, les auteurs, les catégories et les commentaires. Sans base de données, tout serait statique, figé, difficile à maintenir. Avec MySQL, votre site devient évolutif, capable d’évoluer avec les besoins du projet. C’est pour cela que la connexion entre PHP et MySQL est si importante : elle donne à votre application une structure persistante.
Ce qu’il faut avant de commencer
Avant d’écrire une seule ligne de code, il faut disposer d’un environnement de travail fonctionnel. En local, la plupart des développeurs utilisent un stack comme XAMPP, WAMP, MAMP ou Laragon. Ces outils installent généralement PHP, MySQL et un serveur web comme Apache en quelques clics. Le but est d’avoir un environnement proche de celui d’un hébergement réel, mais utilisable sur votre ordinateur. Si vous débutez, cette étape est rassurante, car elle permet de tester vos scripts sans risquer de casser un site en production.
Vous aurez également besoin d’un éditeur de code, comme Visual Studio Code, et d’un navigateur pour tester vos pages. Vérifiez que PHP fonctionne correctement en créant un petit fichier index.php contenant un simple phpinfo() ou un message de test. Ensuite, assurez-vous que MySQL tourne bien et que vous pouvez accéder à l’outil de gestion de base de données, par exemple phpMyAdmin. Cette phase de préparation peut sembler banale, mais elle évite énormément de frustration par la suite. Bien des erreurs de “connexion impossible” viennent en réalité d’un service arrêté, d’un mauvais port, ou d’un identifiant mal saisi.
Comprendre la logique d’une connexion à MySQL
Une connexion à une base de données, ce n’est pas un miracle. C’est simplement l’ouverture d’un canal de communication entre votre script PHP et le serveur MySQL. PHP doit connaître plusieurs informations pour se connecter : l’hôte de la base, souvent localhost en local ; le nom de la base de données ; le nom d’utilisateur ; le mot de passe ; et parfois un port spécifique. Une fois la connexion établie, PHP peut envoyer des requêtes SQL à MySQL, recevoir des résultats et les traiter.
Le point essentiel à retenir est le suivant : PHP ne “voit” pas directement les tables. Il passe par un objet ou une ressource de connexion, puis il envoie des requêtes SQL. Ce dialogue ressemble un peu à une conversation entre deux collègues : l’un demande des données, l’autre répond selon ce qui existe dans la base. Si la requête est mal écrite, MySQL ne comprend pas. Si les identifiants sont faux, la connexion échoue. Si la structure de la base est incorrecte, les résultats seront inattendus. Il faut donc prendre l’habitude d’avancer avec méthode.
Créer une base de données de test
Pour apprendre proprement, rien ne vaut une petite base de données de démonstration. Créons par exemple une base nommée blog_demo. Dans cette base, nous pourrions prévoir une table users pour les utilisateurs et une table posts pour les articles. Voici un exemple simple de création de base et de table en SQL :
CREATE DATABASE blog_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE blog_demo;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
Cette structure est déjà très intéressante à étudier. La table users stocke les informations principales sur les comptes. Le mot de passe doit être enregistré sous forme de hash, jamais en clair. La table posts contient les articles, et la colonne user_id permet de savoir à quel utilisateur appartient chaque article. On voit ici la logique relationnelle de MySQL : une table peut faire référence à une autre, ce qui permet de relier les informations de manière élégante et cohérente.
Première connexion avec MySQLi
PHP propose plusieurs façons de se connecter à MySQL. Historiquement, on a longtemps utilisé l’extension MySQLi, qui signifie “MySQL Improved”. Elle est encore très présente dans de nombreux projets. Elle fonctionne bien, notamment pour des scripts simples ou des bases de code existantes. Voici un exemple de connexion basique avec MySQLi en mode orienté objet :
<?php
$host = "localhost";
$user = "root";
$password = "";
$database = "blog_demo";
$conn = new mysqli($host, $user, $password, $database);
if ($conn->connect_error) {
die("Erreur de connexion : " . $conn->connect_error);
}
echo "Connexion réussie à MySQL.";
?>
Ce script fait exactement ce que vous imaginez. Il définit les informations nécessaires, tente la connexion, puis vérifie s’il y a une erreur. Si la connexion échoue, le script s’arrête avec un message. Si tout va bien, on affiche un message de réussite. Pour un premier test, c’est parfait. Cependant, même si cette méthode est simple, elle n’est pas toujours la plus propre ni la plus souple pour les projets modernes. C’est là que PDO entre en scène.
Pourquoi préférer PDO dans les projets modernes ?
PDO signifie PHP Data Objects. C’est une couche d’abstraction qui permet de communiquer avec plusieurs types de bases de données, pas seulement MySQL. L’un de ses grands avantages est sa flexibilité. Si, plus tard, vous devez changer de moteur de base de données, votre code sera plus facile à adapter. PDO est aussi apprécié pour son intégration avec les requêtes préparées, qui renforcent la sécurité et réduisent le risque d’injection SQL.
Voici un exemple de connexion avec PDO :
<?php
$host = "localhost";
$dbname = "blog_demo";
$user = "root";
$password = "";
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connexion PDO réussie.";
} catch (PDOException $e) {
die("Erreur de connexion : " . $e->getMessage());
}
?>
Dans cet exemple, nous utilisons un bloc try...catch. Cela permet de gérer les erreurs de manière élégante. Si la connexion échoue, une exception est levée et interceptée dans le catch. On évite ainsi une sortie brutale ou un code difficile à maintenir. Le paramètre charset=utf8mb4 est très important, car il permet de gérer correctement les accents, les caractères spéciaux et les emojis. Sans cela, vous pourriez rencontrer des surprises désagréables dans vos données.
Quelle méthode choisir ?
Les deux méthodes, MySQLi et PDO, sont valables, mais elles n’ont pas exactement le même esprit. MySQLi est dédié à MySQL, tandis que PDO est plus généraliste. MySQLi peut être pratique si votre projet est très centré sur MySQL et que vous appréciez son style. PDO est souvent préféré dans les projets modernes parce qu’il encourage une écriture plus propre, plus portable et plus sécurisée. Pour apprendre les bases, il est utile de connaître les deux. Pour un projet sérieux, il est souvent judicieux de partir sur PDO, surtout si vous souhaitez adopter les bonnes pratiques dès le départ.
Le plus important n’est pas de choisir une “campagne” idéologique entre les deux, mais de comprendre vos besoins. Un petit script local pour tester des données peut très bien utiliser MySQLi. Une application plus robuste, plus structurée, ou destinée à évoluer gagnera souvent à utiliser PDO.
Organiser le code de connexion proprement
Dans les débuts, on voit souvent des fichiers où tout est mélangé : paramètres de connexion, HTML, traitement de formulaire, affichage des résultats, tout dans le même script. Cela fonctionne parfois, mais ce n’est pas une bonne habitude. Il est préférable de séparer la configuration de la connexion dans un fichier dédié, par exemple config/database.php. Cette approche rend votre projet plus lisible et facilite la maintenance.
Voici un exemple simple de fichier de configuration avec PDO :
<?php
// config/database.php
$host = "localhost";
$dbname = "blog_demo";
$user = "root";
$password = "";
try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$user,
$password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]
);
} catch (PDOException $e) {
die("Connexion impossible : " . $e->getMessage());
}
Dans ce fichier, on centralise la logique de connexion. Ensuite, dans vos autres pages, vous pouvez simplement inclure ce fichier avec require_once. Cette technique évite de dupliquer le même code partout. Elle vous fait aussi gagner en clarté mentale : un fichier pour la base, un autre pour le traitement, un autre pour l’affichage. Votre projet respire mieux quand ses responsabilités sont bien réparties.
Insérer des données dans la base
Une fois la connexion réussie, l’étape suivante consiste à envoyer des données vers MySQL. Prenons un exemple simple : enregistrer un utilisateur. Il ne faut jamais construire une requête SQL en concaténant naïvement des variables issues d’un formulaire. C’est dangereux et fragile. Il faut utiliser des requêtes préparées. Voici un exemple avec PDO :
<?php
require_once "config/database.php";
$name = "Sara";
$email = "sara@example.com";
$password = password_hash("monMotDePasseSecure", PASSWORD_DEFAULT);
$sql = "INSERT INTO users (name, email, password) VALUES (:name, :email, :password)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':name' => $name,
':email' => $email,
':password' => $password
]);
echo "Utilisateur ajouté avec succès.";
?>
Ce code est propre, lisible et sécurisé. La fonction password_hash() transforme le mot de passe en empreinte sécurisée. La requête préparée sépare la structure SQL des valeurs. Cela limite fortement les risques d’injection SQL. C’est une habitude fondamentale à prendre très tôt. En réalité, toute application sérieuse qui traite des données utilisateur devrait fonctionner sur ce principe.
Lire des données depuis MySQL
Lire des données est l’une des opérations les plus fréquentes. Vous allez très souvent afficher une liste d’articles, récupérer un profil utilisateur, ou charger des informations pour les modifier. Voici comment récupérer tous les utilisateurs :
<?php
require_once "config/database.php";
$sql = "SELECT id, name, email, created_at FROM users ORDER BY created_at DESC";
$stmt = $pdo->query($sql);
$users = $stmt->fetchAll();
foreach ($users as $user) {
echo "<p>";
echo htmlspecialchars($user['name']) . " - ";
echo htmlspecialchars($user['email']) . " - ";
echo htmlspecialchars($user['created_at']);
echo "</p>";
}
?>
Le point important ici est l’usage de htmlspecialchars(). Lorsqu’on affiche des données dans une page HTML, il faut éviter qu’un contenu malveillant soit interprété comme du code. Cette fonction protège contre certaines attaques de type XSS. C’est un réflexe de sécurité à intégrer systématiquement dès que vous affichez du contenu stocké. Une application sûre, ce n’est pas seulement des requêtes bien préparées, c’est aussi un affichage prudent.
Lire un seul enregistrement
Souvent, vous n’aurez pas besoin de tous les résultats, mais seulement d’un seul. Par exemple, la page d’un article ou la fiche d’un utilisateur. Dans ce cas, on utilise une requête avec un paramètre précis :
<?php
require_once "config/database.php";
$id = 1;
$sql = "SELECT id, name, email, created_at FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => $id]);
$user = $stmt->fetch();
if ($user) {
echo "<h2>" . htmlspecialchars($user['name']) . "</h2>";
echo "<p>" . htmlspecialchars($user['email']) . "</p>";
} else {
echo "Utilisateur introuvable.";
}
?>
Cette méthode est plus sûre et plus propre que de faire confiance à une valeur brute transmise par l’URL ou un formulaire. En pratique, vous récupérerez souvent l’identifiant depuis $_GET['id'], mais il faudra le valider et le traiter correctement avant usage. La discipline dans ce genre de détail fait toute la différence entre un script fragile et une application solide.
Mettre à jour des données
Modifier des données est une opération tout aussi courante. Un utilisateur change son nom, son email, son mot de passe ; un administrateur corrige un article ; un statut passe de brouillon à publié. Voici un exemple de mise à jour :
<?php
require_once "config/database.php";
$id = 1;
$newName = "Sara Benali";
$newEmail = "sara.benali@example.com";
$sql = "UPDATE users SET name = :name, email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':name' => $newName,
':email' => $newEmail,
':id' => $id
]);
echo "Utilisateur mis à jour avec succès.";
?>
L’idée est toujours la même : les données sont passées séparément de la requête. Cela rend le code beaucoup plus lisible et fiable. Vous pouvez aussi vérifier le nombre de lignes affectées avec $stmt->rowCount() pour savoir si la mise à jour a réellement touché un enregistrement. C’est utile pour détecter certains cas limites, par exemple lorsque l’identifiant n’existe pas.
Supprimer des données avec prudence
La suppression est une opération puissante, et donc à manier avec une grande prudence. Une suppression irréfléchie peut être irréversible. Voici un exemple simple :
<?php
require_once "config/database.php";
$id = 1;
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => $id]);
echo "Utilisateur supprimé.";
?>
Dans un vrai projet, on ajoute souvent des confirmations, des contrôles d’accès et parfois une suppression “douce” via un champ comme deleted_at au lieu d’effacer définitivement la ligne. Cette approche permet de conserver une trace, de restaurer des données si nécessaire, et de réduire les erreurs humaines. Dans le monde réel, beaucoup de problèmes viennent moins du code que des clics malheureux. Une interface prudente est donc aussi importante qu’une requête correcte.
Les requêtes préparées : une habitude essentielle
Les requêtes préparées méritent qu’on s’y attarde. Elles servent à séparer la logique SQL des données, ce qui protège contre les injections SQL. Lorsqu’un utilisateur envoie des informations via un formulaire, vous ne devez jamais les injecter directement dans la chaîne SQL. Au lieu de cela, vous préparez la requête, puis vous passez les valeurs comme paramètres. Le moteur SQL traite alors les données comme de simples valeurs, pas comme du code.
Voici un exemple d’erreur fréquente :
$sql = "SELECT * FROM users WHERE email = '$email'";
Si $email contient une valeur malveillante, vous ouvrez une porte sérieuse à des attaques. La bonne version ressemble à ceci :
$sql = "SELECT * FROM users WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->execute([':email' => $email]);
Cette différence paraît minime visuellement, mais elle est énorme sur le plan de la sécurité. C’est un des réflexes les plus importants à adopter dès le départ. Beaucoup d’applications vulnérables auraient pu être bien plus sûres avec cette seule habitude.
Gérer les formulaires HTML avec PHP et MySQL
L’un des scénarios les plus classiques consiste à prendre les données d’un formulaire HTML et à les enregistrer en base de données. Voici un petit formulaire d’inscription :
<form method="post" action="register.php">
<label>Nom</label>
<input type="text" name="name" required>
<label>Email</label>
<input type="email" name="email" required>
<label>Mot de passe</label>
<input type="password" name="password" required>
<button type="submit">S'inscrire</button>
</form>
Et voici le traitement côté PHP :
<?php
require_once "config/database.php";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
if ($name === '' || $email === '' || $password === '') {
die("Tous les champs sont obligatoires.");
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("Adresse email invalide.");
}
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$sql = "INSERT INTO users (name, email, password) VALUES (:name, :email, :password)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':name' => $name,
':email' => $email,
':password' => $hashedPassword
]);
echo "Inscription réussie.";
}
?>
Ce morceau de code montre bien la chaîne complète : réception des données, nettoyage, validation, sécurisation du mot de passe, insertion en base. Rien n’est laissé au hasard. Ce n’est pas seulement une manière de faire fonctionner un formulaire, c’est une manière de penser le code. Quand les données viennent de l’extérieur, elles doivent toujours être contrôlées avant d’entrer dans votre système.
Valider et nettoyer les données
Valider les données ne veut pas dire les rendre “jolies”, mais vérifier qu’elles respectent les attentes du système. Un email doit ressembler à un email. Un nom ne doit pas être vide. Un identifiant doit être numérique. Un mot de passe doit respecter une longueur minimale. En parallèle, il est souvent utile de nettoyer légèrement les données avec trim() pour supprimer les espaces superflus au début et à la fin.
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
La validation est un domaine où beaucoup de débutants sous-estiment le travail à faire. Pourtant, elle améliore la qualité des données, simplifie le débogage et évite les comportements étranges. Si vous n’imposez aucune règle à l’entrée, vous devrez corriger le chaos plus tard. Il est presque toujours plus simple de bloquer une mauvaise donnée dès le départ que de la réparer après coup.
Sécuriser les mots de passe
Un mot de passe ne doit jamais être stocké en clair. C’est une règle absolue. PHP propose des fonctions très pratiques pour cela : password_hash() pour créer un hash, et password_verify() pour comparer un mot de passe saisi avec le hash stocké. Voici un exemple d’authentification :
<?php
require_once "config/database.php";
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
$sql = "SELECT id, name, password FROM users WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
echo "Connexion réussie pour " . htmlspecialchars($user['name']);
} else {
echo "Identifiants incorrects.";
}
?>
Ce mécanisme est simple à utiliser, mais il change tout sur le plan de la sécurité. Vous n’avez pas à inventer votre propre système de chiffrement, ce qui serait une très mauvaise idée. La fonction native de PHP fait le travail avec des algorithmes adaptés et une bonne compatibilité avec les mises à jour futures.
Afficher les erreurs intelligemment
L’un des pièges classiques consiste à afficher les erreurs brutes de connexion ou de requête aux visiteurs. En développement local, cela peut être utile. En production, c’est dangereux et peu élégant. Il vaut mieux enregistrer les erreurs dans des logs, puis afficher un message générique à l’utilisateur. Cela protège votre application tout en vous permettant de diagnostiquer les problèmes de votre côté.
En mode développement, vous pouvez activer temporairement un affichage plus bavard. En production, vous le réduisez. Cette discipline est importante, car un site qui expose trop d’informations techniques donne involontairement de précieux indices à un attaquant. La sécurité passe aussi par la retenue.
Utiliser les transactions quand c’est nécessaire
Une transaction permet de regrouper plusieurs opérations de base de données dans un même bloc logique. Soit tout réussit, soit tout est annulé. C’est très utile quand plusieurs requêtes doivent rester cohérentes entre elles. Par exemple, si vous créez un utilisateur puis un profil associé, vous ne voulez pas que l’un soit enregistré sans l’autre.
<?php
require_once "config/database.php";
try {
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO users (name, email, password) VALUES (:name, :email, :password)");
$stmt->execute([
':name' => 'Imane',
':email' => 'imane@example.com',
':password' => password_hash('secret123', PASSWORD_DEFAULT)
]);
$userId = $pdo->lastInsertId();
$stmt = $pdo->prepare("INSERT INTO posts (user_id, title, content) VALUES (:user_id, :title, :content)");
$stmt->execute([
':user_id' => $userId,
':title' => 'Mon premier article',
':content' => 'Voici le contenu de mon article.'
]);
$pdo->commit();
echo "Utilisateur et article créés avec succès.";
} catch (Exception $e) {
$pdo->rollBack();
die("Erreur : " . $e->getMessage());
}
?>
Les transactions donnent un sentiment de robustesse très agréable. Elles vous permettent de penser en termes d’actions complètes, pas seulement de lignes isolées. Dès que votre projet devient un peu plus complexe, elles deviennent vite indispensables.
Créer un mini CRUD complet
Le mot CRUD désigne les quatre opérations de base d’une application : Create, Read, Update, Delete. Si vous maîtrisez ces quatre piliers avec PHP et MySQL, vous avez déjà une base très solide pour construire des applications de gestion, des blogs, des tableaux de bord ou des espaces membres.
Créer : insérer une donnée avec INSERT.
Lire : afficher une donnée avec SELECT.
Modifier : mettre à jour avec UPDATE.
Supprimer : retirer avec DELETE.
Voici un exemple très simplifié de liste d’articles :
<?php
require_once "config/database.php";
$sql = "SELECT id, title, content, created_at FROM posts ORDER BY created_at DESC";
$stmt = $pdo->query($sql);
$posts = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Liste des articles</title>
</head>
<body>
<h1>Articles</h1>
<?php foreach ($posts as $post): ?>
<article>
<h2><?= htmlspecialchars($post['title']) ?></h2>
<p><?= nl2br(htmlspecialchars($post['content'])) ?></p>
<small><?= htmlspecialchars($post['created_at']) ?></small>
</article>
<?php endforeach; ?>
</body>
</html>
Un tel exemple montre bien la continuité entre la base et l’affichage. Ce que MySQL stocke, PHP le récupère, puis le navigateur le présente à l’utilisateur. C’est un cycle simple, mais extrêmement puissant.
Améliorer la lisibilité du code
Quand on apprend, on a parfois tendance à tout écrire rapidement pour voir “si ça marche”. C’est humain, et c’est même souvent nécessaire au début. Mais avec le temps, il faut prendre l’habitude de nommer correctement les variables, de séparer les responsabilités, d’ajouter des commentaires utiles, et de structurer le projet par dossiers. Un code lisible vous fait gagner du temps plus tard. Il vous permet aussi de reprendre un projet après une pause sans avoir l’impression de relire une énigme écrite par quelqu’un d’autre.
Par exemple, au lieu de nommer une variable $x, préférez $user, $post, $email, $stmt ou $pdo. Au lieu d’écrire tout dans un seul fichier, séparez la configuration, les fonctions, les modèles et les vues si le projet grandit. Ce n’est pas du luxe. C’est une manière de respecter votre futur vous-même.
Erreurs fréquentes à éviter
Beaucoup d’erreurs reviennent sans cesse chez les débutants. On oublie d’inclure le bon fichier de connexion. On confond le nom de la base avec celui de l’utilisateur. On essaie de récupérer un formulaire avec GET alors qu’il a été envoyé en POST. On oublie le charset=utf8mb4. On affiche des données sans les échapper. On stocke les mots de passe en clair. On écrit des requêtes SQL sans préparation. Chaque erreur a l’air petite, mais l’ensemble peut rendre un projet fragile.
Le plus rassurant, c’est que ces erreurs sont presque toutes évitables avec une méthode simple : vérifier la configuration, tester étape par étape, lire les messages d’erreur avec calme, et ne pas sauter trop vite à des conclusions. Souvent, le problème n’est pas “PHP ne fonctionne pas”, mais “un détail précis bloque la communication”. Une virgule, un mot de passe vide, un mauvais nom de colonne, et toute la chaîne se met à grincer.
Une structure de projet simple et saine
Pour aller plus loin, vous pouvez organiser votre projet ainsi :
mon-projet/
│
├── config/
│ └── database.php
├── public/
│ └── index.php
├── views/
│ └── posts.php
├── handlers/
│ └── register.php
└── assets/
├── css/
└── js/
Cette organisation n’est pas obligatoire, mais elle devient très utile dès que l’application grandit. Elle vous aide à savoir où mettre quoi. Elle évite le mélange des genres entre logique métier, affichage et configuration. Même un petit projet peut bénéficier d’une structure claire. Et plus vous avez une bonne base au départ, moins vous aurez de douleur lors des évolutions.
Exemple complet d’inscription et de connexion
Prenons un mini scénario plus réaliste. Un utilisateur remplit un formulaire, vous enregistrez son compte, puis vous lui permettez de se connecter. Voici une version simple de l’inscription :
<?php
require_once "config/database.php";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
if ($name === '' || $email === '' || $password === '') {
die("Veuillez remplir tous les champs.");
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("Email invalide.");
}
$check = $pdo->prepare("SELECT id FROM users WHERE email = :email");
$check->execute([':email' => $email]);
if ($check->fetch()) {
die("Cet email est déjà utilisé.");
}
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("INSERT INTO users (name, email, password) VALUES (:name, :email, :password)");
$stmt->execute([
':name' => $name,
':email' => $email,
':password' => $hashedPassword
]);
echo "Compte créé avec succès.";
}
?>
Et voici une version simple de la connexion :
<?php
require_once "config/database.php";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
$stmt = $pdo->prepare("SELECT id, name, password FROM users WHERE email = :email");
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
session_start();
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_name'] = $user['name'];
echo "Bienvenue " . htmlspecialchars($user['name']);
} else {
echo "Email ou mot de passe incorrect.";
}
}
?>
Dans un vrai projet, il faudrait aussi ajouter des redirections, des contrôles de session, des messages d’erreur plus propres et peut-être une couche MVC. Mais même sous cette forme, le principe est déjà clair : formulaire, validation, base de données, authentification, session. C’est la colonne vertébrale de nombreuses applications web.
Aller un peu plus loin avec les bonnes pratiques
À partir du moment où vous savez connecter PHP à MySQL, il devient très intéressant d’adopter quelques bonnes habitudes durables. Utilisez toujours des requêtes préparées. Validez toutes les entrées utilisateur. Échappez l’affichage HTML. Séparez la configuration dans un fichier distinct. Protégez les mots de passe avec les fonctions natives. Utilisez les transactions pour les opérations multi-étapes. Préférez des noms de variables explicites. Commentez seulement ce qui apporte réellement de la clarté.
Ces habitudes peuvent sembler un peu exigeantes au début, mais elles vous font gagner beaucoup de temps plus tard. Un projet n’est pas seulement un ensemble de fonctionnalités visibles ; c’est aussi une façon de penser et de maintenir son code. Les bonnes pratiques ne sont pas là pour compliquer la vie. Elles sont là pour éviter qu’un petit projet devienne un problème permanent.
Conclusion
Connecter PHP à MySQL étape par étape, ce n’est pas juste apprendre une syntaxe. C’est entrer dans la logique des applications web dynamiques. C’est comprendre comment les données circulent entre le navigateur, le serveur et la base. C’est découvrir que la qualité d’un projet dépend souvent de détails très simples : une bonne configuration, des requêtes préparées, un affichage sécurisé, des mots de passe bien protégés, une structure claire. Une fois ces fondations acquises, vous n’êtes plus en train de “faire du PHP”, vous êtes en train de construire de vrais systèmes utiles.
Le plus beau dans cette compétence, c’est qu’elle ouvre la porte à presque tout le reste. Une fois la connexion maîtrisée, vous pouvez créer des tableaux de bord, des espaces d’administration, des blogs, des forums, des boutiques en ligne, des systèmes de réservation, des CRM légers et bien d’autres choses encore. La connexion entre PHP et MySQL est un point de départ, mais c’est aussi une porte d’entrée vers une immense liberté de création. Et c’est souvent là que l’apprentissage devient vraiment passionnant : au moment où la technique cesse d’être un obstacle et devient un outil pour donner vie à vos idées.