Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

PHP et MySQL

Par Quentin MICHALET Publié le 11/10/2016 à 20:56:24 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

Se connecter à une base de données en PHP

Presentation de PDO (PHP Data Object) :

Pour que PHP puisse utiliser une base de données, il faut d’abord qu’il s’y connecte. PHP est très modulaire et dispose de plusieurs extensions qui permettent de se connecter mais la plus intéressante est très certainement l’extension PDO car elle est compatible avec plusieurs bases de données (Oracle, MySQL, PostgreSQL…).

Normalement, l’extension PDO pour MySQL est activée par défaut dans WAMP. Pour s’en assurer, faite un clic gauche sur l’icône de wamp dans la barre de tache puis ’PHP’→’Extension PHP’. Vous devez obtenir la capture ci contre : Cocher l’extension ‘php_pdo_mysql’ si elle ne l’est pas.

PDO est une extension orientée objet. Nous avons déjà vu la programmation objet avec le C++ mais pas encore avec le PHP (nous l’aborderons plus tard) mais cela ne devrait pas nous empêcher de comprendre le fonctionnement de l’extension PDO. PDO dispose de 3 classes qui vont générer les objets qui nous permettrons d’utiliser la base de donnée.

Ces 3 classes sont :

- PDO qui correspond au lien entre PHP et la base de données.

- PDOstatement qui correspond aux résultats des requêtes.

- PDOException qui permet de traiter les erreurs.

Connexion à MySQL avec PDO :

Pour se connecter à une base de données via PDO, nous avons besoin de 3 paramètres :

- Le DSN (Data Source Name) : Le DSN est constitué de l’adresse du serveur sur lequel la base de données (mysql:host) et du nom de la base de données (dbname). La plupart du temps, la base de données est sur le même ordinateur que PHP, nous avons donc dans ce cas : mysql:host=localhost La base de données que nous utilisons depuis le début du cours s’appelle essai, donc dbname=essai Ainsi le DSN vaut : mysql :host=localhost ;dbname=essai

Code pour connecter la base de données à PHP :

Ce code instancie un objet $bdd de classe PDO qui représente la connexion entre PHP et MySQL. C’est cet objet qui nous servira à faire les manipulations sur la base de données.

Connexion avec traitement des erreurs :

Si un client essai de se connecter à une base de données et que la connexion échoue, PHP va afficher un message d’erreur ainsi que la ligne ou l’erreur s’est produite. Le client pourra alors y lire le mot de passe. Pour éviter cela, nous allons utiliser les exceptions.

Une exception est une erreur dans le déroulement du programme qui a été prévue lors de sa conception et qui est traitée de façon particulière. En cas d’erreur de connexion, PDO génère un objet de classe PDOException qui va nous permettre de traiter l’erreur. Code pour connecter la base de données avec traitement des erreurs :

Effectuer un requête SQL en PHP : méthodes exex() et query()

Nous avons vu que les SGBG (Système de Gestion de Bases de Données) utilisent le même langage: Le SQL. PHP manipulera donc les bases de données en effectuant des requêtes SQL.

Pour cela, nous allons utiliser 2 méthodes de l’objet de classe PDO que nous avons instancié lors de la connexion à la base de données :

- La méthode exec() : Elle est utilisée pour les requêtes qui modifient la base de données (ajout d’enregistrements, suppression d’enregistrements…).

- La méthode query() : Elle est utilisé pour les requêtes qui interrogent la base de données. Elle renvoie un objet de classe PDOstatement qui correspond au résultat de la requête.

Ainsi, en PHP, le code pour effectuer une requête SQL s’écrira :

Remarque : La méthode prepare() qui est aussi une méthode de la classe PDO qui permet d’effectuer des requêtes (mais ce sont des requêtes spéciales qui seront abordées par la suite).

Exemple 1 :

- Requête SQL :

SELECT * FROM bandes_dessinees ;

Exemple 2 :

- Requête SQL :

SELECT * FROM bandes_dessinees WHERE serie='Astérix’ ;

Exemple 3 :

Requête SQL:

DELETE FROM bandes_dessinees WHERE titre='Le lourd passé de Lagaffe'

Exploiter le résultat de la requête : méthode fetch()

