Accéder à une base de données MySQL
Introduction
1. Vue d’ensemble
L’utilisation d’une base de données SQL est souvent indispensable pour mettre en place un site web dynamique. C’est en effet un moyen standardisé de stocker des données utiles pour le site :
-
Liste des utilisateurs avec leurs préférences
-
Catalogue de produits
-
Trace des transactions effectuées...
PHP propose un support natif pour un grand nombre de bases de données, parmi lesquelles MySQL, Oracle, Microsoft SQL Server, Informix, Sybase, SQLite. Par ailleurs, PHP supporte ODBC (Open DataBase Connectivity) et peut donc accéder à toute base de données supportant ODBC.
Dans cet ouvrage, nous étudierons l’accès à une base de données MySQL.
Typiquement, lors de l’utilisation d’une base de données, le script PHP aura besoin d’effectuer une ou plusieurs des tâches suivantes :
-
Se connecter et se déconnecter.
-
Lire des données (une ligne ou plusieurs lignes).
-
Mettre à jour des données (ajout, modification ou suppression).
Ces différentes tâches seront étudiées dans ce chapitre.
Pour les différents exemples, nous utiliserons la base de données eni créée dans le chapitre Introduction à MySQL. Pour obtenir les mêmes résultats que ceux présentés dans ce chapitre, vous devez récréer la base de données.
Exemple
[root@xampp ~]# mysql -u root < creer-base-eni.sql
2. Quelle extension utiliser pour accéder à MySQL ?
L’extension MySQLi (préfixe mysqli_) permet d’accéder à une base de données.
Nous présenterons aussi brièvement l’extension PHP Data Objects (PDO) qui définit une interface uniforme pour accéder aux bases de données en PHP....
Utilisation de l’extension MySQLi
1. Introduction
L’extension MySQLi peut être utilisée soit sous une forme procédurale, soit sous une forme objet.
Dans sa forme orientée objet, l’extension MySQLi propose trois classes principales :
mysqli |
Connexion entre PHP et MySQL. |
mysqli_stmt |
Requête préparée. |
mysqli_result |
Résultat de l’exécution d’une requête. |
Ces différentes classes proposent des méthodes qui permettent d’effectuer les différentes actions (exécution d’une requête, récupération du résultat, etc.).
Dans sa forme procédurale, l’extension MySQLi propose des fonctions qui permettent d’effectuer les mêmes actions. De façon transparente, plusieurs de ces fonctions retournent ou acceptent en paramètres des objets de type mysqli ou mysqli_result.
Dans cet ouvrage, nous présenterons uniquement la forme procédurale de l’extension MySQLi.
L’extension MySQLi permet d’utiliser les requêtes préparées.
Une requête préparée est une requête qui contient des paramètres matérialisés par un point d’interrogation (?).
Exemples
SELECT * FROM collection WHERE id = ?
INSERT INTO collection(nom,prix_ht) VALUES(?,?)
À l’inverse, une requête non préparée est une requête dans laquelle toutes les valeurs sont spécifiées.
Exemples
SELECT * FROM collection WHERE id = 1
INSERT INTO collection(nom,prix_ht) VALUES('Open IT',5.69)
Dans la suite de ce chapitre, nous présenterons comment exécuter des requêtes de lecture et de mise à jour, d’abord avec des requêtes non préparées (cf. dans cette section Utiliser des requêtes non préparées)...
PHP Data Objects (PDO)
PHP Data Objects (PDO) est une extension qui définit une interface uniforme pour accéder aux bases de données en PHP. L’accès à une base de données à travers PDO s’effectue par l’intermédiaire d’un driver qui expose les fonctionnalités de la base de données.
Il faut bien noter que PDO ne fournit pas une couche d’abstraction de la base de données mais une couche d’abstraction de l’accès aux bases de données. Les requêtes que vous écrivez doivent respecter la syntaxe de la base de données que vous utilisez ; PDO ne récrit pas les requêtes SQL et n’émule pas les fonctionnalités manquantes (à l’exception des requêtes paramétrées).
De nombreuses bases de données disposent d’un driver PDO parmi lesquelles MySQL, Oracle, Microsoft SQL Server et SQLite.
PDO est une extension orientée objet qui propose trois classes :
-
PDO : connexion entre PHP et la base de données,
-
PDOStatement : requête préparée, et, après exécution, résultat associé,
-
PDOException : exception levée par PDO.
Dans ce chapitre, nous présenterons cette extension par l’intermédiaire d’un simple exemple commenté :
<?php
// Définition des paramètres de connexion.
// La syntaxe de la source (Data Source Name ou DSN)
// est spécifique à chaque driver.
$source = 'mysql:host=localhost;dbname=eni';
$utilisateur = 'eniweb';
$mot_de_passe = 'web';
// Définition de deux requêtes de test.
// Noter que la requête d'insertion est paramétrée (c'est
// en fait la seule fonctionnalité...
Gestion des apostrophes dans le texte des requêtes
Dans le cas de l’utilisation de requêtes non préparées, un problème peut se poser si une chaîne de caractères littérale présente dans une requête contient une apostrophe.
Exemple (insertion dans une base de données MySQL d’une donnée qui contient une apostrophe)
<?php
// Désactiver le rapport d'erreur.
mysqli_report(MYSQLI_REPORT_OFF);
// Donnée qui pose problème (peut être saisie innocemment
// dans un formulaire).
$nom = "L'Atout Réussite";
$prix_ht = 10;
// Requête d'insertion.
$sql = "INSERT INTO collection(nom,prix_ht) " .
"VALUES('$nom',$prix_ht)";
echo $sql,'<br />';
// Exécution.
$db = mysqli_connect('localhost','eniweb','web','eni');
$requête = mysqli_query($db,$sql);
echo mysqli_error($db),'<br />';
$ok = mysqli_close($db);
?>
Résultat
INSERT INTO collection(nom,prix_ht) VALUES('L'Atout Réussite',10)
You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax
to use near 'Atout Réussite',10)' at line 1
En SQL, le délimiteur de chaîne de caractères est l’apostrophe : si une requête envoie la chaîne ’L’Atout Réussite’ à la base, cette dernière va interpréter ’L’ comme une chaîne et ne saura pas quoi faire du reste (Atout Réussite’).
Pour régler ce problème, il faut indiquer à la base que les apostrophes à l’intérieur...
Exemples d’intégration dans des formulaires
1. Vue d’ensemble
Pour terminer ce chapitre, nous allons présenter quelques exemples d’accès à une base de données MySQL à partir de formulaires.
Trois exemples sont proposés :
-
un formulaire qui permet de saisir des données dans une liste ;
-
un formulaire de recherche avec affichage du résultat ;
-
un formulaire de saisie de type "page".
Pour des raisons de concision, dans ces exemples, le contrôle de la saisie et la gestion d’erreur sont pratiquement absents, et la mise en forme est très simple.
2. Formulaire de saisie en liste
Présentation du formulaire
Le formulaire propose le contenu actuel de la table qui peut être modifié (saisie directe dans les zones) ou supprimé (par les cases à cocher), plus cinq lignes vides qui permettent de saisir de nouvelles valeurs. Dans tous les cas, l’identifiant ne peut pas être saisi, c’est le serveur MySQL qui va l’attribuer.
Chaque ligne du tableau contient quatre zones de formulaire qui sont nommées (attribut name de la balise <input>) de la manière suivante :
Colonne |
Nom |
Identifiant |
saisie[i][modifier] |
Nom |
saisie[i][nom] |
Prix H.T. |
saisie[i][prix_ht] |
Supprimer |
saisie[i][supprimer] |
L’indice i est l’identifiant de la collection pour les lignes qui existent et un numéro compris entre -1 et -5 pour les lignes vides. La zone de la colonne Identifiant est une zone masquée (type="hidden") qui va être employée pour identifier les lignes dans lesquelles l’utilisateur a effectué une modification.
Avec ce processus de nommage, toute la saisie est récupérée dans le script PHP sous la forme d’un tableau multidimensionnel. Chaque ligne du tableau correspond à une ligne du formulaire avec la clé...