Question

Utilise PHP / MySQL depuis un moment maintenant, et je me demande s'il existe des avantages spécifiques (performances ou autres) à utiliser mysql_fetch_object () vs mysql_fetch_assoc () / mysql_fetch_array () .

Était-ce utile?

La solution

Performance, peu importe ce que vous utilisez. La différence est que mysql_fetch_object renvoie l'objet:

while ($row = mysql_fetch_object($result)) {
    echo $row->user_id;
    echo $row->fullname;
}

mysql_fetch_assoc () retourne un tableau associatif:

while ($row = mysql_fetch_assoc($result)) {
    echo $row["userid"];
    echo $row["fullname"];
}

et mysql_fetch_array () renvoie le tableau:

while ($row = mysql_fetch_array($result)) {
    echo $row[0];
    echo $row[1] ;
}

Autres conseils

mysql_fetch_array rend votre code difficile à lire = un cauchemar de maintenance. Vous ne pouvez pas voir en un coup d'œil à quelles données votre objet traite. C'est un peu plus rapide, mais si cela est important pour vous, vous traitez tellement de données que PHP n'est probablement pas la bonne solution.

mysql_fetch_object présente certains inconvénients, en particulier si vous basez une couche de base de données dessus.

  • Les noms de colonne peuvent ne pas être des identifiants PHP valables, par exemple déduction fiscale ou user.id si votre pilote de base de données vous attribue le nom de colonne spécifié dans le question. Ensuite, vous devez commencer à utiliser {} partout.

  • Si vous souhaitez obtenir une colonne en fonction de son nom, vous devez également commencer à utiliser les propriétés de la variable $ row- > {$ nom_colonne} , tandis que la syntaxe du tableau $ row [$ nom_colonne]

  • Les constructeurs ne sont pas appelés, contrairement à ce que vous attendez si vous indiquez le nom de la classe.

  • Si vous ne spécifiez pas le nom de la classe, vous obtenez un stdClass , qui n'est de toute façon pas meilleur qu'un tableau.

mysql_fetch_assoc est le plus simple des trois, et j'aime bien la distinction que cela donne dans le code entre les objets et les lignes de résultats de la base de données ...

$object->property=$row['column1'];
$object->property=$row[$column_name];
foreach($row as $column_name=>$column_value){...}

Alors que de nombreux fans de la programmation orientée objet (et je suis un fan de la programmation ciblée) aiment l'idée de transformer tout en un objet, je pense que le tableau associatif est un meilleur modèle de ligne d'une base de données. objet, car dans mon esprit, un objet est un ensemble de propriétés avec des méthodes pour agir sur elles, alors que la ligne n'est que des données et devrait être traitée comme telle sans complication supplémentaire.

Il convient de garder à l’esprit: des tableaux peuvent facilement être ajoutés à une mémoire cache (eaccelerator, XCache, ..), alors que les objets ne le peuvent pas (ils doivent être sérialisés lors de leur stockage et désérialisés à chaque extraction!).

Vous pouvez utiliser des tableaux plutôt que des objets lorsque vous souhaitez ajouter la prise en charge du cache mémoire - mais vous devrez peut-être déjà modifier beaucoup de code, qui utilise les valeurs de retour de type d'objet précédemment utilisées.

La récupération d'un tableau avec mysql_fetch_array () vous permet de parcourir l'ensemble de résultats via une boucle foreach ou une boucle for. mysql_fetch_object () ne peut pas être parcouru par une boucle for.

Je ne suis pas sûr que cela compte beaucoup, je pensais juste que je le mentionnerais.

De plus, si vous souhaitez éventuellement appliquer Memcaching à vos résultats MySQL, vous pouvez opter pour les tableaux. Il semble plus sûr de stocker des types de tableaux plutôt que des résultats de types d'objets.

while ($Row = mysql_fetch_object($rs)) {
    // ...do stuff...
}

... c'est comme ça que je l'ai toujours fait. Je préfère utiliser des objets pour des collections de données plutôt que des tableaux, car il organise les données un peu mieux, et je sais que j'ai beaucoup moins de chances d'essayer d'ajouter des propriétés arbitraires à un objet que d'essayer d'ajouter un index. sur un tableau (les premières années, j’utilisais PHP, je pensais que vous ne pouviez pas simplement attribuer des propriétés arbitraires à un objet, il est donc fondamental de ne pas le faire).

Je pense que la différence entre toutes ces fonctions est insignifiante, surtout par rapport à la lisibilité du code.

Si ce genre d'optimisation vous préoccupe, utilisez mysql_fetch_row () . C'est le plus rapide car il n'utilise pas de tableaux associatifs (par exemple, $ row [2]), mais il est plus simple de casser votre code avec.

En termes de vitesse, mysql_fetch_object () est identique à mysql_fetch_array () et presque aussi rapide que mysql_fetch_row () .

De plus, avec mysql_fetch_object () , vous ne pourrez accéder aux données de champ que par leur nom.

Je vote contre mysql_fetch_array ()

Etant donné que vous récupérez les colonnes et les noms de colonnes indexés numériquement, cela crée un tableau deux fois plus grand. C'est bien si vous n'avez pas besoin de déboguer votre code et d'afficher son contenu. Mais pour le reste d'entre nous, il devient plus difficile de déboguer car vous devez parcourir deux fois plus de données dans un format étrange.

Je rencontre parfois un projet qui utilise cette fonction puis, lors du débogage, je pense que quelque chose a très mal tourné depuis que des colonnes numériques sont mélangées à mes données.

Donc, au nom de la santé mentale, veuillez ne pas utiliser cette fonction, cela rend la maintenance du code plus difficile

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top