FAQ PHP
FAQ PHPConsultez toutes les FAQ
Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 18 septembre 2021
- Qu'est-ce que PDO ?
- Quels sont les pilotes de SGBD disponibles avec PDO ?
- Comment installer PDO ?
- Comment savoir quels pilotes sont chargés pour PDO sur mon hébergement ?
- Comment se connecter en utilisant PDO ?
- Comment gérer les exceptions avec PDO ?
- Comment exécuter une requête en utilisant PDO ?
- Comment récupérer le nombre d'enregistrements retournés par une requête 'SELECT' avec PDO ?
PDO (PHP Data Objects) est une extension PHP qui permet d'utiliser une base de données en programmant avec un style orienté objet, et surtout qui permet de s'affranchir du SGBD. PDO n'utilise pas des fonctions au nom trop explicite comme mysql_query() ou sqlite_query(), ce qui facilite grandement la migration d'un SGBD à l'autre, voire l'utilisation simultanée ou alternée de plusieurs SGBD avec le même code PHP.
PDO est une solution d'abstraction de BDD en PHP.
Le Zend Framework (par exemple) utilise PDO pour ses accès BDD.
Lien : Comment uniformiser l'utilisation de différents SGBD ?
Lien : Cours et tutoriels Zend FrameworkCours et tutoriels ZF
Lien : La documentation de PDO (php.net)
La documentation officielle tient à jour une liste des pilotes disponibles avec PDO. Chaque pilote est associé à une extension qu'il faut penser à activer dans le fichier php.ini afin de pouvoir l'utiliser.
- Firebird/Interbase 6 ;
- FreeTDS / Microsoft SQL Server / Sybase (à ne pas utiliser, module non tenu à jour par Microsoft) ;
- IBM DB2 ;
- IBM Informix Dynamic Server ;
- MySQL 3.x, 4.x, 5.x (optimisé pour 4.1 et supérieur) ;
- ODBC v3 (IBM DB2 unixODBC et win32 ODBC) ;
- Oracle Call Interface ;
- PostgreSQL ;
- SQLite 3 et SQLite 2.
Lien : Pilotes PDO (php.net)
Lien : Quels sont les pilotes de SGBD disponibles avec PEAR::MDB2 ?
PDO est une extension PHP. Il faut installer le pilote PDO générique ainsi que chacun des pilotes de SGBD que l'on souhaite utiliser : chacun d'eux est une extension PHP.
Il faut utiliser le script suivant :
<?php
foreach
(get_loaded_extensions() as
$extension
)
{
if
(strpos(strtolower($extension
),
'pdo'
) !==
FALSE
)
{
echo $extension
.
'<br/>'
;
}
}
?>
La chaîne de connexion varie suivant le pilote SBGD utilisé, mais tout le reste est équivalent d'un SGBD à l'autre.
<?php
// Connexion à la base de données
$db
=
new
PDO('mysql:host=localhost;dbname=developpez'
,
'Yogui'
,
'motdepasse'
);
// Configuration facultative de la connexion
$db
->
setAttribute(PDO::
ATTR_CASE,
PDO::
CASE_LOWER);
// les noms de champs seront en caractères minuscules
$db
->
setAttribute(PDO::
ATTR_ERRMODE ,
PDO::
ERRMODE_EXCEPTION);
// les erreurs lanceront des exceptions
?>
Voici quelques exemples de chaînes de connexion :
$db
=
new PDO('
mysql:host=localhost;dbname=developpez
'
,
'
Yogui
'
,
'
motdepasse
'
);
$db
=
new PDO('
mysql:unix_socket=/tmp/mysql.sock;dbname=developpez
'
,
'
Yogui
'
,
'
motdepasse
'
);
$db
=
new PDO('
odbc:developpez
'
,
'
Yogui
'
,
'
motdepasse
'
);
$db
=
new PDO('
odbc:DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME=localhost;PORT=50000;"
."DATABASE=developpez;PROTOCOL=TCPIP;UID=Yogui;PWD=motdepasse;
'
,
''
,
''
);
$db
=
new PDO('
odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\developpez.mdb;Uid=Yogui
'
,
''
,
''
);
$db
=
new PDO('
firebird:User=Yogui;Password=motdepasse;Database=developpez.gde;DataSource=localhost;Port=3050
'
,
''
,
''
);
$db
=
new PDO("
ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=developpez;HOSTNAME=localhost;PORT=56789;PROTOCOL=TCPIP;
"
,
"
Yogui
"
,
"
motdepasse
"
);
$db
=
new PDO("
informix:host=localhost; service=9800;
database=developpez; server=ids_server; protocol=onsoctcp;
EnableScrollableCursors=1
"
,
"
Yogui
"
,
"
developpez
"
);
Lien : Quels sont les pilotes de SGBD disponibles avec PDO ?
Lien : Comment exécuter une requête en utilisant PDO ?
Lien : Comment construire l'objet $db avec le Zend Framework ?Comment construire l'objet $db avec le ZF ?
PDO est une extension orientée objet et qui utilise un système d'exceptions. L'instanciation d'un objet PDO doit donc se faire avec un bloc try/catch afin d'éviter des fuites d'information (exemple dans les liens ci-dessous).
<?php
try
{
// Connexion à la base de données
$db
=
new
PDO('mysql:host=localhost;dbname=developpez'
,
'Yogui'
,
'motdepasse'
);
// Configuration du pilote : nous voulons des exceptions
$db
->
setAttribute(PDO::
ATTR_ERRMODE,
PDO::
ERRMODE_EXCEPTION);
// Obligatoire pour la suite
}
catch
(Exception
$e
)
{
echo "Échec : "
.
$e
->
getMessage();
}
?>
Le plus efficace est d'utiliser les requêtes préparées. Une requête préparée se matérialise dans le code par un "statement" PDO. Un statement peut être exécuté de nombreuses fois avec des paramètres différents.
<?php
// Connexion à la base de données
$db
=
new
PDO('mysql:host=localhost;dbname=developpez'
,
'Yogui'
,
'motdepasse'
);
// Préparation des requêtes
$truncate
=
$db
->
prepare('TRUNCATE user'
);
$insert
=
$db
->
prepare('INSERT INTO user (name, password) VALUES (?, ?)'
);
$select
=
$db
->
prepare('SELECT id, name, password FROM user'
);
$select
->
setFetchMode(PDO::
FETCH_ASSOC
);
// Facultatif
// Exécution des requêtes
$truncate
->
execute();
$insert
->
execute(array
('Yogui'
,
'1234'
));
$insert
->
execute(array
('BrYs'
,
'4321'
));
$select
->
execute();
// Récupération des résultats
$users
=
$select
->
fetchAll();
echo '<pre>'
;
print_r($users
);
echo '</pre>'
;
?>
Note importante : utiliser des requêtes préparées élimine le risque d'injection SQL et accélère les performances.
Sous réserve que les extension php_pdo et php_pdo_mysql (pour cet exemple) soient montées en mémoire.
Contrairement à ce que l'on pourrait croire, la méthode 'rowCount()' ne fonctionne que dans les cas de requêtes de type INSERT, UPDATE ou DELETE.
<?php
// initialisation de la connexion PDO
$db
=
new
PDO('mysql:host=localhost;dbname=training'
,
'eric'
,
'motdepasse'
);
// Exécution de la requête
$result
=
$db
->
query('SELECT * FROM country'
);
// Récupération de tous les enregistrements retourne un tableau
$countries
=
$result
->
fetchAll();
// Affichage comptage du nombre de lignes du tableau
echo(count($countries
));
?>