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

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

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

Persistance en Php. Note : les problèmes d accès concurrents, de sécurité et de login sont laissés de côté.

Persistance en Php. Note : les problèmes d accès concurrents, de sécurité et de login sont laissés de côté. Persistance en Php Objectif : faire un site pour gérer des articles par catégorie. Chaque catégorie a un nom, chaque catégorie est constitué d articles (titre, auteur, texte), un article est dans une seule

Plus en détail

Accès au serveur SQL. Où ranger les accès au serveur SQL?

Accès au serveur SQL. Où ranger les accès au serveur SQL? 150 requête SQL, cela aura un impact sur un nombre limité de lignes et non plus sur l ensemble des données. MySQL propose une clause originale en SQL : LIMIT. Cette clause est disponible avec les différentes

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

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

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

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

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

LINQ to SQL. Version 1.1

LINQ to SQL. Version 1.1 LINQ to SQL Version 1.1 2 Chapitre 03 - LINQ to SQL Sommaire 1 Introduction... 3 1.1 Rappels à propos de LINQ... 3 1.2 LINQ to SQL... 3 2 LINQ to SQL... 3 2.1 Importer des tables... 3 2.1.1 Le concepteur

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

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

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

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

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

Encryptions, compression et partitionnement des données

Encryptions, compression et partitionnement des données Encryptions, compression et partitionnement des données Version 1.0 Grégory CASANOVA 2 Compression, encryption et partitionnement des données Sommaire 1 Introduction... 3 2 Encryption transparente des

Plus en détail

STAGE2 STAGIAIRE / NIKOLAOS TSOLAKIS. 16/02/2015 : choix des outils nécessités pour l application : Didier Kolb, le maitre de stage

STAGE2 STAGIAIRE / NIKOLAOS TSOLAKIS. 16/02/2015 : choix des outils nécessités pour l application : Didier Kolb, le maitre de stage STAGE2 STAGIAIRE / NIKOLAOS TSOLAKIS 16/02/2015 : choix des outils nécessités pour l application : Didier Kolb, le maitre de stage m invite à faire une étude sur les outils qui seraient utilisés. Sites

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

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

Base de donnée relationnelle. Exemple de table: Film. Exemple de table: Acteur. Exemple de table: Role. Contenu de la table Role

