Ce qu'il faut savoir : La programmation orientée objet avec PHP. Le concept des bases de données relationnelles.

Dimension: px
Commencer à balayer dès la page:

Download "Ce qu'il faut savoir : La programmation orientée objet avec PHP. Le concept des bases de données relationnelles."

Transcription

1 Pratique Object/Relational Mapping avec Doctrine La gestion de la base de données est un point épineux de la création d'une application. La librairie d'object/ Relational Mapping Doctrine vous permet de travailler d'un point de vue objet avec votre base de données relationnelle et ainsi de créer une application plus souple, cohérente et facile à maintenir. Cet article explique : Comment utiliser la librairie d'object/ Relational Mapping Doctrine. Niveau de difficulté En utilisant les fonctions natives de PHP et le langage SQL, le développeur prend le risque de faire un code difficile à porter, peu flexible et en proie aux failles de sécurité. Nous allons voir dans cet article comment, grâce à la librairie d'object/ Relational Mapping Doctrine, passer outre les requêtes classiques pour travailler uniquement à partir d'objets, avec tous les avantages que cela comporte. Tout d'abord, qu'est-ce que l'objet/ Relational Mapping (ORM)? Il s'agit d'une solution pour le problème suivant : comment sauvegarder des objets dans un système de base de données relationnelle? Les deux concepts sont effectivement très éloignés. Pour y répondre, le système d'orm va utiliser une carte des tables de la base et de leurs relations pour créer un comportement objet. Avec l'évolution actuelle de PHP qui est de plus en plus orientée objet, connaître un système d'orm est un avantage certain. Doctrine est une librairie d'orm pour PHP débutée en 2005 qui prend actuellement de l'importance. La dernière version, la 1.0.6, requiert au minimum la version 5.2 de PHP, ce qui montre la volonté des développeurs de créer et maintenir un outil d'actualité, utilisant les dernières fonctionnalités de PHP. Pourquoi choisir Doctrine et pas une autre solution Ce qu'il faut savoir : La programmation orientée objet avec PHP. Le concept des bases de données relationnelles. d' ORM Open Source? Avant tout pour sa simplicité. Pas besoin d'écrire de longs fichiers de configuration ou de compiler quoi que ce soit à la moindre modification : quelques minutes suffisent pour mettre en place Doctrine et commencer à coder. Ensuite pour le Doctrine Query Language, qui permet de créer des requêtes complexes tout en restant dans le milieu objet. Les nombreux outils bonus fournis avec la librairie sont aussi un avantage certain. Enfin, la documentation est très complète et mise à jour (voir encadré Sur Internet). Mise en place de Doctrine Doctrine requiert au minimum la version de PHP pour fonctionner; l'utilisation d'une version récente de PHP a des avantages : inciter les administrateurs système à mettre à jour leur version de PHP, et créer un code plus Quelques autres librairies d'orm pour PHP clair, entre autres grâce à l'utilisation de la Standard PHP Library et du modèle objet de PHP5. Dans cet article nous utiliserons la version 1.0 de Doctrine. Après avoir téléchargé Doctrine sur installez-la dans le répertoire de librairies de votre projet (au hasard, lib/ ). On peut voir que la librairie comporte un fichier principal, Doctrine.php, et que le reste des sources est dans un sous-répertoire Doctrine/. Ce détail a son importance pour le chargement automatique des classes. Il nous faut un fichier d'initialisation commun à toutes les pages pour configurer l'environnement de travail et se connecter à la base. Ce fichier devra avant tout inclure Doctrine. php situé à la racine de la librairie : require_ once 'lib/doctrine.php';. Il s'agit d'ailleurs du seul fichier à importer manuellement, les autres seront chargés via la méthode de la Standart PHP Library autoload, une nouveauté de PHP 5.2 qui permet de définir une fonction personnalisée pour l'inclusion des fichiers de classe. Dès qu'un fichier de définition de classe est manquant, PHP va lancer cette fonction. Doctrine propose son propre autoload, qu'il faut configurer de cette manière : Propel est le principal concurrent de Doctrine. Cette librairie propose presque toutes les mêmes fonctionnalités, en dehors du Doctrine Query Language qui est remplacé par un système de critères à ajouter à une requête. Propel est en phase d'être détrônée par Doctrine en tant que librairie d'orm par défaut livrée avec le framework symfony, Zend_Db, module intégrant le framework Zend propose les fonctionnalités de base attendues par une ORM. Il peut être intéressant de l'utiliser dans le cas où votre application est déjà basée sur le Zend Framework, pour conserver l'unicité du code ou limiter la quantité de librairies utilisées, PhpMyObject, nouveau venu dans le monde des ORM présente l'originalité de ne pas utiliser les modèles : les informations des tables sont chargées automatiquement et les relations se font de manière transparente. Attention néanmoins, la vitesse d'exécution en pâtit énormément, bien qu'une solution de mise en cache soit prévue dans une prochaine version. 1 3/2009

2 Doctrine spl_autoload_register(array('doctrine', 'autoload'));. La connexion à une base se fait via Doctrine_ Manager::connection() qui peut prendre comme paramètre un objet PDO ou une chaîne de caractères contenant les informations d'accès à la base, par exemple : $conn = Doctrine_Manager::connection('mysql: Maintenant que la connexion est établie, il faut décider de la méthode à utiliser pour charger les modèles (des classes qui représentent les tables, nous reviendrons sur leur définition précise plus tard). Pour charger ces fichiers, Doctrine propose deux méthodes : conservative : les modèles ne seront chargés que s'ils sont nécessaires lors du script en cours, agressive : tous les fichiers PHP du répertoire désigné seront inclus dès l'initialisation. La méthode conservative est la meilleure du point de vue des performances, mais le chargement agressif peut résoudre des problèmes dans certains cas spécifiques. Notre blog n'utilisant que quatre tables, n'importe quelle méthode fera l'affaire. Ajouter ceci au fichier d'initialisation : $conn->setattribute('model_loading', 'conservative'); Doctrine::loadModels('models/generated'); Doctrine::loadModels('models/'); Doctrine est maintenant configurée et initialisée. Les tables et le mapping Doctrine utilisant entre autres le motif Row Data Gateway, chaque table aura une classe associée. Cela permet de séparer nettement les requêtes SQL de la logique métier de l'application. Doctrine générera une partie de ces classes pour vous, tandis que les relations entre les tables, les templates et autres événements devront être écrits à la main. Plus précisément, Doctrine va générer deux classes par table. Une première, nommée BaseNomdelatable contiendra les informations indispensables au fonctionnement de l'orm : le nom de la table ainsi que les noms et types des champs de cette table. La seconde, nommée Nomdelatable et vide lors de la génération des classes par Doctrine, servira à étendre la classe de base. C'est cette deuxième classe qui nous intéressera, puisque c'est dans celle-ci que seront indiquées les informations ne pouvant être générées automatiquement. Ces deux classes forment ce que j'appellerai par la suite un modèle. Lexique ORM : Object/Relationnal Mapping, système permettant de simuler un comportement objet sur une base de données relationnelle, SGBD : Système de Gestion de Base de Données, les plus répandus sont MySQL et Oracle, PDO : PHP Data Objects, une extension fournie d'office depuis PHP 5.1 offrant une interface pour communiquer avec les SGBD, SQL : Structured Query Language, pseudo-langage utilisé pour communiquer avec la majorité des SGBD du marché, DQL : Doctrine Query Language, système de création de requêtes de Doctrine en objet, calqué sur SQL. Création des tables et des modèles Il existe plusieurs méthodes pour générer les modèles via Doctrine, la plus simple et rapide restant de laisser Doctrine les créer à partir d'une base de données déjà existante. Commencez par créer les tables qui sont décrites dans le modèle conceptuel des données de la Figure 1 grâce à votre système d'administration de base de données favori (ne créez pas de clés étrangères pour le moment). Listing 1. Le modèle de la table article au format YAML Article: tablename: article columns: id: type: integer(4) primary: true autoincrement: true titre: type: string(255) notnull: true texte: type: string( ) notnull: true date_ajout: type: timestamp(25) notnull: true date_modification: type: timestamp(25) Listing 2. Plusieurs moyens d'ajouter des enregistrements $categorie1 = new Categorie(); $categorie1->nom = 'Php'; Une fois que c'est fait, il suffit d'ajouter la ligne suivante dans le fichier d'initialisation pour générer les modèles : Doctrine::generateModelsFromDb ('models/'); $categorie1->save(); // Nouvelle catégorie nommée 'Php' $categorie2 = new Categorie(); $article = new Article(); $article->titre = "Premier post sur mon nouveau blog!"; Exécutez le script pour lancer la génération. En regardant dans le dossier models, on peut voir que quatre classes ont été créées à la racine et quatre autres dans le dossier generated. $article->texte = "Remarquez qu'il n'y a pas besoin d'échapper les données sortantes"; $article->commentaire[0]->nom = 'John Doe'; $article->commentaire[0]-> = $article->commentaire[0]->texte = 'Premier commentaire sur le blog'; $article->link('categorie', array( $categorie1->id, $categorie2->id ) ); $article->save(); // Enregistre le nouvel article, le commentaire lié et associe l'article aux catégories 'Php' et 'Mysql' 2

