L'extension PHP Data Objects (PDO) définit
une excellente interface pour accéder à une base de données depuis PHP.
Chaque pilote de base de données implémenté dans l'interface PDO peut utiliser
des fonctionnalités spécifiques de chacune des bases de données
en utilisant des extensions de fonctions. Notez que vous ne pouvez
exécuter aucune fonction de base de données en utilisant l'extension PDO
par elle-même ; vous devez utiliser un driver
PDO spécifique à la base de données pour accéder au serveur de base
de données.
PDO fournit une interface d'abstraction à l'accès de données, ce qui signifie que vous utilisez
les mêmes fonctions pour exécuter des requêtes ou récupérer les données quelque
soit la base de données utilisée. PDO ne fournit pas
une abstraction de base de données : il ne réécrit pas le SQL, n'émule pas des fonctionnalités
manquantes. Vous devriez utiliser une interface d'abstraction complète si vous avez
besoin de cela.
PDO est fournit avec PHP 5.1 et est disponible en tant qu'extension PECL pour PHP 5.0 ;
PDO requiert les nouvelles fonctionnalités OO fournies par PHP 5 et donc, ne fonctionne
pas avec les versions antérieures de PHP.
Si vous exécutez une version 5.1 de PHP, PDO et PDO_SQLITE sont inclus dans cette distribution ;
il devrait être automatiquement activé lorsque vous lancerez le script de configuration de PHP.
Il est recommandé de compiler PDO en tant qu'extension partagée, ce qui vous permettra
de mettre à jour PDO via PECL. Il est également recommandé d'activer le support zlib
(pour l'installeur PECL) lors de la compilation de PHP. Vous devriez également avoir besoin
d'activer le driver PDO correspondant à la base de données de votre choix ; consultez la
documentation pour les drivers PDO spécifiques à une base
de données pour plus d'informations, mais notez que si vous contruisez PDO
en tant qu'extension partagée, vous devez également construire les drivers PDO en tant qu'extensions
partagées.
L'extension SQLite dépend de PDO, donc, si PDO est construit en tant qu'extension partagée,
SQLite doit être construit de la même manière.
Après avoir installé PDO en tant que module partagé, vous devez éditer votre
fichier php.ini afin que l'extension PDO soit chargée automatiquement lorsque
PHP est lancé. Vous devez y activer également le driver spécifique à votre base
de données ; assurez-vous qu'ils sont listés après la ligne pdo.so, car PDO
doit être initialisé avant le chargement des extensions spécifiques à la base de données.
Si vous avez compilé PDO et les extensions spécifiques à la base de données statiquement,
vous pouvez sauter cette étape.
extension=pdo.so
Le fait d'avoir PDO en tant que module partagé vous permet d'exécuter
la commande pecl upgrade pdo pour mettre à jour
votre version de PDO sans pour autant avoir besoin de recompiler complètement PHP.
Notez que si vous faites cela, vous devez également mettre à jour votre driver PDO
spécifique à votre base de données en même temps.
PHP 5.0 et supérieur sur les systèmes Unix
PDO est disponible en tant qu'extension PECL depuis
http://pecl.php.net/package/pdo.
L'installation peut être faite via la commande pecl ;
ceci est activé par défaut lorsque vous configurez PHP. Vous devriez vous assurer
que PHP a été configuré avec --with-zlib pour pouvoir utiliser
la commande pecl afin de gérer les paquets compressés.
Exécutez la commande suivante pour télécharger, compiler et installer
la dernière version stable de PDO :
pecl install pdo
La commande pecl installe automatiquement
le module PDO dans votre dossier d'extensions PHP. Pour activer l'extension
PDO sous les systèmes Linux ou Unix, vous devez ajouter la ligne suivante
dans votre fichier php.ini :
extension=pdo.so
Pour plus d'informations sur la compilation de paquets PECL, consultez la section
sur l'installation de PECL du manuel.
Utilisateurs de Windows avec PHP 5.1 et supérieur
PDO ainsi que tous les drivers principaux interagissent avec PHP en tant
qu'extensions partagées, et ont tout simplement besoin d'être activés en
éditant le fichier php.ini :
extension=php_pdo.dll
Ensuite, choisissez les autres fichiers DLL spécifiques à votre base de données
et utilisez soit la fonction dl() pour les charger
au moment de l'exécution ou activer-les dans le fichier php.ini en dessous
de la ligne php_pdo.dll. Par exemple :
Ces bibliothèques DDLs doivent exister dans le dossier système
extension_dir.
Notez que PDO_INFORMIX est
seulement disponible en tant qu'extension PECL.
Les connexions sont établies en créant des instances de la classe de base de PDO.
Peut importe quel driver vous voulez utiliser ; vous utilisez toujours le nom
de la classe PDO. Le constructeur accepte des paramètres pour spécifier
la source de la base de données (connue en tant que DSN) et optionnellement,
le nom d'utilisateur et le mot de passe (s'il y en a un).
Exemple 1. Connexion à MySQL
<?php $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); ?>
S'il y a des erreurs de connexion, un objet PDOException
est lancé. Vous pouvez attraper cette exception si vous voulez gérer
cette erreur, ou laisser le gestionnaire global d'exception défini
via la fonction set_exception_handler() la traiter.
Si votre application n'attrape pas les exceptions lancées depuis le constructeur PDO,
l'action par défaut du moteur zend est de terminer le script et d'afficher une trace.
Cette trace devrait révéler des détails complets sur la connexion à la base de données,
incluant le nom d'utilisateur et le mot de passe. Il en est donc de votre responsabilité
d'attraper cette exception, soit explicitement (via l'instruction catch)
ou implicitement via la fonction set_exception_handler().
Lorsque la connexion à la base de données a réussi, une instance de la classe
PDO est retournée à votre script. La connexion est active tant que l'objet PDO
l'est. Pour clore la connexion, vous devez détruire l'objet en vous assurant que
toutes ses références sont effacées. Vous pouvez faire cela en assignant NULL
à la variable gérant l'objet. Si vous ne le faites pas explicitement, PHP fermera
automatiquement la connexion lorsque le script arrivera à la fin.
Exemple 3. Fermeture d'une connexion
<?php $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); // utiliser la connexion ici
// et maintenant, fermez-la ! $dbh = null; ?>
Beaucoup d'applications web utilisent des connexions persistantes aux serveurs
de base de données. Les connexions persistantes ne sont pas fermées à la fin du
script, mais sont mises en cache et réutilisées lorsqu'un autre script demande une connexion
en utilisant les mêmes paramètres. Le cache des connexions persistantes
vous permet d'éviter d'établir une nouvelle connexion à chaque fois qu'un
script doit accéder à une base de données, rendant l'application web plus rapide.
Note :
Si vous utilisez le driver PDO ODBC et que votre bibliothèque ODBC supporte
le pool de connexion ODBC (unixODBC et Windows le supportent tous les deux ;
peut être plus), alors il est recommandé de ne pas utiliser les connexions persistantes
PDO mais plutôt laisser le pool de connexion ODBC mettre en cache les connexions.
Le pool de connexion ODBC est partagé avec les autres modules dans le processus ;
si PDO met en cache la connexion, alors cette connexion ne sera jamais retournée
par le pool de connexion ODBC, faisant que plusieurs connexions sont créées pour
les autres modules.
Maintenant que vous êtes connecté via PDO, vous devez comprendre
comment PDO gère les transactions avant d'exécuter des requêtes. Si vous n'avez
jamais utilisé les transactions, elles offrent 4 fonctionnalités majeures :
Atomicité, Consistance, Isolation et Durabilité (ACID). En d'autres termes,
n'importe quel travail mené Ã bien dans une transaction, même s'il est effectué
par étapes, est garanti d'être appliqué Ã la base de données sans risque, et sans
interférence pour les autres connexions, quand il est validé. Le travail des transactions
peut également être automatiquement annulé Ã votre demande (en supposant que
vous n'avez encore rien validé), ce qui rend la gestion des erreurs bien plus
simple dans vos scripts.
Les transactions sont typiquement implémentées pour appliquer
toutes vos modifications en une seule fois ; ceci a le bel effet d'éprouver
drastiquement l'efficacité de vos mises à jour. Dans d'autres termes,
les transactions rendent vos scripts plus rapides et potentiellement plus
robustes (vous devez les utiliser correctement pour avoir ces bénéfices).
Malheureusement, toutes les bases de données ne supportent pas les transactions,
donc, PDO doit s'exécuter en mode "auto-commit" lorsque vous ouvrez pour la première
fois la connexion. Le mode "auto-commit" signifie que toutes les requêtes que vous
exécutez ont leurs transactions implicites, si la base de données le supporte ou
aucune transaction si la base de données ne les supporte pas. Si vous avez besoin
d'une transaction, vous devez utiliser la méthode PDO::beginTransaction()
pour l'initialiser. Si le driver utilisé ne supporte pas les transactions, une exception
PDO sera lancée (en accord avec votre gestionnaire d'erreurs : ceci est toujours
une erreur sérieuse). Une fois que vous êtes dans une transaction, vous devez utiliser
la fonction PDO::commit() ou la fonction PDO::rollBack()
pour la terminer, suivant le succès de votre code durant la transaction.
Lorsque le script se termine ou lorsque la connexion est sur le point de se fermer,
si vous avez une transaction en cours, PDO l'annulera automatiquement.
Ceci est une mesure de sécurité afin de garantir la consistance de vos données
dans le cas où le script se termine d'une façon inattendue. Si vous ne validez pas
explicitement la transaction, alors, on présume que quelque chose s'est mal passé
et l'annulation de la transaction intervient afin de garantir la sécurité de vos données.
Avertissement
L'annulation automatique intervient si vous avez initialisé la transaction via
PDO::beginTransaction(). Si vous avez manuellement
exécuté une requête qui commence une transaction, PDO n'a aucun moyen de
le savoir et donc, n'annulera pas automatiquement cette transaction si quelque
chose s'est mal passé.
Exemple 5. Exécution d'un groupe dans une transaction
Dans l'exemple suivant, supposons que nous allons créer un jeu d'entrées
pour un nouvel employé, dont le numéro d'ID sera 23.
En plus des données basiques sur cette personne, nous devons également
lui enregistrer son salaire. Il est très simple d'effectuer deux mises à jour
séparées, mais en les enfermant dans les appels des fonctions
PDO::beginTransaction() et
PDO::commit(), nous garantissons que personne
ne pourra voir ces modifications tant qu'elles ne seront pas complètes.
Si quelque chose tourne mal, le bloc de capture annulera toutes les
modifications effectuées depuis le début de la transaction et affichera
un message d'erreur.
Vous n'êtes pas limité dans le nombre de mises à jour dans une transaction ;
vous pouvez également y effectuer des requêtes complexes et bien sûr, utiliser
ces informations pour construire d'autres mises à jour et requêtes ; durant l'activité
de la transaction, vous êtes garanti que personne d'autre ne peut effectuer des
modifications alors que vous êtes au milieu de vos modifications. En réalité,
ceci n'est pas 100% correct, mais cela reste une très bonne introduction aux
transactions.
La plupart des bases de données supportent le concept des requêtes préparées.
Qu'est-ce donc ? Vous pouvez les voir comme une sorte de modèle compilé
pour le SQL que vous voulez exécuter, qui peut être personnalisé en utilisant
des variables en guise de paramètres. Les requêtes préparées offrent
deux fonctionnalités essentielles :
La requête ne doit être analysée (ou préparée) qu'une seule fois, mais peut
être exécutée plusieurs fois avec des paramètres identiques ou différents.
Lorsque la requête est préparée, la base de données va analyser, compiler
et optimiser son plan pour exécuter la requête. Pour les requêtes complexes,
ce processus peut prendre assez de temps, ce qui peut ralentir vos applications
si vous devez répéter la même requête plusieurs fois avec différents paramètres.
En utilisant les requêtes préparées, vous évitez ainsi de répéter le cycle
analyser/compilation/optimisation. Pour résumer, les requêtes préparées
utilisent moins de ressources et s'exécutent plus rapidement.
Les paramètres pour préparer les requêtes n'ont pas besoin d'être entre
guillemets ; le driver le gère pour vous. Si votre application utilise exclusivement
les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL
n'est possible (Cependant, si vous construisez d'autres parties de la requête
en vous basant sur des entrées utilisateurs, vous continuez à prendre un risque).
Les requêtes préparées sont tellement pratiques que c'est l'unique fonctionnalité
que PDO émule pour les drivers qui ne les supportent pas. Ceci assure de pouvoir
utiliser la même technique pour accéder aux données, sans se soucier des capacités
de la base de données.
Exemple 6. Insertions répétitives en utilisant les requêtes préparées
Cet exemple effectue une requête INSERT en y substituant un
nom et une valeur pour les marqueurs nommés.
// insertion d'une ligne $nom = 'one'; $valeur = 1; $stmt->execute();
// insertion d'une autre ligne avec différentes valeurs $nom = 'two'; $valeur = 2; $stmt->execute(); ?>
Exemple 8. Récupération des données en utilisant des requêtes préparées
Cet exemple récupère des données basées sur la valeur d'une clé fournie
par un formulaire. L'entrée utilisateur est automatiquement échappée, il n'y a
donc aucun risque d'attaque par injection SQL.
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where nom = ?"); if ($stmt->execute(array($_GET['nom']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?>
Si le driver de la base de données le supporte, vous pouvez également lier
des paramètres aussi bien pour l'entrée que pour la sortie. Les paramètres de sortie
sont utilisés typiquement pour récupérer les valeurs d'une procédure stockée.
Les paramètres de sortie sont un peu plus complexe à utiliser que les paramètres d'entrée
car vous devez savoir la longueur d'un paramètre donné pourra atteindre lorsque vous
le liez. Si la valeur retournée est plus longue que la taille qui vous auriez suggéré,
une erreur sera émise.
Exemple 9. Appel d'une procédure stockée avec un paramètre de sortie
// Appel de la procédure stockée $stmt->execute();
print "La procédure a retourné : $return_value\n"; ?>
Vous devez également spécifier les paramètres qui gèrent les valeurs
aussi bien pour l'entrée que pour la sortie ; la syntaxe est similaire aux
paramètres de sortie. Dans le prochain exemple, la chaîne 'Bonjour' est passée
à la procédure stockée et lorsqu'elle retourne la valeur, 'Bonjour' est remplacée
par la valeur retournée par la procédure.
Exemple 10. Appel d'une procédure stockée avec un paramètre d'entrée/sortie
// appel de la procédure stockée $stmt->execute();
print "La procédure a retourné : $value\n"; ?>
Exemple 11. Utilisation invalide de marqueur
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where nom LIKE '%?%'"); $stmt->execute(array($_GET['nom']));
// un marqueur doit être utilisé Ã la place d'une valeur complète $stmt = $dbh->prepare("SELECT * FROM REGISTRY where nom LIKE ?"); $stmt->execute(array("%$_GET[nom]%")); ?>
PDO offre la possibilité de gérer les erreurs de 3 façons différentes, pour
coller au mieux au style de votre application.
PDO::ERRMODE_SILENT
C'est le mode par défaut. PDO définit simplement le code erreur pour vous
afin de l'inspecter en utilisant les méthodes PDO::errorCode()
et PDO::errorInfo() sur la requête ou sur les objets
de la base de données ; si l'erreur est issue d'un appel à un objet de requête,
vous devriez invoquer les méthodes PDOStatement::errorCode()
ou PDOStatement::errorInfo() sur cet objet. Si l'erreur
est issue d'un appel sur un objet de la base de données, vous devriez invoquer
à la place les méthodes de cet objet.
PDO::ERRMODE_WARNING
En plus de définir le code erreur, PDO émettra un message de niveau E_WARNING.
Ce comportement est très utile lors de la phase de test/débogage, si vous voulez
juste voir le problème qui survient sans pour autant stopper le flot de l'application.
PDO::ERRMODE_EXCEPTION
En plus de définir le code erreur, PDO lancera une exception
PDOException et y définit ces propriétés
pour refléter le code erreur et l'information sur l'erreur. Ce comportement
est utile également durant la période de débogage car il va stopper
l'application à l'endroit même de l'erreur et pointer l'endroit où
se trouve potentiellement l'erreur dans votre code (souvenez-vous :
les transactions sont automatiquement annulées si l'exception fait
que le script se termine).
Le mode lançant des exceptions est également utile pour structurer
la gestion de vos erreurs plus clairement que par la traditionnelle
gestion des erreurs de PHP et avec moins de code, plutôt que le mode
silencieux et l'analyse explicite des valeurs retournées par chaque appel
à la base de données.
Lisez la documentation sur les exceptions
pour plus de détails sur les exceptions en PHP.
PDO standardise les codes erreurs en utilisant SQL-92 SQLSTATE ; les drivers
individuels PDO sont responsables du mapping de leurs propres codes
avec les codes SQLSTATE appropriées. La méthode PDO::errorCode()
retourne un seul code SQLSTATE. Si vous avez besoin de plus d'informations sur
une erreur, PDO fournit également la méthode PDO::errorInfo()
qui retourne un tableau contenant le code SQLSTATE, le code erreur spécifique
du driver et la chaîne erreur spécifique au driver.
À un moment dans votre application, vous pourriez avoir besoin de stocker de
larges données dans votre base de données. "Large" signifie typiquement
des données d'environ 4ko ou plus, bien que certaines bases de données peuvent
gérer plus de 32ko avant que les données deviennent "larges". Les objets larges
peuvent être de nature textuelle ou binaire. PDO vous permet de travailler
avec ce type de larges données en utilisant le code type
PDO::PARAM_LOB dans vos appels aux fonctions
PDOStatement::bindParam() ou
PDOStatement::bindColumn().
PDO::PARAM_LOB demande à PDO de mapper les données
en un flux que vous pourrez manipuler en utilisant
l'API PHP sur les flux.
Exemple 12. Affichage d'une image depuis une base de données
Cet exemple lie un LOB dans une variable nommée $lob et l'envoie
au navigateur en utilisant la fonction fpassthru().
Étant donné qu'un LOB est représenté en un flux, les fonctions comme
fgets(), fread() et
stream_get_contents() peuvent être utilisées sur ce flux.
<?php $db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2'); $stmt = $db->prepare("select contenttype, imagedata from images where id=?"); $stmt->execute(array($_GET['id'])); $stmt->bindColumn(1, $type, PDO::PARAM_STR, 256); $stmt->bindColumn(2, $lob, PDO::PARAM_LOB); $stmt->fetch(PDO::FETCH_BOUND);
Exemple 13. Insertion d'une image dans une base de données
Cet exemple ouvre un fichier et passe le pointeur de fichier à PDO
pour l'insérer en tant que LOB. PDO fera son possible pour récupérer
le contenu du fichier et l'insérer dans la base de données de la
manière la plus efficace possible.
<?php $db = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2'); $stmt = $db->prepare("insert into images (id, contenttype, imagedata) values (?, ?, ?)"); $id = get_new_id(); // fonction pour allouer un nouvel ID
// assumons que nous récupérons un fichier depuis un formulaire // vous pouvez trouver plus de détails dans la documentation de PHP
Exemple 14. Insertion d'une image dans une base de données Oracle
Oracle requiert une syntaxe légèrement différente pour y insérer un LOB
depuis un fichier. Il est également essentiel d'effectuer votre insertion
au sein d'une transaction, sinon, votre nouveau LOB sera inséré
avec une longueur de zéro :
<?php $db = new PDO('oci:', 'scott', 'tiger'); $stmt = $db->prepare("insert into images (id, contenttype, imagedata) " . "VALUES (?, ?, EMPTY_BLOB()) RETURNING imagedata INTO ?"); $id = get_new_id(); // fonction pour allouer un nouvel ID
// assumons que nous récupérons un fichier depuis un formulaire // vous pouvez trouver plus de détails dans la documentation de PHP
Représente une erreur émise par PDO. Vous ne devriez pas lancer une exception
PDOException depuis votre propre code.
Lisez la documentation sur les Exceptions
pour plus de détails sur les exceptions en PHP.
Exemple 15. La classe PDOException
<?php class PDOException extends Exception { public $errorInfo = null; // correspond à PDO::errorInfo() // ou PDOStatement::errorInfo() protected $message; // message d'erreur textuel // utiliser Exception::getMessage() pour y accéder protected $code; // code erreur SQLSTATE // utiliser Exception::getCode() pour y accéder } ?>
Ces constantes sont définies par cette
extension, et ne sont disponibles que si cette extension a été compilée avec
PHP, ou bien chargée au moment de l'exécution.
Avertissement
PDO utilise les constantes de classe depuis PHP 5.1. Les versions antérieures
utilisent les constantes globales sous la forme PDO_PARAM_BOOL.
Spécifie que le paramètre est un paramètre INOUT pour une
procédure stockée. Vous devez utiliser l'opérateur OR avec
un type de données explicite PDO::PARAM_*.
Spécifie que la méthode de récupération doit retourner chaque ligne
en tant qu'objet avec les noms de variables correspondant aux noms des
colonnes retournées dans le jeu de résultats. PDO::FETCH_LAZY crée les noms
des variables de l'objet comme ils sont rencontrés.
Spécifie que la méthode de récupération doit retourner chaque ligne dans
un tableau indexé par les noms des colonnes comme elles sont retournées
dans le jeu de résultats correspondant. Si le jeu de résultats contient de multiples
colonnes avec le même nom, PDO::FETCH_ASSOC retourne une seule valeur
par nom de colonne.
Spécifie que la méthode de récupération doit retourner chaque ligne dans
un tableau indexé par les noms des colonnes comme elles sont retournées
dans le jeu de résultats correspondant. Si le jeu de résultats contient de multiples
colonnes avec le même nom, PDO::FETCH_NAMED retourne un tableau de valeurs
par nom de colonne.
Spécifie que la méthode de récupération doit retourner chaque ligne dans
un tableau indexé par le numéro des colonnes comme elles sont
retournées dans le jeu de résultats correspondant, en commençant à 0.
Spécifie que la méthode de récupération doit retourner chaque ligne dans
un tableau indexé par les noms des colonnes ainsi que leurs numéros,
comme elles sont retournées dans le jeu de résultats correspondant, en
commençant à 0.
Spécifie que la méthode de récupération doit retourner chaque ligne
dans un objet avec les noms de propriétés correspondant aux noms
des colonnes comme elles sont retournées dans le jeu de résultats.
Spécifie que la méthode de récupération doit retourner TRUE et assigner
les valeurs des colonnes du jeu de résultats dans les variables PHP auxquelles
elles sont liées avec la méthode
PDOStatement::bindParam() ou la méthode
PDOStatement::bindColumn().
Spécifie que la méthode de récupération doit retourner une nouvelle instance
de la classe demandée, liant les colonnes aux propriétés nommées dans la classe.
Spécifie que la méthode de récupération doit mettre à jour une instance existante
de la classe demandée, liant les colonnes aux propriétés nommées dans la classe.
Définir la taille de la pré-récupération vous permet d'accroître les performances
de votre application. Toutes les combinaisons bases de données / drivers
ne supportent pas cette fonctionnalité. Ceci accroît les performances au
détriment de la consommation de mémoire vive.
Sélectionne le type de curseur. PDO supporte actuellement soit
PDO::CURSOR_FWDONLY, soit
PDO::CURSOR_SCROLL. Conserver
PDO::CURSOR_FWDONLY tant que vous savez que vous avez besoin
d'un curseur scrollable.
Demande une connexion persistante, plutôt que de créer une nouvelle connexion.
Voir les connexions et le gestionnaire de connexion
pour plus d'informations sur cet attribut.
Ajoute le contenu du catalogue de noms dans chaque nom de colonnes retourné
dans le jeu de résultat. Le catalogue de noms et les noms de colonnes
sont séparés par un point (.). Le support de cet attribut n'est pas disponible pour tous les drivers ;
il peut ne pas être disponible pour votre driver.
Ajoute le contenu de la table de noms dans chaque nom de colonne retourné
dans le jeu de résultats. La table de nom et les noms de colonnes sont
séparés par un point (.). Le support de cet attribut n'est pas disponible pour tous les drivers ;
il peut ne pas être disponible pour votre driver.
N'envoie pas d'erreur ni d'exception si une erreur survient. Le développeur
doit explicitement vérifier les erreurs. C'est le mode par défaut.
Voir les erreurs et la gestion des erreurs
pour plus d'informations sur cet attribut.
Récupère la ligne demandée par une position relative à la position courante
du curseur d'un jeu de résultats. Valide seulement pour les curseurs scrollables.
Crée un objet PDOStatement avec un curseur uniquement de retour. C'est
le choix par défaut pour le curseur, car il est rapide et l'accès aux données est commun
pour les masques en PHP.
Correspond à SQLSTATE '00000', ce qui signifie que la requête SQL a réussi
sans erreur, ni avertissement. Cette constante est utile lorsque vous utilisez
PDO::errorCode() ou
PDOStatement::errorCode() pour déterminer si une erreur
est survenue. Cependant, vous devez déjà savoir si c'est le cas en examinant
le code retourné par la méthode qui a lancée l'erreur.