Un objet en sortie d’une requête Mysql

Publié dans PHP objet | Marqué avec , ,
Share

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 😀

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*