3 Pratique Les classes stockées dans le dossier generated correspondent aux classes de base et seront ré-écrites à chaque fois que la commande generatemodelsfromdb sera exécutée, tandis que les quatre autres classes ne seront jamais ré-écrites pour nous permettre de les éditer en toute sérénité. Vous remarquerez que les noms de table ont été transcrits au format CamelCase lors de la création des modèles : chaque mot commence par une majuscule et les underscores sont considérés comme des séparations de mots, ainsi commentaire se transforme en Commentaire et article _ categorie devient ArticleCategorie. Listing 3. Différentes manières de sélectionner des enregistrements // Récupérer un article via son identifiant $article = Doctrine::getTable('Article')->find(1); echo $article->titre; echo $article->commentaire->count(); // Récupérer les articles des catégories nommées 'Php' $categories = Doctrine::getTable('Categorie')->findByNom('Php'); if( $categories->count() > 0 ) { foreach( $categories[0]->article as $article ) { echo $article->titre; // Récupérer les articles contenant 'donnée' // et commentés par John Doe $articles = Doctrine_Query::create() ->select('a.titre, a.texte, c.nom, c. ') ->from('article a') ->innerjoin('a.commentaire c') ->where('c.nom =?', "John Doe") ->andwhere('a.texte LIKE?', "%donnée%") ->execute(); if( $articles!== null ) { echo $articles[0]->commentaire[0]-> ; Listing 4. Exemple d'utilisation de la pagination $pageactuelle = isset($_get['page'])? $_GET['page'] : 1; $articlesparpage = 2; $requete = Doctrine_Query::create()->select('*')->from('Article'); Il faut savoir qu'il est aussi possible d'utiliser des fichiers de configuration YAML (YAML Ain't Markup Language) pour générer les modèles et les tables. Ce format, bien connu des utilisateurs de symfony, présente des avantages mais crée un intermédiaire supplémentaire qui complexifie légèrement l'application et que nous n'utiliserons donc pas dans cet article. Voyez le Listing 1 pour un exemple de modèle au format YAML. $pagination = new Doctrine_Pager( $requete, $pageactuelle, $articlesparpage ); $articles = $pagination->execute( array(), Doctrine::HYDRATE_ARRAY ); // affiche les résultats : foreach( $articles as $article ) { echo '<p>'. $article['texte']. '</p>'; $affichage = new Doctrine_Pager_Layout( $pagination, ); new Doctrine_Pager_Range_Jumping( array('chunk' => 4) ), // le nombre maximum de pages '?page={%page_number' $affichage->settemplate('[<a href="{%url">{%page</a>]'); $affichage->setselectedtemplate('[<b>{%page</b>]'); $affichage->display(); Indiquer les relations Il faut maintenant écrire les relations entres les tables. Grâce à ces quelques lignes, Doctrine pourra construire automatiquement les liaisons entre les tables lors des requêtes en Doctrine Query Language ou des modifications via les instances de classes : un gain de temps qui sera plus qu'appréciable par la suite! Notre application de blog comporte deux relations. Un article peut avoir plusieurs commentaires, mais un commentaire ne peut avoir qu'un seul article. En revanche, un article peut être dans plusieurs catégories, et chaque catégorie peut contenir plusieurs articles. Commençons par indiquer la relation entre les articles et les commentaires, qui est du type one-to-many, en ajoutant au fichier Article.php : public function setup() { $this->hasmany('commentaire', array( )); 'local' => 'id', 'foreign' => 'article_id' Nous venons d'indiquer que le modèle Article possède plusieurs commentaires. Dans la foulée, ajouter le code suivant au fichier Commentaire.php : public function setup() { $this->hasone('article', array( )); 'local' => 'article_id', 'foreign' => 'id' Nos tables sont liées! Quelques explications sont peut-être nécessaires. La méthode setup est appelée lors de l'initialisation du modèle, c'est donc dans celle-ci qu'il faut entre autres préciser les relations. Les méthodes internes hasone et hasmany (respectivement "a une" et "a plusieurs") permettent d'indiquer les relations entre les tables. Ainsi, pour créer une liaison de type one-to-one, les deux modèles posséderont chacun une méthode hasone, pour une relation one-to-many un modèle possédera la méthode hasmany et l'autre hasone (comme c'est le cas ici), et pour une relation many-to-many les deux modèles auront la méthode hasmany. Ces deux méthodes prennent deux paramètres : en premier le nom de la table liée, en second un tableau de paramètres dans lequel nous indiquons les colonnes qui servent de références pour les liaisons : local pour la colonne locale, et foreign pour la colonne de la table liée. Passons maintenant à la relation entre les articles et les catégories, qui est de type many-tomany. Comme vous le savez peut-être, ce genre de liaison se fait via une table intermédiaire, categorie_article dans notre exemple. Grâce à Doctrine, vous n'aurez jamais besoin d'accéder à cette table, les liaisons se feront de façon invisible (comme le montre la deuxième 3 3/2009

4 Doctrine Si l'on est déjà en possession d'un enregistrement et que l'on souhaite le lier à un autre, il faut utiliser la méthode link, comme montré dans le Listing 2. Figure 1. Le modèle conceptuel des données de notre blog, sans les relations ligne du Tableau 1). Ajouter le code suivant aux méthodes setup des modèles Article et Categorie : // Article.php : $this->hasmany('categorie', array( 'local' => 'article_id', 'foreign' => 'categorie_id', 'refclass' => 'CategorieArticle')); // Categorie.php $this->hasmany('article', array( 'local' => 'categorie_id', 'foreign' => 'article_id', 'refclass' => 'CategorieArticle')); Un nouveau paramètre fait son apparition : refclass. Il permet de signaler que la liaison se fait via un modèle intermédiaire. Vous remarquerez que les colonnes de référence sont celles du modèle CategorieArticle. comme une propriété de l'objet. La table article ayant un champ titre, il est possible de définir le titre du nouvel enregistrement de cette manière : $article->titre = "titre de l'article". Plus intéressant, l'instance du modèle a aussi un accès direct à ses tables liées. Il est donc possible d'ajouter directement de nouveaux commentaires lors de l'ajout d'un nouvel article, sans créer d'instance de Commentaire! Si la relation de l'objet vers les enregistrements liée est créée via hasmany, celui-ci sera accessible via un tableau ( par exemple $article-> Commentaire est un tableau de modèles Commentaire). Veillez bien à ne pas indiquer explicitement les identifiants de liaison entre les enregistrements, ceux-ci seront créés par Doctrine au moment d'enregistrer les données, comme ceci : $article->save();. Sélectionner des enregistrements Doctrine propose tout un panel d'outils pour sélectionner des données à partir d'une ou plusieurs tables. Une façon simple et rapide de récupérer des enregistrements est de passer par la méthode statique gettable, qui donne accès à plusieurs sélecteurs : find, findall et findby[...]. Les sélecteurs find et findall permettent respectivement de sélectionner soit un enregistrement par son identifiant, soit tous les enregistrements de la table. Le sélecteur magique findby[...] quant à lui, permet de sélectionner les enregistrements selon la valeur d'une colonne, en remplaçant [...] par le nom de la colonne au format CamelCase. Voyez le Listing 3 pour des exemples. Mais ce moyen de récupérer des données présente un inconvénient : les critères de sélection ne se font que sur une seule table. Pour les requêtes multi-critères Doctrine propose son propre système, le Doctrine Query Language (DQL), qui permet de construire des requêtes complexes de façon modulaire et compatible avec la grande majorité des SGBD. Pour faire une nouvelle requête avec DQL, il faut commencer par créer un nouvel objet Doctrine _Query comme ceci : $query = Doctrine_Query::create();. Il faut ensuite ajouter le type de requête via select(), update() ou delete(), puis des critères avec from(), leftjoin(), innerjoin() ou where() par exemple. Comme vous pouvez le voir, la syntaxe de DQL est très similaire La gestion des enregistrements Nos modèles prêts, il est temps de faire quelques expériences avec les enregistrements. Les données récupérées via Doctrine sont encapsulées dans un objet de type Doctrine_ Record, qui permet d'accéder aux données en lecture, mais aussi en écriture! En effet, n'importe quel enregistrement récupéré ou créé pourra être modifié puis enregistré via $enregistrement->save();. D'autre part, les objets Doctrine_Record peuvent aussi charger de manière transparente les enregistrements liés, qui seront à leur tour modifiables puisqu'eux mêmes sont des instances de Doctrine_Record... L'ajout de nouveaux enregistrements se fait via l'instantiation d'un modèle, par exemple pour créer un nouvel enregistrement dans la table article, il faut créer un nouvel objet Article : $article = new Article();. Chaque champ de la table est alors accessible Tableau 1. Les principales méthodes DQL avec leur équivalence en SQL DQL $query->from('article'); $query->select('a.titre, a.texte, c. , cat.nom') ->from('article a') ->leftjoin('a.commentaire c') ->leftjoin('a.categorie cat') ->orderby('a.date _ ajout') ->limit(5); $query->select()->from('article a') ->where('a.titre =?', "Titre de l'article") ->andwhere('a.texte LIKE? OR a.id =?', array('%hpsol%', 5)); $query->update('article') ->set('date _ modification', '?', new Doctrine _ Expression('NOW()') ) ->wherein('id', array(7, 4, 5, 89)) $query->delete()->from('article') ->where('id >= :maxarticle', array(':maxarticle' => 12)) SQL SELECT * FROM article SELECT a.titre, a.texte, c. , cat.nom FROM article AS a LEFT JOIN commentaire AS c ON c.article _ id = a.id LEFT JOIN categorie _ article AS ca ON ca.article _ id = a.id LEFT JOIN categorie AS cat ON ca.categorie _ id = cat.id ORDER BY a.date _ ajout ASC LIMIT 0,5 SELECT * FROM article AS a WHERE a.titre = 'Titre de l\'article' AND (a.texte LIKE '%hpsol%' OR a.id = '5') UPDATE article SET date _ modification = NOW() WHERE id IN ('7,4,5,89') DELETE FROM article WHERE id >= '12' 4

