Auto_Increment
MySQL peut gérer la génération automatique d'index numérique. Ce sera par exemple le cas d'un identifiant numérique pour chaque ligne d'une table.
Dans le cas de notre table Auteur dont seul le nom est obligatoire :
// PDO $query = "INSERT INTO Auteur (Nom) values ('John Doe')"; try{ $result = $db_server->exec($query); echo "Identifiant : " . $db_server->lastInsertId(); } } catch(PDOException $e) { die("Accès au données échoué :" . $e->getMessage()); }
L'identifiant numérique est automatiquement incrémenté, sa valeur peut être récupérée grâce à la méthode lastInsertId
.
Il faut prévoir l'ordre d'insertion pour répondre aux contraintes (notamment si l'identifiant doit servir de clé étrangère dans une autre table).
Il faut utiliser les transactions pour prendre en compte les échecs éventuels et les accès concurrentiels.Injections SQL
Les injections SQL consistent à formater les données d'un formulaire par exemple de manière à contournerla requête imaginée initialement. Par exemple :
DELETE FROM Livre where isbn = '$toto';
Cette requête supprime normalement une ligne dans la table Livre mais si on forge la requête avec
rien' or '1'='1
, on obtient :
DELETE FROM Livre where isbn = 'rien' or '1'='1';
La dernière condition étant toujours vraie, on vide la table de son contenu. Vous trouverez ci-dessous une manière de vous en protéger.
Requêtes préparées
MySQL
La syntaxe SQL permettant de circonscrire les données passées à des variables spécifiques est la suivante :
PREPARE requete FROM "INSERT INTO Auteur (Nom, LieuNaissance) VALUES (?,?)"; SET @Nom = "John Doe", @LieuNaissance = "Caen"; EXECUTE requete USING @Nom, @LieuNaissance; DEALLOCATE PREPARE requete;
Vous pouvez exécuter plusieurs fois la requête préparée avec des valeurs différentes avant de la désallouer.
PDO
/** @var PDOStatement $query */ $query = $db_server->prepare("INSERT INTO Auteur (Nom, LieuNaissance) VALUES (?,?)"); /** @var bool $result */ $result = $query->execute(array("John Doe", "Caen"));