Base de donnée relationnelle. Exemple de table: Film. Exemple de table: Acteur. Exemple de table: Role. Contenu de la table Role IFT7 Programmation Serveur Web avec PHP Introduction à MySQL Base de donnée relationnelle Une base de données relationnelle est composée de plusieurs tables possédant des relations logiques (théorie des

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

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

Alfresco Mobile pour Android

Alfresco Mobile pour Android Alfresco Mobile pour Android Guide d'utilisation de l'application Android version 1.1 Commencer avec Alfresco Mobile Ce guide offre une présentation rapide vous permettant de configurer Alfresco Mobile

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

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

Philosophie des extensions WordPress

Philosophie des extensions WordPress 8 Philosophie des extensions WordPress Le concept L une des forces de WordPress dans la jungle CMS, c est la simplicité de création d extensions. Il y a plusieurs raisons à cela. Des raisons techniques

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

DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin

DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin Objectifs : Apprendre à l apprenant à lancer un serveur local «Apache» Apprendre à l'apprenant à lancer un serveur MySQL

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

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

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

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

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

CREER UNE BASE DE DONNEES ACCESS AVEC DAO (étape par étape)

CREER UNE BASE DE DONNEES ACCESS AVEC DAO (étape par étape) CREER UNE BASE DE DONNEES ACCESS AVEC DAO (étape par étape) NIVEAU : PREMIERE RENCONTRE AVEC VB INITIES/EXPERIMENTES Pré requis pour comprendre ce tutorial : - Connaître les principales commandes de VB

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

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

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

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

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

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

Les sites statiques et dynamiques : PHP et SQL

Les sites statiques et dynamiques : PHP et SQL Les sites statiques et dynamiques : PHP et SQL Introduction Dans cet exposé, nous traiterons dans un première partie, de la création de pages web statiques et dynamiques. La deuxième partie sera consacrée

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

WordPress : Guide à l édition

WordPress : Guide à l édition WordPress : Guide à l édition WordPress : Guide à l édition... 1 Présentation... 2 1. Accès au site... 2 2. Le tableau de bord... 2 3. Editez les contenus... 4 Quelle est la différence entre les pages

Plus en détail

SELECT FROM WHERE DISTINCT TOP n INSERT INTO VALUES UPDATE

SELECT FROM WHERE DISTINCT TOP n INSERT INTO VALUES UPDATE LES REQUETES SQL Sélectionner des enregistrements La requête SELECT est utilisée pour rechercher des enregistrements d'une table, elle s'emploie avec FROM qui est utilisé pour spécifier le nom de la table.

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

OI40: bases de données, TP 2

OI40: bases de données, TP 2 OI40: bases de données, TP 2 Frédéric Lassabe October 26, 2010 Ce TP requiert d avoir bien compris le TP précédent. 1 Sujet Lors de ce TP, il sera question d améliorer la base de données du TP précédent.

Plus en détail

Utilisation de GalaxShare

Utilisation de GalaxShare Utilisation de GalaxShare Tutoriel accessible en ligne sur http://galaxair.com/tuto/aidegalaxshare.html Le Porte-Document GalaxShare est un logiciel web de partage de documents, avec une gestion fine des

Plus en détail

Programmation C++ (débutant)/les tableaux statiques

Programmation C++ (débutant)/les tableaux statiques Programmation C++ (débutant)/les tableaux statiques 1 Programmation C++ (débutant)/les tableaux statiques Le cours du chapitre 6 : les tableaux statiques Les tableaux Une variable entière de type int ne

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

Vulnérabilités logicielles Injection SQL

Vulnérabilités logicielles Injection SQL MGR850 Hiver 2014 Vulnérabilités logicielles Injection SQL Hakima Ould-Slimane Chargée de cours École de technologie supérieure (ÉTS) Département de génie électrique 1 Plan SQL Injection SQL Injections

Plus en détail

Tutoriel Drupal «views»

Tutoriel Drupal «views» Tutoriel Drupal «views» Tutoriel pour la découverte et l utilisation du module Drupal «Views» 1 Dans ce tutoriel nous allons d abord voir comment se présente le module views sous Drupal 7 puis comment

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

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

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

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

Faire fonctionner symfony sous wamp et windows avec des vhost. Installation de wamp

Faire fonctionner symfony sous wamp et windows avec des vhost. Installation de wamp Vous avez certainement déjà souhaiter gérer plusieurs projets symfony sur votre machine après avoir installé Wamp Server. Ce n'est pas simple en apparence, un seul dossier www et des sous répertoire en

Plus en détail

Précis de vocabulaire Orienté Objet

Précis de vocabulaire Orienté Objet Dernière Mise à jour : Mars 2007 Précis de vocabulaire Orienté Objet 1 Questions Expliquer et donner un exemple pour chacun des concepts suivants 1. Qu'est-ce qu'un objet? 2. Qu'est-ce qu'une classe? 3.

Plus en détail

Ecole Nationale Supérieure des Télécommunications Les outils XML

Ecole Nationale Supérieure des Télécommunications Les outils XML Ecole Nationale Supérieure des Télécommunications Les outils XML Page 1 sur 13 SOMMAIRE 1 Introduction 3 2 Parseur XML et processeur XSLT 4 2.1 Le Parseur XML v2 4 2.1.1 Les API DOM et SAX 4 2.1.2 Le parseur

Plus en détail

Introduction au langage SQL

Introduction au langage SQL Introduction au langage SQL Les bases de données relationnelles Le langage SQL est un langage universel destiné à travailler sur des bases de données relationnelles. Nous considérerons ici qu'une base

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

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

Développement de Servlets et JSP avec Eclipse

Développement de Servlets et JSP avec Eclipse Développement de Servlets et JSP avec Eclipse Sommaire 1 Mise en place o 1.1 Installation de Galileo o 1.2 Association de Galileo avec une installation de Tomcat o 1.3 Pilotage des serveurs 2 Développement

Plus en détail

Projet GsbFrais virtualisation

Projet GsbFrais virtualisation Projet GsbFrais virtualisation Table des matières Première séance : deux machines physiques... 2 Où et comment s'effectue la connexion à la base de données?... 2 Quelles valeurs ont les trois variables

Plus en détail

Visual Studio.NET et Visual SourceSafe - PART 1. Visual Studio.NET et Visual SourceSafe

Visual Studio.NET et Visual SourceSafe - PART 1. Visual Studio.NET et Visual SourceSafe Visual Studio.NET et Visual SourceSafe - PART 1 Configuration de Microsoft Visual SourceSafe Comment gérer les sources de ses projets.net? Avec le développement de Solutions.NET et le travail en 'Extreme

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

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

Utiliser Access ou Excel pour gérer vos données

Utiliser Access ou Excel pour gérer vos données Page 1 of 5 Microsoft Office Access Utiliser Access ou Excel pour gérer vos données S'applique à : Microsoft Office Access 2007 Masquer tout Les programmes de feuilles de calcul automatisées, tels que

Plus en détail

Joomla! Création et administration d'un site web - Version numérique

Joomla! Création et administration d'un site web - Version numérique Avant-propos 1. Objectifs du livre 15 1.1 Orientation 15 1.2 À qui s adresse ce livre? 16 2. Contenu de l ouvrage 17 3. Conclusion 18 Introduction 1. Un peu d histoire pour commencer... 19 1.1 Du web statique

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

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

Nuage Cloud notions, utilisation

Nuage Cloud notions, utilisation Page:1 Cours pour utilisation simple du Cloud Table des matières 1-Généralités...2 1.1-Les principales fonctionnalités...2 2-Les solutions proposées...4 2.1-Choix du fournisseur...4 2.2-Installation de

Plus en détail

S. Laporte C# mode console DAIGL TS1

S. Laporte C# mode console DAIGL TS1 Bases du langage C# I. C# en mode console (mode texte) Avantages par rapport au mode graphique (Application Windows): - C'est un mode plus proche de l'approche algorithmique (pas de notions de composants,

Plus en détail

DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova

DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova I. Introduction Dans une période où la plasticité peut aider à réduire les coûts de développement de projets comme des applications mobile,

Plus en détail

www.evogue.fr SUPPORT DE COURS / PHP PARTIE 3

www.evogue.fr SUPPORT DE COURS / PHP PARTIE 3 L i a m T A R D I E U www.evogue.fr SUPPORT DE COURS / PHP PARTIE 3 Sommaire Sommaire... 2 Eléments initiaux... 3 Base de données... 3 Tables... 4 membres... 4 commandes... 4 articles... 4 details_commandes...

Plus en détail

1. Installation du Module

1. Installation du Module 1 sur 10 Mise en place du Module Magento V 1.5.7 1. Installation du Module Vous pouvez installer le module de deux façons différentes, en passant par Magento Connect, ou directement via les fichiers de

Plus en détail

SYSTÈMES D INFORMATIONS

SYSTÈMES D INFORMATIONS SYSTÈMES D INFORMATIONS Développement Modx Les systèmes de gestion de contenu Les Content Management Système (CMS) servent à simplifier le développement de sites web ainsi que la mise à jour des contenus.

Plus en détail

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles Types d applications pour la persistance Université de Nice Sophia-Antipolis Version 0.9 28/8/07 Richard Grin Toutes les applications n ont pas une complexité qui nécessite une architecture n- tiers Ce

Plus en détail

Installation et gestion du site Web de rapports dans cet article :

Installation et gestion du site Web de rapports dans cet article : Base de connaissances SiteAudit Installation et gestion du site Web de rapports dans cet article : Avril 2010 Présentation des fonctionnalités Installation de RWS Gestion des dossiers de rapport Accès

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

Rapport de Cryptographie

Rapport de Cryptographie Cryptographie [MIF30] / Année 2008-2009 Rapport de Cryptographie Les Injections SQL Sylvie Tixier & François-Xavier Charlet Page 1 20/05/2009 Sommaire Introduction...3 Définition d une injection SQL...3

Plus en détail

II. EXCEL/QUERY ET SQL

II. EXCEL/QUERY ET SQL I. AU TRAVAIL, SQL! 1. Qu est-ce que SQL?... 19 2. SQL est un indépendant... 19 3. Comment est structuré le SQL?... 20 4. Base, table et champ... 21 5. Quelle est la syntaxe générale des instructions SQL?...

Plus en détail

Pratique et administration des systèmes

Pratique et administration des systèmes Université Louis Pasteur Licence Informatique (L2) UFR de Mathématiques et Informatique Année 2007/2008 1 But du TP Pratique et administration des systèmes TP10 : Technologie LAMP Le but de ce TP est de

Plus en détail

Déploiement d'une base SQL Express

Déploiement d'une base SQL Express Déploiement d'une base SQL Express Comment déployer une base avec SQL Express Après l'article sur le déploiement d'une application ASP.NET, il fallait aborder la partie concernant les données. Ainsi, nous

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

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

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

Reporting Services et SharePoint

Reporting Services et SharePoint Reporting Services et SharePoint Utiliser SharePoint comme source de données Dans un précédent article, nous avons pu apprendre comment créer un rapport utilisant une source de données XML La question

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

Documentation Talend. Charly Riviere CDG35

Documentation Talend. Charly Riviere CDG35 Documentation Talend Charly Riviere CDG35 1. Présentation générale Talend est un ETL pour "Extract Transform Load". Comme son nom l'indique il permet d'extraire des données pour ensuite les transformer

Plus en détail

RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005

RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005 Oussama ELKACHOINDI Wajdi MEHENNI RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005 Sommaire I. Préliminaire : Notice d exécution et mode opératoire...4 II. Architecture globale de l application...5

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

C'est : C'est : un fichier, analogue à une feuille de calcul Excel, contenant les informations.

C'est : C'est : un fichier, analogue à une feuille de calcul Excel, contenant les informations. C'est : un ensemble de fichiers contenant toutes les informations nécessaires à une application + un logiciel de Gestion de ces informations appelé SGBD (Système de Gestion de Base de Données). C'est :

Plus en détail

Tutoriel pour l introduction à l animation en HTML5 et JavaScript

Tutoriel pour l introduction à l animation en HTML5 et JavaScript Tutoriel pour l introduction à l animation en HTML5 et JavaScript Frédéric Guégan Olivier Fauvel-Jaeger Giacomo Rombaut Table des matières 1. Introduction... 2 2. Création de l environnement... 2 3. Création

Plus en détail

LES ACCES ODBC AVEC LE SYSTEME SAS

LES ACCES ODBC AVEC LE SYSTEME SAS LES ACCES ODBC AVEC LE SYSTEME SAS I. Présentation II. SAS/ACCESS to ODBC III. Driver ODBC SAS IV. Driver ODBC SAS Universel V. Version 8 VI. Références I. Présentation Introduction ODBC, qui signifie

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

Cas d'usage C080 - Création d'une vue

Cas d'usage C080 - Création d'une vue Cas d'usage C080 - Création d'une vue Page 1 / 15 1. Cas d'usage 3 1.1. C080 - Création d'une vue 3 1.2. Etape 3 2. Etape 5 2.1. Liste des vues 5 2.2. Créer une vue 6 2.3. Ajouter des zones 7 2.4. Exercice

Plus en détail