5 Pratique à celle de SQL ce qui rend son apprentissage aisé pour qui a déjà utilisé SQL par le passé. Remarquez que les jointures n'ont pas besoin d'être précisées explicitement, mais qu'il faut en revanche préciser l'alias de la table parente pour que la structure des résultats soit correcte. Il faut effectivement que Doctrine sache entre quelles tables se fait la liaison : en imaginant qu'on ajoute la possibilité de mettre des commentaires sur une catégorie, il faudra bien montrer au moment de la requête si l'on souhaite les commentaires de l'article ou de la catégorie. Les critères de condition avec where utilisent un système de template qui permet de séparer les paramètres de la condition : en utilisant un ou plusieurs points d'interrogation, le second paramètre de la condition sera une valeur ou un tableau de valeurs qui remplaceront les points d'interrogation par ordre d'apparition, en utilisant le format :clef, le second paramètre sera un tableau associatif de clefs/ valeurs. Il est aussi possible de passer tous les paramètres d'une requête d'un seul coup en passant un tableau à la méthode execute(). Ce système de template est très pratique lorsque l'on souhaite utiliser la même requête plusieurs fois, mais avec des paramètres différents. Listing 5. Modifier les valeurs des enregistrements avec les événements // ajouté à la classe Commentaire : public function prehydrate(doctrine_event $event) { $data = $event->data; $data['mailantispam'] = str_replace( '.'), array(' AT ', ' POINT '), $data[' '] ); $event->data = $data; // dans le script principal : $c = Doctrine_Query::create()->from('Commentaire')->fetchOne(); // récupère le premier enregistrement echo $c['mailantispam']; // affiche : mail AT host POINT com Listing 6. Ajouter des éléments dans une structure hiérarchique $progcategorie = new Categorie(); $progcategorie->nom = 'Programmation'; $tree = Doctrine::getTable('Categorie')->getTree(); $tree->createroot($progcategorie); // nouvelle racine $phpcategorie = new Categorie(); $phpcategorie->nom = 'PHP'; $phpcategorie->getnode()->insertaslastchildof($progcategorie); // nouvelle feuille $sqlcategorie = new Categorie(); $sqlcategorie->nom = 'SQL'; $sqlcategorie->getnode()->insertaslastchildof($progcategorie); // deuxième feuille Listing 7. Récupérer des enregistrements en utilisant une structure hiérarchique $compteurquery = Doctrine_Query::create() ->select('count(a.id) as nombrearticle, c.nom') ->from('categorie c') ->leftjoin('c.article a') ->groupby('c.id'); $tree = Doctrine::getTable('Categorie')->getTree(); $tree->setbasequery($compteurquery); $completetree = $tree->fetchtree(); foreach ($completetree as $categorie) { echo str_repeat(' ', $categorie['level']). ' - '. $categorie['nom']. '('. $categorie['nombrearticle']. ')<br />'; Figure 2. Schéma résumant le fonctionnement d'une application utilisant Doctrine Comme nous l'avons vu, les enregistrements récupérés sont stockés dans un objet Doctrine_ Record qui, s'il a de nombreux avantages, est plutôt lourd. Si vous n'y croyez pas, essayez de faire un var_dump d'un enregistrement, les dizaines de milliers de lignes de données affichées devrait finir de vous convaincre. C'est pourquoi Doctrine propose un autre format plus léger pour les résultats lorsque l'on ne souhaite y accéder qu'en lecture, sous la forme d'un tableau associatif. Pour obtenir les enregistrements de cette manière, deux méthodes principales : $resultat = $requete->fetchall(); $resultat = $requete->execute( array(), Doctrine::HYDRATE_ARRAY ); Le contenu de $resultat est le même dans les deux cas. L'accès aux enregistrements se fait de manière similaire à ceux d'un objet Doctrine _ Record : $article['nom'] à la place de $article->nom. En fait, vous feriez bien d'utiliser ce format de résultats à chaque fois que l'accès en écriture n'est pas nécessaire; votre serveur vous en sera reconnaissant. Les outils de Doctrine En plus de toutes ses fonctionnalités d'orm, Doctrine propose une collection d'outils simplifiant la vie des programmeurs. Dans ce chapitre nous allons aborder quelques-uns de ces suppléments qui seront utiles pour notre application de blog. La pagination Doctrine propose un système permettant de paginer automatiquement des résultats, en gérant de la modification de la requête à l'affichage des résultats au format HTML. Concrètement, le système va calculer le nombre total 5 3/2009

