PHP Avanc
Abdelahad SATOUR
PHP 5 et POO
1. 2. 3. 4.
Systme de gestion de base de donnes relationnelles, MySQL est un SGBDR trs populaire, performant et fiable. MySQL est dvelopp par MySQL AB (http://www.mysql.com) sous une license GPL (GNU General Public License). Il y a 2 millions dinstallations connues dans le monde.
MySQL sintgre facilement avec PHP (et Apache et Linux). Utilise le langage SQL pour les requtes (conforme la majorit des standards SQL). Supporte les transactions (version Max). Version courante MySQL 5.3
Une application SGBD roule sur le serveur. Le serveur est accessible par un client qui peut tre sur la mme machine ou distant. Un pilote ODBC est disponible. Dans le cas du web, le client est le module PHP.
crit en C et C++, multi-threaded (multiple CPUs). Disponible sous plusieurs plate-formes (notamment Un*x, Windows). API pour C, C++, Eiffel, Java, Perl, PHP, Python et Tcl. Supporte diffrents types de donnes: entier sign/nonsign de 1, 2, 3, 4, et 8 octets, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET, et ENUM. Multilingues (message).
Principe
PHP propose de nombreux outils permettant de travailler avec la plupart des SGBDR
Oracle, Sybase, Microsoft SQL Server, PostgreSQL ou encore MySQL
Lorsqu'une base de donnes n'est pas directement supporte par Php, il est possible d'utiliser un driver ODBC (pilote standard) pour communiquer avec les bases de donnes Php fournit un grand choix de fonctions permettant de manipuler les bases de donnes. Quatre fonctions sont essentielles:
La fonction de connexion au serveur La fonction de choix de la base de donnes La fonction de requte La fonction de dconnexion
Principe
Avec le SGBD MySQL, les fonctions de manipulation sont :
mysql_connect mysql_select_db mysql_query mysql_close
La connexion un SGBDR
Dclarer les variables qui vont permettre la connexion la base de donnes
Ce sont les paramtres (optionnels gnralement) des fonctions de connexion la base. Ces variables sont: $user : Le nom d'utilisateur $passwd : Le mot de passe
$host : L'hte (ordinateur sur lequel le SGBD est install) dfaut le nom dhte est localhost
$bdd : Le nom de la base de donnes
La connexion un SGBDR
Dclarer les variables qui vont permettre la connexion la base de donnes Il est. utile de crer un script PHP contenant les variables de connexion sous forme de variables et lier ce script aux autres scripts en utilisant linstruction include().
<? // connexion_data.php4 /* Accs au serveur de bases de donnes MySQL */ $MySql_Hot=localhost; $MySql_User=admin; $MySql_Passw=admin; ?>
La connexion un SGBDR
La connexion (un serveur) un systme de gestion de base de donnes s'effectue par l'entremise des fonctions spcialises
mysql_connect("nom_serveur","nom_utilisateur","mot_passe");
retourne une valeur de type Integer servant didentificateur de connexion lorsque la connexion a t tablie retourne False si une erreur se produit lors de l tablissement de la connexion
La connexion un SGBDR
Il existe deux faons de se connecter une base de donnes
Les connexions non-persistantes (base_connect) Les connexions persistantes (base_pconnect).
Les deux types de connexions sont parfaitement identiques au niveau des fonctionnalits qu'elles apportent Nanmoins, les connexions persistantes ne se referment pas automatiquement la fin du script
PHP s'assure qu'il n'existe pas un processus semblable, dj ouvert avec les noms de serveur et d'utilisateur ainsi que le mot de passe. Si tel est le cas, ce processus est rutilis sinon un nouveau est ouvert le principal avantage des connexions persistantes est leur rutilisabilit
La connexion un SGBDR
mysql_close($id_connexion); mssql_close($id_connexion);
par
des
$chaine_numero_version = mysql_get_client_info(); $type_connexion = mysql_get_host_info($id_connexion); $protocole_connexion = mysql_get_proto_info($id_connexion); $chaine_version_serveur = mysql_get_server_info($id_connexion); $nom_hote = pg_host($id_connexion); $option_connexion = pg_options($id_connexion); $num_port = pg_port($id_connexion); $encodage = pg_client_encoding($id_connexion);
<html> body> <!-- Fichier : formulaire.php --> <form action="traitement.php" method="POST"> <table> <tr> <td>Nom </td> <td> <input type="text" size="20" name="nom_utilisateur"></td> </tr> <tr> <td>Mot de passe</td> <td>: <input type="password size="20" name="mot_de_passe"></td> </tr> <tr> <td>Serveur hte</td> <td> <input type="text" size="20" name="nom_serveur" value="<?php echo $SERVER_NAME ?> ></td> </tr> <tr> <td>Numro de port</td> <td> <input type="text" size="20" name="num_port" value="<?php echo $SERVER_PORT ?> ></td> </tr> <tr> <td>Nom SGBDR</td> <td> <input type="text" size="20" name="nom_sgbdr ></td> </tr> <tr> <td>Autre paramtre </td> <td> <input type="text" size="20" name="autre_param ></td> </tr> <tr> <td> </td> <td><input type="submit" name="Soumission value="Soumettre"> </td></tr> </table> </form> </body></html>
<?php // Fichier : traitement.php function connexion($sgbdr, $hote, $port, $utilisateur, $mot_passe,$param_sup){ if ($type == "") { echo ("Aucun SGBDR n'a t spcifi !"); return false; } else { switch ($type) { case "MySQL" : { if ($port != "") $hote .= ":". $port; $id_connexion = mysql_connect($hote, $utilisateur, $mot_passe); } case "mSQL" : { if ($port != "") $hote .= ":". $port; $id_connexion = msql_connect($hote, $utilisateur, $mot_passe); } case "SQLSever" : {$id_connexion = mssql_connect($hote,$utilisateur,$mot_passe); }
case "ODBC" : {
if ($param_sup == "")
$id_connexion = odbc_connect($hote, $utilisateur, $mot_passe); else $id_connexion = odbc_connect($hote, $utilisateur, $mot_passe, $param_sup); } case "Oracle" : { $id_connexion = ocilogon($utilisateur, $mot_passe); } case "PostgreSQL" : { $chaine_connexion = "host=" . $hote . " "; if ($port != "") $chaine_connexion .= "port=" . $port . " "; $chaine_connexion .= "user=" . $utilisateur ." password=" . $mot_passe"; if ($param_sup != "") $chaine_connexion .= " ".$param_sup; $id_connexion = pg_connect($chaine_connexion); } case "Sybase" : { if ($param_sup == "") $id_connexion = sybase_connect($hote, $utilisateur, $mot_passe); else $id_connexion = sybase_connect($hote, $utilisateur, $mot_passe, $param_sup); } default : { echo ("Le SGBDR " . $sgbdr . " n'est pas gr."); return false; } } return true; } } connexion($nom_sgbdr, $nom_serveur, $num_port, $nom_utilisateur, $mot_de_passe, $autre_param); ?>
Suite la connexion un SGBDR, il faut soit slectionner la base de donnes si elle existe dj, soit la crer.
La slection de bases de donnes s'effectue par des fonctions adaptes :
msql_select_db($nom_base_donnee,$id_connexion); mysql_select_db($nom_base_donnee,$id_connexion); sybase_select_db($nom_base_donnee,$id_connexion); pg_connect( "dbname=nom_base " . "host=nom_serveur ". "port=num_port " . "user=nom_utilisateur " ."password=mot_passe");
La cration des bases de donnes peut tre ralise par des fonctions PHP dvolues cette tche
msql_create_db($nom_base_donnee,$id_connexion); mysql_create_db ($nom_base_donnee, $id_connexion);
La suppression des bases de donnes est permise, de la mme faon qu'il est possible de les crer.
Certaines fonctions permettent de retourner la liste des bases de donnes et de leurs tables.
$id_connexion = mysql_connect('localhost', 'administrateur', 'md2N50Oml'); $liste_bases = mysql_list_dbs($id_connexion ); $nb_bases = mysql_num_rows($liste_bases); echo "<h3>Liste des bases de donnes</h3>"; for($i = 0; $i < $nb_bases; $i++){ $nom_base_donnee = mysql_db_name($liste_bases, $i); $liste_tables = mysql_list_tables($nom_base_donnee, $id_connexion); $nb_tables = mysql_num_rows($liste_tables); echo "<h3>" . $nom_base_donnee . "</h3>"; echo "<h4>Liste des tables :</h4>"; for($j = 0; $j < $nb_tables; $j++) { echo mysql_tablename($liste_tables, $j) . "<br>"; } }
$requete =
$requete =
$requete = 7";
<html> <head> <title>Liens</title> </head> <body> <table border="1" cellpadding="0" cellspacing="0"> <tr> <th>Nom du site</th> <th>URL</th> </tr> <?php // Dclaration des paramtres de connexion $host = la_machine; $user = votre_login; $bdd = Nom_de_la_base_de_donnees; $password = Mot_de_passe; // Connexion au serveur mysql_connect($host, $user,$password) or die("erreur de connexion au serveur"); mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");
// Creation et envoi de la requete $query = "SELECT nom,url FROM sites ORDER BY nom"; $result = mysql_query($query); // Recuperation des resultats while($row = mysql_fetch_row($result)){ $Nom = $row[0]; $Url = $row[1]; echo "<tr>\n <td><a href=\"$Url\">$Nom</a></td>\n <td>$Url</td>\n </tr>\n"; } // Dconnexion de la base de donnes mysql_close(); ?> </tr> </table> </body> </html>
Certaines instructions permettent de rcuprer diverses informations propos des champs d'une table rsultant d'une requte SQL.
Le nom d'un champ peut tre retourn par l'intermdiaire de certaines fonctions.
$nom = msql_fieldname($id_resultat, $num_champ); $nom = mysql_field_name($id_resultat, $num_champ); $nom = ociColumnName($id_resultat, $num_champ); $nom = pg_FieldName($id_resultat, $num_champ);
D'autres proprits peuvent tre recueillies par des instructions relatives certains gestionnaires de bases de donnes
// nom de la table parente de la colonne $nom_table = mssql_fieldtable($id_resultat, $num_champ); $nom_table = msql_tablename($id_resultat, $num_champ); $nom_table = mysql_field_table($id_resultat, $num_champ); $nom_table = mysql_tablename($id_resultat, $num_champ); // smaphore du champ comme NOT NULL, PRIMARY KEY $semaphore = msql_fieldflags($id_resultat, $num_champ); $semaphore = mysql_field_flags($id_resultat, $num_champ);
<?php $id_connexion = mysql_connect("localhost","root","emma"); mysql_select_db("utilisateur"); $requete = "SELECT * FROM tbl_utilisateur"; $id_resultat = mysql_query($requete, $id_connexion) or die ("La requte est invalide : ".$requete."<br>"); $nb_champs = mysql_num_fields($id_resultat); $ligne = mysql_fetch_row($id_resultat); $type = array(); $propriete = array(); for ($i = 0; $i < $nb_champs; $i++) { $propriete[$i]['nom'] = mysql_field_name($id_resultat, $i); $propriete[$i]['type'] = mysql_field_type($id_resultat, $i); $propriete[$i]['longueur'] = mysql_field_len($id_resultat, $i);} for($i = 0; $i < $nb_champs; $i++) { echo "<h3>Colonne n" . $i . "</h3>"; foreach($propriete[$i] as $cle => $valeur){ echo "<u>" . $cle . " :</u> <b>" . $valeur . "</b><br>";} } ?>
Le dcompte total des enregistrements ou des champs d'une table, peut tre obtenu par l'intermdiaire de certaines fonctions
$nb_champs = msql_num_fields($id_resultat); $nb_lignes = msql_num_rows($id_resultat);
Afin d'viter une surcharge de la suite au terme de leur utilisation. mmoire, des instructions PHP permettent de librer les ressources
mssql_free_result($id_resultat); msql_free_result($id_resultat); mysql_free_result($id_resultat); sybase_free_result($id_resultat);
Les erreurs gnres par la plupart des SGBDR ne sont plus traites comme des alertes. Elles sont stockes et disponibles partir d'une fonction spcifique Il est possible d'interrompre le script afin d'viter les erreurs en cascade. Deux mthodes permettent d'effectuer cette opration
Le stockage du rsultat de l'excution de la fonction dans une variable
$connect = mysql_connect($host,$user,$password);
L'utilisation de la fonction die() en cas d'erreur d'excution. Si la fonction retourne la valeur 0 (c'est--dire s'il y a une erreur) la fonction die() renvoie un message d'erreur.
mysql_connect($host,$user,$password) or die("erreur de connexion au serveur $host"); En gnral, deux fonctions PHP retournent respectivement le numro et le message de l'erreur en cours. Certains SGBDR ne grent que le message d'erreur tels que PostgreSQL et Sybase.
<?php $id_connexion = mysql_connect("localhost", "root", "mot"); if (!$id_connexion) { $message = "<h3>Une erreur est survenue :</h3>" . "<b><u>Erreur numro " . mysql_errno() . ":</u> " . mysql_error() . "</b>"; echo $message;} else {$reussite = mysql_select_db("utilsateur"); if (!$reussite) { $message = "<h3>Une erreur est survenue :</h3>" . "<b><u>Erreur numro " . mysql_errno() . ":</u> " . mysql_error() . "</b>"; echo $message;} else{$id_requete = mysql_query("SELECT datte, email, nom " . "FROM tbl_utilsateur"); if (!$id_requete) { $message = "<h3>Une erreur est survenue :</h3>" . "<b><u>Erreur numro " . mysql_errno() . ":</u> " . mysql_error() . "</b>"; echo $message; }}}?>
<?php function gestion_erreur($identifiant){ echo "Une erreur est survenue :<br>" . mysql_errno() . " : " . mysql_error(); mysql_close($identifiant); exit; } $id_connexion = mysql_connect("localhost","root","mpt"); if(!$id_connexion) gestion_erreur($id_connexion); $id_liste_bases = mysql_list_dbs($id_connexion); if(!$id_liste_bases) gestion_erreur($id_liste_bases); $nb_bases = mysql_num_rows($id_liste_bases); echo '<table width="640" border="1">'; for($i = 0; $i < $nb_bases; $i++){ $nom_base = mysql_db_name($id_liste_bases, $i); $id_liste_tables = mysql_list_tables($nom_base, $id_connexion); if(!$id_liste_tables) gestion_erreur($id_liste_tables); $nb_tables = mysql_num_rows($id_liste_tables); echo '<tr><th valign="top" width="140"><u>' . $nom_base . '</u></th><td valign="top" width="500">';
for($j = 0; $j < $nb_tables; $j++){ $nom_table = mysql_tablename($id_liste_tables, $j); $id_liste_champs = mysql_list_fields($nom_base, $nom_table, $id_connexion); if(!$id_liste_champs) gestion_erreur($id_liste_champs); $nb_champs = mysql_num_fields($id_liste_champs); echo '<table width="500" border="1"><tr><th valign="top" width="200">' . $nom_table . '</th><td valign="top" width="300">'; for($k = 0; $k < $nb_champs; $k++){ $nom_champ = mysql_field_name($id_liste_champs, $k); $type_champ = mysql_field_type($id_liste_champs, $k); $longueur_champ = mysql_field_len($id_liste_champs, $k); $semaphore_champ = mysql_field_flags($id_liste_champs, $k); echo '<u>' . $nom_champ . '</u>(' . $type_champ . ' ' . $longueur_champ . ' ' . $semaphore_champ . ')<br>';} echo '</td></tr></table>';} echo '</td></tr>'; } echo '</table>'; mysql_free_result($id_liste_bases); mysql_free_result($id_liste_tables); mysql_free_result($id_liste_champs); mysql_close($id_connexion); ?>
Par rapport au standard ANSI SQL92, il dispose dun certain nombre de fonctions additionnelles (comparaison de chanes, expressions rgulires, arithmtique sur les dates)
Le cur du systme MySql affiche une performance remarquable, tout particulirement dans les accs indexs MySql utilise une architecture multiutilisateur, multitraitement Permet dtablir des connexions rapides et dutiliser la mme mmoire cache pour plusieurs requtes
Syntaxe et conventions
Syntaxe et conventions
Les nombres
Les nombres virgule flottante utilisent le point(.) comme sparateur dcimal Les valeur ngatives sont prcdes du signe moins Les nombres entiers utiliss en relation avec les nombres virgule flottante sont interprts comme des nombres virgule flottante
Syntaxe et conventions
Les variables
Les variables peuvent contenir des nombres entiers, des nombres rels ou des chanes de caractres Les noms des variables peuvent comporter des caractres alphanumriques ainsi que les caractres spciaux . et _. Il nest pas ncessaire dinitialiser les variables, qui possde par dfaut la valeur NULL Syntaxe de Dfinition de variables
SET @variable={integer | real |string} [,@variable=] ou @variable:=expression
MySql connat les types de donnes numriques, de date et dheure ainsi que chanes
Les types de donnes numriques M : nombre maximal de chiffres affichs U (Unsigned) :le caractre de signe est omis Z(Zerofill) : les valeurs manquantes sont sont remplies par NULL D : le nombre de dcimales affiches pour les virgule flottante
TINYINT[(M)] [UNSIGNED] [ZEROFILL] : trs petit nombre entier SMALLINT[(M)] [UNSIGNED] [ZEROFILL] : petit nombre entier MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] : nombre entier myen INT[(M)] [UNSIGNED] [ZEROFILL] : nombre entier normal INTEGER[(M)] [UNSIGNED] [ZEROFILL] : synonyme de INT BIGINT[(M)] [UNSIGNED] [ZEROFILL] : grand nombre entier FLOAT(prcision) [ZEROFILL] : nombre virgule flottante sign FLOAT[(M,D)] [ZEROFILL] : petit nombre virgule flottante sign DOUBLE[(M,D)] [ZEROFILL] : petit nombre virgule flottante normal, double prcision, sign DOUBLE prcision[(M,D)] [ZEROFILL] : synonyme de double REAL[(M,D)] [ZEROFILL] : synonyme de double DECIMAL[(M[,D])] [ZEROFILL] : nombre virgule flottante sign NUMERIC(M,D) [ZEROFILL] : synonyme de DECIMAL
d'une liste : ou encore la valeur NULL ou la valeur d'erreur spciale "". SET('value1','value2',...) :Une chane de caractres qui a zro, un ou plusieurs valeurs issues d'une liste
:chane de caractre de longueur variable : taille maximale 255 caractres : taille maximale 65535 caractres : taille maximale 16777215 caractres : taille maximale 4294967295caractres :Une chane de caractres qui n'a qu'une seule valeur, issue
Les oprateurs arithmtiques +, -, *, / Les oprateurs logiques NOT (!), OR(||), AND(&&) Les oprateurs de comparaison =, <> (!=), <=, <, >=, >
Select NomArt, PrixArt AS Prix, PrixArt * 0.196 AS TVA PrixArt / 10 as Marge From article as A, groupeArticle as G Where A.NumGrArt=G.NumGrArt And ( G.NumGrArt<>1 OR Not (A.type = 2))
Cration, suppression et utilisation dune base de donnes Cration de bases de donnes CREATE DATABASE nom_bd Suppression de bases de donnes DROP DATABASE [IF EXISTS] nom_bd
Le mot-cl IF EXISTS est utilis pour viter que la tentative de supprimer une base de donnes inexistante ne donne lieu une erreur
Sybtaxe :
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition, )) [table_options] [select_statement] Create_definition : Col_name type [NOT NULL|NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition] OU PRMARY KEY (index_col_name, ) OU KEY [index_name](index_col_name, ) OU INDEX [index_name](index_col_name, ) OU UNIQUE [INDEX] [index_name] (index_col_name, ) OU [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name) OU [reference_definition] OU CHECK (expr)
CREATE TABLE article ( NumArt BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, numCde VARCHAR(25) NOT NULL, NomART VARCHAR(100) NOT NULL, TexteArt MEDIUMTEXT NOT NULL, PrixArt DECIMAL(8,2) NOT NULL NumGrArt BIGINT NOT NULL, NumSGrArt BIGINT NOT NULL, );
Modifier la structure dune table existante ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec] Alter_specification
ADD [COLUMN] create_definition [FIRST | AFTER column_name] ADD PRIMARY KEY (index_col_name, ) OU ADD UNIQUE [index_name] (index_col_name, ) OU CHANGE [COLUMN] old_col_name create_definition MODIFY [COLUMN] create_definition DROP [COLUMN] col_name DROP PRIMARY KEY OU DROP INDEX index_name RENAME [AS] new_tbl_name OU Table_options
OU
OU OU OU OU
Remplacer un enregistrement
Un ancien enregistrement dans la table, qui a la mme valeur quun nouvel enregistrement pour une cl, est supprim de la table avant dinsrer un nouvel enregistrement
REPLACE INTO article (NumCde, NomArt, TexteArt, PrixArt, NumGrArt, NumSGrart) VALUES (1-999-999-999, articl1, cest un autre artcile, 12, 1, 1)
Slection denregistrement
Syntaxe
SELECT [DISTINCT|ALL] expression_de_selection FROM tebles WHERE expression_where GROUP BY col_name, ] HAVING where_definition] [ORDER BY [ASC|DESC]]
Exemples SELECT * FROM article WHERE PrixArt > 50 SELECT NumGrArt, AVG(PrixArt) FROM article GROUP BY NumArt
PDO : PHP Data Objects Extension PHP fournissant une interface pour accder une base de donnes Fournit une interface d'abstraction pour l'accs aux donnes Ne fournit PAS une abstraction de base de donnes SQL spcifique au moteur Fonctionnalits prsentes / absentes Interface oriente objet
10:27:15 59
Pr og ra m m ati on We b 20 12 20 13
Bases de donnes supportes FreeTDS / Microsoft SQL Server / Sybase Firebird/Interbase 6 IBM DB2
PDO_INFORMIX
PDO_MYSQL PDO_OCI PDO_ODBC PDO_PGSQL
PDO_SQLITE
PDO_4D
SQLite 3 et SQLite 2
4D
10:27:15 60
10:27:15
61
Pr og ra m m ati on We b 20 12 20 13
10:27:15
62
Pr og ra m m ati on We b 20 12 20 13
Instanciation d'un objet PDO $dbh=new PDO(DSN [, user [, pass [, options]]]); DSN : Data Source Name
nom_du_driver:syntaxe_spcifique_au_driver Ex : mysql:host=localhost;dbname=ma_base
10:27:15
63
Pr og ra m m ati on We b 20 12 20 13
10:27:15
64
<?php try { $dbh = new PDO('mysql:host=h;dbname=db', $user, $pass) ; $dbh = null ; } catch (PDOException $e) { echo "Erreur: ".$e->getMessage()."<br/>" ; die() ; } ?>
10:27:15 65
Pr og ra m m ati on We b 20 12 20 13
PDO::ERRMODE_WARNING
Mise en place du code d'erreur mission d'une erreur de type E_WARNING
PDO::ERRMODE_EXCEPTION
Mise en place du code d'erreur Objet PDOException lanc
10:27:15
66
Pr og ra m m ati on We b 20 12 20 13
<?php try { $dbh = new PDO('mysql:host=h;dbname=db', $user, $pass) ; $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh = null ; } catch (PDOException $e) { echo "Erreur: ".$e->getMessage()."<br/>" ; die() ; } ?>
10:27:15
67
Pr og ra m m ati on We b 20 12 20 13
<?php $pdo = new PDO("mysql:host=localhost") ; $pdostat = $pdo->query("COUCOU") ; if ($pdo->errorCode()) { Code SQLSTATE echo "ERREUR !!\n" ; echo "<pre>\n" ; var_dump($pdo->errorInfo()) ; Code erreur spcifique echo "</pre>\n" ; du driver } ?> !! ERREUR array(3) { Chane erreur spcifique [0]=> string(5) "42000" au driver [1]=> int(1064)
}
10:27:15
68
Pr og ra m m ati on We b 20 12 20 13
<?php try { $pdo = new PDO("mysql:host=localhost") ; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) ; $pdostat = $pdo->query("COUCOU") ; Code erreur spcifique } du driver catch (Exception $e) { echo "ERREUR : ".$e->getMessage() ; Chane erreur spcifique Code SQLSTATE } au driver ?>
ERREUR : SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe prs de 'COUCOU' la ligne 1
10:27:15
69
Pr og ra m m ati on We b 20 12 20 13
<?php try { $pdo = new PDO("mysql:host=localhost") ; $pdostat = $pdo->query("SELECT * FROM clients") ; } catch (Exception $e) { echo "ERREUR : ".$e->getMessage() ; } ?>
10:27:15
70
Pr og ra m m ati on We b 20 12 20 13
10:27:16
71
try { $pdo=new PDO("mysql:host=localhost;dbname=mysql") ; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdostat = $pdo->query("SELECT * FROM user") ; $pdostat->setFetchMode(PDO::FETCH_ASSOC) ; foreach ($pdostat as $ligne) { echo implode(';', $ligne)."<br>\n" ; } } catch (Exception $e) { echo "ERREUR : ".$e->getMessage() ; }
10:27:16
72
Pr og ra m m ati on We b 20 12 20 13
try { $pdo=new PDO("mysql:host=localhost;dbname=mysql") ; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdostat = $pdo->query("SELECT * FROM user") ; foreach ($pdostat->fetchAll(PDO::FETCH_ASSOC) as $ligne) { echo implode(';', $ligne)."<br>\n" ; } } catch (Exception $e) { echo "ERREUR : ".$e->getMessage() ; }
10:27:16
73
Pr og ra m m ati on We b 20 12 20 13
try { $pdo=new PDO("mysql:host=localhost;dbname=mysql") ; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdostat = $pdo->query("SELECT * FROM user") ; while ($ligne = $pdostat->fetch(PDO::FETCH_ASSOC)) { echo implode(';', $ligne)."<br>\n" ; } } catch (Exception $e) { echo "ERREUR : ".$e->getMessage() ; }
10:27:16
74
Pr og ra m m ati on We b 20 12 20 13
PDO::FETCH_ASSOC
PDO::FETCH_NUM
retourner chaque ligne dans un tableau index par les noms des colonnes comme elles sont retournes dans le jeu de rsultats correspondant. Si le jeu de rsultats contient de multiples colonnes avec le mme nom, PDO::FETCH_ASSOC retourne une seule valeur par nom de colonne.
retourner chaque ligne dans un tableau index par le numro des colonnes comme elles sont retournes dans le jeu de rsultats correspondant, en commenant 0.
10:27:16
75
Pr og ra m m ati on We b 20 12 20 13
PDO::FETCH_BOTH
retourner chaque ligne dans un tableau index par les noms des colonnes ainsi que leurs numros, comme elles sont retournes dans le jeu de rsultats correspondant, en commenant 0.
PDO::FETCH_OBJ
retourner chaque ligne dans un objet avec les noms de proprits correspondant aux noms des colonnes comme elles sont retournes dans le jeu de rsultats.
Pr og ra m m ati on We b 20 12 20 13
10:27:16
76
PDO::FETCH_BOUND
retourner true et assigner les valeurs des colonnes du jeu de rsultats dans les variables PHP auxquelles elles sont lies avec la mthode PDOStatement::bindParam() ou la mthode PDOStatement::bindColumn().
PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE
retourner une nouvelle instance de la classe demande, liant les colonnes aux proprits nommes dans la classe. Nom de la classe = 1re colonne.
Pr og ra m m ati on We b 20 12 20 13
10:27:16
77
PDO::FETCH_INTO
met jour une instance existante de la classe demande, liant les colonnes du jeu de rsultats aux noms des proprits de la classe.
PDO::FETCH_LAZY
retourner chaque ligne en tant qu'objet avec les noms des attributs correspondant aux noms des colonnes retournes dans le jeu de rsultats. PDO::FETCH_LAZY cre les noms des attributs de l'objet comme ils sont rencontrs.
10:27:16
78
Pr og ra m m ati on We b 20 12 20 13
1. 2. 3. 4.
Excution rpte d'une requte : 1+2+3+4 Prparation d'une requte : 1+2+3 Excution rpte d'une requte prpare : 4 Prparation en fonction de paramtres :
Anonymes Nomms
10:27:16
79
Pr og ra m m ati on We b 20 12 20 13
statement : la requte prparer. Peut contenir des paramtres anonymes (?) ou nomms (:nom) driver_options : tableau d'options du driver retourne un objet PDOStatement qui effectuera l'association des paramtres et excutera la requte
Pr og ra m m ati on We b 20 12 20 13
$pdo=new PDO("mysql:host=localhost;dbname=mysql") ; $pdostat = $pdo->prepare( "SELECT * FROM user WHERE User= ?") ;
10:27:16
80
10:27:16
81
Pr og ra m m ati on We b 20 12 20 13
$pdo=new PDO("mysql:host=localhost;dbname=mysql") ; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdostat = $pdo->prepare( "SELECT * FROM user WHERE User= ?") ; $pdostat->bindValue(1, 'root') ; paramtre anonyme $pdostat->execute() ; // Utilisation du rsultat $pdostat->bindValue(1, 'cutrona') ; $pdostat->execute() ; // Utilisation du rsultat
Association Prparation d'une valeur valeur dela larequte au requte 1er paramtre Association Excution d'une de au 1er paramtre
10:27:16
82
Pr og ra m m ati on We b 20 12 20 13
$pdo=new PDO("mysql:host=localhost;dbname=mysql") ; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdostat = $pdo->prepare( "SELECT * FROM user WHERE User= :utilisateur") ; $pdostat->bindValue(':utilisateur', 'root') ; paramtre nomm $pdostat->execute() ; // Utilisation du rsultat $pdostat->bindValue(':utilisateur', 'cutrona') ; $pdostat->execute() ; // Utilisation du rsultat
Association Prparation Excution d'une valeur de dela au larequte requte paramtre nomm
10:27:16
83
Pr og ra m m ati on We b 20 12 20 13
$pdo=new PDO("mysql:host=localhost;dbname=mysql") ; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdostat = $pdo->prepare( "SELECT * FROM user WHERE User= ?") ; $pdostat->execute(array('root')) ; paramtre anonyme // Utilisation du rsultat $pdostat->execute(array('cutrona')) ; // Utilisation du rsultat
Association Association Prparation Excution d'une d'une valeur valeur de dela laau requte au requte 1er 1er paramtre paramtre
10:27:16
84
Pr og ra m m ati on We b 20 12 20 13
$pdo=new PDO("mysql:host=localhost;dbname=mysql") ; $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdostat = $pdo->prepare( "SELECT * FROM user WHERE User= :utilisateur") ; $pdostat->execute( paramtre nomm array(':utilisateur' => 'root')) ; // Utilisation du rsultat $pdostat->execute( array(':utilisateur' => 'cutrona')) ; // Utilisation du rsultat
Association Prparation Excution d'une valeur de dela au larequte requte paramtre nomm
10:27:16
85
Pr og ra m m ati on We b 20 12 20 13
Amlioration des performances en cas d'excutions rptes mulation faite par PDO si le driver ne les supporte pas nativement Protection automatique des valeurs des paramtres pour interdire les attaques par injection de code SQL
10:27:16
86
Pr og ra m m ati on We b 20 12 20 13
Ex : validation d'un login/pass sur un site Requte consistant trouver un enregistrement correspondant au couple login/pass fourni par l'utilisateur SELECT * FROM membre WHERE mail='{$_GET['mail']}' AND passwd='{$_GET['passwd']}' Et si on essayait de fournir un mot de passe un peu particulier
10:27:16 87
Pr og ra m m ati on We b 20 12 20 13
$pdo = new PDO('mysql:host=localhost;dbname=test') ; $pdostat = $pdo->query($req = <<<SQL SELECT * FROM membre WHERE mail='{$_GET['mail']}' AND passwd='{$_GET['passwd']}' SQL ) ; echo "Requte:\n$req\n" ; if ($utilisateur = $pdostat->fetch()) echo "Bienvenue {$utilisateur['nom']}" ; else echo "Dsol..." ;
10:27:16
88
Pr og ra m m ati on We b 20 12 20 13
Saisie de l'utilisateur :
mail : whatever pass : who_cares?
URL :
?mail=whatever&passwd=who_cares?
Requte: SELECT * FROM membre WHERE mail='whatever' AND passwd='who_cares?' Dsol...
10:27:16
89
Pr og ra m m ati on We b 20 12 20 13
Saisie de l'utilisateur :
mail : whatever pass : who_cares?' OR true!='
URL :
?mail=whatever&passwd=who_cares?'%20OR%20true! ='
Requte: SELECT * FROM membre WHERE mail='whatever' AND passwd='who_cares?' OR true!='' Bienvenue John
Pr og ra m m ati on We b 20 12 20 13
10:27:16
90
$pdo = new PDO('mysql:host=localhost;dbname=test') ; $pdostat = $pdo->prepare($req = <<<SQL SELECT * FROM membre WHERE mail=? AND passwd=? SQL ) ; $pdostat->execute(array($_GET['mail'], $_GET['passwd'])) ; if ($utilisateur = $pdostat->fetch()) { echo "Bienvenue {$utilisateur['nom']}\n" ; } else { echo "Dsole...\n" ; }
10:27:16
91
Pr og ra m m ati on We b 20 12 20 13
$pdo = new PDO('mysql:host=localhost;dbname=test') ; $mail = $pdo->quote($_GET['mail']) ; $passwd = $pdo->quote($_GET['passwd']) ; $pdostat = $pdo->query($req = <<<SQL SELECT * FROM membre WHERE mail=$mail AND passwd=$passwd SQL Requte: ) ; SELECT * echo "Requte:\n$req\n" ; FROM membre if ($utilisateur = $pdostat->fetch()) WHERE mail='whatever' { echo "Bienvenue {$utilisateur['nom']}\n" ; } AND passwd='who_cares?\' OR true!=\'' else { echo "Dsole...\n" ; } Dsol...
10:27:16
92
Pr og ra m m ati on We b 20 12 20 13
mysql_connect('localhost'); mysql_select_db('test'); $mail = mysql_real_escape_string($_GET['mail']); $passwd = mysql_real_escape_string($_GET['passwd']); $res = mysql_query($req = <<<SQL SELECT * FROM membre WHERE mail='$mail' AND passwd='$passwd' SQL ) ; Requte: if (mysql_num_rows($res) == 1 ) { SELECT * $utilisateur = mysql_fetch_assoc($res) ; FROM membre echo "Bienvenue {$utilisateur['nom']}\n" ; WHERE mail='whatever' } AND passwd='who_cares?\' OR true!=\'' else { echo "Desole...\n" ; } Dsol...
10:27:11
93
Pr og ra m m ati on We b 20 12 20 13
Transactions :
Atomicit, Consistance, Isolation et Durabilit BEGIN puis COMMIT ou ROLLBACK
PDO::beginTransaction() PDO::commit() PDO::rollBack() Tous les moteurs ne supportent pas les transactions PDOException
10:27:11 94
Pr og ra m m ati on We b 20 12 20 13