Tutoriel PHP-MySQL : 2ème partie

Informations d'accès à la base de données

Nous avons vu dans la première partie du tutoriel qu'avant chaque accès aux données, nous devons nous authentifier. En effet, l'accès dépend d'un nom d'utilisateur et d'un mot de passe.

Pour éviter de spécifier à chaque fois ces données, nous pouvons les placer dans un fichier. Il suffit alors d'inclure ce fichier partout où nous en avons besoin.

Si nous changeons régulièrement de mot de passe, nous devons alors seulement le modifier dans ce fichier, et non plus partout où le mot de passe est utilisé.

  1. <?php
  2. //fichier scripts/variables.php
  3. //
  4. // nom du serveur qui supporte la db
  5. define('DB_SERVER', 'mysql5test');
  6. //
  7. // nom de la db
  8. define('DB_NAME', 'Infobrol');
  9. //
  10. //authentification
  11. define('DB_LOGIN', 'test');
  12. define('DB_PASSWORD', 'password');
  13. ?>

Emplacement des fichiers

Nous pouvons placer tous les fichiers comme celui-ci dans un sous-répertoire du site (dans cet exemple, le répertoire "scripts"). De cette manière, les seuls fichiers qui se trouvent à la racine du site sont des fichiers dont le contenu doit être affiché.

Il est même possible de placer vos fichiers de configuration dans une structure de répertoires parent de celui qui contient les pages de votre site (généralement le répertoire "www"). Ces fichiers de configuration ne sont donc plus accessibles de manière traditionnelle, ce qui renforce un peu la sécurité. Vous ne pouvez alors plus les appeler qu'au travers de vos include.

Inhaltsverzeichnis Haut

Connexion à la base de données

Comme nous avons créé un fichier avec les données nécessaires à la connexion vers la base de données [DB], nous allons simplement inclure ce fichier dans notre page.

Nous pouvons aussi tester si nous pouvons accéder à la DB. Si nous n'avons pas accès, nous stoppons immédiatement tout traitement grâce à l'instruction PHP die.

  1. // Debut de la page
  2. // …
  3. // Informations de connexion
  4. include('scripts/scripts/variables.php');
  5. // Tentative de connexion
  6. $db_connection = mysql_connect(DB_SERVER, DB_LOGIN, DB_PASSWORD);
  7. if(empty(self::$connection)){
  8. die('Connexion à la DB impossible');
  9. }
  10. // Selection de la base de donnees
  11. mysql_select_db('Infobrol');
  12. // Suite du code si la connexion est ok
  13. // …
  14. // Deconnexion de la base de donnees
  15. mysql_close($db_connection);

Ce type de gestion d'erreur est parfois trop "brutal", et nous pouvons éviter d'utiliser la fonction PHP die comme le montre l'exemple suivant :

  1. // Debut de la page
  2. // …
  3. include_once('scripts/scripts/variables.php');
  4. $db_connection = mysql_connect(DB_SERVER, DB_LOGIN, DB_PASSWORD);
  5. if(!empty(self::$connection)){
  6. // Suite du code si la connexion est ok
  7. mysql_select_db('Infobrol');
  8. // …
  9. mysql_close($db_connection);
  10. }else{
  11. echo 'Attention : impossible de se connecter à la DB.';
  12. }

Nous en avons aussi profité pour remplacer include par include_once qui évite d'inclure inutilement le fichier s'il est déjà inclus.

Depuis PHP 7, il n'est plus possible d'utiliser ces méthodes, et nous pouvons utiliser mysqli ou PDO_MySQL :

  1. // Debut de la page
  2. // …
  3. // Informations de connexion
  4. include_once('scripts/scripts/variables.php');
  5. //
  6. // Tentative de connexion et de selection de la base de donnees
  7. $mysqli = new mysqli(DB_SERVER, DB_LOGIN, DB_PASSWORD);
  8. // Gestion des erreurs de connexion
  9. if ($mysqli->connect_errno) {
  10. echo 'Echec lors de la connexion à MySQL : (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error;
  11. }

