Rappel : si vous travaillez sur votre ordinateur personnel, vous devez avoir créer la base de données de test pour que les exemples puissent être utilisés.

La connexion à la base de données doit être faite dans chaque script qui va utiliser cette base. Il faut donc la centraliser dans une fonction placée dans une bibliothèque pour que toute modification en soit simplifiée. Les identifiants de connexion seront en effet différent selon que l'on est en phase de développement, sur notre serveur (personnelle ou de l'entreprise), ou en phase de production (le site est accessible depuis le Web et sur le serveur d'un hébergeur).

Pour faire correctement les choses il faut avoir 2 fichiers :

- un fichier avec les fonctions de gestion de la base,
- un fichier avec les paramètres de notre application (et en particulier les paramètres concernant la base de données).

Nous utiliserons notre bibliothèque (bib_fonctions.php) pour y mettre notre fonction de connexion, et un nouveau fichier (bib_params.php) pour y mettre les paramètres de notre application.

Contenu du fichier bib_params.php

    <?php
    //
    // Paramètres de l'application
    //
    /* Comme le fichier des paramètres doit être (normalement)
     * appelé par tous les scripts, nous pouvons y placer toutes
     * les initialisations qui devraient être faites.
     * Nous pourrions y mettre ob_start et session_start() par
     * exemple. Elles n'y sont pas pour que vous ne perdiez pas
     * de vue la bufferisation des sorties.
     */
    //ob_start();
    //session_start();

    /* Une des façons les plus simples de définir des paramètres
     * est de définir des constantes car elles sont "superglobales"
     */

    // Phase de développement (TRUE) ou de production (FALSE)
    // Permet d'afficher des messages de débuggage (TRUE)
    define('IS_DEV', TRUE);

    // Paramètres base de données
    define('BD_SERVEUR', 'localhost');
    define('BD_USER', 'tuto_user');
    define('BD_PASS', 'tuto_pass');
    define('BD_NOM', 'php_tuto');
    ?>

Nouvelles fonctions dans le fichier bib_fonctions.php

    //___________________________________________________________________
    /**
     * Connexion à une base de données MySQL.
     * En cas d'erreur de connexion le script est arrêté.
     *
     * @return resource	connecteur à la base de données
     */
    function bdConnecter() {
    	$bd = mysqli_connect(BD_SERVEUR, BD_USER, BD_PASS, BD_NOM);

    	if ($bd !== FALSE) {
    		// mysqli_set_charset() définit le jeu de caractères
    		// par défaut à utiliser lors de l'envoi de données
    		// depuis et vers le serveur de base de données.
            mysqli_set_charset($bd, 'latin1') or
            bdErreurExit('<h4>Erreur lors du chargement
    					  du jeu de caractères latin1</h4>');
    		return $bd;		// Sortie connexion OK
    	}

    	// Erreur de connexion
    	// Collecte des informations facilitant le debugage
    	$msg = '<h4>Erreur de connexion base MySQL</h4>'
    			.'<div style="margin: 20px auto; width: 350px;">'
    			.'BD_SERVEUR : '.BD_SERVEUR
    			.'<br>BD_USER : '.BD_USER
    			.'<br>BD_PASS : '.BD_PASS
    			.'<br>BD_NOM : '.BD_NOM
    			.'<p>Erreur MySQL numéro : '.mysqli_connect_errno($bd)
    			.'<br>'.mysqli_connect_error($bd)
    			.'</div>';

    	bdErreurExit($msg);
    }

    //___________________________________________________________________
    /**
     * Arrêt du script si erreur base de données.
     * La fonction arrête le script, avec affichage de message d'erreur
     * si on est en phase de développement.
     *
     * @param string	$msg	Message affiché ou stocké.
     */
    function bdErreurExit($msg) {
    	ob_end_clean();		// Supression de tout ce qui
    						// a pu être déja généré

    	// Si on est en phase de développement, on affiche le message
    	if (IS_DEV) {
    		htmlDebut('Erreur base de données');
    		echo $msg;
    		htmlFin();
    		exit();
    	}

    	// Si on est en phase de production on stocke les
    	// informations de débuggage dans un fichier d'erreurs
    	// et on affiche un message sibyllin.
    	$buffer = date('d/m/Y H:i:s')."\n$msg\n";
    	error_log($buffer, 3, 'erreurs_bd.txt');

    	htmlDebut('Maintenance en cours');
    	// Gros mensonge
    	echo 'Notre site est momentanément indisponible ',
    		'pour cause de maintenance. Merci de ré-essayer ',
    		'dans quelques instants.';
    	htmlFin();
    	exit();
    }

Notez :

- les appels des fonctions mysqli_connect_errno() et mysqli_connect_error() qui sont des fonctions spécialisées permettant de connaître respectivement le numéro et le message de l'erreur à l'origine de l'échec de la connexion. Ces fonctions fournissent des informations qu'il est essentiel de récupérer quand une connexion au serveur MySQL échoue.
- l'appel de la fonction mysqli_set_charset() qui définit le jeu de caractères par défaut à utiliser lors de l'envoi de données depuis et vers le serveur de base de données quand la connexion réussit;
- l'opérateur or, comme les autres opérateurs logiques and, && et || est un opérateur "paresseux", ce qui signifie que ces opérateurs n'évaluent pas leur deuxième opérande quand l'évaluation du premier opérande suffit pour connaître le résultat de l'opération logique. Donc:
  - quand mysqli_set_charset() renvoie TRUE, le résultat de l'opérateur logique or est alors forcément égal à TRUE (comme TRUE or X = TRUE quelque soit X); et donc la fonction bdErreurExit() n'est pas appelée;
  - quand mysqli_set_charset() renvoie FALSE, c'est à dire quand elle échoue, l'opérateur logique or a besoin d'évaluer son deuxième opérande pour connaître le résultat de l'opération logique, donc la fonction bdErreurExit() est appelée.
  - l'instruction

        mysqli_set_charset($bd, 'latin1') or
        bdErreurExit('<h4>Erreur lors du chargement du jeu de
                     caractères latin1</h4>');

    est donc strictement équivalente à :

        if (!mysqli_set_charset($bd, 'latin1')){
        	bdErreurExit('<h4>Erreur lors du chargement du jeu de
        	              caractères latin1</h4>');
        }

    La première instruction est simplement plus concise.

Résultat :

Exemple : bibliothèque
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Nombre de livres'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT count(*) FROM livres'; $r = mysqli_query($bd, $sql); //-- Traitement ------------------------------------- $enr = mysqli_fetch_row($r); echo 'Il y a ', $enr[0], ' livres dans notre base'; // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>

Si vous travailler sur votre ordinateur personnel vous pouvez arrêter le serveur MySQL (et laisser bien sûr le serveur apache) pour tester en simulant un serveur de bases de données en panne.