6 Doctrine de résultats pour une requête et sélectionner uniquement la plage d'enregistrement voulue. Pour mettre en place cet outil, il faut commencer par préparer une requête DQL quelconque sans l'exécuter. Il suffit ensuite de la placer dans un nouvel objet Doctrine_Pager avec le nombre de résultats souhaité par page et la page à afficher, puis d'utiliser la méthode execute comme on le ferait sur un objet Doctrine_ Query pour récupérer les résultats. L'affichage de la pagination se fait via une nouvelle instance de Doctrine_Pager_Layout, qui prend trois paramètres : l'objet Doctrine _ Pager créé précédemment, un objet du type Doctrine _ Pager _ Range, qui contrôle l'écart maximal entre les pages affichées. Il y en a deux livrés de base avec la librairie : Jumping (affichage par blocs) et Sliding (affichage fluide), mais rien n'empêche de créer les vôtres, le template de l'url affiché, qui sera ensuite accessible dans les autres templates via {%url Il reste à définir le template du lien de la page en cours et celui des autres pages en utilisant settemplate et setselectedtemplate pour que la pagination soit complète. Le Listing 4 montre comment mettre rapidement un système de pagination en place, mais cet outil propose de nombreuses fonctionnalités avancées pour créer à peu près n'importe quel type de pagination. Les transactions Déjà connues de ceux utilisant régulièrement les bases de données relationnelles, les transactions permettent de valider ou d'annuler une séquence de requêtes. Doctrine utilise déjà les transactions en interne, par exemple lors de l'ajout simultané d'un Article et d'un Commentaire, si l'un des deux enregistrements pose problème, aucun des deux ne sera enregistré afin de garantir l'unicité de la base. On débute une transaction avec : $conn = Doctrine_Manager::getInstance() ->getconnection(0); $conn->begintransaction(); Puis, après avoir lancé les requêtes voulues, on valide via $conn->commit() ou annule avec $conn->rollback(). À noter que Doctrine supporte les transaction imbriquées, c'est à dire qu'il est possible de commencer une nouvelle transaction à l'intérieur d'une transaction. Les événements Les événements de Doctrine sont en réalité des Hooks, des appels de fonction lancés à certains moments précis. De cette manière, quasiment toutes les actions peuvent être accompagnées par l'exécution d'une méthode de façon transparente (voyez la documentation pour la liste complète des hooks). Par exemple, mettre automatiquement à jour les dates d'ajout et de modification d'un article serait bénéfique : une ligne de code en moins à chaque fois et la garantie que les dates seront toujours à jour. La mise en place d'un écouteur d'événements sur le modèle Article permet de le faire en ajoutant la méthode suivante à la classe Article : public function preinsert() { Sur Internet Le site officiel de la librairie, La documentation (en anglais), La F.A.Q. Doctrine de developpez.com, Tutoriel d'installation avec symfony. $this->date_ajout = new Doctrine_ Expression('NOW()'); Nous utilisons ici la méthode spéciale preinsert : cette méthode est appelée juste avant l'enregistrement d'un nouvel Article. Il existe une pléthore de méthodes du même type pour exécuter des actions après une suppression, lors d'une requête DQL, etc. Voici un autre exemple : dans notre application de blog, nous enregistrons l' des utilisateurs postant des commentaires. Au moment de l'affichage des commentaires, nous pourrions afficher l' tel quel, mais ce serait donner en pâture aux spammeurs les adresses de nos chers lecteurs! Il faut donc encoder l' pour qu'il ne soit pas récupérable par des robots mais lisible pour un humain, par exemple en remplaçant par AT et le. par POINT. Tant qu'à faire, autant que cette valeur soit directement accessible dans les enregistrements sélectionnés. Le Listing 5 montre comment faire en quelques lignes. Mise en place d'une structure hiérarchique Une table a une structure hiérarchique lorsqu'elle comporte une référence sur elle-même, le plus souvent via l'identifiant de l'enregistrement parent. On trouve des structures hiérarchiques dans des applications diverses comme les forums des discussion ( un forum peut contenir un forum qui contient un forum etc. ) ou dans les menus multi-niveaux. Ce genre de système est difficile à mettre en place, puisqu'on ne peut pas connaître à l'avance le nombre d'éléments enfants ou parents que comporte un enregistrement. Pour nous aider dans cette tâche ardue, Doctrine propose ni plus ni moins de s'occuper de toute la gestion du système hiérarchique. Nous allons nous en servir pour la gestion des catégories du blog. Il faut commencer par modifier la table commentaire en ajoutant 3 champs : lft, rgt et level, tous les trois du type INT. Ces champs serviront à la gestion de l'arbre des catégories en interne, il ne faut en aucun cas assigner leur valeur manuellement ou les renommer, sous peine de corrompre la structure. Il faut ensuite signaler à Doctrine que le modèle Categorie doit agir comme une structure hiérarchique en ajout le code suivant dans le setup du modèle : $this->actas('nestedset'); Le modèle Catégorie peut maintenant être vu comme un arbre : les racines sont les catégories principales tandis que les feuilles représentent les catégories les plus éloignées. Un nœud quant à lui est une catégorie intermédiaire. Quand on rajoute une catégorie dans une catégorie "feuille", celle-ci devient un nœud. C'est de cette manière que le système de structure est vu par Doctrine, comme vous pouvez le constater dans le Listing 6. Il est ensuite possible de récupérer non seulement l'arbre des catégories, mais aussi les enregistrements liés en injectant une requête DQL lors de la génération de la structure. Il suffit pour cela d'utiliser setbasequery;. Le Listing 7 montre comment générer l'arbre des catégories de notre blog, avec le nombre d'articles contenus par chaque catégorie, le tout en une dizaine de lignes! Conclusion Doctrine est un outil puissant qui, non content d'offrir tout ce que l'on peut attendre d'une librairie d'orm, propose une multitude de fonctionnalités annexes. Après avoir vu les bases des modèles et des enregistrements, nous avons abordé certaines de ces fonctionnalités avec la pagination et les structures hiérarchiques. D'autres, comme la migration ou la mise en cache des requêtes, sont à découvrir dans la documentation. La prochaine version de Doctrine, la 1.1 est actuellement en release candidate et devrait être disponible sous peu. JONATHAN PRÉVOST Jonathan Prévost est développeur d'applications pour la société Odenti. Passionné depuis toujours par la programmation, l'auteur s'est spécialisé en développement web et plus particulièrement en ActionScript, Flex et PHP. Contact : 6

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

Mysql. Les requêtes préparées Prepared statements Mysql Les requêtes préparées Prepared statements Introduction Les prepared statements côté serveur sont une des nouvelles fonctionnalités les plus intéressantes de MySQL 4.1 (récemment sorti en production

Plus en détail

Jusqu à 14 h : Open Questions! On vous explique ce que vous n avez pas compris lors de la première formation.

Jusqu à 14 h : Open Questions! On vous explique ce que vous n avez pas compris lors de la première formation. Bienvenue! Jusqu à 14 h : Open Questions! On vous explique ce que vous n avez pas compris lors de la première formation. Téléchargez les logiciels nécessaires pour cette formation : http ://formation-web.via.ecp.fr

Plus en détail

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

BTS S.I.O. 2012-2013 PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais BTS S.I.O. 2012-2013 PHP OBJET Module SLAM4 Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais Table des matières 1 But... 3 2 Les bases :... 3 3 Utilisation d'une classe : Instanciation...3

Plus en détail

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Création d'un site dynamique en PHP avec Dreamweaver et MySQL Création d'un site dynamique en PHP avec Dreamweaver et MySQL 1. Création et configuration du site 1.1. Configuration de Dreamweaver Avant de commencer, il est nécessaire de connaître l'emplacement du

Plus en détail

PHP & BD. PHP & Bases de données. Logiciels & matériels utilisés. Bases de données et Web

PHP & BD. PHP & Bases de données. Logiciels & matériels utilisés. Bases de données et Web PHP & Bases de données La quantité de données utilisée par certains sites web nécessite l'utilisation d'une base de données Il faut donc disposer d'un SGBD (mysql, postgresql, oracle, ) installé sur un

Plus en détail

SPIP et PHP le couple infernal

SPIP et PHP le couple infernal SPIP et PHP le couple infernal signé : les apprentis sorciers PERFORMANCES, PERFORMANCE QUAND TU NOUS TIENT... par la barbichette... Au départ il y avait un site qui marchait bien. Mais on voulait du mieux;

Plus en détail

Fonctionnement du Site Web Dynamique:

Fonctionnement du Site Web Dynamique: Fonctionnement du Site Web Dynamique: Site Web Dynamique: Un site Web dynamique est en faite un site Web dont les pages qu'il contient peuvent être générées dynamiquement, c'est à dire à la demande de

Plus en détail

Documentation de CMS-gen

Documentation de CMS-gen Table des matières GÉNÉRALITÉ... 1 LA ZONE D'ADMINISTRATION... 2 LOGIN SUR LA ZONE D ADMINISTRATION... 2 EDITION DU CONTENU EN LIGNE... 3 LE MODE EDITION... 3 PUBLICATION... 3 SUPPRIMER DES MODIFICATIONS...

Plus en détail

Un serveur FTP chez soi Tutoriel pour Filezilla FTP server

Un serveur FTP chez soi Tutoriel pour Filezilla FTP server Space-OperaRécitsLogicielsCréationsBlogForum Un serveur FTP chez soi Tutoriel pour Filezilla FTP server DynDNS : Pourquoi et comment? Téléchargement et installation de Filezilla Server Configuration réseau

Plus en détail

Roman Mkrtchian SI5-2012/2013 François Chapuis. Rapport de projet de WASP. Réalisation d'un site web sécurisé

Roman Mkrtchian SI5-2012/2013 François Chapuis. Rapport de projet de WASP. Réalisation d'un site web sécurisé Roman Mkrtchian SI5-2012/2013 François Chapuis Rapport de projet de WASP Réalisation d'un site web sécurisé Introduction Nous avons choisi de coder un blog sécurisé. Nous avons notamment codé nous-mêmes

Plus en détail

PHP 5.4 Développez un site web dynamique et interactif

PHP 5.4 Développez un site web dynamique et interactif Editions ENI PHP 5.4 Développez un site web dynamique et interactif Collection Ressources Informatiques Table des matières Table des matières 1 Chapitre 1 Introduction 1. Objectif de l'ouvrage.............................................

Plus en détail

Développer de nouvelles fonctionnalités

Développer de nouvelles fonctionnalités 19 Développer de nouvelles fonctionnalités Chaque site e-commerce est unique. Bien que Magento soit une application riche, des besoins spécifiques apparaîtront et l ajout de modules deviendra nécessaire.

Plus en détail

CHARLOIS SIGAUD AGNAN Nils Vincent Diane PROJET 04 - PLATEFORME DE PROJET ZEND ET SYMFONY

CHARLOIS SIGAUD AGNAN Nils Vincent Diane PROJET 04 - PLATEFORME DE PROJET ZEND ET SYMFONY CHARLOIS SIGAUD AGNAN Nils Vincent Diane PROJET 04 - PLATEFORME DE PROJET ZEND ET SYMFONY Installation de Symfony : Paquet à installer : - php5 - php5-pgsql - postgresql - apache2 Prérequis au niveau

Plus en détail

Introduction à ADO.NET

Introduction à ADO.NET 1 Introduction à ADO.NET Introduction à ADO.NET Sommaire Introduction à ADO.NET... 1 1 Introduction... 2 1.1 Qu est ce que l ADO.NET?... 2 1.2 Les nouveautés d ADO.NET... 2 1.3 Les avantages d ADO.NET...

Plus en détail

Chap. 5 : Langage SQL (Structured Query Language) Pr. : Mohamed BASLAM Contact : baslam.med@gmail.com Niveau : S4 BCG Année : 2014/2015 1

Chap. 5 : Langage SQL (Structured Query Language) Pr. : Mohamed BASLAM Contact : baslam.med@gmail.com Niveau : S4 BCG Année : 2014/2015 1 Chap. 5 : Langage SQL (Structured Query Language) Pr. : Mohamed BASLAM Contact : baslam.med@gmail.com Niveau : S4 BCG Année : 2014/2015 1 Plan Généralités Langage de Définition des (LDD) Langage de Manipulation

Plus en détail

Applications orientées données (NSY135)

Applications orientées données (NSY135) Applications orientées données (NSY135) 2 Applications Web Dynamiques Auteurs: Raphaël Fournier-S niehotta et Philippe Rigaux (philippe.rigaux@cnam.fr,fournier@cnam.fr) Département d informatique Conservatoire

Plus en détail

PHP /MySQL Interface d'accès aux BDDs PDO. Youssef CHAHIR

PHP /MySQL Interface d'accès aux BDDs PDO. Youssef CHAHIR PHP /MySQL Interface d'accès aux BDDs PDO Youssef CHAHIR 1 PLAN Architecture Interface phpmyadmin Créer une interface PHP/MySQL : Établir une connexion Exécuter une requête Gérer les erreurs Exploiter

Plus en détail

TD1. Installation de Symfony 2 et Netbeans

TD1. Installation de Symfony 2 et Netbeans I - Introduction : TD1 Installation de Symfony 2 et Netbeans L objet de ce TP est d installer l environnement de travail. Nous commençons par définir des notions de base nécessaires pour comprendre la

Plus en détail

Atelier Web Les langages du Web Le MySQL Module 1 - Les bases

Atelier Web Les langages du Web Le MySQL Module 1 - Les bases Atelier Web Les langages du Web Le MySQL Module 1 - Les bases Définition MySQL = SGBD = Système de Gestion de Base de Données Le rôle du MySQL est de vous aider à enregistrer les données de manière organisée

Plus en détail

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

PHP 5. La base de données MySql. A. Belaïd 1 PHP 5 La base de données MySql A. Belaïd 1 Base de données C est quoi une base de données? Une base de données contient une ou plusieurs tables, chaque table ayant un ou plusieurs enregistrements Exemple

Plus en détail

SQL Server Management Studio Express

SQL Server Management Studio Express SQL Server Management Studio Express L'outil de gestion gratuit des bases Microsoft SQL Suite à mon précédent article, Microsoft a mis à disposition du public d'un outil gratuit de gestion des bases de

Plus en détail

SQL Server 2008 Report Builder 2.0

SQL Server 2008 Report Builder 2.0 SQL Server 2008 Report Builder 2.0 Installation et utilisation de Report Builder 2.0 Dans le cadre de la création de rapports pour SQL Server Reporting Services 2008, un outil est disponible, Report Builder

Plus en détail

Java EE Approfondi - Cours 2. Cours de 2 e année ingénieur Spécialisation «Génie Informatique»

Java EE Approfondi - Cours 2. Cours de 2 e année ingénieur Spécialisation «Génie Informatique» Java EE Approfondi - Cours 2 Cours de 2 e année ingénieur Spécialisation «Génie Informatique» Présentation Lier l'orienté objet et la base de données relationnelle peut être lourd et consommateur en temps.

Plus en détail

Symfony 2. 1.Définition de symfony 2. 2.Installation. 3.Structure. 4.Symfony et les commandes

Symfony 2. 1.Définition de symfony 2. 2.Installation. 3.Structure. 4.Symfony et les commandes Symfony 2 Sommaire : 1.Définition de symfony 2 2.Installation 3.Structure 4.Symfony et les commandes 5.Le fonctionnement : le routeur (les url), les bundles, twig(templates) 6.L architecture de symfony2

Plus en détail

SPECIFICATIONS TECHNIQUES POUR LE DEVELOPPEMENT DES PLUGINS TOURISM SYSTEM CLIENT. V 1.0 27 janvier 2011

SPECIFICATIONS TECHNIQUES POUR LE DEVELOPPEMENT DES PLUGINS TOURISM SYSTEM CLIENT. V 1.0 27 janvier 2011 SPECIFICATIONS TECHNIQUES POUR LE DEVELOPPEMENT DES PLUGINS TOURISM SYSTEM CLIENT V 1.0 27 janvier 2011 Ce document présente l'utilisation des plugins dans Tourism System Client. Dans le Client, un plugin

Plus en détail

Introduction Mysql API mysqli Annexe. Introduction à PHP. Web et SGBD : un exemple avec Mysql. IUT de Fontainebleau. 8 mars 2014. Introduction à PHP

Introduction Mysql API mysqli Annexe. Introduction à PHP. Web et SGBD : un exemple avec Mysql. IUT de Fontainebleau. 8 mars 2014. Introduction à PHP Web et SGBD : un exemple avec IUT de Fontainebleau 8 mars 2014 1 2 Modèle relationnel 3 4 listes des fonctions mysqli 1 2 Modèle relationnel 3 4 listes des fonctions mysqli Problématique Sites dynamiques

Plus en détail

L'application WinForm et le composant d'accès aux données

L'application WinForm et le composant d'accès aux données L'application WinForm et le composant d'accès aux données Vous disposez d'un squelette de l'application AntoineVersion0- ainsi que de la base de données à restaurer dans SqlServer Bd_Antoine.dat-. Travail

Plus en détail

COURS 6 Adopter un style de programmation clair

COURS 6 Adopter un style de programmation clair COURS 6 Adopter un style de programmation clair Lorsque votre site prend de l'importance, le code devient vite illisible et incompréhensible si vous ne pensez pas à l'organiser. Mais comment organiser

Plus en détail

Chapitre 1 : Introduction aux bases de données

Chapitre 1 : Introduction aux bases de données Chapitre 1 : Introduction aux bases de données Les Bases de Données occupent aujourd'hui une place de plus en plus importante dans les systèmes informatiques. Les Systèmes de Gestion de Bases de Données

Plus en détail

Programmation orientée objet et interfaces web en PHP

Programmation orientée objet et interfaces web en PHP Programmation orientée objet et interfaces web en PHP La programmation objet avec PHP5 Bases de données et interfaces web Fonctionnement des sessions Nicolas Moyroud Cemagref - UMR TETIS 26 Juin 2008 Programmation

Plus en détail

Mémento Site Dynamique / PHP

Mémento Site Dynamique / PHP Mémento Site Dynamique / PHP Pour faire fonctionner site statique : Navigateur Éditeur de texte Apache/PHP/MySQL (qu'on peut retrouver dans WampServer (uniquement Windows)) Inclure les portions de page

Plus en détail

Apprendre à développer un site web avec PHP et MySQL Exercices pratiques et corrigés (2ième édition)

Apprendre à développer un site web avec PHP et MySQL Exercices pratiques et corrigés (2ième édition) Introduction 1. Objectif de l'ouvrage 13 2. Fonctionnement d un site web 13 Installation 1. Introduction 17 2. Installation d'easyphp 13.1 18 Les bases du langage PHP 1. Les balises 23 1.1 Syntaxe de base

Plus en détail

E-mail : contact@nqicorp.com - Web : http://www.nqicorp.com

E-mail : contact@nqicorp.com - Web : http://www.nqicorp.com - 5, rue Soutrane - 06560 Valbonne Sophia-Antipolis E-mail : contact@nqicorp.com - Web : http://www.nqicorp.com NQI Orchestra 3.3 - Guide d'installation Windows.................................................................

Plus en détail

Utilisation et traitement des données saisies sous EndNote avec des scripts PHP/MySQL

Utilisation et traitement des données saisies sous EndNote avec des scripts PHP/MySQL Cah. Tech. Inra, 70, 47-53 Utilisation et traitement des données saisies sous EndNote avec des scripts PHP/MySQL Sabine Julien 1 et Jacques Maratray 1 Résumé : Cet article présente la façon d exploiter

Plus en détail

LES INJECTIONS SQL. Que20. 08 novembre 2015

LES INJECTIONS SQL. Que20. 08 novembre 2015 LES INJECTIONS SQL Que20 08 novembre 2015 Table des matières 1 Introduction 5 2 Qu est-ce qu une injection SQL? 7 3 Premier cas : injection SQL sur une chaîne de caractères 9 3.1 Comment s en protéger?..............................

Plus en détail

Architecture applicative de l application Web

Architecture applicative de l application Web Architecture applicative de l application Web Principes d organisation de l application PHP Gsb-AppliFrais Les principes d'organisation de l'application s'inspirent des travaux réalisés autour du contexte

Plus en détail

Bases de données (INF225), TELECOM ParisTech. TP PHP & MySQL

Bases de données (INF225), TELECOM ParisTech. TP PHP & MySQL Bases de données (INF225), TELECOM ParisTech TP PHP & MySQL Pierre Senellart (pierre.senellart@telecom-paristech.fr) Bogdan Cautis (bogdan.cautis@telecom-paristech.fr) Ioana Ileana (ioana.ileana@telecom-paristech.fr)

Plus en détail

PHP /MySQL Interface d'accès aux BDDs PDO. Youssef CHAHIR

PHP /MySQL Interface d'accès aux BDDs PDO. Youssef CHAHIR PHP /MySQL Interface d'accès aux BDDs PDO Youssef CHAHIR 1 PLAN Architecture Créer une interface PHP/MySQL : Établir une connexion Exécuter une requête Gérer les erreurs Exploiter les résultats de la requête

Plus en détail

GRAILS L'ARCHITECTURE GRAILS

GRAILS L'ARCHITECTURE GRAILS GRAILS L'ARCHITECTURE GRAILS Grails est un serveur d'application web basé sur le langage Groovy, et le framework Spring. Il est édité par la société : SpringSource. Une application Grails se décompose

Plus en détail

MySQL 5 (versions 5.1 à 5.6) Guide de référence du développeur (Nouvelle édition)

MySQL 5 (versions 5.1 à 5.6) Guide de référence du développeur (Nouvelle édition) Avant-propos 1. Les objectifs de ce livre 13 2. Les principaux sujets qu'aborde ce livre 13 3. À qui s adresse ce livre? 14 4. Les pré-requis 14 Introduction à MySQL 1. Introduction aux bases de données

Plus en détail

Formation PHP/ MYSQL

Formation PHP/ MYSQL Formation PHP/ MYSQL Deuxième PARTIE 1/12 II MYSQL (PHPmyAdmin) Création d un annuaire avec une table MySQL dans phpmyadmin. Voici l écran de PHPmyAdmin lorsque vous vous y connectez. 2/12 1) Création

Plus en détail

ACCESS 2003. Auteur : THIERRY TILLIER Formateur informatique Les requêtes : étape 3

ACCESS 2003. Auteur : THIERRY TILLIER Formateur informatique Les requêtes : étape 3 ACCESS 2003 Auteur : THIERRY TILLIER Formateur informatique Les requêtes : étape 3 2/33 Copyright 2005 Tous droits réservés. www.coursdinfo.fr Table des matières Chapitre 1 Les requêtes-introduction...5

Plus en détail

WordPress Développez avec PHP extensions, widgets et thèmes avancés (théorie, TP, ressources)

WordPress Développez avec PHP extensions, widgets et thèmes avancés (théorie, TP, ressources) Avant-propos 1. Introduction 17 2. À qui s adresse cet ouvrage? 18 3. Les pré-requis 18 4. Les objectifs du livre 19 Introduction à WordPress 1. Introduction 21 2. Qu'est-ce que WordPress? 21 2.1 La licence

Plus en détail

Cours Web n o 7 MySQL et PHP

Cours Web n o 7 MySQL et PHP Introduction aux bases de données Cours Web n o 7 MySQL et PHP Sandrine-Dominique Gouraud (gouraud@lri.fr) Pierre Senellart (pierre@senellart.com) Semaine du 7 novembre 2005 S.-D. Gouraud, P. Senellart

Plus en détail

la réalisation d'un site d'inscriptions

la réalisation d'un site d'inscriptions Rapport du projet la réalisation d'un site d'inscriptions Réaliser par : Fatimaezzahra Yazough Année :2014 /2015 1/9 Yazough INTRODUCTION Le but de ce projet et de réaliser une maquette de site web pour

Plus en détail

Document d'aide phpmyadmin et MySQL

Document d'aide phpmyadmin et MySQL Document d'aide phpmyadmin et MySQL GPA775 Base de données École de Technologie Supérieure 23 juin 2009 Ce document sert de guide de base pour travailler avec l'interface phpmyadmin (interface par un navigateur

Plus en détail

Chapitre 3 La manipulation des données (LMD)

Chapitre 3 La manipulation des données (LMD) 75 Chapitre 3 La manipulation des données (LMD) 1. Introduction La manipulation des données (LMD) Le langage de manipulation de données permet aux utilisateurs et aux développeurs d'accéder aux données

Plus en détail

Gestion du design (DesignManager)

Gestion du design (DesignManager) 1 sur 7 15/10/2014 14:06 Administration de CMS Made Simple - evolution biologique - Gestionnaire de Modules Bienvenu(e) : archeo Vous avez 1 notification en cours Gestionnaire de Modules Déposer les fichiers

Plus en détail

Personnaliser et adapter SPIP Développeur SPIP

Personnaliser et adapter SPIP Développeur SPIP Personnaliser et adapter SPIP Développeur SPIP En Théorie Le fonctionnement de SPIP Qu est ce que SPIP? SPIP (Système de Publication pour l Internet Partagé) est un logiciel libre destiné à la production

Plus en détail

PHP 5.4 Développez un site web dynamique et interactif

PHP 5.4 Développez un site web dynamique et interactif Editions ENI PHP 5.4 Développez un site web dynamique et interactif Collection Ressources Informatiques Table des matières Table des matières 1 Chapitre 1 Introduction 1. Objectif de l'ouvrage.............................................

Plus en détail

Le farming dans DokuWiki, intérêt et mise en œuvre

Le farming dans DokuWiki, intérêt et mise en œuvre Le farming dans DokuWiki, intérêt et mise en œuvre Etienne MELEARD Comité Réseau des Universités Université de Rennes 1, Campus Beaulieu 35042 Rennes Cedex Résumé DokuWiki est une plateforme de Wiki souple

Plus en détail

Les procédures stockées et les fonctions utilisateur

Les procédures stockées et les fonctions utilisateur Les procédures stockées et les fonctions utilisateur Z Grégory CASANOVA 2 Les procédures stockées et les fonctions utilisateur [08/07/09] Sommaire 1 Introduction... 3 2 Pré-requis... 4 3 Les procédures

Plus en détail

1. Introduction... 2. 2. Création d'une macro autonome... 2. 3. Exécuter la macro pas à pas... 5. 4. Modifier une macro... 5

1. Introduction... 2. 2. Création d'une macro autonome... 2. 3. Exécuter la macro pas à pas... 5. 4. Modifier une macro... 5 1. Introduction... 2 2. Création d'une macro autonome... 2 3. Exécuter la macro pas à pas... 5 4. Modifier une macro... 5 5. Création d'une macro associée à un formulaire... 6 6. Exécuter des actions en

Plus en détail

Philippe FAGNIARD Jonathan VANDAL LP-SIL IDSE-JV

Philippe FAGNIARD Jonathan VANDAL LP-SIL IDSE-JV Philippe FAGNIARD Jonathan VANDAL LP-SIL IDSE-JV I ) Qu'est-ce que Symfony? II ) Force et Faiblesse III ) Comparaison de Framework identiques IV ) Exemple d'utilisation I ) Symfony Symfony est un framework