Cet exemple affiche un message avec l'erreur ; nous discuterons plus tard de l'impact sur la sécurité que représente le fait d'exposer de telles informations au visiteur.

Inhaltsverzeichnis Haut

Erreurs MySQL

Pour demander à PHP d'envoyer une requête SQL à MySQL, nous pouvons utiliser la fonction PHP mysql_query. Dans l'exemple suivant, nous avons une « requête » (en anglais, “query”) qui compte le nombre de mots définis dans notre dictionnaire, mais nous verrons par la suite comment écrire ces requêtes.

Lors de l'exécution de la requête SQL dans le serveur MySQL, nous pouvons aussi avoir des erreurs. Nous pouvons récupérer des informations sur ces erreurs grâce à la fonction PHP mysql_error.

  1. $errors=array();
  2. $query='SELECT COUNT(nom) AS nbr FROM dictionnaire';
  3. //suite du code…
  4. $resultat=@mysql_query($query) or $errors[]=mysql_error();

Le fait de placer le signe "@" devant l'instruction permet de lui signaler de ne pas traiter lui-même l'erreur (sinon il risque d'interrompre tout traitement), car nous nous en chargerons.

Nous ajoutons à la variable "error" (un tableau) l'erreur que la base de données nous envoie. Nous pourrons ensuite lui demander le texte correspondant, et d'autres informations.

  1. // Debut de la page
  2. // …
  3. // Informations de connexion
  4. include_once('scripts/scripts/variables.php');
  5. //
  6. // Tentative de connexion et de selection de la base de donnees
  7. $mysqli = new mysqli(DB_SERVER, DB_LOGIN, DB_PASSWORD);
  8. // Gestion des erreurs de connexion
  9. if ($mysqli->connect_errno) {
  10. echo 'Echec lors de la connexion à MySQL : (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error;
  11. }else{
  12. // creation de la requete
  13. $query='SELECT COUNT(nom) AS nbr FROM dictionnaire';
  14. // execution de la requete
  15. if ($result = $mysqli->query($query) ){
  16. // lire et traiter les resultats
  17. // …
  18. // liberer le resultat
  19. $result->close();
  20. }else{
  21. // gestion de l'erreur
  22. echo 'Echec lors de la requête MySQL : ' . $mysqli->error;
  23. }
  24. // liberer la connexion
  25. $mysqli->close();
  26. }

Inhaltsverzeichnis Haut

Encodage UTF8 de MySQL

Nous avons déclaré à la création de la base de données que nous utiliserons le français UTF-8.


Je préconise fortement d'utiliser UTF-8 partout (base de données encodée en UTF-8, déclarations de pages PHP en UTF-8, codage des pages PHP en UTF-8), ce qui évite tout problème par la suite entre les encodages UTF-8 et ISO-Latin1 (ISO-8859-1) pour les caractères accentués.

Nous pouvons utiliser la commande suivante afin d'éviter un mauvais affichage des caractères accentués :

  1. // avant PHP 5 :
  2. mysql_query("SET NAMES 'utf8'");
  3.  
  4. // depuis PHP 5 :
  5. $mysqli->set_charset("utf8");

Inhaltsverzeichnis Haut

Classe de gestion de la DB

Même si nous utilisons un include pour ne pas devoir spécifier à chaque fois les données nécessaires à la connexion, à chaque fois que nous utilisons la base de données dans nos pages nous devons effectuer les mêmes opérations de connexion et de déconnexion. L'infobrol utilise une classe PHP qui se charge d'effectuer les traitements nécessaires. Le gain d'une telle classe, en temps et facilité de maintenance, est très important.

Deutsche Übersetzung

Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.

Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.

Vielen Dank im Voraus.

Dokument erstellt 20/11/2003, zuletzt geändert 27/03/2020
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/php-mysql-tutorial.html

Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.

Aufzeichnungen
  1. a,b,c DataBase : entspricht « base de données » en français

  2. a,b,c DB : “DataBase” (en français, « base de données »)

  3.  requête : entspricht “query” en anglais

Inhaltsverzeichnis Haut