Afficher la pageAnciennes révisionsLiens de retourExporter en PDFHaut de page Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. [[info:bdd:accueilbdd|{{ :iconemaison.jpg?nolink&25|Sommaire Bdd}}]] ===== BDD - MySQL et PHP ===== [Mise à jour le 28/8/2024] ** 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 |}} <callout type="tip" title="jeux_video" icon="true">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]].</callout> ==== 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|}} <callout type="primary" title="Connexion" icon="true">La connexion à la base se fait **une seule fois** en créant un **objet** de la classe PDO.</callout> * //Syntaxe// \\ nomConnect = **new PDO**('mysql:host=**$host** dbname=**$base**',user,pass); \\ <callout type="default" title="Objet PDO" icon="true">L'objet //$<nomConnect>// représente la connexion au serveur. Il est utilisé pour toutes les opérations à effectuer sur la base.</callout> * //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 === <callout type="default" title="Variable" icon="true">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.</callout> **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) <callout type="primary" title="Requête" icon="true">**exec()** retourne un entier contenant le nombre de lignes concernées par la requête.</callout> * //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) <callout type="default" title="Erreur" icon="true">Retourne FALSE en cas d'erreur ou un objet représentant l'ensemble des lignes de résultat.</callout> * //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** <callout type="primary" title="Vérification" icon="true">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.</callout> <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** 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. <callout type="primary" title="SELECT" icon="true">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**()//.</callout> * //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 === <callout type="primary" title="NULL" icon="true">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.</callout> * //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. info/bdd/sqlphp.txt Dernière modification : 2024/08/28 17:17de phil