Plus en détail

CREATION WEB DYNAMIQUE

CREATION WEB DYNAMIQUE CREATION WEB DYNAMIQUE IV ) MySQL IV-1 ) Introduction MYSQL dérive directement de SQL (Structured Query Language) qui est un langage de requêtes vers les bases de données relationnelles. Le serveur de

Plus en détail

Tutoriel : Réaliser un site multilingues

Tutoriel : Réaliser un site multilingues Tutoriel : Réaliser un site multilingues INDEX : 1. Introduction 2. Détecter la langue 3. Gérer les langues avec PHP a. Usage de variables b. Traduction à la volée (passage de fonction) 4. Gérer les langues

Plus en détail

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

PHP. Bertrand Estellon. 26 avril 2012. Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril 2012 1 / 214 PHP Bertrand Estellon Aix-Marseille Université 26 avril 2012 Bertrand Estellon (AMU) PHP 26 avril 2012 1 / 214 SQLite et PDO Base de données SQLite et PDO SQLite écrit les données relatives à la base dans

Plus en détail

L3 - Sites Web dynamiques : Mini-Wall MINI-WALL

L3 - Sites Web dynamiques : Mini-Wall MINI-WALL L3 - SITES WEB DYNAMIQUES MINI-WALL 1 Introduction L'objectif de ce TD est de mettre en place un mini "livre d'or", permettant à vos visiteurs de vous laisser des messages sur votre site. Une page affiche

