mysql_fetch_row vs mysql_fetch_array
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 :
- mysql_result() qui ne retourne qu'un champ.
- mysql_fetch_object() qui est nettement plus lent que les autres car la structure renvoyée possède celle d'un objet.
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 :)
11 septembre 2004 à 18:54
Coucou,
personnellement, je n’ai toujours utilisé que mysql_result()… même dans les boucles (je vous vois dire oh!). Et comme je souhaite améliorer mon niveau PHP, je me suis posé la question de savoir s’il vallait mieux utiliser d’autre fonctions MySQL comme mysql_fetch_array().
Votre article est très interessant mais ne donne pas d’informations concernant la vitesse de mysql_result() (qui serait p-e plus rapide)
Sinon, juste pour noter que dans la doc PHP, il est précisé :
"Concernant la vitesse, mysql_fetch_object() est aussi rapide que mysql_fetch_array() et presque aussi rapide que mysql_fetch_row() (la différence est insignifiante). "
Voilà,
Si vous pouvez m’éclaircir ne serait-ce qu’un peu, ça serait déjà bcp ^^
a+, Thomas
17 septembre 2004 à 22:01
mysql_result sera toujours plus lent car il ne permet d’accéder qu’à un seul champ à la fois.
lorsqu’il s’agit d’un seul résultat la différence peut paraître minime, mais dans 99% des cas l’exploitation d’une requête se fait sur plusieurs champs de plusieurs enregistrements, dans une boucle.
ce qui implique que mysql_fetch_row sera préférable car elle traite « par lot » les informations.
28 novembre 2004 à 16:48
Il est super cool comme article! Moi j’utilise "mysql_fetch_row" sans jamais savoir pourquoi lui, question d’habitude peut-être….. Mais maintenant je sais que mysql_fetch_row est plus rapide lorsqu’on doit extraire des informations dans plus d’un champ :)
A+
11 juin 2005 à 14:56
Bonjour, ça va vous parraître stupide, mais je vais citer la documentation officièlle de PHP :
" 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. "
Ceci étant principalement dû à l’utilisation d’une seule structure de donnée particulière et adapté à la structure de la réponse du SGBD.
Voilà pour mes 2 centimes.. bye
11 août 2005 à 16:28
Bon ben d’abord, merci beaucoup pour ce petit article super intéressant.
J’aimerais juste vous faire part de quelques remarques qui me sont venues à l’esprit :
imaginons une base, assez grosse et qui évolue. Imaginons que nous tenons à insérer un nouveau champ dans une de nos table et que, pour des soucis de propreté, nous ne désirons pas l’insérer à la fin de la table mais entre deux champs…
Que deviennent nos résultats de "SELECT *" traités avec un mysql_fetch_row ?
…
Je vous laisse réfléchir à ces inconvénients…
Bien sûr, on peut arriver au même inconvénient s’il nous vient l’idée de renommer un champ de notre table… que deviennent nos appels à mysql_fetch_assoc ?
Il me semble qu’un rechercher remplacer sur un [‘mon_champ’] marchera toujours mieux qu’un rechercher/remplacer sur [x]…
Bref tout ça pour dire que je préfère de loin mysql_fetch_assoc .
17 août 2005 à 15:08
Pour ma part, je suis plustot POO (programation orienté objet), et une fois qu’on connait à peu pres bien le sujet, mysql_fetch_object() fournit un résultat très explicite..
exemple très simple:
Liste des membres<br />
<?PHP
$query = "SELECT nom,prenom FROM ‘membre’";
$result = mysql_query($query);
while($membre=mysql_fetch_object($result)) {
$nom=$membre -> nom;
$prenom=$membre -> prenom;
echo $prenom.’ ‘.$nom.'<br />’;
}
?>
5 avril 2006 à 12:59
Voilà…
Ca marche pour toi "Astikoo" ?
Si besoin d’aide, contact-moi…
4 décembre 2009 à 14:57
piranha je susi dsl mais je piege pas sa :) merci
$nom=$membre -> nom;
$prenom=$membre -> prenom;