Récapitulatif SQL & intégration PHP

Types de données (MySQL)

TypeExempleDescription
INT id INT AUTO_INCREMENT Nombre entier (ex: ID, âge, quantité).
VARCHAR(n) nom VARCHAR(50) Chaîne de caractères de longueur variable, maximum n caractères (ex: nom, email).
TEXT description TEXT Chaîne de caractères longue (ex: contenu d'un article, commentaire).
DECIMAL(m,d) prix DECIMAL(10,2) Nombre décimal exact. Idéal pour les prix (10 chiffres au total, dont 2 après la virgule).
DATE / DATETIME created_at DATETIME DATE (YYYY-MM-DD) ou DATETIME (YYYY-MM-DD HH:MM:SS).
BOOLEAN is_active BOOLEAN Souvent stocké comme TINYINT(1) (0 pour faux, 1 pour vrai).

DDL : Structure de la base de données et des tables

Le DDL (Data Definition Language) permet de créer, modifier et supprimer la structure de vos bases de données.

ActionCommande SQLExempleDétails
Créer DB CREATE DATABASE
CREATE DATABASE ma_boutique 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;
Crée une nouvelle base. Définir le `CHARACTER SET` à utf8mb4 est une bonne pratique pour gérer tous les caractères (y compris les émojis).
Créer Table CREATE TABLE
CREATE TABLE produits (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nom VARCHAR(50) NOT NULL,
    prix DECIMAL(10,2) DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
Définit les colonnes et leurs types.
  • PRIMARY KEY : Identifiant unique.
  • AUTO_INCREMENT : S'incrémente seul.
  • NOT NULL : Obligatoire.
Modifier Table ALTER TABLE
-- Ajouter une colonne
ALTER TABLE produits ADD stock INT;

-- Modifier une colonne (type)
ALTER TABLE produits MODIFY nom VARCHAR(100);

-- Supprimer une colonne
ALTER TABLE produits DROP COLUMN stock;
Permet de changer la structure d'une table existante sans perdre les données (sauf en cas de suppression de colonne).
Supprimer DROP
-- Supprime la table (irréversible !)
DROP TABLE IF EXISTS produits;

-- Supprime la base (irréversible !)
DROP DATABASE IF EXISTS ma_boutique;
Supprime définitivement la structure et toutes les données qu'elle contient. IF EXISTS évite une erreur si l'élément n'existe pas.

CRUD : Les 4 opérations de base

ActionCommande SQLExempleDescription
C (Create) INSERT INTO
INSERT INTO utilisateurs (nom, email) 
VALUES ('Dupont', 'dupont@mail.com');
Ajoute une nouvelle ligne dans la table.
C (Create en masse) INSERT INTO ... VALUES ...
INSERT INTO utilisateurs (nom, email) VALUES 
('Alice', 'alice@mail.com'),
('Bob', 'bob@mail.com'),
('Charlie', 'charlie@mail.com');
Pour ajouter plusieurs lignes en une seule requête, il suffit de séparer les groupes de valeurs par des virgules. C'est beaucoup plus performant que de faire plusieurs requêtes séparées.
R (Read) SELECT
SELECT nom, email FROM utilisateurs;
SELECT * FROM produits;
Récupère des données. * sélectionne toutes les colonnes.
U (Update) UPDATE
UPDATE produits 
SET prix = 19.99 
WHERE id = 5;
Modifie des données existantes. ⚠️ Toujours utiliser WHERE sinon toute la table est modifiée !
D (Delete) DELETE
DELETE FROM utilisateurs 
WHERE id = 12;
Supprime des lignes. ⚠️ Toujours utiliser WHERE sinon toute la table est effacée !

Filtrage et Tri (Clauses)

ClauseExempleDescription
WHERE
SELECT * FROM users WHERE age >= 18;
Filtre les résultats selon une condition.
AND / OR
SELECT * FROM users 
WHERE pays = 'Belgique' AND age > 20;
Combine plusieurs conditions.
LIKE
SELECT * FROM produits 
WHERE nom LIKE '%pomme%';
Recherche partielle. % est un joker (n'importe quelle chaîne de caractères).
ORDER BY
SELECT * FROM scores 
ORDER BY points DESC;
Trie les résultats. ASC (croissant, défaut) ou DESC (décroissant).
LIMIT
SELECT * FROM news 
ORDER BY date DESC LIMIT 5;
Limite le nombre de résultats retournés (ex: les 5 derniers articles).

Fonctions d'agrégation

FonctionExempleDescription
COUNT() SELECT COUNT(*) FROM eleves; Compte le nombre de lignes.
SUM() SELECT SUM(prix) FROM commandes; Calcule la somme d'une colonne numérique.
AVG() SELECT AVG(note) FROM bulletins; Calcule la moyenne d'une colonne.
MAX() / MIN() SELECT MAX(prix) FROM produits; Trouve la valeur la plus haute ou la plus basse.

Jointures (Joins)

Les jointures permettent de combiner les données de deux tables liées par une clé étrangère.

TypeSyntaxeRésultat
INNER JOIN
SELECT users.nom, commandes.date 
FROM users 
INNER JOIN commandes ON users.id = commandes.user_id;
Retourne les lignes uniquement s'il y a une correspondance dans les deux tables (ex: utilisateurs QUI ont passé une commande).
LEFT JOIN
SELECT users.nom, commandes.date 
FROM users 
LEFT JOIN commandes ON users.id = commandes.user_id;
Retourne toutes les lignes de la table de gauche (users), même s'il n'y a pas de correspondance à droite (commandes). Utile pour trouver les utilisateurs SANS commande.

Intégration PHP avec PDO

PDO (PHP Data Objects) est l'interface standard pour accéder aux bases de données en PHP. Elle est sécurisée et orientée objet.

1. Connexion à la base de données (DB)

try {
    // DSN (Data Source Name), Username, Password
    $pdo = new PDO('mysql:host=localhost;dbname=mon_site;charset=utf8', 'root', 'root');
    
    // Activer les erreurs PDO (important pour le débug)
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // Récupérer les résultats sous forme de tableau associatif par défaut
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

} catch (Exception $e) {
    die('Erreur de connexion : ' . $e->getMessage());
}

2. Requêtes simples (sans variables) - query()

À utiliser uniquement quand il n'y a aucune variable externe dans la requête.

$sql = "SELECT * FROM produits ORDER BY prix ASC";
$stmt = $pdo->query($sql);

// Récupérer tous les résultats
$produits = $stmt->fetchAll(); 

foreach ($produits as $prod) {
    echo $prod['nom'] . "<br>";
}

3. Requêtes préparées (avec variables) - prepare() & execute()

Indispensable pour la sécurité (protection contre les injections SQL) dès qu'on utilise des données utilisateur ($_POST, $_GET).

ActionExemple de code
Lecture sécurisée
$id = $_GET['id'];

// 1. Préparer (avec un marqueur :id)
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");

// 2. Exécuter (en passant le tableau de valeurs)
$stmt->execute(['id' => $id]);

// 3. Récupérer le résultat (fetch pour une seule ligne)
$user = $stmt->fetch();

if ($user) {
    echo "Bonjour " . $user['nom'];
}
Ecriture sécurisée
$nom = $_POST['nom'];
$email = $_POST['email'];

// 1. Préparer
$sql = "INSERT INTO users (nom, email) VALUES (:nom, :email)";
$stmt = $pdo->prepare($sql);

// 2. Exécuter
$stmt->execute([
    'nom' => $nom,
    'email' => $email
]);

echo "Utilisateur ajouté !";