Plus en détail

Apprendre à développer un site web

Apprendre à développer un site web Ce livre s adresse à un public de développeurs débutants connaissant déjà le HTML et les CSS et qui souhaitent bien comprendre le fonctionnement d une application web pour créer leurs propres sites web

Plus en détail

TP Projet Informatique : Persistance en Php et prise en main GIT / Atlassian

TP Projet Informatique : Persistance en Php et prise en main GIT / Atlassian TP Projet Informatique : Persistance en Php et prise en main GIT / Atlassian Objectif : faire un site pour gérer des articles par catégorie. Chaque catégorie a un nom, chaque catégorie est constitué d

Plus en détail

et Groupe Eyrolles, 2006, ISBN : 2-212-11747-7

et Groupe Eyrolles, 2006, ISBN : 2-212-11747-7 Tsoft et Groupe Eyrolles, 2006, ISBN : 2-212-11747-7 OEM Console Java OEM Console HTTP OEM Database Control Oracle Net Manager 6 Module 6 : Oracle Enterprise Manager Objectifs Contenu A la fin de ce module,

Plus en détail

INTERFACE. Supervision / Bases de Données

INTERFACE. Supervision / Bases de Données MASTER ASE SYSTEMES D INFORMATION POUR L INDUSTRIE INTERFACE Supervision / Bases de Données ODBC/ADO Pierre BONNET 2008-2009 Pierre BONNET - Supervision - Liaison ODBC 1 L INTERFACE ODBC Open DataBase

