Anda di halaman 1dari 94

De l'esprit la machine L'approche Professo-Acadmique

PHP Avanc

Abdelahad SATOUR

PHP 5 et POO

1. 2. 3. 4.

MySQL MySQL PHP MySQL Avanc PDO

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

mssql_connect("nom_serveur","nom_utilisateur","mot_passe"); ocilogon("nom_utilisateur","mot_passe", "nom_base"); pg_connect("dbname=nom_base,host=nom_serveur port=num_port" "user=nom_utilisateur password=mot_passe"); sybase_connect("nom_serveur","nom_utilisateur","mot_passe");

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);

La dconnexion des bases de donnes s'effectue l'intermdiaire des fonctions de fermeture

par

Plusieurs fonctions PHP permettent de retourner informations propos de la connexion en cours


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); ?>

L'accs aux bases de donnes

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);

L'accs aux bases de donnes

Cration dune base de donnes la fonction create_db() attend deux paramtres


Une variable de type String portant le nom de la base de donnes crer Lidentificateur de connexion de la connexion courante
function creatdb($db, $lkid) { if (! $res=mysql_create_db($db, $lkid) { echo mysql_error ($lkid); exit; } return $res; } ?>

L'accs aux bases de donnes


Si la cration d'une base de donnes n'est pas possible l'aide de fonctions, il est possible de crer une base l'aide d'une requte SQL.
$requete = "CREATE DATABASE nom_base_donnee"; $id_requete = ociparse($requete, $id_connexion); ociexecute($id_requete);

La suppression des bases de donnes est permise, de la mme faon qu'il est possible de les crer.

msql_drop_db($nom_base_donnee, $id_connexion); mysql_drop_db ($nom_base_donnee, $id_connexion);

L'accs aux bases de donnes

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>"; } }

Les requtes SQL


Les requtes doivent rpondre la syntaxe SQL en gnral et ventuellement aux singularits des diffrents diteurs de SGBDR. Les requtes SQL permettent d'accomplir une action sur une base de donnes comme la slection d'informations, la cration de tables, l'ajout, la suppression ou la modification des enregistrements. Les requtes SQL sont envoyes la base de donnes dfinie par un identificateur de connexion
$requete = "SELECT * FROM table WHERE champ = \"valeur\""; $id_resultat = mssql_query($requete, $id_connexion); $id_resultat1 = mysql_query($requete, $id_connexion);

Les requtes SQL


$requete = "CREATE TABLE tbl_nom (" ."nom_champ1 INTEGER PRIMARY KEY," . "nom_champ2 CHAR(50) UNIQUE," . "nom_champ3 DATETIME)"; "INSERT INTO tbl_nom " . "(nom_champ1, nom_champ2,.nom_champ3) " . "VALUES('valeur','valeur2','valeur3')"; "SELECT * FROM tbl_nom " . "WHERE nom_champ2 = 'valeur'"; "DELETE FROM tbl_nom " . "WHERE nom_champ3 < SYSDATE -

$requete =

$requete =

$requete = 7";

Traitement des rsultats dune requte


La variable contenant l'ensemble des enregistrements retourns par une requte n'est pas exploitable telle quelle. On utilise la fonction mysql_fetch_row(), qui dcoupe les lignes de rsultat en colonnes (par exemple Nom,adresse,...) et les affecte une variable tableau dans l'ordre o elles arrivent. Exemple: une table appele liens contenant le nom et l'URL de sites internet. rcuprer l'ensemble des enregistrements et de les afficher dans un tableau

<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>

Les proprits de colonnes

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);

Le type du champ est obtenu en utilisant des fonctions spcifiques.


$type_donnee = msql_fieldtype($id_resultat, $num_champ); $type_donnee = mysql_field_type($id_resultat, $num_champ); $type_donnee = ociColumnType($id_resultat, $num_champ); $type_donnee = pg_FieldType($id_resultat, $num_champ);

Les proprits de colonnes

D'autres fonctions renvoient la longueur d'un champ


$longueur = mssql_field_length($id_resultat, $num_champ); $longueur = msql_fieldlen($id_resultat, $num_champ); $longueur = mysql_field_len($id_resultat, $num_champ); $longueur = ociColumnSize($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>";} } ?>

L'exploitation des donnes

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);

$nb_champs = mysql_num_fields($id_resultat); $nb_lignes = mysql_num_rows($id_resultat);


$nb_champs = ociNumCols($id_resultat); $nb_lignes = ociRowCount($id_resultat);

$nb_champs = pg_NumFields($id_resultat); $nb_lignes = pg_NumRows($id_resultat);


$nb_champs = sybase_num_fields($id_resultat); $nb_lignes = sybase_num_rows($id_resultat);

