Parfois, on peut être un peu mordu de PHP objet, et au lieu de vouloir un array associatif (le nom du champ comme clé : mysql_fetch_assoc
), ou un array indexé numériquement (un numéro comme clé : mysql_fetch_row
-> le plus rapide), on veut un objet « associatif » (le nom des champs comme attribut) grâce à mysql_fetch_object
. C’est tout aussi rapide que mysql_fetch_assoc
ou mysql_fetch_array
, un peu moins que mysql_fetch_row
(quand même) mais ça peut être utile.
Le manuel PHP nous dit : mysql_fetch_object()
retourne un tableau qui contient la ligne demandée dans le résultat result et déplace le pointeur de données interne d’un cran.
Voici un exemple d’utilisation (tiré du manuel PHP) avec matable(user_id, user_name, user_age) que voici :
user_id | user_name | user_age 1 Fylhan NULL 2 BN 18
<?php // Connexion à la BDD mysql_connect('serveur', 'utilisateur', 'mdp'); mysql_select_db('nombdd'); // Exécution de la requête $result = mysql_query('select * from matable'); if (mysql_num_rows($result) == 0) echo 'Aucun résultat.'; else { // Boucle sur les champs (chaque champ étant renvoyé en tant qu'objet) while ($row = mysql_fetch_object($result))) { echo $row->user_id.' '; echo $row->user_name.'<br />'; } } // Libération de la mémoire mysql_free_result($result);
Ceci renverra :
1 Fylhan 2 BN
Il est possible de préciser en second paramètre une classe résultat, et en troisième une liste de paramètre à fournir au constructeur.
<?php // Connexion à la BDD mysql_connect('localhost', 'root', 'mysql'); mysql_select_db('test'); // Création de la class résultat class User { var $user_id; var $user_name; var $user_age; function __construct($user_age) { $this->user_age = $user_age; } } // Exécution de la requête $result = mysql_query('select * from matable'); if (mysql_num_rows($result) == 0) echo 'Aucun résultat.'; else { // Boucle sur les champs (chaque champ étant renvoyé en tant qu'objet) while ($row = mysql_fetch_object($result, 'User', array('21'))) { echo $row->user_id.' '; echo $row->user_name.' '; echo $row->user_age.'<br />'; } } // Libération de la mémoire mysql_free_result($result);
Ceci affichera :
1 Fylhan 21 2 BN 21
Pour avoir une alternative à ce type de boucle, et simplement pour découvrir de nouvelles fonctions (qui fonctionneront aussi avec un mysql_fetch_asso/row/array) voici un dernier exemple :
<?php // Connexion à la BDD mysql_connect('serveur', 'utilisateur', 'mdp'); mysql_select_db('nombdd'); // Exécution de la requête $result = mysql_query('select * from matable'); if (mysql_num_rows($result) == 0) echo 'Aucun résultat.'; else { $n = mysql_num_rows($result); for ($i=0; $i<$n; $i++) { mysql_data_seek($result, $i); $row = mysql_fetch_object($result); echo 'i = '.$i.' : '.$row->user_id . ' ' . $row->user_name.'<br />'; } }
Et cet exemple affichera :
i = 0 : 1 Fylhan i = 1 : 2 BN
On l’aura compris, mysql_fetch_object est tout aussi facile à utiliser que ses équivalents procédurales, mais elle prend tout son sens lorsqu’on lui fournit une class en deuxième argument, voir des paramètres en troisième argument 😀