Plus en détail

Fonctionnement du serveur Z39.50

Fonctionnement du serveur Z39.50 Fonctionnement du serveur Z39.50 Table des matières 1 Configuration du serveur...2 1.1 Comportement du serveur...2 1.2 Configuration de la traduction z39.50 -> base de données...2 1.3 Configuration du

Plus en détail

Bases de données relationnelles

Bases de données relationnelles Module B210 Bases de données relationnelles Travaux pratiques TP avec Oracle XE TP avec MySQL Gérard-Michel Cochard Travaux Pratiques avec Oracle XE Contenu : 1 - Installation et prise en main 2 - Un exemple

Plus en détail

4D - Référence SQL. Prise en main Utiliser le SQL dans 4D Commandes SQL Règles de syntaxe Transactions Fonctions Annexes

4D - Référence SQL. Prise en main Utiliser le SQL dans 4D Commandes SQL Règles de syntaxe Transactions Fonctions Annexes 4D - Référence SQL Prise en main Utiliser le SQL dans 4D Commandes SQL Règles de syntaxe Transactions Fonctions Annexes Prise en main Introduction Recevoir le résultat d'une requête SQL dans une variable

Plus en détail

Base de données - Tableaux Query Rapport de projet

Base de données - Tableaux Query Rapport de projet Base de données - Tableaux Query Rapport de projet Xavier Dubuc 30 mars 2009 Table des matières 1 Introduction. 2 1.1 Qu est-ce qu un tableau query?................................. 2 1.2 Le tupple résumé..........................................

Plus en détail

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

Compte-rendu de projet de Système de gestion de base de données Compte-rendu de projet de Système de gestion de base de données Création et utilisation d'un index de jointure LAMBERT VELLER Sylvain M1 STIC Université de Bourgogne 2010-2011 Reponsable : Mr Thierry Grison

Plus en détail

1. L'environnement. de travail. 420-283 Programmation. d'un serveur

1. L'environnement. de travail. 420-283 Programmation. d'un serveur 420-283 Programmation d'un serveur 1. L'environnement de travail L'objectif de ce cours est de développer des applications clients-serveur utilisant des bases de données. Le modèle selon lequel fonctionne

Plus en détail

Compte rendu d activité Fiche n 1

