info:bdd:sqlphp

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
info:bdd:sqlphp [2021/08/10 11:05] – [Cas 2] philinfo:bdd:sqlphp [2021/08/11 12:10] (Version actuelle) phil
Ligne 1: Ligne 1:
 +[[info:bdd:accueilbdd|{{ :iconemaison.jpg?nolink&25|Sommaire Bdd}}]]
  
 +===== BDD - MySQL et PHP =====
 +
 +[Mise à jour le 10/8/2021]
 +
 +** Sources **
 +  * Documentation de référence sur <html><a href="https://www.php.net/manual/fr/intro.pdo.php" target="_blank">php.net</a></html>
 +  * Tutoriel sur le site **Openclassrooms** : <html><a href="https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/914293-lisez-des-donnees" target="_blank">Concevez votre site web avec PHP et MySQL</a></html>
 +
 +**Mots-clés** : SGBD, base, table, enregistrement, champ, requêtes, SQL.
 +
 +----
 +
 +{{ :web:219973.png?nolink&350|}}
 +==== 1. Introduction ====
 +En PHP, on se connecte à une base de données avec les méthodes suivantes:
 +  - Avec l'extension mysqli_ (modèle procédural lié à MySQL)
 +  - Avec l'extension **PDO** (modèle objet) : à privilégier, car plus moderne et permet l'accès à divers types de BDD (**SQLite**,** MySQL**, etc.) avec la même syntaxe.
 +
 +**PDO** (**PHP** **D**ata **O**Bjects) comprend trois classes :
 +  * //PDO// pour créer des objets de connexion à la base disposant de méthodes pour l'envoi de requêtes, etc.
 +  * //PDOStatement// permettant de gérer des requêtes préparées et des résultats de requête.
 +  * //PDOException// qui permet de gérer et d'afficher des informations sur les erreurs.
 +
 +** Extrait de la table //jeux_video// de la base //test// utilisée dans les exemples **
 +{{ :web:extable.png?nolink |}}
 +
 +<note tip>On utilise le SGBD MySQL pour les exemples de la base //test//. La table jeux_video peut être téléchargé [[https://webge.fr/doc/wikis/code/web/WEB_TABLE_MSQL_jeux_video.zip|ici]].</note>
 +
 +==== 2. Accès à une base de données MySQL avec PHP ====
 + L'exploitation d'une base de données se fait à travers les actions suivantes :
 +  - **Connexion** à la base
 +  - **Envoi** de requêtes au serveur
 +  - **Traitement** du résultat des requêtes
 +  - **Fermeture** de la connexion
 +\\
 +=== 2.1 Connexion à la base ===
 +{{ :web:cobjetbdd.png?nolink&100|}}
 +
 +<note>La connexion à la base se fait **une seule fois** en créant un **objet** de la classe PDO.</note>
 +
 +  * //Syntaxe// \\ nomConnect = **new PDO**('mysql:host=**$host** dbname=**$base**',user,pass); \\
 +
 +<note>L'objet //$<nomConnect>// représente la connexion au serveur. Il est utilisé pour toutes les opérations à effectuer sur la base.</note>
 +
 +  * //Exemple 1 // : Connexion à la base //test// avec le login //root//, sans mot de passe et sans la gestion des erreurs
 +
 +<code php *.php>
 +$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', ''); 
 +</code>
 +
 +  * //Exemple 2// : Même connexion avec la gestion des d'erreurs
 +<code php *.php>
 +try
 +{
 + $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
 +}
 +catch (Exception $e)
 +{
 +        die('Erreur : ' . $e->getMessage()); // En cas d'erreur, on affiche un message et on arrête tout
 +}
 +</code>
 +
 +=== 2.2 Envoi d'une requête ===
 +<note>L'information liée au bon fonctionnement de la requête ou son résultat sont placés dans une variable pour être traités.</note>
 +
 +**Cas 1** - Si la requête **ne retourne pas de résultat** (INSERT, UPDATE, DELETE, etc.), on utilise la méthode //exec()//.
 +
 +  * //Syntaxe// \\ //integer// nomConnect **->** exec(//string// requete) \\ nomvar = nomConnect **->** exec(//string// requete)
 +
 +<note>**exec()** retourne un entier contenant le nombre de lignes concernées par la requête.</note>
 +
 +  * //Exemple// : modification du possesseur de  la console NES identifiée par ID=1 (Initialement Florent)
 +<code php *.php>
 +$nb=$bdd->exec('UPDATE jeux_video SET possesseur="Laurent" WHERE ID="1"');
 +</code>
 +  * //Résultat//
 +{{ :web:ex2table.png?nolink |}}
 +
 +**Cas 2** - Si la requête **retourne un résultat** (SELECT, etc.), on utilise la méthode //query()//.
 +
 +  * //Syntaxe// \\ //object// nomConnect **->** query(//string// requete) \\ nomResultat = nomConnect **->** query(//string// requete) 
 +
 +<note>Retourne FALSE en cas d'erreur ou un objet représentant l'ensemble des lignes de résultat.</note>
 +
 +  * //Exemple// : //reponse// reçoit le résultat de la requête 
 +<code php *.php>
 +$reponse = $bdd->query('SELECT * FROM jeux_video WHERE console="NES"');
 +</code>
 +
 +  * //Résultats // issus du traitement décrit au paragraphe suivant
 +    * Super Mario Bros - Laurent - 4
 +    * The Rocketeer - Michel - 2
 +    * Ice Hockey - Michel - 7
 +\\
 +=== 2.3 Traitement du résultat de la requête ===
 +  * **Insertion, suppression, mise à jour**
 +<note>Pour les opérations d'insertion, de suppression ou de mise à jour des données dans une base, il est utile de vérifier si la requête a bien été exécutée.</note>
 +
 +<code php *.php>
 +echo "<p> $nb ligne(s) modifiée(s) </p>"; // Résultat : 1 ligne(s) modifiée(s)
 +</code>
 +
 +$nb contient le nombre de lignes modifiées dans l'exemple de cas 1 précédent. Cette valeur pourra être testée pour valider la requête. \\
 +\\
 +  * **Résultat d'une commande SELECT**
 +<note>Lorsqu'il s'agit de lire le résultat d'une requête contenant la commande //SELECT//, la méthode //query()// retourne un objet de type //PDOStatement// ($reponse dans les exemples). La classe //PDOStatement// dispose de méthodes permettant de récupérer des données. La méthode des objets //PDOStatement// couramment utilisée pour lire des données est //**fetch**()//.</note> 
 +
 +  * //Syntaxe// \\ //array// nomResultat **->** fetch(//integer// type); \\ \\ Cette méthode retourne un tableau  :
 +    * pouvant être indicé si type = PDO::FETCH_NUM
 +    * dont les clés sont les noms des colonnes de la table interrogée si type = PDO::FETCH_ASSOC
 +    * dont les clés sont mixtes si type = PDO::FETCH_BOTH \\ 
 +\\ Pour lire toutes les lignes du résultat, il faut créer une boucle while qui lit chaque ligne.
 +  * //Exemple//
 +<code php *.php>
 +while ($donnees = $reponse->fetch()) {
 +    echo '<p>' . $donnees['nom'].' - '.$donnees['possesseur'].' - '.$donnees['prix'].'</p>';
 +}
 +</code>
 +    * //Résultats// 
 +      * Super Mario Bros - Laurent - 4
 +      * The Rocketeer - Michel - 2
 +      * Ice Hockey - Michel - 7
 +
 +=== 2.4 Fermeture de la connexion ===
 +<note>Pour clore la connexion, il suffit de détruire l'objet en assignant NULL à la variable qui le gère. Si ce n'est pas fait explicitement, PHP fermera automatiquement la connexion lorsque le script arrivera à la fin.</note>
 +
 +  * //Exemple//
 +<code php *.php>
 +$bdd=null;
 +</code>
 +
 +==== Résumé ====
 +  * Pour dialoguer avec MySQL depuis PHP, on fait appel à l'extension PDO de PHP.
 +  * Avant de dialoguer avec MySQL, il faut s'y connecter. On a besoin de l'adresse IP de la machine où se trouve MySQL, du nom de la base de données ainsi que d'un login et d'un mot de passe.
 +  * Il faut faire une boucle en PHP pour récupérer ligne par ligne les données renvoyées par MySQL.