L'exploitation des donnes


A partir des enregistrements, chacun des champs devient accessible aisment par des fonctions appropries. Certaines fonctions sont capables d'extraire directement un champ dtermin
$valeur = mssql_result($id_resultat, $num_ligne, $num_col) $valeur = msql_result($id_resultat, $num_ligne, $num_col); $valeur = mysql_result($id_resultat, $num_ligne, $num_col); $valeur = pg_result($id_resultat, $num_ligne, $num_col); $valeur = sybase_result($id_resultat, $num_ligne, $num_col);

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);

La gestion des erreurs

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.

La gestion des erreurs


// message d'erreur gnr par Microsoft SQL Server $message = mssql_get_last_message();
// numro et message d'erreur due la dernire action pour MySQL $num_erreur = mysql_errno([$id_connexion]); $message = mysql_error([$id_connexion]); // message d'erreur gnr par mSQL $message = msql_error(); // message d'erreur pour une connexion ou une requte Oracle 8 $message = ociError([$id_connexion | $id_requete]); // message d'erreur gnr par PostgreSQL $message = pg_ErrorMessage($id_connexion); // message d'erreur gnr par Sybase $message = sybase_get_last_message();

<?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); ?>

Principe des bases de donnes MySQL


MySql sappuie sur le standard ANSI SQL92
Par rapport au standard ANSI SQL92, il manque les instructions SELECT imbriques

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

Les chanes de caractres


Notes entre des guillemets simples Notes entre des guillemets doubles dans le cas o la base utilise le mode ANSI Les squences dchappement
\0 \n \t \r \b \ \" \\ % \_ ASCII 0 (NUL) Saut de ligne. Correspond au caractre ASCII CHR(13) Tabulation. Correspond au caractre ASCII CHR(9) Retour chariot. Correspond au caractre ASCII CHR(10) Retour caractre Guillemet simple Guillemet double Barre oblique inverse Pourcentage caractre soulign

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

Mysql prend en charge les nombres hexadcimaux


NULL signifie aucune donne et ne doit pas tre confondu avec le nombre 0 ou la chane de caractre vide "" .

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

Les types de donnes

MySql connat les types de donnes numriques, de date et dheure ainsi que chanes

Les types de donnes

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

Les types de donnes


Les types de donnes de date et dheure
DATE : Date DATETIME : Date et heure TIMESTAMP[(M)] : Tampon horaire UNIX TIME : Heure YEAR[(2|4)] : Anne

Les types de donnes


Les types de donnes chanes
CHAR(M) M VARCHAR(M) TINYBLOB, TINYTEXT BLOB, TEXT MEDIUMBLOB, MEDIUMTEXT LONGBLOB, LONGTEXT ENUM('value1','value2',...) : chane de caractre de longueur fixe

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 de MySql

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))

Dfinition et manipulation des donnes


DDL : langage de dfinition de donnes Dfinition de tables et de domaine de valeurs DML : langage de manipulation de donnes Modification et slection denregistrement dans les tables DCL : langage de contrle de donnes Contrle des accs aux objets et aux oprations, contrle des transactions Nest pas pris en charge dans MySql (version 3.22.32)

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

Utilisation dune base de donnes USE nom_bd


Permet dtablir que la base de donnes spcifies est la base de donnes par dfaut. Toutes les requtes suivantes se rapportent donc cette base de donnes.

Dfinition et modification de la structure dune table


Cration dune Table
CREATE TABLE : permet de crer une nouvelle table dans la base de donnes courante

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)

Dfinition et modification de la structure dune table


Cration dune Table
CREATE TABLE : permet de crer une nouvelle table dans la base de donnes courante Syntaxe : Lattribut AUTO_INCREMENT : signifie que le contenu dun champ de type INTEGER est incrment automatiquement dune unit aprs linsertion dun nouvel enregistrement. Ne peut tre affect quune seule fois une table donne Lattribut PRIMARY_KEY : dfinit une cl dindex primaire unique Chaque table peut comporter au maximum une cl dindex primaire. Une cl dindex primaire peut tre forme partir dune combinaison dun maximum de 32 colonnes Les colonnes dune cl dindex primaire doivent tre dfinies avec le paramtre NOT NULL

Dfinition et modification de la structure dune table


Cration dune Table Syntaxe :
Lattribut UNIQUE_KEY : dfinit une cl dindex. Elle ne peut comporter que des valeurs uniques. Lattribut INDEX : dfinit un index. Les champs TEXT et BLOB ne peuvent pas tre indexs Les cls trangres : ne sont pas encore prises en charge par MySQL

Dfinition et modification de la structure dune table


Cration dune Table Exemple:

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, );

Dfinition et modification de la structure dune table


Suppression dune Table
DROP TABLE [IF EXISTS] tbl_name [, tbl_name, ]

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

Saisie, modification et suppression denregistrement


Insrer de nouveaux enregistrement
INSERT INTO article (NumCde, NomArt, TexteArt, PrixArt, NumGrArt, NumSGrart) VALUES (1-001-001-001, articl1, cest un article, 7.95, 1, 1);

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)

Saisie, modification et suppression denregistrement


Lecture denregistrements partir dun fichier
LOAD DATA LOCAL INFILE c:/apache/www3_docs/donnees.txt INTO TABLE article FIELDS TERMINATED BY , (NUMcde, NomArt, TexteArt, PrixArt, NumGrArt, NumSGrArt); Les donnes figurent dans le fichier donnees.txt Les donnes sont spares par des virgules Les donnes ont \n comme caractre de fin de ligne Le mot cl LOCAL indique que le fichier de donnes se trouve sur lhte client dans le rpertoire spcifi.

Modification des valeurs dans des champs dune table

UPDATE tbl_name SET col_name=expr1, col_name2=expr2, [WHERE section_condition_where]

Suppression denregistrements DELETE FROM tbl_name [WHERE_definition]

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

Nom du driver PDO_DBLIB PDO_FIREBIRD PDO_IBM

Bases de donnes supportes FreeTDS / Microsoft SQL Server / Sybase Firebird/Interbase 6 IBM DB2

PDO_INFORMIX
PDO_MYSQL PDO_OCI PDO_ODBC PDO_PGSQL

IBM Informix Dynamic Server


MySQL 3.x/4.x/5.x Oracle Call Interface ODBC v3 (IBM DB2, unixODBC et win32 ODBC) PostgreSQL
Pr og ra m m ati on We b 20 12 20 13

PDO_SQLITE
PDO_4D

SQLite 3 et SQLite 2
4D
10:27:15 60

PDO : connexion PHP / base de donnes


__construct() exec(), prepare(), query() errorCode(), errorInfo() getAttributes(), setAttribute() lastInsertId(), quote() beginTransaction() commit(), rollBack() getAvailableDrivers()

10:27:15

61

Pr og ra m m ati on We b 20 12 20 13

PDOStatement : requte prpare, jeu de rsultats


bindColumn(), bindParam(), bindValue(), closeCursor() errorCode(), errorInfo() fetch(), fetchAll(), fetchColumn(), fetchObject(), setFetchMode(), nextRowset() rowCount(), columnCount(), getColumnMeta() getAttribute(), setAttribute() execute() debugDumpParams()

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

user : nom d'utilisateur, pass : mot de passe options : tableau associatif


spcifiques au driver Ex : array(PDO::ATTR_PERSISTENT => true)) ;

nom_du_driver:syntaxe_spcifique_au_driver Ex : mysql:host=localhost;dbname=ma_base

Fin de connexion : $dbh=null ; ou unset($dbh) ;

10:27:15

63

Pr og ra m m ati on We b 20 12 20 13

Connexion par construction d'un objet Gestion envisageable des erreurs


Aucune Fin brutale (exit, die) tat Exception
Pr og ra m m ati on We b 20 12 20 13

En cas d'erreur de connexion


Objet PDOException lanc PDOException hrite de Exception

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_SILENT (par dfaut)


Mode silencieux, mise en place d'un code d'erreur PDO : errorCode() / errorInfo() PDOStatement : errorCode() / errorInfo()

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)
}

[2]=> string(47) "Erreur de syntaxe prs de 'COUCOU' la ligne 1"

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

PDOStatement PDO::query ( string statement )


Rsultat de requte Requte

<?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

Rcupration des donnes ligne ligne Une ligne peut tre :


un un un un un tableau index tableau associatif tableau mixte (par dfaut) objet anonyme objet d'une classe dfinie par l'utilisateur
Pr og ra m m ati on We b 20 12 20 13

Rcupration des donnes d'une colonne

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.

Droulement d'une requte SQL


Analyse Compilation Optimisation Excution

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

PDOStatement PDO::prepare(string statement [, array driver_options])

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

bool PDOStatement::bindValue(mixed parameter, mixed value [, int data_type])


parameter : le paramtre (nom ou position [1n]) value : sa valeur data_type : le type de la valeur PDO::PARAM_BOOL boolen. PDO::PARAM_NULL NULL SQL. PDO::PARAM_INT INTEGER SQL. PDO::PARAM_STR CHAR, VARCHAR ou autre chane. PDO::PARAM_LOB "objet large" SQL.

bool PDOStatement::execute([array parameters])

parameters : tableau associatif ou index des valeurs

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

Mode PDO par dfaut :


Chaque requte est valide automatiquement

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

Anda mungkin juga menyukai