Jump to content

PDO

From DevNotes

En PHP, la méthode moderne et recommandée pour communiquer avec MySQL/MariaDB est PDO. Évite les anciennes fonctions mysql_* : elles ont été supprimées depuis PHP 7.

Le principe est : PHP → PDO → MySQL/MariaDB

1. Se connecter à MySQL

[edit | edit source]
<?php

$host = 'localhost';
$db   = 'ma_base';
$user = 'mon_utilisateur';
$pass = 'mon_mot_de_passe';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";

try {
    $pdo = new PDO($dsn, $user, $pass);

    // Affiche les erreurs SQL sous forme d'exceptions
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "Connexion réussie !";

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

En pratique, mets cette connexion dans un fichier séparé, par exemple database.php :

<?php

$dsn = 'mysql:host=localhost;dbname=ma_base;charset=utf8mb4';
$user = 'mon_utilisateur';
$pass = 'mon_mot_de_passe';

try {
    $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);
} catch (PDOException $e) {
    die('Erreur de connexion à la base de données.');
}

Puis dans tes autres fichiers :

require_once 'database.php';

2. Lire des données

[edit | edit source]

Imaginons cette table :

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(255)
);

Pour récupérer tous les utilisateurs :

$stmt = $pdo->query('SELECT * FROM users');

$users = $stmt->fetchAll();

foreach ($users as $user) {
    echo $user['name'] . '<br>';
}

Comme PDO::FETCH_ASSOC est configuré dans notre connexion, chaque utilisateur est un tableau associatif :

$user['id'];
$user['name'];
$user['email'];

3. Chercher un utilisateur

[edit | edit source]

Supposons que tu veuilles récupérer l'utilisateur dont l'ID est 5.

Ne fais pas ça :

$id = $_GET['id'];

$stmt = $pdo->query("SELECT * FROM users WHERE id = $id");

C'est une mauvaise pratique et peut mener à une injection SQL.

Utilise une requête préparée :

$id = $_GET['id'];

$stmt = $pdo->prepare(
    'SELECT * FROM users WHERE id = :id'
);

$stmt->execute([
    'id' => $id
]);

$user = $stmt->fetch();

Puis :

if ($user) {
    echo $user['name'];
} else {
    echo 'Utilisateur introuvable';
}

4. Insérer des données

[edit | edit source]
$name = 'Antoine';
$email = 'antoine@example.com';

$stmt = $pdo->prepare(
    'INSERT INTO users (name, email)
     VALUES (:name, :email)'
);

$stmt->execute([
    'name' => $name,
    'email' => $email
]);

Tu peux récupérer l'ID créé :

$id = $pdo->lastInsertId();

echo "Nouvel utilisateur : $id";

5. Modifier des données

[edit | edit source]
$id = 5;
$name = 'Nouveau nom';

$stmt = $pdo->prepare(
    'UPDATE users
     SET name = :name
     WHERE id = :id'
);

$stmt->execute([
    'name' => $name,
    'id' => $id
]);

6. Supprimer des données

[edit | edit source]
$id = 5;

$stmt = $pdo->prepare(
    'DELETE FROM users
     WHERE id = :id'
);

$stmt->execute([
    'id' => $id
]);

7. Exemple complet

[edit | edit source]

Une page PHP qui affiche les utilisateurs et permet d'en ajouter pourrait ressembler à :

<?php

require_once 'database.php';

// Ajout
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    $name = $_POST['name'];
    $email = $_POST['email'];

    $stmt = $pdo->prepare(
        'INSERT INTO users (name, email)
         VALUES (:name, :email)'
    );

    $stmt->execute([
        'name' => $name,
        'email' => $email
    ]);
}

// Récupération
$stmt = $pdo->query('SELECT * FROM users ORDER BY id DESC');
$users = $stmt->fetchAll();

?>

<form method="POST">
    <input name="name" placeholder="Nom">
    <input name="email" type="email" placeholder="Email">
    <button type="submit">Ajouter</button>
</form>

<hr>

<?php foreach ($users as $user): ?>

    <p>
        <?= htmlspecialchars($user['name']) ?>
        —
        <?= htmlspecialchars($user['email']) ?>
    </p>

<?php endforeach; ?>

Le htmlspecialchars() est important ici : les données venant de la base ne doivent pas être injectées directement dans du HTML.

Le modèle mental à retenir

[edit | edit source]

Pour quasiment toutes tes applications PHP/MySQL :

// 1. Connexion
require_once 'database.php';

// 2. Préparer
$stmt = $pdo->prepare('SELECT ... WHERE ...');

// 3. Envoyer les paramètres
$stmt->execute([...]);

// 4. Récupérer
$data = $stmt->fetch();
// ou
$data = $stmt->fetchAll();

Et pour les modifications :

INSERT → ajouter
SELECT → lire
UPDATE → modifier
DELETE → supprimer

C'est le fameux CRUD : Create, Read, Update, Delete.