<!-- If it is directly included in a div, we have to add Opale's text markups -->
<xsl:whentest="parent::*[name() = 'div']">
<xsl:whentest="parent::*[name() = 'div'] and not(parent::*[@data-hdoc-type = 'gapText']) and not(parent::*[@data-hdoc-type = 'label']) and not(parent::*[@data-hdoc-type = 'target'])">
?><htmlxmlns="http://www.utc.fr/ics/hdoc/xhtml"xmlns:sc="http://www.utc.fr/ics/scenari/v3/core"xmlns:sp="http://www.utc.fr/ics/scenari/v3/primitive"xmlns:op="utc.fr:ics/opale3"><head><title>Technologie Web : Architecture LAPP</title><metacharset="utf-8"/><metacontent="HdocConverter/Opale3.4"name="generator"/><metaname="rights"content="by-sa"/><metaname="author"content="Stéphane Crozat (Contributions : Antoine Vincent, Benjamin Lussier, Léonard Dumas)"/></head><body><sectiondata-hdoc-type="introduction"><header><h1>Introduction</h1></header><div><p>Si les SGBD offrent les technologies de modélisation et de gestion des données, ils nécessitent la plupart du temps d'être interfacés avec des applications qui fournissent un accès orienté métier aux utilisateurs, notamment à travers des IHM évoluées. Même des systèmes comme Oracle ou PostgreSQL qui proposent un langage procédural (comme PL/SQL) au dessus de la couche SQL, ne sont pas auto-suffisants. Les langages évolués comme Java ou C++ sont couramment utilisés pour implémenter la couche applicative d'exploitation des BD. </p><p>Les applications de BD sont aujourd'hui généralement réalisées selon des architectures réseaux. L'explosion d'Internet de son côté a favorisé le langage HTML pour implémenter les IHM et a vu la naissance de langages de script pour implémenter la couche applicative côté serveur, tels que PHP ou JSP, plus simples que les langages classiques.</p></div></section><section><header><h1>Architecture Web</h1></header><section><header><h1>Notions d'architecture client-serveur</h1><divdata-hdoc-type="author">Fait à partir de www.commentcamarche.net. Copyright 2003 Jean-François Pillou. Document soumis à la licence GNU FDL. </div></header><div><h6>Présentation de l'architecture d'un système client/serveur</h6><p>De nombreuses applications fonctionnent selon un environnement clients/serveur, cela signifie que des machines clientes (des machines faisant partie du réseau) contactent un serveur, une machine généralement très puissante en terme de capacités d'entrée-sortie, qui leur fournit des services. Ces services sont des programmes fournissant des données telles que l'heure, des fichiers, une connexion...</p><p>Les services sont exploités par des programmes, appelés programmes clients, s'exécutant sur les machines clientes. On parle ainsi de client FTP, client de messagerie... </p><p>Dans un environnement purement client/serveur, les ordinateurs du réseau (les clients) ne peuvent voir que le serveur, c'est un des principaux atouts de ce modèle.</p></div><div><h6>Avantages de l'architecture client/serveur</h6><p>Le modèle client/serveur est particulièrement recommandé pour des réseaux nécessitant un grand niveau de fiabilité, ses principaux atouts sont :</p><ul><li><p>
<em>des ressources centralisées</em>
</p><p>étant donné que le serveur est au centre du réseau, il peut gérer des ressources communes à tous les utilisateurs, comme par exemple une base de données centralisée, afin d'éviter les problèmes de redondance et de contradiction</p></li><li><p>
<em>une meilleure sécurité</em>
</p><p>car le nombre de points d'entrée permettant l'accès aux données est moins important</p></li><li><p>
<em> une administration au niveau serveur</em>
</p><p> les clients ayant peu d'importance dans ce modèle, ils ont moins besoin d'être administrés</p></li><li><p>
<em>un réseau évolutif</em>
</p><p>grâce à cette architecture ont peu supprimer ou rajouter des clients sans perturber le fonctionnement du réseau et sans modifications majeures</p></li></ul></div><div><h6>Inconvénients du modèle client/serveur</h6><p>L'architecture client/serveur a tout de même quelques lacunes parmi lesquelles :</p><ul><li><p>
<em>un coût élevé </em>
</p><p>dû à la technicité du serveur</p></li><li><p>
<em>un maillon faible</em>
</p><p>le serveur est le seul maillon faible du réseau client/serveur, étant donné que tout le réseau est architecturé autour de lui! Heureusement, le serveur a une grande tolérance aux pannes (notamment grâce au système RAID)</p></li></ul></div><div><h6>Fonctionnement d'un système client/serveur</h6><imgsrc="re/cs.jpg"alt="cs.jpg"/><p>Un système client/serveur fonctionne selon le schéma suivant:</p><ul><li><p>Le client émet une requête vers le serveur grâce à son <em>adresse</em> et à son <em>port</em>, qui désigne un service particulier du serveur</p></li><li><p>Le serveur reçoit la demande et répond à l'aide de l'adresse de la machine client (et de son port)</p></li></ul></div><footer><divdata-hdoc-type="tags"><span>Architecture</span><span>Client</span><span>Serveur</span></div></footer></section><section><header><h1>Notions d'architecture 3-tier</h1><divdata-hdoc-type="author">Fait à partir de www.commentcamarche.net. Copyright 2003 Jean-François Pillou. Document soumis à la licence GNU FDL. </div></header><div><h6>Présentation de l'architecture à deux niveaux</h6><p>L'architecture à deux niveaux (aussi appelée architecture 2-tier,<i>tier</i> signifiant étage en anglais) caractérise les systèmes clients/serveurs dans lesquels le client demande une ressource et le serveur la lui fournit directement. Cela signifie que le serveur ne fait pas appel à une autre application afin de fournir le service. </p><imgsrc="re/2-tier.jpg"alt="2-tier.jpg"/></div><div><h6>Présentation de l'architecture à trois niveaux</h6><p>Dans l'architecture à 3 niveaux (appelée architecture 3-tier), il existe un niveau intermédiaire, c'est-à-dire que l'on a généralement une architecture partagée entre:
</p><ol><li><p>
<em>Le client</em>
</p><p>le demandeur de ressources</p></li><li><p>
<em>Le serveur d'application</em>
</p><p>(appelé aussi <i>middleware</i>) le serveur chargé de fournir la ressource mais faisant appel à un autre serveur</p></li><li><p>
<em>Le serveur secondaire</em>
</p><p>(généralement un serveur de base de données), fournissant un service au premier serveur</p></li></ol><imgsrc="re/3-tier.jpg"alt="3-tier.jpg"/></div><divdata-hdoc-type="remark"><p>Étant donné l'emploi massif du terme d'architecture à 3 niveaux, celui-ci peut parfois désigner aussi les architectures suivantes :</p><ul><li><p>Partage d'application entre client, serveur intermédiaire, et serveur d'entreprise</p></li><li><p>Partage d'application entre client, base de données intermédiaire, et base de données d'entreprise</p></li></ul></div><div><h6>Comparaison des deux types d'architecture</h6><p>L'architecture à deux niveaux est donc une architecture client/serveur dans laquelle le serveur est polyvalent, c'est-à-dire qu'il est capable de fournir directement l'ensemble des ressources demandées par le client.</p><p> Dans l'architecture à trois niveaux par contre, les applications au niveau serveur sont délocalisées, c'est-à-dire que chaque serveur est spécialisé dans une tâche (serveur web et serveur de base de données par exemple). Ainsi, l'architecture à trois niveaux permet :</p><ul><li><p>une plus grande flexibilité/souplesse</p></li><li><p>une plus grande sécurité (la sécurité peut être définie pour chaque service)</p></li><li><p>de meilleures performances (les tâches sont partagées)</p></li></ul></div><divdata-hdoc-type="complement"><h6>L'architecture multi-niveaux</h6><p>Dans l'architecture à 3 niveaux, chaque serveur (niveaux 1 et 2) effectue une tâche (un service) spécialisée. Ainsi, un serveur peut utiliser les services d'un ou plusieurs autres serveurs afin de fournir son propre service. Par conséquence, l'architecture à trois niveaux est potentiellement une architecture à N niveaux. </p><imgsrc="re/n-tier.jpg"alt="n-tier.jpg"/></div><footer><divdata-hdoc-type="tags"><span>Architecture</span><span>Client</span><span>Serveur</span><span>3-tier</span></div></footer></section><section><header><h1>Notions de serveur Web</h1></header><div><p>Fait à partir de <ahref="www.commentcamarche.net">www.commentcamarche.net</a>. Copyright 2003 Jean-François Pillou. Document soumis à la licence GNU FDL. </p></div><div><p>Un serveur web est un logiciel permettant à des clients d’accéder à des pages web, c'est-à-dire en réalité des fichiers au format HTML à partir d'un navigateur.</p><p>Un serveur web est donc un "simple" logiciel capable d'interpréter les requêtes HTTP arrivant sur le port associé au protocole HTTP (par défaut le port 80), et de fournir une réponse avec ce même protocole.
:</p><p>Connectez vous de préférence en utilisant <spandata-hdoc-type="syntax">ssh</span>, lancez <spandata-hdoc-type="syntax">ssh username@tuxa.sme.utc</span> dans le terminal Putty (avec <i>username</i> votre compte NF17).</p></li></ol></div><footer/></section><section><header><h1>Rappels Unix/Linux</h1></header><div><h6>Connexion Linux</h6><p>Pour se connecter depuis une machine Windows vers un serveur Linux, on utilise le client Putty pour se connecter avec le protocole <spandata-hdoc-type="syntax">ssh</span>.</p></div><div><h6>Quelques commandes de base à connaître</h6><ul><li><p><spandata-hdoc-type="syntax">cd</span></p></li><li><p><spandata-hdoc-type="syntax">man</span></p></li><li><p><spandata-hdoc-type="syntax">ls</span></p></li><li><p><spandata-hdoc-type="syntax">pwd</span></p></li><li><p><spandata-hdoc-type="syntax">chmod</span></p></li><li><p><spandata-hdoc-type="syntax">more</span></p></li><li><p>...</p></li></ul></div><footer/></section><section><header><h1>Mise en ligne d'un fichier HTML</h1></header><div><ul><li><p>
Les fichiers HTML sont mis dans un dossier <spandata-hdoc-type="syntax">~/public_html</span>
</p></li><li><p>Il faut donner les droits en lecture sur les fichiers (<spandata-hdoc-type="syntax">chmod 755</span>)</p></li><li><p>Les fichiers sont ensuite accessibles sur le Web via une adresse telle que :</p><p>
<spandata-hdoc-type="syntax">psql</span> est le client textuel de PostgreSQL.</p><p>psql dbname -h host</p></div><div><h6>Commande de base</h6><ul><li><p>
<spandata-hdoc-type="syntax">\?</span> : Liste des commandes <spandata-hdoc-type="syntax">psql</span>
</p></li><li><p>
<spandata-hdoc-type="syntax">\h</span> : Liste des instructions SQL</p><p>
<spandata-hdoc-type="syntax">\h CREATE TABLE</span> : Description de l'instruction SQL <spandata-hdoc-type="syntax">CREATE TABLE</span>
<spandata-hdoc-type="syntax">\d</span> : Liste des relations (catalogue de données)</p><p>
<spandata-hdoc-type="syntax">\d maTable</span> : Description de la relation <spandata-hdoc-type="syntax">maTable</span>
</p></li><li><p>
<spandata-hdoc-type="syntax">\H</span> : mode HTML ou mode textuel pour les retours de requête</p></li><li><p><spandata-hdoc-type="syntax">\!</span> : permet d'exécuter certaines commandes du <i>shell</i> Linux</p></li></ul></div><div><h6>Écrire une instruction SQL</h6><p>Une instruction SQL peut s'écrire sur une ou plusieurs lignes, le <spandata-hdoc-type="syntax">retour chariot</span> n'a pas d'incidence sur la requête, c'est le <spandata-hdoc-type="syntax">
;
</span>qui marque la fin de l'instruction SQL et provoque son exécution.</p><p>dbnf17p015=> SELECT * FROM maTable ;</p><p>dbnf17p015=> SELECT *
dbnf17p015-> FROM maTable
dbnf17p015-> ;</p><p>On notera dans <spandata-hdoc-type="syntax">psql</span> la différence entre les caractères <spandata-hdoc-type="syntax">=></span> et <spandata-hdoc-type="syntax">-></span> selon que l'on a ou pas effectué un retour chariot.</p></div><divdata-hdoc-type="complement"><p><ahref="http://www.postgresql.org/docs/current/static/app-psql.html">http://www.postgresql.org/docs/current/static/app-psql.html</a></p></div><footer/></section><section><header><h1>Exécuter un fichier SQL</h1></header><div><p>Il est souvent intéressant d'exécuter un fichier contenant une liste de commandes SQL, plutôt que de les entrer une par une dans le terminal. Cela permet en particulier de recréer une base de données à partir du script de création des tables.</p></div><div><p>Pour exécuter un fichier contenant du code SQL utiliser la commande PostgreSQL <spandata-hdoc-type="syntax">\i chemin/fichier.sql</span></p><ul><li><p>
<spandata-hdoc-type="syntax">chemin</span> désigne le répertoire dans lequel est le fichier <spandata-hdoc-type="syntax">fichier.sql</span>
</p></li><li><p>le dossier de travail de <spandata-hdoc-type="syntax">psql</span> est le dossier dans lequel il a été lancé, le script peut être lancé à partir de son dossier <spandata-hdoc-type="syntax">home</span> pour en être indépendant (<spandata-hdoc-type="syntax">~/.../fichier.sql</span>)</p></li></ul></div><footer/></section><section><header><h1>Fichier CSV</h1></header><divdata-hdoc-type="definition"><h6>Fichier CSV</h6><p>
CSV est un format informatique permettant de stocker des données tabulaires dans un fichier texte.</p><p>Chaque ligne du fichier correspond à une ligne du tableau. Les valeurs de chaque colonne du tableau sont séparées par un caractère de séparation, en général une <em>virgule</em> ou un <em>point-virgule</em>. Chaque ligne est terminée par un <em>caractère de fin de ligne</em> (<i>line break</i>).</p><p>Toutes les lignes contiennent <em>obligatoirement</em> le même nombre de valeurs (donc le même nombre de caractères de séparation). Les valeurs vides doivent être exprimées par deux caractères de séparation contigus.</p><p>La taille du tableau est le nombre de lignes multiplié par le nombre de valeurs dans une ligne.</p><p>La première ligne du fichier peut être utilisée pour exprimer le nom des colonnes.</p></div><div><p>[NomColonne1;NomColonne2;...;NomColonneN]
ValeurColonne1;ValeurColonne2;...;ValeurColonneN
ValeurColonne1;ValeurColonne2;...;ValeurColonneN
...</p></div><divdata-hdoc-type="example"><h6>Fichier CSV sans entête</h6><p>Pierre;Dupont;20;UTC;NF17
Pierre;Dupont;20;UTC;NF26
Paul;Durand;21;UTC;NF17
Jacques;Dumoulin;21;UTC;NF29</p></div><divdata-hdoc-type="example"><h6>Fichier CSV avec entête</h6><p>Prenom;Nom;Age;Ecole;UV
Pierre;Dupont;20;UTC;NF17
Pierre;Dupont;20;UTC;NF26
Paul;Durand;21;UTC;NF17
Jacques;Dumoulin;21;UTC;NF29</p></div><divdata-hdoc-type="example"><h6>Valeur nulle</h6><p>Jacques;Dumoulin;;UTC;NF29</p><p>L'âge est inconnu (NULL).</p></div><divdata-hdoc-type="warning"><h6>Variations...</h6><p>La syntaxe des fichiers CSV n'est pas complètement standardisée, aussi des variations peuvent exister :</p><ul><li><p>Les chaînes de caractères peuvent être protégées par des guillemets (les guillemets s'expriment alors avec un double guillemet). </p></li><li><p>Le caractère de séparation des nombres décimaux peut être le point ou la virgule (si c'est la virgule, le caractère de séparation doit être différent)</p></li><li><p>...</p></li></ul><p>Un des problème les plus importants reste l'encodage des caractères qui n'est pas spécifié dans le fichier et peut donc être source de problèmes, lors de changement d'OS typiquement.</p></div><divdata-hdoc-type="advice"><h6>Usage en base de données</h6><p>Les fichiers CSV sont très utilisés en BD pour échanger les données d'une table (export/import). </p><p>Les SGBD contiennent généralement des utilitaires permettant d'exporter une table ou un résultat de requête sous la forme d'un fichier CSV, en spécifiant un certain nombre de paramètres (caractère de séparation de valeur, caractère de fin de ligne, présence ou non d'une ligne de définition des noms des colonnes, etc.). De même ils proposent des utilitaires permettant d'importer un fichier CSV dans une table (en spécifiant les mêmes paramètres), voire de créer directement une table à partir du fichier CSV (quand les noms des colonnes sont présents).</p></div><divdata-hdoc-type="complement"><h6>Fichiers à largeur de colonne fixe</h6><p>Les fichiers à largeur de colonne fixe n'utilisent pas de séparateur de colonne, mais imposent <em>le même nombre de caractères</em> pour chaque cellule. L'avantage est de ne pas avoir à spécifier le caractère de séparation, l'inconvénient est la taille de fichier supérieure si les valeurs ne font pas toutes la même largeur.</p></div><divdata-hdoc-type="complement"><h6>XML</h6><p>Les fichiers XML tendent de plus en plus à remplacer les fichiers CSV car ils permettent d'être beaucoup plus expressifs sur le schéma d'origine. Ils sont également plus standards (encodage spécifié, principe de séparation des données par les <i>tags</i>, etc.). Leur seul inconvénient est d'être plus verbeux et donc plus volumineux.</p></div><divdata-hdoc-type="complement"><h6>Tables externes</h6><p>Certains SGBD, comme Oracle, permettent de créer des tables dites <em>externes</em>, qui autorisent de créer un schéma de table <em>directement sur un fichier CSV</em>, permettant ainsi un accès SQL standard à un fichier CSV, sans nécessité de l'importer d'abord dans une table.</p></div><footer/></section><section><header><h1>Importer un fichier CSV</h1></header><div><p> \copy nom_table (att1, att2, ...) FROM 'fichier.csv' WITH CSV DELIMITER ';' QUOTE '"'</p><ul><li><p><spandata-hdoc-type="syntax">WITH</span> introduit les options de l'import</p></li><li><p><spandata-hdoc-type="syntax">CSV</span> indique qu'il s'agit d'un fichier CSV</p></li><li><p><spandata-hdoc-type="syntax">DELIMITER 'c'</span> indique que le caractère <em>c</em> est utilisé comme délimiteur de champ (en général <em>;</em> ou <em>,</em>)</p></li><li><p><spandata-hdoc-type="syntax">QUOTE 'c'</span> indique que le caractère <em>c</em> est utilisé comme délimiteur de chaîne (en général <em>"</em>)</p></li></ul></div><divdata-hdoc-type="remark"><ul><li><p>La table <spandata-hdoc-type="syntax">nom_table</span> doit déjà exister</p></li><li><p>Le nombre de colonnes spécifié doit correspondre au nombre de colonnes du fichier CSV</p></li><li><p>Les types doivent être compatibles</p></li></ul></div><divdata-hdoc-type="remark"><p>Ajouter l'option <spandata-hdoc-type="syntax">HEADER</span> après <spandata-hdoc-type="syntax">WITH CSV</span> si le fichier CSV contient une ligne s'entête.</p><p> \copy nom_table (att1, att2, ...) FROM 'fichier.csv' WITH CSV HEADER DELIMITER ';' QUOTE '"'</p></div><divdata-hdoc-type="advice"><h6>Localisation du fichier CSV depuis psql</h6><p>Par défaut, la commande <spandata-hdoc-type="syntax">\copy</span> prendra le chemin du répertoire courant au moment où la commande <spandata-hdoc-type="syntax">psql</span> a été lancée. </p><p>Sous <spandata-hdoc-type="syntax">psql</span>, vous pouvez utiliser les commandes :</p><ul><li><p><spandata-hdoc-type="syntax">dbnf17p007=> \! pwd</span></p><p>Pour exécuter la commande <i>shell</i><spandata-hdoc-type="syntax">pwd</span> et obtenir le répertoire courant</p></li><li><p><spandata-hdoc-type="syntax">dbnf17p007=> \cd directory</span></p><p>Pour changer le répertoire courant</p></li></ul></div><footer/></section><section><header><h1>Les clients graphiques pgAdminIII et phpPgAdmin</h1></header><div><h6>pgAdminIII</h6><p>Un client graphique une interface graphique permettant d'effectuer les mêmes opérations qu'avec le client <spandata-hdoc-type="syntax">psql</span>.</p><ul><li><p>Le client graphique pgAdminIII est un client lourd qui fonctionne très bien sous Linux, mais qui est instable sous Windows. </p></li><li><p>Le client graphique phpPgAdmin est un client léger (qui tourne dans un navigateur Web donc).</p></li></ul></div><div><h6>Déclarer une connexion dans pgAdminIII</h6><ol><li><p>Sélectionner <spandata-hdoc-type="syntax">Fichier > Ajouter un serveur</span>
</p></li><li><p>Utilisez votre compte et mot de passe NF17</p><ul><li><p>Hôte : tuxa.sme.utc</p></li><li><p>Port : 5432 (port standard de PostgreSQL)</p></li><li><p>Base : dbnf17p...</p></li><li><p>Nom : nf17p...</p></li><li><p>Mot de passe : ...</p></li></ul></li></ol><imgsrc="re/connexionPgAdmin.png"alt="connexionPgAdmin.png"/></div><div><h6>Ouvrir un terminal SQL dans pgAdminIII</h6><ol><li><p>Sélectionner sa base de données dans la liste <spandata-hdoc-type="syntax">Bases de données</span>
</p></li><li><p>Sélectionner <spandata-hdoc-type="syntax">Outils > Éditeur de requêtes</span> (ou <spandata-hdoc-type="syntax">CTRL+E</span>)</p></li></ol><imgsrc="re/pgAdminIII.png"alt="pgAdminIII.png"/></div><divdata-hdoc-type="complement"><h6>phpPgAdmin</h6><p><ahref="http://phppgadmin.sourceforge.net">http://phppgadmin.sourceforge.net</a></p></div><footer/></section><section><header><h1>Notion de schéma</h1></header><divdata-hdoc-type="definition"><objectdata="re/schemas.odg"type="application/vnd.oasis.opendocument.graphics"/></div><div><h6>Créer un schéma</h6><p>CREATE SCHEMA myschema;</p></div><div><h6>Créer une table dans un schéma</h6><p>CREATE TABLE myschema.mytable (
...
);</p></div><div><h6>Requêter dans un schéma</h6><p>SELECT ...
FROM myschema.mytable</p></div><divdata-hdoc-type="example"><imgsrc="re/pgAdminSchema.png"alt="pgAdminSchema.png"/></div><divdata-hdoc-type="complement"><h6>Schéma par défaut</h6><p>Afin d'alléger la syntaxe il est possible de définir un schéma par défaut, dans lequel seront créer les tables non-préfixées et un ou plusieurs schémas par défaut dans lesquels seront requêtées les tables non-préfixées.</p><p>SET search_path TO myschema,public;</p><p>Cette instruction définit le schéma <spandata-hdoc-type="syntax">myschema</span> comme schéma par défaut pour la création de table et le requêtage, puis <spandata-hdoc-type="syntax">public</span> pour le requêtage, le premier étant prioritaire sur le second :</p><ul><li><p>
<spandata-hdoc-type="syntax">CREATE mytable</span> créera ma <spandata-hdoc-type="syntax">mytable</span> dans le schéma <spandata-hdoc-type="syntax">mychema</span>.</p></li><li><p>
<spandata-hdoc-type="syntax">SELECT FROM mytable</span> cherchera la table dans la schéma <spandata-hdoc-type="syntax">mychema</span>, puis dans le schéma <spandata-hdoc-type="syntax">public</span> si la table n'existe pas dans le premier schéma.</p></li></ul></div><divdata-hdoc-type="remark"><h6>Schéma "public"</h6><p>Le schéma <spandata-hdoc-type="syntax">public</span> est un schéma créé par défaut à l'initialisation de la base, et qui sert de schéma par défaut en l'absence de toute autre spécification.</p></div><divdata-hdoc-type="complement"><h6>Pour aller plus loin</h6><p>
</p></div><footer/></section><section><header><h1>Compléments</h1></header><divdata-hdoc-type="complement"><h6>Héritage (clause INHERITS)</h6><p><ahref="http://www.postgresql.org/docs/current/static/sql-createtable.html">http://www.postgresql.org/docs/current/static/sql-createtable.html</a></p></div><divdata-hdoc-type="complement"><h6>PL/pgSQL</h6><p><ahref="http://www.postgresql.org/docs/current/static/plpgsql.html">http://www.postgresql.org/docs/current/static/plpgsql.html</a></p></div><divdata-hdoc-type="complement"><h6>Autres langages procéduraux (PL)</h6><ul><li><p>PL/Tcl</p></li><li><p>PL/Perl</p></li><li><p>PL/Python</p></li><li><p>...</p></li></ul><p><ahref="http://www.postgresql.org/docs/current/static/xplang.html">http://www.postgresql.org/docs/current/static/xplang.html</a></p><p><ahref="http://www.postgresql.org/docs/current/static/server-programming.html">http://www.postgresql.org/docs/current/static/server-programming.html</a></p></div><divdata-hdoc-type="complement"><h6>Triggers</h6><p><ahref="http://www.postgresql.org/docs/current/static/sql-createtrigger.html">http://www.postgresql.org/docs/current/static/sql-createtrigger.html</a></p><p>(<ahref="http://www.postgresql.org/docs/current/static/triggers.html">http://www.postgresql.org/docs/current/static/triggers.html</a>)</p></div><footer/></section><footer/></section><section><header><h1>Introduction à HTML</h1></header><section><header><h1>HTML</h1></header><divdata-hdoc-type="definition"><h6>HTML</h6><p>
HTML est un langage inventé à partir de 1989 pour coder des pages de contenu sur le Web. Il est standardisé par le W3C.</p></div><divdata-hdoc-type="definition"><h6>Langage à balises</h6><p>HTML est un langage à balises : il se fonde sur le mélange entre du contenu et des balises permettant de caractériser ce contenu. HTML utilise le formalisme SGML pour définir les balises et combinaisons de balises autorisées.</p></div><divdata-hdoc-type="example"><h6>Extrait de code HTML</h6><p><p>Ceci est un contenu, caractérisé par des <b>balises</b></p></p><p>Les balises <spandata-hdoc-type="syntax">p</span> et <spandata-hdoc-type="syntax">b</span> ont une signification dans le langage HTML : Créer un paragraphe et mettre en gras.</p></div><divdata-hdoc-type="remark"><h6>HTML5</h6><p>La version courante de HTML et la version 4.01 de 1999. Le HTML5 en cours de spécification est déjà dans un état avancé de spécification et d'implémentation, il peut d'ors et déjà être employé et est prévu pour 2014.</p></div><footer/></section><section><header><h1>XHTML</h1></header><divdata-hdoc-type="definition"><h6>XHTML</h6><p>XHTML est une réécriture du HTML : tandis que HTML est fondé sur SGML, XHTML est fondé sur XML, plus récent et plus rigoureux. XHTML et HTML ne présentent pas de différence fonctionnelle, uniquement des différences syntaxiques.</p></div><divdata-hdoc-type="example"><h6>Comparaison XHTML et HTML</h6><p><ul><li>Ceci est un extrait de contenu <i>HTML</p><p><ul><li>Ceci est un extrait de contenu <i>XHTML</i></li></ul></p><p>Dans le cas du HTML les balises fermantes sont optionnelles, en XHTML c'est obligatoire. Les deux exemples sont donc équivalents, mais dans l'exemple HTML, il existait en fait plusieurs interprétations possibles, par exemple :</p><p>
<spandata-hdoc-type="syntax"><ul><li>Ceci est un extrait de contenu</li></ul><i>XHTML</i></span>
</p></div><divdata-hdoc-type="remark"><h6>XHTML5</h6><p>La version actuelle de XHTML est la version 1, correspondant à HTML4. XHTML5 est le pendant de HTML5.</p></div><divdata-hdoc-type="complement"><p>
</ol></p></div><divdata-hdoc-type="complement"><p>Pour une description des balises de base : Brillant07, pp108-112.</p></div><footer/></section><section><header><h1>Formulaires HTML</h1></header><div><p>Fait à partir de <ahref="www.commentcamarche.net">www.commentcamarche.net</a>. Copyright 2003 Jean-François Pillou. Document soumis à la licence GNU FDL. </p></div><div><p>Grâce à la balise FORM du langage HTML, il est très simple de créer des formulaires comprenant :</p><ul><li><p>des cases à cocher</p></li><li><p>des champs de saisie</p></li><li><p>des boutons radio</p></li><li><p>des listes à choix multiples</p></li><li><p>...</p></li></ul></div><divdata-hdoc-type="example"><h6>Formulaire</h6><p><form Method="GET" Action="test.php">
Nom : <input type="text" name="nom"><br/>
Age : <input type="text" name="age"><br/>
<input type="submit">
</form></p><imgsrc="re/form.jpg"alt="form.jpg"/></div><footer><divdata-hdoc-type="tags"><span>HTML</span><span>Formulaire</span><span>FORM</span></div></footer></section><section><header><h1>Introduction à CSS</h1></header><div><p>CSS (Cascading Style Sheets) est un standard du W3C qui complète HTML. </p><p>CSS sert à :</p><ul><li><p>Mieux séparer méthodologiquement la structure (en HTML) de la mise en forme (CSS)</p></li><li><p>Simplifier l'écriture HTML (et la génération HTML dans le cas de sites dynamiques réalisés avec PHP par exemple)</p></li><li><p>Factoriser et réutiliser la mise en forme, notamment pour assurer l'homogénéisation d'un site Web (externalisation des feuilles CSS)</p></li><li><p>Augmenter les possibilités de mise en forme du HTML (couches CSS)</p></li></ul></div><div><h6>Association HTML et CSS</h6><p>On peut associer à tout fichier HTML, dans le <spandata-hdoc-type="syntax">head</span>, une ou plusieurs feuilles CSS (qui se complètent "<em>en cascade</em>").</p><p><html xmlns="http://www.w3.org/1999/xhtml">
...</p></div><div><h6>Syntaxe CSS</h6><p>Un fichier CSS permet d'associer une mise en forme aux éléments utilisés dans le fichier HTML.</p><p>p { font-family:sans-serif;}</p></div><divdata-hdoc-type="advice"><h6>DIV et SPAN</h6><p>On peut différencier les styles en fonction des attributs <spandata-hdoc-type="syntax">class</span> et <spandata-hdoc-type="syntax">id</span> des éléments HTML.</p><p>On recours alors massivement aux éléments <spandata-hdoc-type="syntax">div</span> et <spandata-hdoc-type="syntax">span</span> pour le stylage, avec des attributs <spandata-hdoc-type="syntax">id</span> (pour référencer un élément particulier) et/ou <spandata-hdoc-type="syntax">class</span> (pour référencer un ensemble d'éléments de même type).</p><p>div.class { ... }
span.class { ... }
#id { ... }</p></div><divdata-hdoc-type="complement"><p>Tutoriel CSS didactique et complet : <ahref="http://fr.html.net/tutorials/css/">http://fr.html.net/tutorials/css/</a>.</p><p>Pour une introduction à CSS : Brillant07, pp112-122.</p><p>Zen Garden : <ahref="http://www.csszengarden.com/">http://www.csszengarden.com/</a> ; Le Zen des CSS</p></div><footer/></section><section><header><h1>HTTP</h1></header><div><p>+ ref </p><p>+ explications générales GET / POST</p><p>CF SR03</p></div><footer/></section><section><header><h1>Objectifs</h1></header><div><p>Savoir écrire une page simple en HTML</p><p>Savoir créer des formulaires en HTML</p></div></section><section><header><h1>Questions de synthèse</h1></header><div><p>A quoi sert un formulaire en HTML ?</p></div></section><footer/></section><section><header><h1>Introduction à PHP</h1></header><section><header><h1>Présentation de PHP</h1><divdata-hdoc-type="author">Fait à partir de www.commentcamarche.net. Copyright 2003 Jean-François Pillou. Document soumis à la licence GNU FDL. </div></header><div><p>PHP est un langage interprété (un langage de script) exécuté du côté serveur (comme les scripts CGI, ASP, ...) et non du côté client (un script écrit en JavaScript ou une applet Java s'exécute au contraire sur l'ordinateur où se trouve le navigateur). La syntaxe du langage provient de celles du langage C, du Perl et de Java. </p><p>Ses principaux atouts sont :</p><ul><li><p>La gratuité et la disponibilité du code source (PHP est distribué sous licence GNU GPL)</p></li><li><p>La simplicité d'écriture de scripts</p></li><li><p>La possibilité d'inclure le script PHP au sein d'une page HTML (contrairement aux scripts CGi, pour lesquels il faut écrire des lignes de code pour afficher chaque ligne en langage HTML)</p></li><li><p>La simplicité d'interfaçage avec des bases de données (de nombreux SGBD sont supportés, le plus utilisé avec ce langage est MySQL).</p></li><li><p>L'intégration au sein de nombreux serveurs web (Apache...)</p></li></ul></div><divdata-hdoc-type="example"><h6>SGBD supportés par PHP</h6><ul><li><p>MySQL</p></li><li><p>Oracle</p></li><li><p>PostgreSQL</p></li></ul><ul><li><p>...</p></li></ul></div><footer><divdata-hdoc-type="tags"><span>PHP</span><span>HTML</span></div></footer></section><section><header><h1>Principes de PHP</h1><divdata-hdoc-type="author">Fait à partir de www.commentcamarche.net. Copyright 2003 Jean-François Pillou. Document soumis à la licence GNU FDL. </div></header><div><h6>L'interprétation du code par le serveur</h6><p>Un script PHP est un simple fichier texte contenant des instructions écrites à l'aide de caractères ASCII 7 bits (des caractères non accentués) incluses dans un code HTML à l'aide de balises spéciales et stocké sur le serveur. Ce fichier doit avoir une extension particulière (qui dépend de la configuration du serveur HTTP, en général ".php") pour pouvoir être interprété par le serveur.</p><p>Ainsi, lorsqu'un navigateur (le client) désire accéder à une page dynamique réalisée en php :</p><ol><li><p>Le serveur reconnaît qu'il s'agit d'un fichier PHP</p></li><li><p>Il lit le fichier PHP</p></li><li><p>Dès que le serveur rencontre une balise indiquant que les lignes suivantes sont du code PHP, il "passe" en mode PHP, ce qui signifie qu'il ne lit plus les instructions: il les exécute.</p></li><li><p>Lorsque le serveur rencontre une instruction, il la transmet à l'interpréteur</p></li><li><p>L'interpréteur exécute l'instruction puis envoie les sorties éventuelles au serveur</p></li><li><p>A la fin du script, le serveur transmet le résultat au client (le navigateur)</p></li></ol></div><divdata-hdoc-type="remark"><h6>Code PHP et clients Web</h6><p>Un script PHP est interprété par le serveur, les utilisateurs ne peuvent donc pas voir le code source !</p><p>Le code PHP stocké sur le serveur n'est donc jamais visible directement par le client puisque dès qu'il en demande l'accès, le serveur l'interprète !
De cette façon aucune modification n'est à apporter sur les navigateurs... </p></div><div><h6>Implantation au sein du code HTML</h6><p>Pour que le script soit interprété par le serveur deux conditions sont nécessaires :</p><ul><li><p>Le fichier contenant le code doit avoir l'extension .php et non .html (selon la configuration du serveur Web)</p></li><li><p>Le code PHP contenu dans le code HTML doit être délimité par les balises "<?php" et "?>"</p></li></ul></div><divdata-hdoc-type="example"><h6>Hello world</h6><p><html>
</html></p></div><divdata-hdoc-type="complement"><p>Tutoriel PHP : <ahref="http://fr.html.net/tutorials/php/">http://fr.html.net/tutorials/php/</a></p></div><footer><divdata-hdoc-type="tags"><span>PHP</span><span>Serveur</span><span>HTML</span></div></footer></section><section><header><h1>Syntaxe PHP</h1></header><divdata-hdoc-type="emphasis"><h6>Manuel PHP en ligne</h6><p><ahref="http://php.net/manual/">http://php.net/manual/</a></p></div><divdata-hdoc-type="example"><p><?php
$i=0 ;
while($i<6) {
echo $i ;
$i=rand(1,6) ;
}</p></div><divdata-hdoc-type="warning"><h6>Généralités</h6><ul><li><p>Une instruction se termine par un <spandata-hdoc-type="syntax">;</span></p></li><li><p>Les espaces, retours chariot et tabulation ne sont pas pris en compte par l'interpréteur</p></li><li><p>Les commentaires sont écrits entre les délimiteurs <spandata-hdoc-type="syntax">/*</span> et <spandata-hdoc-type="syntax">*/</span> ou <spandata-hdoc-type="syntax">//</span> sur une seule ligne.</p></li><li><p>Le langage est <i>case-sensitive</i> (sauf pour les fonctions).</p></li></ul></div><divdata-hdoc-type="complement"><h6>IDE</h6><ul><li><p>Eclipse PDT (PHP Development Tools)</p><p><ahref="http://www.zend.com/fr/community/pdt">http://www.zend.com/fr/community/pdt</a></p></li><li><p>Zend Studio</p><p><ahref="http://www.zend.com/fr/products/studio/">http://www.zend.com/fr/products/studio/</a></p></li></ul></div><footer><divdata-hdoc-type="tags"><span>PHP</span></div></footer></section><section><header><h1>Variables en PHP</h1></header><div><ul><li><p>Les variables ne sont pas déclarées</p></li><li><p>Les variables commencent pas un $</p></li><li><p>Les variables ne sont pas typées</p></li></ul><p>Les variables en langage PHP peuvent être de trois types : </p><ul><li><p>Scalaires (entiers, chaîne, réels)</p></li><li><p>Tableaux (un tableau pouvant être multidimensionnel et stocker des scalaires de types différents)</p></li><li><p>Tableaux associatifs (indexés par des chaînes)</p></li></ul></div><divdata-hdoc-type="example"><p>$Entier=1;
}</p><p>La fonction <spandata-hdoc-type="syntax">isset()</span> permet de tester qu'une variable existe et est affectée.</p></div><footer><divdata-hdoc-type="tags"><span>PHP</span><span>Variables</span></div></footer></section><section><header><h1>Structures de contrôle en PHP</h1></header><div><h6>Alternative IF</h6><p>if (condition réalisée) {
liste d'instructions
}
elseif (autre condition réalisée) {
autre série d'instructions
}
...
else (dernière condition réalisée) {
série d'instructions
}</p></div><div><h6>Boucle FOR</h6><p>for (compteur; condition; modification du compteur) {
}</p></div><divdata-hdoc-type="complement"><h6>Autres structures de contrôle</h6><p><ahref="http://php.net/manual/fr/language.control-structures.php">http://php.net/manual/fr/language.control-structures.php</a></p></div><footer><divdata-hdoc-type="tags"><span>PHP</span><span>Alternative</span><span>IF</span><span>Boucle</span><span>WHILE</span><span>FOR</span></div></footer></section><section><header><h1>Fonctions en PHP</h1></header><div><p>function Nom_De_La_Fonction(argument1, argument2, ...) {
liste d'instructions
...
return valeur_ou_variable;
...
}</p></div><divdata-hdoc-type="complement"><p><ahref="http://www.php.net/manual/fr/language.functions.php">http://www.php.net/manual/fr/language.functions.php</a></p></div><footer><divdata-hdoc-type="tags"><span>PHP</span><span>Fonction</span><span>Function</span></div></footer></section><section><header><h1>Envoi de texte au navigateur</h1></header><div><p>echo Expression;</p></div><divdata-hdoc-type="remark"><h6>Print</h6><p>La fonction <spandata-hdoc-type="syntax">print</span> est iso-fonctionnelle avec <spandata-hdoc-type="syntax">echo</span> et <spandata-hdoc-type="syntax">printf</span> plus complexe permet en plus le formatage des données (peu utilisée).</p></div><divdata-hdoc-type="warning"><h6>L'importance de l'implantation du code PHP au sein du code HTML</h6><p>
Le code PHP peut être implanté au sein du code HTML. Cette caractéristique n'est pas à négliger car le fait d'écrire uniquement du code PHP là où il est nécessaire rend la programmation plus simple (il est plus simple d'écrire du code HTML que des fonctions <spandata-hdoc-type="syntax">echo</span> ou <spandata-hdoc-type="syntax">print</span>, dans lesquelles les caractères spéciaux doivent être précédés d'un antislash sous peine de voir des erreurs lors de l'exécution).</p><p> L'exemple le plus simple concerne les pages dynamiques dont l'en-tête est toujours le même: dans ce cas, le code PHP peut ne commencer qu'à partir de la balise <spandata-hdoc-type="syntax"><body></span>, au moment où la page peut s'afficher différemment selon une variable par exemple.
</p><p>
Mieux, il est possible d'écrire plusieurs portions de script en PHP, séparées par du code HTML statique car les variables/fonctions déclarées dans une portion de script seront accessibles dans les portions de scripts inférieures.</p></div><footer><divdata-hdoc-type="tags"><span>PHP</span><span>HTML</span><span>Echo</span></div></footer></section><section><header><h1>Formulaires HTML et PHP</h1></header><div><p>PHP rend très simple la récupération de données envoyées par l'intermédiaire de formulaires HTML. </p><p>Lorsque l'on soumet un formulaire à un fichier PHP, toutes les données du formulaire lui sont passées en tant que variables, c'est-à-dire chacun des noms associés aux champs (ou boutons) du formulaire précédés du caractère $. </p></div><divdata-hdoc-type="example"><h6>Page d'appel</h6><p><html>
?></p></div><divdata-hdoc-type="remark"><h6>$HTTP_GET_VARS[] et $HTTP_POST_VARS[]</h6><p>Selon la configuration du module PHP, il est possible que la récupération directe des données issue du formulaire HTML ne fonctionne pas.
On peut dans ce cas utiliser les tableaux associatifs <spandata-hdoc-type="syntax">$HTTP_GET_VARS['variable']</span> et <spandata-hdoc-type="syntax">$HTTP_POST_VARS['variable']</span> ou <spandata-hdoc-type="syntax">$_GET['variable']</span> et <spandata-hdoc-type="syntax">$_POST['variable']</span> (selon configuration).</p><p><?php
$MaVarLocale=$HTTP_GET_VARS['MaVar']
echo $MaVarLocale;
?></p></div><divdata-hdoc-type="remark"><h6>Code implanté</h6><p>La page retournée dans l'exemple n'est pas du HTML (mais du simple texte qu'un navigateur peut néanmoins afficher). Pour retourner du HTML, il faut implanter ce même code au sein d'une page HTML.</p><p><html>
while ($vResult = pg_fetch_array($vQuery, null, PGSQL_ASSOC)) {
... $vResult[nom_attribut]...
}</p></div><div><h6>Alimentation de la BD</h6><p> $vSql="INSERT ...";
$vQuery=pg_query($vConn, $vSql);</p></div><div><h6>Déconnexion de la base de données</h6><p>pg_close($conn)</p></div><footer><divdata-hdoc-type="tags"><span>PHP</span><span>PostgreSQL</span></div></footer></section><section><header><h1>Interfaçage PHP avec Oracle</h1></header><div><p>Fait à partir de <ahref="http://www.php.net/manual/en/ref.oci8.php">http://www.php.net/manual/en/ref.oci8.php</a>.</p></div><divdata-hdoc-type="remark"><p>L'API OCI a remplacé l'ancienne API ORA (qui n'est plus supportée dans PHP).</p></div><div><h6>Connexion à la base de données</h6><p>
<spandata-hdoc-type="syntax">oci_connect</span> établit une connexion entre le serveur PHP et un serveur Oracle.</p><p>connection_id oci_connect(string username, string password, string bd); </p></div><divdata-hdoc-type="example"><p>if (! $conn=oci_connect($user, $passwd, $bd)) {
echo "Impossible d'établir la connexion ";
exit;
}</p></div><div><h6>Préparation d'une requête</h6><p>
<spandata-hdoc-type="syntax">oci_parse</span> analyse une requête SQL et retourne un pointeur sur un <i>statement</i> (espace de requête).</p><p>statement_handle oci_parse(connection_id connection, string query); </p></div><divdata-hdoc-type="example"><p>if(! $statement=oci_parse($conn, $sql)) {
echo "Impossible de préparer la requête";
exit;
}</p></div><div><h6>Exécution d'une requête</h6><p>
<spandata-hdoc-type="syntax">oci_execute</span> exécute une commande déjà préparée avec OCIParse. Il est possible de spécifier le mode d'exécution des transactions (par défaut, il est en auto-commit, c'est à dire que l'ordre commit est passé automatiquement après chaque instruction SQL). Il est préférable d'utiliser le mode OCI_DEFAULT qui permet de contrôler les commits.</p><p>boolean oci_execute(statement_handle statement, int mode); </p><p>
<spandata-hdoc-type="syntax">$mode</span> permet de paramétrer le <spandata-hdoc-type="syntax">commit</span> (par défaut, le commit est envoyé automatiquement si l'exécution est correcte).</p></div><divdata-hdoc-type="example"><p>if(! oci_execute($statement, OCI_DEFAULT)) {
echo "Impossible d'exécuter la requête";
exit;
}</p></div><div><h6>Commit d'une transaction</h6><p>