Compte rendu d activité Fiche n 1 Compte rendu d activité Fiche n 1 Alexandre K. (http://ploufix.free.fr) Nature de l activité Création d une base de connaissances avec PostgreSQL Contexte : Le responsable technique souhaite la mise en

Plus en détail

La base e-journals utilisation au SCD, Université de Limoges

La base e-journals utilisation au SCD, Université de Limoges La base e-journals utilisation au SCD, Université de Limoges Conçue en mars 2002 par le SCD de Nancy 1 (Jean-Charles Houpier et Nicolas Morin), e- Journals est une base de données open source, construite

Plus en détail

Formation PHP/MySQL. Pierre PATTARD. Avril 2005

Formation PHP/MySQL. Pierre PATTARD. Avril 2005 Formation PHP/MySQL Pierre PATTARD Julien BENOIT Avril 2005 Le PHP Langage interprété, côté serveur pages interprétées par le serveur web pas de compilation, code éditable avec un bloc notes. aucune différences

Plus en détail

1 Introduction et installation

1 Introduction et installation TP d introduction aux bases de données 1 TP d introduction aux bases de données Le but de ce TP est d apprendre à manipuler des bases de données. Dans le cadre du programme d informatique pour tous, on

Plus en détail

8. Java et les bases de données. Olivier Curé - UMLV [page 206 ]

8. Java et les bases de données. Olivier Curé - UMLV [page 206 ] 8. Java et les bases de données Olivier Curé - UMLV [page 206 ] Java et les BD Plusieurs manières d'écrire du code Java accédant à une BD: Statement Level Interface (SLI) Solutions : SQLJ (SQL92) Call

Plus en détail

Procédures Stockées WAVESOFT... 12 ws_sp_getidtable... 12. Exemple :... 12. ws_sp_getnextsouche... 12. Exemple :... 12

Procédures Stockées WAVESOFT... 12 ws_sp_getidtable... 12. Exemple :... 12. ws_sp_getnextsouche... 12. Exemple :... 12 Table des matières Les Triggers... 2 Syntaxe... 2 Explications... 2 Les évènements déclencheurs des triggers... 3 Les modes de comportements des triggers... 4 Les pseudo tables... 5 Exemple... 6 Les procédures

Plus en détail

Manuel du rédacteur. Dernière mise à jour : le 14/04/2010

Manuel du rédacteur. Dernière mise à jour : le 14/04/2010 Manuel du rédacteur Dernière mise à jour : le 14/04/2010 Table des matières 1 PRÉSENTATION GÉNÉRALE... 3 2 L INTERFACE DE GESTION... 3 2.1 ACCÈS À L INTERFACE DE GESTION... 3 2.2 PRÉSENTATION GÉNÉRALE...

Plus en détail

Construire une extension évoluée

Construire une extension évoluée 12 Construire une extension évoluée Objectif de l'extension Dans ce chapitre, nous allons créer une extension "évoluée", autrement dit une extension ajoutant plusieurs fonctionnalités et faisant appel

Plus en détail

Chapitre 9 Les métadonnées

Chapitre 9 Les métadonnées 217 Chapitre 9 Les métadonnées 1. De l'importance des métadonnées Les métadonnées Au-delà du contenu des données elles-mêmes d'un système, il est souvent très utile de connaître un minimum d'informations

Plus en détail

Création d un catalogue en ligne

Création d un catalogue en ligne 5 Création d un catalogue en ligne Au sommaire de ce chapitre Fonctionnement théorique Définition de jeux d enregistrements Insertion de contenu dynamique Aperçu des données Finalisation de la page de

Plus en détail

Serveur d'archivage 2007 Serveur Archivage : Manuel Utilisateur

Serveur d'archivage 2007 Serveur Archivage : Manuel Utilisateur Type du document Manuel utilisateur Auteur(s) Eric Bouladier Date de création 26/03/2007 Domaine de diffusion Illimité Validé par Versions Date Auteur(s) Modifications 1.0 26/03/2007 Eric Bouladier Création

Plus en détail

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

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2 SQL Sommaire : COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2 COMMANDES DE MANIPULATION DE DONNEES... 2 COMMANDES DE CONTROLE TRANSACTIONNEL... 2 COMMANDES DE REQUETE DE DONNEES... 2 COMMANDES

Plus en détail

SQL pour. Oracle 10g. Razvan Bizoï. Tsoft, Groupe Eyrolles, 2006, ISBN : 2-212-12055-9, ISBN 13 : 978-2-212-12055-4

SQL pour. Oracle 10g. Razvan Bizoï. Tsoft, Groupe Eyrolles, 2006, ISBN : 2-212-12055-9, ISBN 13 : 978-2-212-12055-4 SQL pour Oracle 10g Razvan Bizoï Tsoft, Groupe Eyrolles, 2006, ISBN : 2-212-12055-9, ISBN 13 : 978-2-212-12055-4 Ce guide de formation a pour but de vous permettre d'acquérir une bonne connaissance du

Plus en détail

PHP/MySQL. École Nationale Supérieure des Mines de Nancy 2nde Année

PHP/MySQL. École Nationale Supérieure des Mines de Nancy 2nde Année Bases de Données et Ingénierie des Systèmes d Information 1 PHP/MySQL École Nationale Supérieure des Mines de Nancy 2nde Année Table des matières I PHP 2 1 Les bases 2 1.1 Introduction........................................

Plus en détail

Formation DEV4 : SQL - Conception & Mise en Oeuvre

Formation DEV4 : SQL - Conception & Mise en Oeuvre Synopsis Formation DEV4 : SQL - Conception & Mise en Oeuvre Le SQL (Structured Query Language) est le langage standard de manipulation de données. À ce titre, il est le pilier fondamental de la base PostgreSQL,

Plus en détail

MOODLE : Installation et organisation MASTER IPM 2009-2011_ Méthode et Modèle Plate-forme

MOODLE : Installation et organisation MASTER IPM 2009-2011_ Méthode et Modèle Plate-forme MOODLE : Installation et organisation MASTER IPM 2009-2011_ Méthode et Modèle Plate-forme KOUNDE Koba Pierre Sommaire Introduction I Installation 1- Installation d un serveur de type Apache 2- Installation

Plus en détail

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

Introduction à JDBC. Accès aux bases de données en Java Introduction à JDBC Accès aux bases de données en Java Eric Cariou Université de Pau et des Pays de l'adour Département Informatique Eric.Cariou@univ-pau.fr 1 Introduction JDBC : Java Data Base Connectivity

Plus en détail

Sites web MVC Damien Nouvel

Sites web MVC Damien Nouvel Sites web MVC Plan Architecture MVC Vues / interface Contrôleur / application 2 / 17 Plan Architecture MVC Vues / interface Contrôleur / application 3 / 17 Architecture MVC MVC Méthode de conception d'interface

Plus en détail

PHP Et Les Bases De Données 22 février 2006

PHP Et Les Bases De Données 22 février 2006 Conservatoire National des Arts et Métiers FOD Ile de France UE NFA054 PHP Et Les Bases De Données 22 février 2006 Version Auteur Commentaires 22 février 2006 Florent Brusciano Version Initiale Tous droits

Plus en détail

Le langage PHP permet donc de construire des sites web dynamiques, contrairement au langage HTML, qui donnera toujours la même page web.

Le langage PHP permet donc de construire des sites web dynamiques, contrairement au langage HTML, qui donnera toujours la même page web. Document 1 : client et serveur Les ordinateurs sur lesquels sont stockés les sites web sont appelés des serveurs. Ce sont des machines qui sont dédiées à cet effet : elles sont souvent sans écran et sans

Plus en détail

Transaction. 1:débiter(1000) 2:créditer(1000)

Transaction. 1:débiter(1000) 2:créditer(1000) Transaction Il n'est pas rare qu'une opération se divise en plusieurs autres opérations élémentaires sur la base de données. Dans ce cas, l''état de la base de données avant l'opération est maintenue cohérent,

Plus en détail

PHP - BD. PostgreSQL. Connexion (I) Présentation

PHP - BD. PostgreSQL. Connexion (I) Présentation PHP - BD PostgreSQL S. Lanquetin LE2I Aile sciences de l'ingénieur Bureau G206 sandrine.lanquetin@u-bourgogne.fr Présentation Connexion (I) PostgreSQL s'appuie sur le modèle relationnel mais apporte les

Plus en détail

Bases de Données & Interfaces Web. stanislas.oger@univ-avignon.fr

Bases de Données & Interfaces Web. stanislas.oger@univ-avignon.fr Bases de Données & Interfaces Web stanislas.oger@univ-avignon.fr 1 Architecture d'un SI Web Fonctionnement Dynamique avec Base de Données 2 Idée Dynamiser les pages avec des infos venant de BDD Enregistrer

Plus en détail

PHP MySQL N 2. IUT MMI Saint Raphaël 2014-2015

PHP MySQL N 2. IUT MMI Saint Raphaël 2014-2015 PHP MySQL N 2 IUT MMI Saint Raphaël 2014-2015 Base de données : Utilisation avec PHP Se connecter à la base de données PHP propose plusieurs moyens de se connecter à une base de données MySQL : - L'extension

Plus en détail

NVU, Notepad++ (ou le bloc-note), MySQL, PhpMyAdmin. HTML, PHP, cas d utilisation, maquettage, programmation connaissances en HTML, PHP et SQL

NVU, Notepad++ (ou le bloc-note), MySQL, PhpMyAdmin. HTML, PHP, cas d utilisation, maquettage, programmation connaissances en HTML, PHP et SQL Prise en main de NVU et Notepad++ (conception d application web avec PHP et MySql) Propriétés Intitulé long Formation concernée Matière Présentation Description Conception de pages web dynamiques à l aide

Plus en détail

Les CMSs, comment ça marche et comment choisir le bon CMS? (mon site, pas à pas)

Les CMSs, comment ça marche et comment choisir le bon CMS? (mon site, pas à pas) Les CMSs, comment ça marche et comment choisir le bon CMS? (mon site, pas à pas) Author : soufiane Bonjour, J'ai parlé dans les tutoriels précédents de la série "mon site, pas à pas" sur les divers langages

Plus en détail

Documentation déploiement Auteur: Ratefiarivony Herimamy herimamy.ratefiarivony@enscachan.fr Date: 23/10/08

Documentation déploiement Auteur: Ratefiarivony Herimamy herimamy.ratefiarivony@enscachan.fr Date: 23/10/08 Objet: Documentation déploiement Auteur: Ratefiarivony Herimamy herimamy.ratefiarivony@enscachan.fr Date: 23/10/08 Présentation de l'architecture matérielle du SIENS/Cachan: Spider3 (Linux) via adaptor

Plus en détail

Nouveau : Test de DATAGEN, générateur de données

Nouveau : Test de DATAGEN, générateur de données Nouveau : Test de DATAGEN, générateur de données par Date de publication : 10 avril 2005 Dernière mise à jour : Test de DATAGEN, outil de génération de jeux de données SGBD par Sylvain James, rédacteur

Plus en détail

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server Suite à mon précédent article concernant MSDE, je me suis rendu compte à partir des commentaires que de nombreux utilisateurs avaient des problèmes

Plus en détail