Bertrand Estellon
Aix-Marseille Universit´e
Base de donn´ees SQLite et PDO
SQLite et PDO
SQLite ´
ecrit les donn´
ees relatives `
a la base dans un unique fichier sur le
disque dur du serveur. La commande sqlite3 permet d’ouvrir la base et
effectuer des requˆ
etes SQL (pratique pour d´
ebugger).
PDO (PHP Data Objects) est une interface pour acc´
eder `
a une base de
donn´
ees depuis PHP. Elle g`
ere la connexion, l’envoie des requˆ
etes, la
d´
econnexion `
a la base de donn´
ees. Elle permet de changer plus facilement
de moteur de bases de donn´
ees (Par exemple, SQLite → MySQL).
Ouverture de la base :
<? t r y { $bd = new PDO( ” s q l i t e : d a t a b a s e . s q l i t e ” ) ; } c a t c h ( PDOException $e ) { d i e ( ’ E r r e u r : ’ . $e−>g e t M e s s a g e ( ) ) ; } ?>Une fois l’instance de PDO construite, vous effectuez des requˆ
etes avec :
I
$bd->exec($requete) : pour modifier la base de donn´
ees
I
$bd->query($requete) : pour extraire des donn´
ees de la base
Exemples :
$bd−>e x e c ( ”CREATE TABLE u s e r s ( ” . ” n i c k n a m e c h a r ( 2 0 ) , ” . ” p a s s w o r d c h a r ( 5 0 ) ” . ” ) ; ” ) ;
$ r e s =$bd−>e x e c ( ’UPDATE u s e r s SET p a s s w o r d =”’ .
md5 ( $ p a s s w o r d ) . ’ ” WHERE n i c k n a m e =”’ . $ n i c k n a m e . ’ ”; ’ ) ; e c h o ”nombre de l i g n e s m o d i f i e e s = $ r e s ” ;
Base de donn´ees Les requˆetes et fonctions utiles
Injections SQL
Le code suivant :
$ n i c k n a m e = ’ a a ”; DELETE FROM u s e r s ; ’ .
’ SELECT ∗ FROM u s e r s WHERE n i c k n a m e =”’ ; $ p a s s w o r d = ” t r u c ” ;
$ r e s = $bd−>e x e c ( ’UPDATE u s e r s SET p a s s w o r d =”’ .
md5 ( $ p a s s w o r d ) . ’ ” WHERE n i c k n a m e =”’ . $ n i c k n a m e . ’ ”; ’ ) ;
ex´
ecute la requˆ
ete SQL suivante :
UPDATE u s e r s SET p a s s w o r d=” . . . . ” WHERE n i c k n a m e=”a a ” ; DELETE FROM u s e r s ;
SELECT ∗ FROM u s e r s WHERE n i c k n a m e=” ” ;
Protection contre les injections SQL :
$ r = $bd−>p r e p a r e ( ’UPDATE u s e r s SET p a s s w o r d = ? ’ . ’WHERE n i c k n a m e = ? ’ ) ;
Pour faire une requˆ
ete SQL :
$ r e s = $bd−>q u e r y ( ” s e l e c t ∗ f r o m s o n d a g e s ” ) ; v a r d u m p ( $ r e s ) ;
affiche ’object(PDOStatement)#2 (1) {
[”queryString”]=> string(19) ”select * from sondages” }’
Pour connaˆıtre le nombre de lignes :
e c h o ”nombre de l i g n e s : ” .$ r e s −>r o w C o u n t ( ). ”\ n ” ;
Pour parcourir les lignes :
$ r e s = $bd−>q u e r y ( ” s e l e c t ∗ f r o m s o n d a g e s ” ) ; w h i l e ( $ l i g n e = $ r e s −>f e t c h ( )) { e c h o $ l i g n e [ ’ c r e a t e u r ’ ] . ” p o s e l a q u e s t i o n : ” . $ l i g n e [ ’ q u e s t i o n ’ ] . ”\ n ” ; }
Base de donn´ees Les requˆetes et fonctions utiles
SQLite et PDO
Pour mettre toutes les lignes dans un tableau :
$ r e s = $bd−>q u e r y ( ” s e l e c t ∗ f r o m s o n d a g e s ” ) ; $ l i g n e s = $ r e s −> f e t c h A l l ( ) ; f o r e a c h ( $ l i g n e s a s $ l i g n e ) { e c h o $ l i g n e [ ’ c r e a t e u r ’ ] . ” p o s e l a q u e s t i o n : ” . $ l i g n e [ ’ q u e s t i o n ’ ] . ”\ n ” ; }
Voir aussi, dans la classe PDOStatement, les m´
ethodes :
I
bindColumn
: attache une variable `
a une colonne
I
errorInfo
: information d’erreur
I
fetchColumn
: r´
ecup`
ere la valeur dans une colonne donn´
ee
Voir aussi, dans la classe PDO, les m´
ethodes :
I
beginTransaction
: d´
emarre une transaction
I
commit
: valide une transaction
I
rollback
: annule une transaction
I
errorInfo
: Retourne les informations associ´
ees `
a l’erreur
I
errorCode
: Retourne le SQLSTATE associ´
e avec la derni`
ere op´
eration
I
prepare
: Pr´
epare une requˆ
ete `
a l’ex´
ecution et retourne un objet
I
quote
: Prot`
ege une chaˆıne pour l’utiliser dans une requˆ
ete SQL PDO
$ s t r i n g = ’ C h a i n e
\ ’
p a r t i c u l i e r e ’ ;
p r i n t
”non e c h a p p e e
:
$ s t r i n g \ n ” ;
p r i n t
”e c h a p p e e
: ” .
$bd−>q u o t e ( $ s t r i n g )
.
”\ n ” ;
Chaine non echappee : Chaine ’ particuliere
Chaine echappee : ’Chaine ” particuliere’
Base de donn´ees Les requˆetes et fonctions utiles
Base de donn´
ees du projet
Les trois tables utilis´
ees dans le projet :
u s e r s ( n i c k n a m e
c h a r ( 2 0 ) ,
p a s s w o r d
c h a r ( 5 0 ) ) ;
s u r v e y s ( i d
i n t e g e r
p r i m a r y
k e y
a u t o i n c r e m e n t ,
o w n e r
c h a r ( 2 0 ) ,
q u e s t i o n
c h a r ( 2 5 5 ) ) ;
r e s p o n s e s ( i d
i n t e g e r
p r i m a r y
k e y
a u t o i n c r e m e n t ,
i d s u r v e y
i n t e g e r ,
t i t l e
c h a r ( 2 5 5 ) ,
c o u n t
i n t e g e r ) ;
p u b l i c f u n c t i o n s a v e S u r v e y (& $ s u r v e y ) { i f ( $ s u r v e y −>g e t I d ()!== n u l l ) r e t u r n f a l s e ;
$ t h i s −>c o n n e c t i o n −>b e g i n T r a n s a c t i o n ( );
$ r = $ t h i s −>c o n n e c t i o n −>p r e p a r e ( ’ INSERT INTO s u r v e y s ( owner , ’ . ’ q u e s t i o n ) VALUES ( ? , ? ) ; ’ ) ; i f ( $ r===f a l s e ) { $ t h i s −>c o n n e c t i o n −> r o l l b a c k ( ); r e t u r n f a l s e ; } i f ( $ r −>e x e c u t e ( a r r a y ( $ s u r v e y −>g e t O w n e r ( ) , $ s u r v e y −>g e t Q u e s t i o n ()))=== f a l s e ) { $ t h i s −>c o n n e c t i o n −> r o l l b a c k ( ); r e t u r n f a l s e ; } $ i d = $ t h i s −>c o n n e c t i o n −> l a s t I n s e r t I d ( ); $ s u r v e y −>s e t I d ( $ i d ) ; f o r e a c h ( $ s u r v e y −>g e t R e s p o n s e s ( ) a s $ r e s p o n s e ) i f ( ! $ t h i s −>s a v e R e s p o n s e ( $ r e s p o n s e ) ) { $ t h i s −>c o n n e c t i o n −> r o l l b a c k ( ); r e t u r n f a l s e ; } $ t h i s −>c o n n e c t i o n −>commit ( ); r e t u r n t r u e ; }
Base de donn´ees Les requˆetes et fonctions utiles
La classe Database
c l a s s D a t a b a s e { p r i v a t e $ c o n n e c t i o n ; p u b l i c f u n c t i o n c o n s t r u c t ( ) { . . . } p u b l i c f u n c t i o n c h e c k P a s s w o r d ( $ n i c k n a m e , $ p a s s w o r d ) { . . . } p u b l i c f u n c t i o n a d d U s e r ( $ n i c k n a m e , $ p a s s w o r d ) { . . . } p u b l i c f u n c t i o n u p d a t e U s e r ( $ n i c k n a m e , $ p a s s w o r d ) { . . . } p u b l i c f u n c t i o n s a v e S u r v e y (& $ s u r v e y ) { . . . } p u b l i c f u n c t i o n l o a d S u r v e y s B y O w n e r ( $ o w n e r ) { . . . } p u b l i c f u n c t i o n l o a d S u r v e y s B y K e y w o r d ( $ k e y w o r d ) { . . . } p u b l i c f u n c t i o n v o t e ( $ i d ) { . . . } p r i v a t e f u n c t i o n c r e a t e D a t a B a s e ( ) { . . . } p r i v a t e f u n c t i o n c h e c k N i c k n a m e V a l i d i t y ( $ n i c k n a m e ) { . . . } p r i v a t e f u n c t i o n c h e c k P a s s w o r d V a l i d i t y ( $ p a s s w o r d ) { . . . } p r i v a t e f u n c t i o n c h e c k N i c k n a m e A v a i l a b i l i t y ( $ n i c k n a m e ) { . . . } p r i v a t e f u n c t i o n s a v e R e s p o n s e (& $ r e s p o n s e ) { . . . } p r i v a t e f u n c t i o n l o a d S u r v e y s ( $ a r r a y S u r v e y s ) { . . . } p r i v a t e f u n c t i o n l o a d R e s p o n s e s (& $ s u r v e y , $ a r r a y R e s p o n s e s ) { . . . } }Les besoins :
I
Sauvegarde simple des objets en base de donn´
ees :
$ u s e r = new U s e r ( ) ; $ u s e r −>n i c k n a m e = ”bob ” ; $ u s e r −>p a s s w o r d = md5 ( ” t r u c ” ) ; $ u s e r −>s a v e ( ) ;
I
Cr´
eation automatique des tables ;
I
Chargement des objets ;
I
Gestion des relations entre les objets/enregistrements ;
I