Choisir entre les deux fonctions PHP mysql_fetch_row() et mysql_fetch_array() peut sembler anodin, mais c'est une question souvent posée et qui a déjà donné lieu à de nombreux débats.
A première vue les descriptions de la documentation PHP peuvent indiquer une piste :
- mysql_fetch_array : Retourne une ligne de résultat MySQL sous la forme d'un tableau associatif, d'un tableau indexé, ou les deux
- mysql_fetch_row : Retourne une ligne de résultat MySQL sous la forme d'un tableau
On peut constater que la première méthode nécessite plus de traitement car elle renvoie un tableau associatif, c'est à dire en utilisant les noms des champs comme indices. Généralement on peut apercevoir ceci :
$result=mysql_query('SELECT nom_du_champ1,nom_du_champ2 FROM table');
while($array=mysql_fetch_array($result)) {
/* utilisation de $array['nom_du_champ1']... ; */
}
Déjà, le fait d'associer les noms des champs dans le tableau nécessite un investissement en ressources plus important. Des indices sous forme de chaînes de caractères seront plus longs à traiter que des simples valeurs numériques.
La seconde méthode est donc plus légère. Principalement car elle ne retourne qu'un tableau indexé numériquement. Mais comment l'utiliser de la meilleure manière ? L'inconvénient est de devoir s'y retrouver entre cette indexation numérique et les noms habituels des champs, spécialement lorsque la structure de la table peut changer au cours du temps (ajout, modification ou suppression de champs). Néanmoins on peut contourner cette limitation de deux façons :
- Pour s'affranchir d'une potentielle modification des champs, de leur ordre dans la table : spécifier clairement dans la requête (ici SELECT) les champs à prendre en compte. Au-delà de l'aspect pratique cela est conseillé pour obtenir de meilleures performances, surtout lorsque la table contient beaucoup de champs différents qui ne seront pas forcément utiles.
- Pour s'affranchir du nom des colonnes : utiliser l'élément de langage list() qui permet de rassembler les variables sous forme de tableau, pour les assigner en une seule ligne.
$result=mysql_query('SELECT nom_du_champ1,nom_du_champ2 FROM table');
while(list($champ1,$champ2)=mysql_fetch_array($result)) {
/* utilisation de $champ1, $champ2... ; */
}
Pourtant, il est précisé dans la doc que :
Il est important de souligner que mysql_fetch_array() n'est PAS significativement plus lente que mysql_fetch_row(), tandis qu'elle ajoute un confort d'utilisation important.
A cela il faut rajouter que 3 cas de figure se présentent alors, avec l'ajout de la fonction mysql_fetch_assoc(), classés du plus rapide au plus lent :
- mysql_fetch_row() : tableau d'indices numériques ($array[1])
- mysql_fetch_assoc() : tableau associatif ($array['nom_du_champ'])
- mysql_fetch_array() : tableau d'indices numériques + tableau associatif
En gros, mysql_fetch_array effectue le travail des deux premières simultanément. Donc tant qu'à choisir, autant le faire entre row et assoc. Il existe de surcroît deux outsiders :
Là encore il s'agit d'une optimisation au niveau atomique. Il est inutile de reprendre tous vos scripts pour remplacer l'une ou l'autre fonction. Rien n'empêchera la totalité de la boucle de prendre du temps si la requête est mal constituée. Ceci fera l'objet d'un prochain sujet de discussion :)