Dans l’exemple précédent, l’objet $reponse (de classe PDOsatement) correspond au résultat de la requête. Cet objet dispose de la méthode fetch() qui permet de récupérer un par un les enregistrements correspondant à la requête.

La méthode flech() renvoie dans un array, l’enregistrement correspondant à la position d’un curseur puis place le curseur sur l’enregistrement suivant.

Lors du premier appel, le curseur est sur le premier enregistrement. La méthode renvoie FALSE si le curseur n’est plus sur un enregistrement.

Exemple 1 :

- Requête SQL:

SELECT numero,titre FROM bandes_dessinees;

- Code PHP :

Exemple 1 :

- Requête SQL:

SELECT numero,titre FROM bandes_dessinees;

- Code PHP :

Les requêtes préparées :

Les injections : SQL :

Une injection SQL est une attaque qui consiste à entrer des commandes SQL dans les champs prévus pour les utilisateurs (dans un formulaire par exemple) afin de tromper le programme et modifier le comportement de la requête. (Comme la faille XSS).

Exemple d’injection SQL :

- Soit ‘users’ une table contenant des informations sur des personnes. Cette table possède entre autres les champs ‘login’ et ‘password’.

- Pour pouvoir accéder à ses informations, un utilisateur doit s’identifier en fournissant via un formulaire (par la méthode POST) son login et son mot de passe.

- En théorie, l’utilisateur n’aura accès à ses données que s’il a correctement renseigné le login et le password.

Imaginons que l’on remplisse le login du formulaire comme suit :

A l’exécution, la requête devient :

- On peut se connecter sur le compte de l’utilisateur ‘dupont’ sans connaitre son mot de passe, en effet celui-ci se trouve dans la partie commentaire de la requête.

- L’une des solutions pour se prémunir contre les injections SQL sera l’utilisation de requêtes préparées que nous allons voir juste après.

Présentation des requêtes préparées : méthode prepare() :

- Nous avons vu que pour exécuter des requêtes SQL, on pouvait utiliser les méthodes :

- exec() si on veut modifier la base données.

- query() si on veut récupérer des informations de la base de données.

- Il existe une troisième méthode ; la méthode prepare() qui exécute des requêtes préparées.

- Comparaison entre une requête classique et une requête préparée : Lorsque l’on envoi une requête classique, elle est compilée dans son ensemble (mots clés + paramètres) puis elle est exécutée. Si je la relance plus tard elle sera à nouveau compilée (même si les paramètres sont identiques).

Dans une requête préparée, on compile un modèle de la requête que l’on stocke en mémoire. Ainsi lorsqu’on lance une requête préparée, on n’a plus qu’à faire appel au modèle déjà compilé en lui passant les paramètres de la requête.

- Avantage :

- Plus rapide si la requête doit être exécutée plusieurs fois, en effet la compilation n’a lieu qu’une seule fois.

- Plus sûr, les paramètres sont passés à un modèle déjà compilé donc plus de risque d’injection SQL.

Mode d’emploi d’une requête préparée :

On désire construire une requête qui ajoute l’enregistrement suivant dans la table ‘bandes_dessinees’ :

Requête SQL classique :

La requête SQL classique s’écrit :

INSERT INTO bandes_dessines (serie,editeur,numero,titre,dessinateur,scenariste) VALUES (‘ Astérix’,’ Dargaud ’,15,’La zizanie’,’Uderzo’,’Goscinny’)

La ligne de code PHP est :

Requête SQL préparée :

a) Modèle de la requête :

On écrit le modèle de la requête en remplaçant la partie variable de la requête par un marqueur qui peut être soit par un point d’interrogation soit par un paramètre nommé (nom commençant par : ).

OU

b) Préparation de la requête :

On utilise la méthode prepare() de l’objet représentant la connexion à la base de données. La méthode prepare() prend pour paramètre le modèle de la requête préparée et renvoi un objet de classe PDOstatement qui nous servira à exécuter la requête préparée.

OU

c) Exécution de la requête préparée :

On utilise la méthode execute() de l’objet renvoyé par la méthode prepare().

La méthode execute() prend pour paramètre un array qui contient la partie variable de la requête préparée. C’est une array numérique si la requête est écrite avec des points d’interrogations et un array associatif si elle est écrite avec des paramètres nommés.

OU

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels