Le passage par référence des paramètres est supporté par l utilisation de valeur de type référence &. Les fonctions peuvent retourner des références



Documents pareils
PDO : PHP Data Object 1/13

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

PHP 5. La base de données MySql. A. Belaïd 1

PHP. PHP et bases de données

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

CREATION WEB DYNAMIQUE

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Mysql. Les requêtes préparées Prepared statements

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Introduction à JDBC. Accès aux bases de données en Java

OpenPaaS Le réseau social d'entreprise

Java DataBaseConnectivity

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

1. Base de données SQLite

Notes de cours : bases de données distribuées et repliquées

PHP 4 PARTIE : BASE DE DONNEES

Programmer en JAVA. par Tama

I. MySQL : Serveur et SGBD

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Mysql avec EasyPhp. 1 er mars 2006

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Application web de gestion de comptes en banques

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

PHP 5.4 Développez un site web dynamique et interactif

Gestion des utilisateurs et de leurs droits

Projet Viticulture - TP 3 : bases de données distantes BTS Services informatiques aux organisations

Pratique et administration des systèmes

as Architecture des Systèmes d Information

Chapitre 2. Classes et objets

Stockage du fichier dans une table mysql:

Configurer la supervision pour une base MS SQL Server Viadéis Services

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Le langage SQL (première partie) c Olivier Caron

Olivier Mondet

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Dans l'article précédent, vous avez appris

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une application

RMI le langage Java XII-1 JMF

A QUOI SERVENT LES BASES DE DONNÉES?

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

TP1 : Initiation à Java et Eclipse

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Les BASES de DONNEES dans WampServer

LES ACCES ODBC AVEC LE SYSTEME SAS

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Bases de données relationnelles

Diagramme de classes

Java et les bases de données

Installation FollowMe Q server

Héritage presque multiple en Java (1/2)

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Paginer les données côté serveur, mettre en cache côté client

Projet de programmation (IK3) : TP n 1 Correction

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Généralités sur le Langage Java et éléments syntaxiques.

Construire une base de donnée pour bibliothèque

TP Contraintes - Triggers

Compte-rendu de projet de Système de gestion de base de données

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Mise en oeuvre d'une base de données mono-utilisateur avec SQLite

Information utiles. webpage : Google+ : digiusto/

Bases de Données relationnelles et leurs systèmes de Gestion

Cours 14 Les fichiers

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

laposte.net) Ministère de l'éducation nationale Atelier sécurité Rabat RALL 2007

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Encryptions, compression et partitionnement des données

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Initiation à JAVA et à la programmation objet.

Premiers Pas en Programmation Objet : les Classes et les Objets

SYSTÈMES D INFORMATIONS

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Test de HSQLDB et Comparatif avec Sqlite

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Installation et Mise en œuvre de MySQL

Bases de données et sites WEB

Partie 0 : Gestion des tablespace et des utilisateurs... 3

Introduction aux SGBDR

Bases de SQL. Hacks 1-6 CHAPITRE UN

Remote Method Invocation (RMI)

Bases de données Cours 1 : Généralités sur les bases de données

Guide d'installation sous Windows

Installation d'un serveur FTP géré par une base de données MySQL

Langage Java. Classe de première SI

PHP et les Bases de données - Généralités

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Transcription:

Modèle de programmation Un programme PHP est habituellement structuré selon le modèle procédural : le programmeur définit des données structurées et les traitements de ces données sous forme de procédures (les fonctions PHP) function nomfonction(arguments){ Instructions Les fonctions PHP sont récursives et admettent un nombre quelconque d arguments. À partir d un certain rang, on peut fixer des valeurs par défaut aux arguments. La valeur de retour est unique et peut avoir un type quelconque. Le passage par référence des paramètres est supporté par l utilisation de valeur de type référence &. Les fonctions peuvent retourner des références function &getreference(){ return $ref; On peut définir des références de fonctions à l aide de leur nom les fonctions variables function foo(){ echo foo() <br/> \n"; $func='foo'; $func(); //Appel de foo() Les objets : encapsulation On regroupe dans la même entité des données structurées et les fonctions qui les manipulent Les données sont généralement appelées attributs et les procédures de traitement sont appelées méthodes. Idéalement, pour accéder aux données on passe par les méthodes => notion d interface : isoler l implémentation d un objet à la manière d un type de donnée abstrait. Deux modèles coexistent PHP4 (deprecated) et PHP5. On présente le modèle de PHP5 (meilleures performances et modèle plus riche). Manipulation d objets Les objets sont manipulés par l intermédiaire de références. Un attribut d un objet peut-être accédé par la notation suivante : référence_objet->nom_du_champ Une méthode d un objet peut être appelée par la notation suivante : référence_objet->nom_de_la_méthode(valeurs) Modèle à héritage de classe Le type d un objet est défini par une classe (description d un objet : attributs et méthodes) déclaration : Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 1

[abstract final] class Nom [extends ClasseMère] [implements Interface[, Interface]] { //déclaration d un attribut [public protected private] [static] $att [= valeur]; //déclaration d une constante const NOM = valeur ; //déclaration d une méthode [public protected private] [abstract final] [static] function f(args..)[ {... ;] La classe est une usine à objets et peut posséder des attributs partagés entre toutes les instances. Mots clés et variables réservées (méthodes) La variable $this référence l instance courante sur laquelle on exécute une méthode d instance (lecture seule). On accède aux attributs et aux méthodes par la construction syntaxique suivante : $this->nomattributoumethode // pas de $ devant un attribut Les variables et méthodes de classe sont appelées en utilisant l opérateur :: nomclasse::nomattributoumethode $this n est pas défini pour les méthodes de classe. Les constantes dans une classe sont accessibles par : self::nomconstante Instanciation d objets Création d objets à partir d une classe = instanciation on utilise le mot clé new et on invoque implicitement un constructeur (fonction magique unique) [public protected private] function construct() {... Une référence est créée sur la représentation de l objet en mémoire centrale, l identifiant de manière unique. La référence NULL est retournée si l objet ne peut être créé class Test{ private $nom; public function construct($nom){ $this->nom = $nom;echo "Say Hello to $this->nom"; $reftoto = new Test("moi"); Référence à un objet Tas titi Ref2 String s2 = titi ; Ref1 String s1 = toto ; toto Tas titi Ref2 s2 = s1; Ref1 Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 2

toto $o1 = new Toto(); $o2 = new Titi(); $o2 = $o1; Gestion de la mémoire et objets La référence sur un objet en mémoire centrale doit être affectée à une variable. Lorsqu il n y a plus de référence sur un objet dans un programme, celui-ci est libéré. La libération d un objet entraîne l exécution d une fonction magique : le destructeur. [public protected private] function destruct(){... La référence sur un objet en mémoire centrale doit être conservée dans une variable : class Test{ public $nom; public function construct(){ echo "Say Good bye to $this->nom"; new Test(); //exécution immédiate du destructeur Les modificateurs d accès private : l'attribut (resp. la méthode) n est visible qu à l intérieur de la classe (pas d étanchéité entre instances). protected : l'attribut (resp. la méthode) n est visible qu à l intérieur de la classe et dans les classes dérivées. public : l'attribut (resp. la méthode) appartient à l interface utilisateur de la classe, ce sont les seuls éléments visibles pour un utilisateur (extérieur) de la classe. C'est l'accès par défaut => le mot clé public est optionnel. En cas de redéfinition, on ne peut pas restreindre l accessibilité (exemple public -> private) Réutilisation de code : héritage Caractéristique d un langage OO : mécanisme de réutilisation et de spécialisation Héritage simple en PHP (arborescences de classes) redéfinition de méthodes dans les classes filles et à travers la fonction magique call, pas de redéfinition des variables mise en œuvre avec le mot clé extends Référence à la classe parente avec le mot clé parent (réutilisation) Les interfaces Réponse partielle au problème de l héritage multiple, déclaration : interface NomDInterface {... Constituée de signatures de fonctions publiques et de constantes de classes (public static) Une classe peut implémenter une ou plusieurs interfaces. mot clé implements : représente un contrat entre un objet et celui qui le manipule (implémente toutes les méthodes) PHP5, Comparaison d'objets: ==, === l'opérateur de comparaison == compare les objets de manière classique : deux objets sont égaux s'ils ont les mêmes attributs avec les mêmes valeurs, et s'ils sont des instances de la même classe. L utilisation de l'opérateur d'identité === Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 3

compare les références: il retourne true si les références sont égales i.e. si elles font référence à un même objet en mémoire centrale. Clonage Pour copier un objet on utilise le mot-clé clone $copy = clone $obj; ou $copy = clone($obj); Attention : clone effectue une copie superficielle de toutes les propriétés de l'objet. Tous les attributs qui sont des références à d'autres variables demeureront des références. Si une méthode magique clone() est définie dans la classe alors la méthode clone() du nouvel objet sera appelée pour permettre à chaque propriété qui doit l'être d'être modifiée. Sérialisation C est la possibilité de transformer un objet PHP dans un format structuré ou non Solution simple : transformation en chaîne de caractères à l aide de la fonction magique tostring (appelée au moment de la conversion en chaîne de caractères). Solution préférable on utilise les fonctions serialize() et unserialize(). Qui invoquent les fonctions magiques sleep et wakeup qui disposent d implantation par défaut. serialisation sleep : permet de préciser les attributs à sérialiser. La fonction serialize() vérifie si la classe implémente sleep. Si c'est le cas, elle l'exécute avant toute linéarisation. Elle peut nettoyer l'objet et elle retourne un tableau avec les noms de toutes les variables de l'objet qui doivent être linéarisées. Le but de sleep est aussi de fermer toutes les connexions aux bases de données que l'objet peut avoir ouverte, de valider les données en attente ou d'effectuer des tâches de nettoyage. Cette fonction est utile pour les très gros objets qui n'ont pas besoin d'être sauvegardés en totalité. déserialisation wakeup(), si définie, est appelée après dé-sérialisation pour recréer les attributs qui n'ont pas été sérialisés. La fonction unserialize() vérifie la présence d'une fonction magique. wakeup dans la définition de la classe. Si elle est présente, cette fonction permet de reconstruire toutes les ressources que l'objet possède. Le but de wakeup est aussi de rétablir toute connexion à une base de données qui aurait été perdue durant la linéarisation et d'effectuer les tâches de réinitialisation. Base de données: compléments PDO, SQLite, Mysqli, PDO PHP Data Objects. L'extension PHP Data Objects (PDO) interface d'abstraction à l'accès à une base de données : _ Standard d'accès à des bases de données pour les applications PHP _ PDO requiert les nouvelles fonctionnalités OO fournies par PHP 5 et donc, ne fonctionne pas avec les versions antérieures de PHP. _ PDO est fourni avec PHP 5.1 (extension PECL pour php5.0) _ Ainsi une application PHP ne sera plus liée à une seule base (le plus souvent MySQL), mais à PDO, et donc à n'importe quel SGBD ( SQLite, MySQL, PostgreSQL, Oracle, Sybase, SQL Server,... ) _ Pourquoi PDO? Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 4

_ les fonctions PHP d'utilisation des SGBD sont très différentes tant dans leur implémentation que dans leurs noms. PDO permet de se connecter à différentes bases de données avec une même fonction, (y compris en émulant certaines fonctions absentes des SGBD les moins fournis ) => PORTABILITE ACCRUE Installation PDO Il faut, soit par l administration php, soit dans php.ini directement _ Activer dans php.ini extension=php_pdo.dll : l extension offrant une couche d'abstraction d accès à des bases de données. 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 : _ Activer les extensions spécifiques des BD désirées parmi les disponibles: extension=php_pdo.dll extension=php_pdo_firebird.dll extension=php_pdo_mssql.dll extension=php_pdo_mysql.dll extension=php_pdo_oci.dll extension=php_pdo_oci8.dll extension=php_pdo_odbc.dll extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll NB : Les extensions disponibles sont visibles dans _ wamp/bin/php/php2.5.2/ext _ easyphp 2.0/php5/ext (ne pas y toucher ) PDO : Installation : php.ini exemple EXEMPLE php.ini extension=php_pdo.dll //extension pdo activée ;extension=php_pdo_firebird.dll //non activée (;) ;extension=php_pdo_mssql.dll //non activée (;) extension=php_pdo_mysql.dll //driver pdo mysql activé ;extension=php_pdo_oci.dll //non activée (;) ;extension=php_pdo_oci8.dll ;extension=php_pdo_odbc.dll //non activée (;) extension=php_pdo_pgsql.dll //driver pdo postgresql activé ;extension=php_pdo_sqlite.dll //non activée (;) Avec cette configuration php, on pourra utiliser les deux types de bases sous l interface PDO PDO utilisation : connexion Une fois cette configuration faite, on connectera à différentes bases de données avec une même fonction, en ne modifiant que certains arguments : un changement de SGBD se fait simplement en modifiant l'instanciation de l'objet de la classe PDO. _ Connexion : les connexions sont établies en créant des instances de la classe de base de PDO. Exemple : // MySQL Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 5

$dbh = new PDO( mysql:host=localhost;dbname=basededonnees, identifiant, motdepasse); // PostgreSQL $dbh = new PDO( pgsql:host=localhost port=5432 dbname=basededonnees user=identifiant password=motdepasse ); _ Fermeture de la connexion $dbh = NULL; Gestions des exceptions try { code... Catch(PDOException $monexception) { echo 'Error de connection à MySQL!: '.$monexception->getmessage(); exit() Pour des connexions persistantes, on utilisera <?php $dbh = new PDO ( mysql:host=localhost;dbname=basededonnees, identifiant,motdepasse, array( PDO::ATTR_PERSISTENT => true) );?> Transactions et validation automatique _ PDO gère les transactions avant d'exécuter des requêtes _ Les transactions : _ 4 fonctionnalités : Atomicité, Consistance, Isolation et Durabilité (ACID). _ Ne sont pas toujours supportées dans les SGBD _ PDO doit s'exécuter en mode auto-commit lorsqu on ouvre pour la première fois la connexion, c est à dire : toutes les requêtes ont leurs transactions implicites, si la base de données le supporte aucune transaction si la base de données ne les supporte pas. _ Quand on a besoin d une transaction: _ méthode PDO->beginTransaction() pour l'initialiser (Si le driver utilisé ne supporte pas les transactions, une exception PDO sera lancée) _ Et la méthode PDO->commit() (valide) ou PDO->rollBack() (annule) pour la terminer, suivant le succès de votre code durant la transaction. _ catch (Exception $e) { $dbh->rollback(); echo "Échec : ". $e->getmessage(); Intérêt des requêtes préparées _ 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. En utilisant les requêtes préparées, vous évitez ainsi de répéter le cycle analyser/compilation/optimisation. Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 6

_ 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). Requêtes préparées Requête normale : 1 : envoi de la requête par le client vers le serveur 2 : compilation de la requête 3 : plan d'exécution par le serveur 4 : exécution de la requête 5 : résultat du serveur vers le client Requête préparée : Phase 1 : 1 : envoi de la requête à préparer 2 : compilation de la requête 3 : plan d'exécution par le serveur 4 : stockage de la requête compilée en mémoire 5 : retour d'un identifiant de requête au client Phase 2 : 1 : le client demande l'exécution de la requête avec l'identifiant 2 : exécution 3 : résultat du serveur au client En PDO : prepare Requêtes préparées en PDO : exemple Utilisation de prepare : marqueurs? <?php $stmt = $dbh->prepare("insert INTO TAB (nom, valeur) VALUES (?,?)"); $stmt->bindparam(1, $nom); $stmt->bindparam(2, $valeur); // 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();?> Pour des marqueurs nommés, on aura $stmt = $dbh->prepare ("INSERT INTO TAB (nom, valeur) VALUES (:nom, :valeur)"); $stmt->bindparam(':nom', $nom) $stmt->bindparam(':valeur', $valeur); Méthode query (1) _ PDO->query() : Exécute une requête SQL, retourne un jeu de résultats en tant qu'objet PDOStatement Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 7

_ Pour une requête dont on a besoin plusieurs fois, _ préparer un objet PDOStatement avec la fonction PDO->prepare() _ exécuter la requête avec la fonction PDOStatement->execute(). _ Il faudra lier les variables PHP aux marqueurs de positionnement soit par PDOStatement->bindParam(), soit par un tableau, en paramètre de PDOStatement->execute(). _ Si on ne récupère pas toutes les données du jeux de résultats avant d'exécuter le prochain appel à PDO->query(), l appel peut échouer. _ Il faut appeler PDOStatement->closeCursor() pour libérer les ressources associées à l'objet PDOStatement avant d'exécuter le prochain appel PDO->query(). PDOStatement->fetch() _ Récupère la ligne suivante d'un jeu de résultat PDO. Liste de paramètres _ fetch_style détermine la façon dont PDO retourne la ligne. _ PDO::FETCH_ASSOC: tableau indexé par le nom de la colonne _ PDO_FETCH_BOTH (défaut): retourne un tableau indexé par les noms de colonnes mais aussi par les numéros de colonnes (commençant à l'indice 0), _ PDO::FETCH_BOUND: retourne TRUE et assigne les valeurs des colonnes de votre jeu de résultats dans les variables PHP à laquelles elles sont liées avec la méthode PDOStatement->bindParam() _ PDO::FETCH_LAZY: combine PDO::FETCH_BOTH et PDO::FETCH_OBJ, créant ainsi les noms des variables de l'objet, comme elles sont accédées _ PDO::FETCH_NUM: retourne un tableau indexé par le numéro de la colonne comme elle est retourné dans votre jeu de résultat, commençant à 0 _ PDO_FETCH_OBJ: retourne un objet anonyme avec les noms de propriétés qui correspondent aux noms des colonnes retournés dans le jeu de résultats. _ _ cursor_orientation quelle ligne sera retournée à l'appelant. Par défaut PDO::FETCH_ORI_NEXT. _ Offset : pour un objet PDOStatement représentant un curseur scrollable pour lequel le paramètre cursor_orientation est défini à PDO::FETCH_ORI_ABS, cette valeur spécifie le numéro absolu de la ligne Exemple query (2) $sql = "SELECT * FROM personnes"; foreach ($dbh->query($sql) as $row) { print $row[ nom].' - '. $row[ prenom]. '<br />'; Le fetch_style est celui par défaut (tableau indexé par les noms de colonnes mais aussi par les numéros de colonnes) PDOStatement->fetchAll() Retourne un tableau contenant toutes les lignes du jeu d'enregistrements _ Paramètre _ : fetch_style détermine la façon dont PDO retourne les lignes _ column_index [optionnel] pour n obtenir qu une seule colonne Exemple : <?php Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 8

$sth = $dbh->prepare("select nom, couleur FROM fruit"); $sth->execute(); /* Récupération de toutes les lignes d'un jeu de résultats */ $result = $sth->fetchall(); print_r($result);?> Méthode exec PDO->exec(statement) : Exécute une requête SQL et retourne le nombre de lignes affectées _ Liste de paramètres _ statement : requête à préparer et à exécuter. _ Exemple: $delrows=$dbh->exec('delete FROM tab WHERE id<20'); echo nombre d enregistrements supprimés :'.$delrows; PDOStatement->execute() _ Exécute une requête préparée. Si la requête préparée inclut des marqueurs de positionnement, on peut : _ appeler la fonction PDOStatement->bindParam() pour lier les variables PHP aux marqueurs de positionnement : _ ou passer un tableau de valeurs de paramètres, uniquement en entrée Exemple <?php /* Exécute une requête préparée en passant un tableau de valeurs */ $calories = 150; $colour = 'rouge'; $sth = $dbh->prepare('select nom, couleur, calories FROM fruit WHERE calories <? AND couleur =?'); $sth->execute(array($calories, $couleur)); SQLite SQLite : un moteur SQL simplifié _ petite bibliothèque écrite en C : un moteur de base de données SQL ( partie de SQL92) et les propriétés ACID, _ dans la distribution de base depuis la version 5 de php _ SQLite n'est pas client/serveur : _ pas de procédure d'installation, de configuration, de gestion de comptes et de droits utilisateurs. _ toute la base est stockée dans un seul fichier (directement sur le disque dur du serveur www). _ le type de chaque donnée stockée en base est une propriété de la donnée, pas de la colonne. Une colonne peut donc contenir des données de type différent. _ Adapté aux petits sites, applications embarquées, mais non conçu pour gérer de nombreux accès simultanés _ Intégré dans mozilla firefox, skype, mac, téléphones symbian et apple (sans doute plus de 300 millions de déploiement au total) Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 9

_ D. Richard Hipp, le créateur de SQLite, a choisi de distribuer cette bibliothèque dans le domaine public. SQLite et php5 _ Depuis PHP 5.1.0, SQLite (3) dépend de PDO, alors PDO doit être activé, en ajoutant à php.ini (dans l'ordre) : _ extension=php_pdo.dll _ extension=php_pdo_sqlite.dll _ SQLite est embarqué et compilé par défaut, ce qui signifie que le simple fait d'installer PHP5 permet de l'utiliser. Donc pas de processus indépendant comme MySQLserver. SQLite 2 ou SQLite3? création de base _ SQLite2 $dbhandle = new SQLiteDatabase('/www/support/usersqlite2.db'); il suffit de donner un nom de fichier (création BD ou ouverture) sous réserve des droits lecture/écriture sur le répertoire. On peut aussi créer la base en mémoire vive destination :memory _ SQLite3 try { $dbhandle = new PDO('sqlite:'.$_SERVER['DOCUMENT_ROOT'].'/../usersqlite3.db'); catch( PDOException $exception ){ die($exception->getmessage()); SqLite interface OO // connection à une db ou création si elle n'existe pas $db = new SQLiteDatabase("db.sqlite"); //transaction implicite $db->query("create TABLE foo(id INTEGER PRIMARY KEY, name UNIQUE)"); //transaction $db->query("begin; INSERT INTO foo (name) VALUES('machin'); INSERT INTO foo (name) VALUES('truc'); INSERT INTO foo (name) VALUES('chouette'); COMMIT;"); $result = $db->query("select * FROM foo"); // de classe 'SQLiteResult' while ($result->valid()) { // reste-t-il des lignes? $row = $result->current(); print_r($row); echo "<p />"; $result->next(); unset($db); // détruire la connexion (pas très utile en PHP...) SQLite en procédural // connection à une db ou création si elle n'existe pas $db = sqlite_open("db.sqlite"); //transaction implicite sqlite_query($db, Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 10

"CREATE TABLE foo(id INTEGER PRIMARY KEY, name UNIQUE)"); //transaction sqlite_query("begin; INSERT INTO foo (name) VALUES('machin1'); INSERT INTO foo (name) VALUES('truc1'); INSERT INTO foo (name) VALUES('chouette1'); COMMIT;"); $result = sqlite_query($db,"select * FROM foo"); while ($row = sqlite_fetch_array($result)) { print_r($row); echo "<p />"; sqlite_close($db); SQLite: typage Par new SQLiteDatabase("db.sqlite"); ou sqlite_open("db.sqlite"); Création de la db "db.sqlite" dans le répertoire du script qui exécute cette instruction dans un seul fichier. Rappel : SQLite est très faiblement typée, toutes les données sont enregistrées comme des chaînes terminées par 'NULL'. Pas de type pour les colonnes/champs. Pour des raisons de compatibilité. SQLite 'supporte' les spécifications INT, CHAR, FLOAT, TEXT, etc dans les déclarations de table mais ne s'en sert pas. SQLite fait seulement la distinction entre les strings et les integers pour les tris. Donc si vous n'avez pas l'intention de trier des données vous pouvez vous dispenser de typer les colonnes dans les instructions CREATE TABLE SQLite's typeless nature makes sorting and comparing data somewhat slow SQLite : INTEGER PRIMARY KEY L'habitude dans les tables SQL d'avoir un premier champ numérique clé primaire en "AUTOINCREMENT" (pour faciliter des recherches ou l'accès à la dernière ligne) a en SQLite une syntaxe particulière : INTEGER PRIMARY KEY. ATTENTION : AUTOINCREMENT provoque une erreur de syntaxe Autre erreur de syntaxe : IF NOT EXISTS SQLite : requêtes chaînées, transactions $db = new SQLiteDatabase(":memory:"); // transaction $db->query("begin; CREATE TABLE bar ( id INTEGER PRIMARY KEY, id2 ); INSERT INTO bar (id2) VALUES('v1'); INSERT INTO bar (id2) VALUES('v2'); COMMIT;"); // requête chaînées $db->query("insert INTO bar (id2) VALUES('v3'); INSERT INTO bar (id2) VALUES('v4'); INSERT INTO bar (id2) VALUES('v5'); INSERT INTO bar (id2) VALUES('v6');"); SQLite : class SQLiteDatabase { Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 11

construct ( string filename [, int mode [, string &error_message]] ); SQLiteResult query ( string query [, int result_type [, string &error_msg]] ); bool queryexec ( string query [, string &error_msg] ); array arrayquery ( string query [, int result_type [, bool decode_binary]] ); array singlequery ( string query [, bool first_row_only [, bool decode_binary]] ); SQLiteUnbuffered unbufferedquery ( string query [, int result_type [, string &error_msg]] ); int lastinsertrowid ( ); int changes ( ); void createaggregate ( string function_name, callback step_func, callback finalize_func [, intnum_args] ); void createfunction ( string function_name, callback callback [, int num_args] ); void busytimeout ( int milliseconds ); int lasterror ( ); array fetchcolumntypes ( string table_name [, int result_type] ) SQLite : class SQLiteDatabase(1) construct (string filename [, int mode [, string &error_message]] ); Ouvre une db SQLite ou la crée si elle n'existe pas. Paramètres : filename : le nom du fichier qui contient la db mode : mode d'accès (unix) au fichier de la db. (pour le moment NON utilisé par SQLite). Le mode par défaut est la valeur octale 0666. error_message : Passé par référence pour proposer un message d'erreur expliquant pourquoi la db n'a pu être ouverte. Return Values : Retourne une ressource (database handle) en cas de succès, FALSE en cas d'erreur SQLite : class SQLiteDatabase(2) SQLiteResult query( string query [, int result_type [, string &error_msg]] ); Exécute une requête SQL donné par query sur la connexion à la db (database handle). Remarque : la connexion n'est pas demandé dans l'interface OO. result_type : SQLITE_ASSOC, SQLITE_NUM, SQLITE_BOTH (par défaut) SQLiteUnbuffered unbufferedquery ( string query [, int result_type [, string &error_msg]] ); identique à query( ) mais le résultat peut seulement être utilisé en lisant une ligne après l'autre; idéale pour la génération de tables HTML où on traite le résultat ligne par ligne. bool queryexec (string query [, string &error_msg] ); exécuter une requête qui ne retourne rien. array arrayquery (string query [, int result_type [, bool decode_binary]] ); Exécute une requête et retourne les résultats dans un tableau array singlequery (string query [, bool first_row_only [, booldecode_binary]] ); Exécute une requête et retourne soit un tableau pour une seule colonne, soit la valeur de la première ligne. SQLite : class SQLiteResult (3) { array fetch ( [int result_type [, bool decode_binary]] ); Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 12

object fetchobject ( [string class_name [, array ctor_params [, bool decode_binary]]] ); string fetchsingle ( [bool decode_binary] ); array fetchall ( [int result_type [, bool decode_binary]] ); mixed column ( mixed index_or_name [, bool decode_binary] ); int numfields ( ); string fieldname ( int field_index ); array current ( [int result_type [, bool decode_binary]] ); int key ( ); bool next ( ); bool valid ( ); bool rewind ( ); bool prev ( ); bool hasprev ( ); int numrows ( ); bool seek ( int rownum ); SQLite : class SQLiteUnbuffered { array fetch ( [int result_type [, bool decode_binary]] ); object fetchobject ( [string class_name [, array ctor_params [, bool decode_binary]]] ); string fetchsingle ( [bool decode_binary] ); array fetchall ( [int result_type [, bool decode_binary]] ); mixed column ( mixed index_or_name [, bool decode_binary] ); int numfields ( ); string fieldname ( int field_index ); array current ( [int result_type [, bool decode_binary]] ); bool next ( ); bool valid ( ); SQLite : inconvénients, problèmes Attention: pendant la mise à jour de la BD en ajoutant une nouvelle donnée SQLite doit verrouiller le fichier qui contient la BD jusqu'à ce que la modification soit terminée. _ sqlite_escape_string() Attention : utiliser sqlite_escape_string( ) pour les problèmes de simple quote et autres caractères spéciaux. Sinon une chaine comme abc'123 provoquera une erreur syntaxique. Ne pas utiliser addslashes( ) à la place de sqlite_escape_string(), car les deux fonctions ne sont pas équivalentes. _ Exemple : $username = sqlite_escape_string($username); $password = sqlite_escape_string($password); sqlite_query($db, "INSERT INTO users VALUES ('$username', '$password')"); SQLite : sqlite_fetch_array() $r = sqlite_query($db, 'SELECT username FROM users'); while ($row = sqlite_fetch_array($r)) { // do something with $row Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 13

Par défaut, sqlite_fetch_array( ) retourne un tableau dont les éléments sont indexés numériquement et comme un tableau associatif. Par exemple si la requête ci dessus retourne une ligne avec le username rasmus, on obtient : Array ( [0] => rasmus [username] => rasmus ) PHP5 : extension mysqli Mysqli : Extension MySQL "améliorée" Installation : pour installer l'extension mysqli dans WAMP, activer l'extension php_mysqli dans le menu PHP extensions et désactivez aussi l'extension standard php_mysql. Options de configuration MySQLi : mysqli.max_links, mysqli.default_port, mysqli.default_socket, mysqli.default_host, mysqli.default_user, mysqli.default_pw cf. le fichier 'php.ini' dans wamp Classes pré-définies : Mysqli mysqli : représente la connexion entre PHP et le serveur MySQL. Contructeur : Style orienté objet (méthode) class mysqli { construct ( [string host [, string username [, string passwd [, string dbname [, int port [, string socket]]]]]] ) Style procédural mysqli mysqli_connect ( [string host [, string username [, string passwd [, string dbname [, int port [, string socket]]]]]] ) Mysqli : connexion 'style Objet' <?php $mysqli = new mysqli("localhost", "root", "", "world"); /* Vérification de la connexion */ if (mysqli_connect_errno()) { echo "Echec de la connexion: ".mysqli_connect_error()."<br/>"; exit(); echo " connexion OK <br/>"; echo "Information sur le serveur : ".$mysqli->host_info."<br/>"; /* Fermeture de la connexion */ $mysqli->close();?> Mysqli : connexion 'style procedurale' // connexion à une db <?php $link = mysqli_connect("localhost", "root", "", "world"); Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 14

/* Vérification de la connexion */ if (!$link) { printf("echec de la connexion : %s\n", mysqli_connect_error()); exit(); printf("information sur le serveur : %s\n", mysqli_get_host_info($link)); /* Fermeture de la connexion */ mysqli_close($link);?> Mysqli : requête Style orienté objet (méthode) class mysqli { mixed query ( string query [, int resultmode] ) Style procédural mixed mysqli_query ( mysqli link, string query [, int resultmode] ) Mysqli : requête 'style Objet' <?php $mysqli = new mysqli("localhost", "root", "", "world"); /* Vérification de la connexion */ /* Requète "Select" retourne un objet de type mysqli */ if ($result = $mysqli->query("select Name FROM City LIMIT 10")) { printf("select a retourné %d lignes.\n", $result->num_rows); /* Libération du jeu de résultats */ $result->close(); /* Si beaucoup de données, utiliser MYSQLI_USE_RESULT */ if ($result = $mysqli->query("select * FROM City", MYSQLI_USE_RESULT)) { $result->close(); $mysqli->close();?> Mysqli : requête 'style procédural' <?php $mysqli = mysqli_connect("localhost", "root", "", "world"); /* Vérification de la connexion */ /* Requète "Select" retourne un objet de mysqli */ if ($result = mysqli_query($mysqli, "SELECT Name FROM City LIMIT 10")) { printf("select a retourné %d lignes.<br/>", mysqli_num_rows); /* Libération du jeu de résultats */ mysqli_free_result($result); mysqli_close();?> Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 15

Classes pré-définies : mysqli_result Représente le résultat retourné par le serveur. Quelques Méthodes : close - Termine le jeu de résultat MySQL data_seek - Déplace le pointeur de lignes de résultat fetch_field - Lit les informations de colonnes dans un résultat fetch_fields - Lit les informations de toutes les colonnes d'un résultat fetch_field_direct - Lit les informations de colonne fetch_array - Lit une ligne de résultat dans un tableau associatif ou numérique fetch_assoc - Lit une ligne de résultat dans un tableau associatif fetch_object - Lit une ligne de résultat dans un objet (construit à la volée) fetch_row - Lit une ligne de résultat dans un tableau (indices numériques) fetch_seek - Place le pointeur de résultat à un offset valide mysqli_result : fetch_assoc Style procédural array mysqli_fetch_assoc ( mysqli_result result ) Style orienté objet (méthode) class mysqli_result { array fetch_assoc ( void ) mysqli_result : fetch_assoc exemple $query = "SELECT Nom, CodePays FROM Ville ORDER by ID DESC LIMIT 50,5"; if ($result = $mysqli->query($query)) { /* Tableau associatif de la ligne sélectionnée */ while ($row = $result->fetch_assoc()) { printf ("%s (%s)\n", $row["nom"], $row["codepays"]); /* Libération du jeu de résultats */ $result->close(); mysqli_result : fetch_object Style orienté objet (méthode) class mysqli_result { mixed fetch_object ( void ) Style procédural mixed mysqli_fetch_object ( mysqli_result result ) mysqli_result : fetch_object exemple $query = "SELECT Nom, CodePays FROM Ville ORDER by ID DESC LIMIT 50,5"; if ($result = $mysqli->query($query)) { /* Récupération du tableau d'objet */ while ($obj = $result->fetch_object()) { printf ("%s (%s)\n", $obj->nom, $obj->codepays); Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 16

/* Libération du jeu de résultats */ $result->close(); Jean Michel MEULIEN - Les Objets en PHP5 - PHP_MySQL Page 17