samedi 23 mars 2013

Envoyer des SELECT

Pour selectionner des enregistrements, nous utiliserons la méthode query($requete).
?
1
2
3
4
5
// On établis la connection
require_once('conf/connection.php');
 
// On envois la requète
$select = $connection->query("SELECT * FROM createurs");
La variable $select contiend maintenant le résultat de la requète, mais sous une forme un peu particulière : un PDOStatement. Vous pourrez allé consulter la documentation pour obtenir des informations complémentaires sur cette classe.
http://www.php.net/manual/fr/class.pdostatement.php : Documentation officiel pour PDOStatement
Cet objet contiend la réponse du serveur de données à la requète que nous lui avons envoyé. Cette objet va nous permettre de gérer l'affichage des données reçues, pour cela il existe plusieurs méthodes :

Avec setFetchMode / fetch

PDO nous offre la libertée d'utiliser la réponse au format que nous voulons, nous pouvons dire que nous voulons traiter les enregistrements reçus comme des tableaux, comme des objets typés, etc... Comme nous débutons, nous allons traiter les enregistrements comme des objets simples.
Donc juste après avoir envoyé la requète (ou avant peu importe), nous allons "configurer" notre objet PDOStatement pour qu'ils nous livre les enregistrements comme des objets :
?
1
2
// On indique que nous utiliserons les résultats en tant qu'objet
$select->setFetchMode(PDO::FETCH_OBJ);
Notre variables $select contiend maintenant un objet pour chaque enregistrement obtenu, pour traiter tous les résultats nous allons utilise la boucle TANT QUE (la boucle while) :
?
1
2
3
4
5
6
// Nous traitons les résultats en boucle
while( $enregistrement = $select->fetch() )
{
  // Affichage d'un des champs
  echo '<h1>', $enregistrement->nom, ' ', $enregistrement->prenom, '</h1>';
}
Normalement, vous verrez une liste de nom de personnes connues appraitre dans un titre H1...
Si la réponse ne contiens pas de résutats, $select->fetch() va retourner NULL/FALSE. (Et donc l'éxécution de la boucle sera interrompue).
Si vous faites une requète qui ne doit retourner qu'un seul enregistrement, vous n'avez pas besoin d'utiliser une boucle pour traiter les résultats, mais utilisez quand même une condition pour éviter un message d'erreur disgracieux au moment de l'affichage :
?
1
2
3
4
5
6
7
8
9
10
11
12
// Traitement d'un seul résultat
$enregistrement = $select->fetch();
 
// On test si la variable $enregistrement, au cas
// ou elle serait vide.
if( $enregistrement ) {
  echo '<h1>', $enregistrement->nom, ' ', $enregistrement->prenom, '</h1>';
}
// La requète n'a pas retournée de résultat
else {
  echo "Aucun résultat";
}

Méthode fetch(PDO::FETCH_OBJ)

Petite variante avec une ligne de moins, dans cette exemple, le format de récupération (Format Objet) est précisé au moment du fetch() :
?
1
2
3
4
5
6
7
8
// Nous traitons les résultats en boucle
// C'est lors de l'utilisation de fetch() que nous spécifions
// le format de récupération pour le traitement.
while( $enregistrement = $select->fetch(PDO::FETCH_OBJ) )
{
  // Affichage d'un des champs
  echo '<h1>', $enregistrement->nom, ' ', $enregistrement->prenom, '</h1>';
}

Méthode fetchAll

Cette méthode va convertir notre objet de résultats en un tableau d'objet, ensuite nous traitons le tableau comme un tableau classique, ce cas d'application est surtout utilisé pour traiter des listes de résultats (Lorsque l'on s'attend à plusieurs résultats) :
?
1
2
3
4
5
6
7
8
9
// On transforme les résultats en tableaux d'objet
$createurs = $select->fetchAll(PDO::FETCH_OBJ);
 
// On traite le tableau $créateur
while( $enregistrement = next($createurs) )
{
  // Affichage d'un des champs
  echo '<h1>', $enregistrement->nom, ' ', $enregistrement->prenom, '</h1>';
}
Je n'ai pas fait de test de performance sur ces différentes méthodes, pour ma part j'aime bien la dernière car cela me permet potentiellement de manipuler le tableau... Sinon j'utilise la précédente quand je n'attend qu'un seul résultat.

C'est quoi ces caractères bizarres ???

Si vous avez mis des caractères spéciaux dans l'une des données affichées, c'est le drame.
Rien ne sert de vérifier le format de document ça ne viens pas de lui :P (Mais faites le quand même ça ne coute rien).
En effet, lors d'un echange avec le serveur web, l'encodage de transmission n'est pas formement l'UTF8 !!!
Pour corriger/forcer ça nous avons 2 solutions :
  • Une solution standard mais pas très lisible
  • Une solution moins standard mais plus facile à lire.

Aucun commentaire:

Enregistrer un commentaire