PHP : PDO Requêtes préparées



De nos jours, énormément de sites dynamiques utilisent une base de données SQL. Tout le monde sait que l’accès à une base de données prend un temps non négligeable dans le traitement d’un site web. De plus, pour ceux qui se sont déjà intéressé à la sécurité, vous avez sûrement remarqué la quantité énorme de failles qu’il peut exister entre un script et sa base de données.

Histoire

Histoire PDO signifie PHP Data Objects et a été introduit dans la version 5.1. C'est une couche d'abstraction d'accès aux données qui fournit une interface cohérente pour accéder à différents types de bases de données. Avant PDO, les développeurs utilisaient des extensions adaptées à chaque moteur de base de données, telles que mysql / mysqli (MySQL) ou pgsql (Postgres). L'extension mysql a été dépréciée en 5.5 et supprimée entièrement en version 7. L'extension mysqli (MySQL improved) est toujours supportée, mais de nombreux développeurs ont commencé à utiliser PDO car elle offre des avantages importants.



Principes

  • Le principe des requêtes préparées est, comme son nom l’indique, de préparer les requêtes pour ensuite les utiliser. Ainsi, au lieu de recalculer la requête à chaque fois qu’on lui envoi, la base de données va la calculer une seule fois. Les fois suivantes, la base de données n’aura qu’à les exécuter.
  • Le second principe des requêtes préparées c’est de ne plus traiter les données comme faisant partie de la requête mais vraiment comme des données. Lors de la préparation d’une requête la base de données crée en réalité des cases dans lesquelles elle va « binder » les valeurs qu’on lui donne. Il n’y a donc plus moyen de pirater une requête avec des valeurs frauduleuses.



Vérifiez si PDO est installé

Si vous utilisez une version récente de PHP, il est probable que PDO est déjà installé. L'extension doit être activée avec le pilote du moteur de base de données que vous utilisez.

php -i | grep PDO

Résultat:

PDO
PDO support => enabled
PDO drivers => mysql
PDO Driver for MySQL => enabled

 

Vous pouvez également exécuter le code suivant en PHP pour afficher les pilotes de base de données disponibles:

var_dump(PDO::getAvailableDrivers());



SELECT préparé

Exemple d’une requête de sélection simple :

SELECT label, description FROM books WHERE id = 1

Cette requête peut être découpée en deux parties : Une partie fixe et une partie variable. La partie fixe est celle que l’on va envoyer à la base de données pour préparer l’exécution. La partie variable est celle qui va changer en fonction du livre (book) qu’on veut charger. Il s’agit de 1 c’est cette valeur que nous allons « binder ».

$pdo = new PDO('mysql:host=127.0.0.1;dbname=nomdelabase', 'user', 'motdepasse');
$stmt = $pdo->prepare('SELECT label, description FROM books WHERE id = :id', PDO::PARAM_STR);
$stmt->bindValue(':id', 3, PDO::PARAM_INT);
$stmt->execute();

var_dump($stmt->fetch());



fetch vs fetchAll

fetch () récupérera la ligne suivante du résultat de la requête

$result = $sth->fetch(PDO::FETCH_ASSOC);

$result = $sth->fetch(PDO::FETCH_ASSOC);

 

fetchAll () récupérera toutes les lignes du résultat de la requête



Obtenir le nombre de lignes

Nous pouvons utiliser la méthode rowCount de l'instruction pour obtenir le nombre de lignes affectées par une requête. Notez que nous pouvons utiliser la méthode query à la place prepare / execute car nous ne transmettons aucune donnée d'entrée utilisateur.

$result = $db->query('SELECT * FROM books');
$count = $result->rowCount();



Obtenir le dernier identifiant d'insertion

$stmt = $db->prepare(' INSERT INTO books (label, description) VALUES ("Harry Potter", "Tome numéro 7 - Partie 2")');
$stmt->execute();
$id = $db->lastInsertId();



INSERT préparé

Exemple d’une requête :

INSERT INTO books (label, description) VALUES ("Harry Potter", "Tome numéro 7 - Partie 2")

Avec PDO :

$pdo = new PDO('mysql:host=127.0.0.1;dbname=nomdelabase', 'user', 'motdepasse');
$stmt = $pdo->prepare('INSERT INTO books (label, description) VALUES (:label, :description)');
$stmt->bindValue(':label', 'Harry Potter', PDO::PARAM_STR);
$stmt->bindValue(':description', 'Tome numéro 7 - Partie 2', PDO::PARAM_STR);
$stmt->execute();



UPDATE préparé

Exemple d’une requête :

UPDATE books SET description = "Tome numéro 8 - Voldemort le retour" WHERE id = 1

Avec PDO :

$pdo = new PDO('mysql:host=127.0.0.1;dbname=nomdelabase', 'user', 'motdepasse');
    $stmt = $pdo->prepare('UPDATE books SET description = :description WHERE id = :id');
    $stmt->bindValue(':description', 'Tome numéro 8 - Voldemort le retour', PDO::PARAM_STR);
    $stmt->bindValue(':id', 1, PDO::PARAM_INT);
    $stmt->execute();



DELETE préparé

Exemple d’une requête :

DELETE books WHERE id = 1

Avec PDO :

$pdo = new PDO('mysql:host=127.0.0.1;dbname=nomdelabase', 'user', 'motdepasse');
$stmt = $pdo->prepare('DELETE books WHERE id = :id');
$stmt->bindValue(':id', 1, PDO::PARAM_INT);
$stmt->execute();



Documentation officielle

http://php.net/manual/fr/book.pdo.php