web 2.0

Seebz.net

Créer un compteur de requêtes SQL

Les requêtes SQL nécessitant souvent plus de ressources, il est parfois nécessaire de connaitre le nombre de requêtes effectuées lors de l'affichage d'une page.
Nous allons voir ici une méthode pour y arriver.

Comme nous ne pouvons pas directement compter le nombre de requêtes, nous allons devoir le faire d'une façon détournée.

L'idée ici est d'appeller une fonction 'intermédiaire' afin de faire nos requêtes.

Au lieu d'appeller directement la fonction mysql_query() qui effectue la requête, nous devrons appeller une autre fonction qui fera à la fois la requête en question et incrémentera le compteur.

Mais alors, je devrais changer du code dans mes pages ?

Hélas oui, c'est le prix à payer mais cela devrait se faire facilement à l'aide de outils de 'remplacement' fourni avec les éditeurs de texte.

La fonction mysql_query()

Cette fonction fonctionne de la manière suivante:
Elle nécessite la requête SQL en paramètre et retourne la ressource contenant le résultat.

$sql = 'SELECT * FROM une_table';
$resultat = mysql_query($sql);

Nous ne tiendrons pas compte ici du second paramètre de la fonction mysql_query() qui permet d'identifier quelle connexion à la Base de données utiliser.

Le principe

Comme expliqué plus haut, nous n'appellerons plus directement la fonction mysql_query(), nous utiliserons une autre fonction que nous allons créer, je la nommerai db_query() (db pour DataBase).

Mais nous avons aussi besoin d'un compteur que l'on initialisera à zéro au debut de la page, pourquoi pas $query_count ?

Ainsi il ne restera plus qu'à incrémenter $query_count à chaque appel de db_query()

Notre fonction db_query()

Elle nécessite la requête en paramètre et retourne le résultat de cette requête.

function db_query($sql)
{
	return mysql_query($sql);
}

Nous devons aussi incrémenter le compteur, ça donnera donc :

function db_query($sql)
{
	global $query_count;
	$query_count++;
	return mysql_query($sql);
}

Utilisation

Il ne nous reste plus qu'à implémenter notre fonction sur nos pages.

// On initialise le compteur
$query_count = 0;


// On effectue diverses requêtes SQL
$sql = 'SELECT * FROM une_table';
$result = db_query($sql);

db_query("INSERT INTO une_table VALUES ('valeur')");


// On affiche le nombre de requêtes effectuées
echo $query_count;

Voilà, j'espère que ce petit article vous sera utile.

Partager : Share
 

4 Réponses à “Créer un compteur de requêtes SQL”

  1. Je l'aurais plutôt faite comme ça la fonction :

    <?php

    function dbQuery($query, &$resReq) {

    static $queriesCounter = 0;
    $queriesCounter++;

    $resReq = mysql_query($query);

    return $queriesCounter;

    }

    // Utilisation :

    $nombreRequetes = dbQuery('SELECT champ FROM table', $resultat);

    while($row = mysql_fetch_assoc($resultat)) {

    echo htmlspecialchars($row['champ']) ,'<br/>';
    }

    ?>

    La fonction retourne deux valeurs. Le second paramètre est passé par référence (grâce au & ) ce qui signifie que la variable est modifiée et reste utilisable. C'est comme une variable globale en fait.

    On déclare une variable locale statique. Cette variable appartient à la fonction et conserve sa valeur quelque soit l'utilisation de celle-ci. A chaque exécution de la requête on retourne la nouvelle valeur de la variable locale statique.

    L'utilisation du variable globale (déclarée global dans ta fonction) n'est pas une bonne pratique. En règle générale, une fonction devrait toujours n'avoir que des paramètres d'entrées et pas des variables qui sortent par magie de nulle part parcequ'on les déclare globales.

    ++

    ;)

    Hugo.

  2. Je te conseillerai même de rajouter un or die(mysql_error()) dans ta fonction ainsi tu serai sur de ne pas l'oublier.

    function db_query($sql) {
    global $query_count;
    $query_count++;
    return mysql_query($sql) or die(mysql_error());
    }

  3. Salut Hugo, merci pour ta participation, toujours très interressant ;)

    je vais étudier ca bien que je préfère que la fct retourne le résultat plutot que le compteur (mais c'est un avis perso bien sur :p)


    Jiraya sama: merci aussi de ta participation ^^ mais en production je préfère ne pas afficher les erreurs (au contraire je préfère encore les masquer avec @).
    Il n'y a rien de pire je trouve d'arriver sur un site et voir pleins de messages d'erreurs.

    Sympa le design de ton site, vraiment ;)

  4. @Jiraya sama :

    Surtout pas !!! Le or die() ne sert qu'à débugguer lorsque l'on est en développement. En production, il n'a pas lieu d'être. C'est une mauvaise pratique de l'utiliser. Malheureusement beaucoup trop de sites ne maîtrisant pas le sujet incite à l'utiliser...

    @Seebz :

    Même erreur... On n'utilise pas @ pour masquer les erreurs. L'arobase est le pire de tous les opérateurs PHP car il est excessivement gourmand en ressources car il revient à faire deux ini_set() à la suite. Chaque ini_set() est très lourd à traiter.

    Au final :

    - En développement -> configuration du serveur avec toutes les possibilités de débug (display_errors à On, log_errors à On, extension XDebug...)

    -> En développement : pas de @, pas de or die(), display_errors à Off mais log_errors à On

    ++

Poster un commentaire

Remonter