Commit 20fd5db8 authored by Baptiste Montange's avatar Baptiste Montange

Merge branch 'master' of ssh://gitlab.utc.fr/crozatst/hdoc

parents 25c591e0 2653bd07
<?xml version="1.0" encoding="UTF-8"?>
<container version="1.0" xmlns="urn:utc.fr:ics:hdoc:container">
<rootfiles>
<rootfile full-path="content.xml" media-type="text/xml" />
</rootfiles>
</container>
<?xml version="1.0" encoding="UTF-8"?>
<?oxygen RNGSchema="http://hdoc.crzt.fr/schemas/xhtml/hdoc1-xhtml.rng" type="xml"
?><html xmlns="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><meta charset="utf-8"/><meta content="HdocConverter/Opale3.4" name="generator"/><meta name="rights" content="by-sa"/><meta name="author" content="Stéphane Crozat (Contributions : Antoine Vincent, Benjamin Lussier, Léonard Dumas)"/></head><body><section data-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><div data-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><img src="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><div data-hdoc-type="tags"><span>Architecture</span><span>Client</span><span>Serveur</span></div></footer></section><section><header><h1>Notions d'architecture 3-tier</h1><div data-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><img src="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><img src="re/3-tier.jpg" alt="3-tier.jpg"/></div><div data-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><div data-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><img src="re/n-tier.jpg" alt="n-tier.jpg"/></div><footer><div data-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 <a href="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>Les principaux serveurs web sur le marché sont entre autres :</p><ul><li><p>Apache</p></li><li><p>Microsoft IIS (Internet Information Server)</p></li><li><p>...</p></li></ul></div><footer><div data-hdoc-type="tags"><span>Architecture</span><span>Serveur</span><span>Web</span><span>HTTP</span></div></footer></section><section><header><h1>Notion d'architecture Web</h1></header><div><p>Fait à partir de <a href="www.commentcamarche.net">www.commentcamarche.net</a>. Copyright 2003 Jean-François Pillou. Document soumis à la licence GNU FDL. </p></div><div><img src="re/3-tierExemple.jpg" alt="3-tierExemple.jpg"/></div><footer><div data-hdoc-type="tags"><span>Architecture</span><span>Client</span><span>Serveur</span><span>3-tier</span><span>Web</span></div></footer></section><section><header><h1>Architecture LAPP</h1></header><div data-hdoc-type="definition"><h6>Définition</h6><p>On appelle une architecture LAPP une architecture qui s'appuie sur :</p><ul><li><p><em>L</em>inux pour le système d'exploitation</p></li><li><p><em>A</em>pache pour le serveur Web</p></li><li><p><em>P</em>ostgreSQL pour la base de données</p></li><li><p><em>P</em>HP pour le langage applicatif</p></li></ul></div><div data-hdoc-type="complement"><h6>LAMP, WAMP, WAPP</h6><ul><li><p>LAMP : Linux, Apache, MySQL, PHP</p></li><li><p>WAMP : Windows, Apache, MySQL, PHP</p></li><li><p>...</p></li></ul></div><footer/></section><section data-hdoc-type="introduction"><header><h1>Introduction</h1></header><div><p>Cette section a été réalisée à partir de contenus de <a href="www.commentcamarche.net">www.commentcamarche.net</a>, © 2003 Jean-François Pillou (document soumis à la licence GNU FDL). </p></div></section><section><header><h1>Objectifs</h1></header><div><p>Comprendre les principes des architectures d'application de bases de données (en particulier 3-tier et Web)</p><p>Savoir appliquer les principes d'une architecture Web dans le cadre des technologies Servlets ou PHP et HTML</p></div></section><section><header><h1>Questions de synthèse</h1></header><div><p>Quelle sont les atouts d'une architecture 3-tier par rapport à une architecture client-serveur classique ?</p><p>Qu'est ce qu'une architecture Web ?</p></div></section><footer/></section><section><header><h1>Rappels système</h1></header><section><header><h1>Rappels architecture UTC</h1></header><div><p>Les comptes d'UV sont des comptes sur des serveurs Linux de l'UTC (accès et espace disque réservé). Par exemple <span data-hdoc-type="syntax">nf17p001</span> est un compte sur le serveur <span data-hdoc-type="syntax">tuxa.sme.utc</span>.</p><p>Les comptes d'UV sont également des comptes d'accès sur des postes clients Linux ou Windows de l'UTC.</p></div><div data-hdoc-type="advice"><h6>Transférer des fichiers depuis un client vers le serveur auquel il est associé</h6><ul><li><p>Les clients Windows de l'UTC sont configurés pour proposer un disque virtuel Z qui pointe sur l'espace du serveur Linux : les données déposées sur le disque Z sont donc physiquement stockées sur le serveur Linux. </p></li><li><p>Les clients Linux de l'UTC sont configurés pour que le dossier <span data-hdoc-type="syntax">home</span> sur le client corresponde à un répertoire sur le serveur. </p></li><li><p>Quelque soit le client il est possible d'utiliser un client SFTP (<i>Filezilla</i> par exemple) en se connectant au serveur (par exemple <span data-hdoc-type="syntax">tuxa.sme.utc</span>) avec son compte UTC (par exemple <span data-hdoc-type="syntax">nf17p001</span>).</p></li></ul></div><div data-hdoc-type="advice"><h6>Se connecter à un serveur Linux depuis un client Windows</h6><p>Pour se connecter à un serveur Linux depuis un client Windows on peut utiliser le terminal par défaut du système, mais <em>il est recommandé d'utiliser un programme plus performant comme par exemple Putty</em>.</p><ol><li><p>Ouvrez un terminal :</p><p>Exécuter <i>Putty</i>.</p></li><li><p>Connectez-vous sur votre compte Linux
 :</p><p>Connectez vous de préférence en utilisant <span data-hdoc-type="syntax">ssh</span>, lancez <span data-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 <span data-hdoc-type="syntax">ssh</span>.</p></div><div><h6>Quelques commandes de base à connaître</h6><ul><li><p><span data-hdoc-type="syntax">cd</span></p></li><li><p><span data-hdoc-type="syntax">man</span></p></li><li><p><span data-hdoc-type="syntax">ls</span></p></li><li><p><span data-hdoc-type="syntax">pwd</span></p></li><li><p><span data-hdoc-type="syntax">chmod</span></p></li><li><p><span data-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 <span data-hdoc-type="syntax">~/public_html</span>
</p></li><li><p>Il faut donner les droits en lecture sur les fichiers (<span data-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>
<span data-hdoc-type="syntax">http://tuxa.sme.utc/~nf17pXXX/monfichier.html</span>
</p></li></ul></div><footer/></section><footer/></section><section><header><h1>Introduction à PostgreSQL</h1></header><section><header><h1>Présentation</h1></header><div><p>PostgreSQL est :</p><ul><li><p>un SGBDRO</p></li><li><p>libre (licence BSD)</p></li><li><p>multi-plate-formes (Unix, Linux, Windows, MacOS, ...)</p></li><li><p>puissant (proche d'Oracle)</p></li><li><p>très respectueux du standard</p></li></ul></div><div data-hdoc-type="complement"><ul><li><p>
<a href="http://www.postgresql.org/">http://www.postgresql.org/</a>
</p></li><li><p>
<a href="http://www.postgresql.fr/">http://www.postgresql.fr/</a>
</p></li></ul></div><footer/></section><section><header><h1>Types de données</h1></header><div><h6>Types standards</h6><ul><li><p>numériques : integer (int2, int4, int8), real (float4, float8)</p></li><li><p>dates : date (time, timestamp)</p></li><li><p>chaînes : char, varchar, text</p></li><li><p>autres : boolean, array[]</p></li></ul></div><div data-hdoc-type="complement"><h6>Documentation</h6><p>
<a href="http://docs.postgresqlfr.org/8.1/datatype.html">http://docs.postgresqlfr.org/8.1/datatype.html</a>
</p></div><div data-hdoc-type="complement"><h6>OID</h6><p>Voir Identification d'objets et références
</p></div><div data-hdoc-type="complement"><h6>Types composites</h6><p>Voir Les types utilisateurs
</p></div><footer/></section><section><header><h1>Le client textuel "psql"</h1></header><div data-hdoc-type="definition"><h6>psql</h6><p>
<span data-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>
<span data-hdoc-type="syntax">\?</span> : Liste des commandes <span data-hdoc-type="syntax">psql</span>
</p></li><li><p>
<span data-hdoc-type="syntax">\h</span> : Liste des instructions SQL</p><p>
<span data-hdoc-type="syntax">\h CREATE TABLE</span> : Description de l'instruction SQL <span data-hdoc-type="syntax">CREATE TABLE</span>
</p></li><li><p>
<span data-hdoc-type="syntax">\q</span> : Quitter <span data-hdoc-type="syntax">psql</span>
</p></li><li><p>
<span data-hdoc-type="syntax">\d</span> : Liste des relations (catalogue de données)</p><p>
<span data-hdoc-type="syntax">\d maTable</span> : Description de la relation <span data-hdoc-type="syntax">maTable</span>
</p></li><li><p>
<span data-hdoc-type="syntax">\H</span> : mode HTML ou mode textuel pour les retours de requête</p></li><li><p><span data-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 <span data-hdoc-type="syntax">retour chariot</span> n'a pas d'incidence sur la requête, c'est le <span data-hdoc-type="syntax">
;
</span>qui marque la fin de l'instruction SQL et provoque son exécution.</p><p>dbnf17p015=&gt; SELECT * FROM maTable ;</p><p>dbnf17p015=&gt; SELECT *
dbnf17p015-&gt; FROM maTable
dbnf17p015-&gt; ;</p><p>On notera dans <span data-hdoc-type="syntax">psql</span> la différence entre les caractères <span data-hdoc-type="syntax">=&gt;</span> et <span data-hdoc-type="syntax">-&gt;</span> selon que l'on a ou pas effectué un retour chariot.</p></div><div data-hdoc-type="complement"><p><a href="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 <span data-hdoc-type="syntax">\i chemin/fichier.sql</span> </p><ul><li><p>
<span data-hdoc-type="syntax">chemin</span> désigne le répertoire dans lequel est le fichier <span data-hdoc-type="syntax">fichier.sql</span>
</p></li><li><p>le dossier de travail de <span data-hdoc-type="syntax">psql</span> est le dossier dans lequel il a été lancé, le script peut être lancé à partir de son dossier <span data-hdoc-type="syntax">home</span> pour en être indépendant (<span data-hdoc-type="syntax">~/.../fichier.sql</span>)</p></li></ul></div><footer/></section><section><header><h1>Fichier CSV</h1></header><div data-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><div data-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><div data-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><div data-hdoc-type="example"><h6>Valeur nulle</h6><p>Jacques;Dumoulin;;UTC;NF29</p><p>L'âge est inconnu (NULL).</p></div><div data-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><div data-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><div data-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><div data-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><div data-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><span data-hdoc-type="syntax">WITH</span> introduit les options de l'import</p></li><li><p><span data-hdoc-type="syntax">CSV</span> indique qu'il s'agit d'un fichier CSV</p></li><li><p><span data-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><span data-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><div data-hdoc-type="remark"><ul><li><p>La table <span data-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><div data-hdoc-type="remark"><p>Ajouter l'option <span data-hdoc-type="syntax">HEADER</span> après <span data-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><div data-hdoc-type="advice"><h6>Localisation du fichier CSV depuis psql</h6><p>Par défaut, la commande <span data-hdoc-type="syntax">\copy</span> prendra le chemin du répertoire courant au moment où la commande <span data-hdoc-type="syntax">psql</span> a été lancée. </p><p>Sous <span data-hdoc-type="syntax">psql</span>, vous pouvez utiliser les commandes :</p><ul><li><p><span data-hdoc-type="syntax">dbnf17p007=&gt; \! pwd</span></p><p>Pour exécuter la commande <i>shell</i> <span data-hdoc-type="syntax">pwd</span> et obtenir le répertoire courant</p></li><li><p><span data-hdoc-type="syntax">dbnf17p007=&gt; \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 <span data-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 <span data-hdoc-type="syntax">Fichier &gt; 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><img src="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 <span data-hdoc-type="syntax">Bases de données</span>
</p></li><li><p>Sélectionner <span data-hdoc-type="syntax">Outils &gt; Éditeur de requêtes</span> (ou <span data-hdoc-type="syntax">CTRL+E</span>)</p></li></ol><img src="re/pgAdminIII.png" alt="pgAdminIII.png"/></div><div data-hdoc-type="complement"><h6>phpPgAdmin</h6><p><a href="http://phppgadmin.sourceforge.net">http://phppgadmin.sourceforge.net</a></p></div><footer/></section><section><header><h1>Notion de schéma</h1></header><div data-hdoc-type="definition"><object data="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><div data-hdoc-type="example"><img src="re/pgAdminSchema.png" alt="pgAdminSchema.png"/></div><div data-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 <span data-hdoc-type="syntax">myschema</span> comme schéma par défaut pour la création de table et le requêtage, puis <span data-hdoc-type="syntax">public</span> pour le requêtage, le premier étant prioritaire sur le second :</p><ul><li><p>
<span data-hdoc-type="syntax">CREATE mytable</span> créera ma <span data-hdoc-type="syntax">mytable</span> dans le schéma <span data-hdoc-type="syntax">mychema</span>.</p></li><li><p>
<span data-hdoc-type="syntax">SELECT FROM mytable</span> cherchera la table dans la schéma <span data-hdoc-type="syntax">mychema</span>, puis dans le schéma <span data-hdoc-type="syntax">public</span> si la table n'existe pas dans le premier schéma.</p></li></ul></div><div data-hdoc-type="remark"><h6>Schéma "public"</h6><p>Le schéma <span data-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><div data-hdoc-type="complement"><h6>Pour aller plus loin</h6><p>
<a href="http://www.postgresql.org/docs/8.4/static/ddl-schemas.html">http://www.postgresql.org/docs/8.4/static/ddl-schemas.html</a>
</p></div><footer/></section><section><header><h1>Compléments</h1></header><div data-hdoc-type="complement"><h6>Héritage (clause INHERITS)</h6><p><a href="http://www.postgresql.org/docs/current/static/sql-createtable.html">http://www.postgresql.org/docs/current/static/sql-createtable.html</a></p></div><div data-hdoc-type="complement"><h6>PL/pgSQL</h6><p><a href="http://www.postgresql.org/docs/current/static/plpgsql.html">http://www.postgresql.org/docs/current/static/plpgsql.html</a></p></div><div data-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><a href="http://www.postgresql.org/docs/current/static/xplang.html">http://www.postgresql.org/docs/current/static/xplang.html</a></p><p><a href="http://www.postgresql.org/docs/current/static/server-programming.html">http://www.postgresql.org/docs/current/static/server-programming.html</a></p></div><div data-hdoc-type="complement"><h6>Triggers</h6><p><a href="http://www.postgresql.org/docs/current/static/sql-createtrigger.html">http://www.postgresql.org/docs/current/static/sql-createtrigger.html</a></p><p>(<a href="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><div data-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><div data-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><div data-hdoc-type="example"><h6>Extrait de code HTML</h6><p>&lt;p&gt;Ceci est un contenu, caractérisé par des &lt;b&gt;balises&lt;/b&gt;&lt;/p&gt;</p><p>Les balises <span data-hdoc-type="syntax">p</span> et <span data-hdoc-type="syntax">b</span> ont une signification dans le langage HTML : Créer un paragraphe et mettre en gras.</p></div><div data-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><div data-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><div data-hdoc-type="example"><h6>Comparaison XHTML et HTML</h6><p>&lt;ul&gt;&lt;li&gt;Ceci est un extrait de contenu &lt;i&gt;HTML</p><p>&lt;ul&gt;&lt;li&gt;Ceci est un extrait de contenu &lt;i&gt;XHTML&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;</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>
<span data-hdoc-type="syntax">&lt;ul&gt;&lt;li&gt;Ceci est un extrait de contenu&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;XHTML&lt;/i&gt;</span>
</p></div><div data-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><div data-hdoc-type="complement"><p>
Définition du XML
</p><p>
Historique : de SGML à XML
</p><p>
Discussion : HTML et XML
</p></div><footer/></section><section><header><h1>Structure générale XHTML</h1></header><div><h6>Structure générale</h6><p>&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
  ...
&lt;/head&gt;
&lt;body&gt;
  ...
&lt;/body&gt;
&lt;/html&gt;</p></div><div><h6>Entête</h6><p>&lt;head&gt;
&lt;title&gt;...&lt;/title&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
&lt;/head&gt;</p></div><div><h6>Corps</h6><p>&lt;body&gt;
&lt;h1&gt;...&lt;/h1&gt;
&lt;h2&gt;...&lt;/h2&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;/body&gt;</p></div><div data-hdoc-type="complement"><ul><li><p>Tutoriel XHTML : <a href="http://fr.html.net/tutorials/html/">http://fr.html.net/tutorials/html/</a></p></li><li><p>Brillant07, pp107-108
</p></li></ul></div><footer/></section><section><header><h1>Balises de base XHTML</h1></header><div><p>&lt;p&gt;Un paragraphe de texte&lt;/p&gt;
&lt;p&gt;Paragraphe contenant du texte, mot &lt;b&gt;gras&lt;/g&gt; ou &lt;i&gt;italique&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="page02.html"&gt;Un lien&lt;/a&gt; vers une autre page&lt;/p&gt;
&lt;img src="img.png" alt="une image"/&gt;
&lt;h1&gt;Titre de niveau 1&lt;/h1&gt;
&lt;h2&gt;Titre de niveau 2&lt;/h2&gt;
&lt;h3&gt;Titre de niveau 3&lt;/h3&gt;
&lt;table border="1"&gt;
&lt;tr&gt;&lt;th&gt;Titre   colonne 1&lt;/th&gt;&lt;th&gt;Titre   colonne 2&lt;/th&gt;&lt;th&gt;...&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ligne 1 colonne 1&lt;/td&gt;&lt;td&gt;Ligne 1 colonne 2&lt;/td&gt;&lt;td&gt;...&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ligne 2 colonne 1&lt;/td&gt;&lt;td&gt;Ligne 2 colonne 2&lt;/td&gt;&lt;td&gt;...&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Item de liste à puce&lt;/li&gt;
&lt;li&gt;Item de liste à puce&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Item de liste à ordonnée&lt;/li&gt;
&lt;li&gt;Item de liste à ordonnée&lt;/li&gt;
&lt;/ol&gt;</p></div><div data-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 <a href="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><div data-hdoc-type="example"><h6>Formulaire</h6><p>&lt;form Method="GET" Action="test.php"&gt;
 Nom : &lt;input type="text" name="nom"&gt;&lt;br/&gt;
 Prénom : &lt;input type="text" name="prenom"&gt;&lt;br/&gt;
 Age : &lt;input type="text" name="age"&gt;&lt;br/&gt;
&lt;input type="submit"&gt;
&lt;/form&gt;</p><img src="re/form.jpg" alt="form.jpg"/></div><footer><div data-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 <span data-hdoc-type="syntax">head</span>, une ou plusieurs feuilles CSS (qui se complètent "<em>en cascade</em>").</p><p>&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
  &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
  &lt;title&gt;...&lt;/title&gt;
  &lt;link href='css/style1.css' type='text/css' rel='stylesheet'/&gt;
  &lt;link href='css/style2.css' type='text/css' rel='stylesheet'/&gt;
...</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><div data-hdoc-type="advice"><h6>DIV et SPAN</h6><p>On peut différencier les styles en fonction des attributs <span data-hdoc-type="syntax">class</span> et <span data-hdoc-type="syntax">id</span> des éléments HTML.</p><p>On recours alors massivement aux éléments <span data-hdoc-type="syntax">div</span> et <span data-hdoc-type="syntax">span</span> pour le stylage, avec des attributs <span data-hdoc-type="syntax">id</span> (pour référencer un élément particulier) et/ou <span data-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><div data-hdoc-type="complement"><p>Tutoriel CSS didactique et complet : <a href="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 : <a href="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><div data-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><div data-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><div data-hdoc-type="tags"><span>PHP</span><span>HTML</span></div></footer></section><section><header><h1>Principes de PHP</h1><div data-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><div data-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 "&lt;?php" et "?&gt;"</p></li></ul></div><div data-hdoc-type="example"><h6>Hello world</h6><p>&lt;html&gt;
&lt;head&gt;&lt;title&gt;Exemple&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;?php
echo "Hello world";
?&gt;
&lt;/body&gt;
&lt;/html&gt;</p></div><div data-hdoc-type="complement"><p>Tutoriel PHP : <a href="http://fr.html.net/tutorials/php/">http://fr.html.net/tutorials/php/</a></p></div><footer><div data-hdoc-type="tags"><span>PHP</span><span>Serveur</span><span>HTML</span></div></footer></section><section><header><h1>Syntaxe PHP</h1></header><div data-hdoc-type="emphasis"><h6>Manuel PHP en ligne</h6><p><a href="http://php.net/manual/">http://php.net/manual/</a></p></div><div data-hdoc-type="example"><p>&lt;?php
$i=0 ;
while($i&lt;6) {
  echo $i ;
  $i=rand(1,6) ;
}</p></div><div data-hdoc-type="warning"><h6>Généralités</h6><ul><li><p>Une instruction se termine par un <span data-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 <span data-hdoc-type="syntax">/*</span> et <span data-hdoc-type="syntax">*/</span> ou <span data-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><div data-hdoc-type="complement"><h6>IDE</h6><ul><li><p>Eclipse PDT (PHP Development Tools)</p><p><a href="http://www.zend.com/fr/community/pdt">http://www.zend.com/fr/community/pdt</a></p></li><li><p>Zend Studio</p><p><a href="http://www.zend.com/fr/products/studio/">http://www.zend.com/fr/products/studio/</a></p></li></ul></div><footer><div data-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><div data-hdoc-type="example"><p>$Entier=1;
$Reel=1.0;
$Chaine="1";
$Tableau[0]=1
$Tableau[1]="1"
$TableauMulti[0][0]="1.0"
$TableauAssoc[Age]=18</p></div><div data-hdoc-type="complement"><h6>isset()</h6><p>if (isset($var)) {
 echo $var;
}</p><p>La fonction <span data-hdoc-type="syntax">isset()</span> permet de tester qu'une variable existe et est affectée.</p></div><footer><div data-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) {
 liste d'instructions
}</p></div><div><h6>Boucle WHILE</h6><p>while (condition réalisée) {
 liste d'instructions
}</p></div><div data-hdoc-type="complement"><h6>Autres structures de contrôle</h6><p><a href="http://php.net/manual/fr/language.control-structures.php">http://php.net/manual/fr/language.control-structures.php</a></p></div><footer><div data-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><div data-hdoc-type="complement"><p><a href="http://www.php.net/manual/fr/language.functions.php">http://www.php.net/manual/fr/language.functions.php</a></p></div><footer><div data-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><div data-hdoc-type="remark"><h6>Print</h6><p>La fonction <span data-hdoc-type="syntax">print</span> est iso-fonctionnelle avec <span data-hdoc-type="syntax">echo</span> et <span data-hdoc-type="syntax">printf</span> plus complexe permet en plus le formatage des données (peu utilisée).</p></div><div data-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 <span data-hdoc-type="syntax">echo</span> ou <span data-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 <span data-hdoc-type="syntax">&lt;body&gt;</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><div data-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><div data-hdoc-type="example"><h6>Page d'appel</h6><p>&lt;html&gt;
&lt;body&gt;
  &lt;form method="GET" action="test.php"&gt;
   &lt;input type="text" size="20" name="MaVar"/&gt;
   &lt;input type="submit"/&gt;
  &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</p></div><div data-hdoc-type="example"><h6>Page appelée (test.php)</h6><p>&lt;?php
 echo $MaVar;
?&gt;</p></div><div data-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 <span data-hdoc-type="syntax">$HTTP_GET_VARS['variable']</span> et <span data-hdoc-type="syntax">$HTTP_POST_VARS['variable']</span> ou <span data-hdoc-type="syntax">$_GET['variable']</span> et <span data-hdoc-type="syntax">$_POST['variable']</span> (selon configuration).</p><p>&lt;?php
 $MaVarLocale=$HTTP_GET_VARS['MaVar']
 echo $MaVarLocale;
?&gt;</p></div><div data-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>&lt;html&gt;
&lt;body&gt;
  &lt;?php
   echo $MaVar;
  ?&gt;
&lt;/body&gt;
&lt;/html&gt;</p></div><div data-hdoc-type="warning"><h6>Cache</h6><p>Les navigateurs disposent d'un cache, c'est à dire d'une copie locale des fichiers qui leur évite de recharger plusieurs fois un fichier identique. Lorsque l'on développe une application PHP, les fichiers changent fréquemment, il est alors nécessaire de <em>vider le cache</em> pour que le navigateur recharge bien la nouvelle version du code.</p><p>Sous Firefox, faire <span data-hdoc-type="syntax">CTRL+F5</span>.</p></div><footer><div data-hdoc-type="tags"><span>PHP</span><span>HTML</span><span>Form</span><span>Formulaire</span></div></footer></section><section data-hdoc-type="introduction"><header><h1>Introduction</h1></header><div><p>Cette section a été réalisée avec l'aide de contenus issus de <a href="www.commentcamarche.net">www.commentcamarche.net</a>, © 2003 Jean-François Pillou (document soumis à la licence GNU FDL). </p></div></section><section><header><h1>Objectifs</h1></header><div><p>Comprendre le fonctionnement d'un langage applicatif côté serveur comme PHP</p><p>Savoir faire des programmes simples en PHP</p><p>Savoir faire communiquer un serveur PHP avec un client HTML</p></div></section><section><header><h1>Questions de synthèse</h1></header><div><p>Comment se situe PHP dans une architecture Web ?</p><p>Pourquoi un langage comme PHP s'est-il développé ces dernières années à votre avis ?</p><p>Quels inconvénients peut-on trouver à un langage comme PHP ?</p></div></section><footer/></section><section><header><h1>PHP et BD</h1></header><section><header><h1>Architecture PHP/BD</h1><div data-hdoc-type="author">Fait à partir de www.commentcamarche.net. Copyright 2003 Jean-François Pillou. Document soumis à la licence GNU FDL. </div></header><div data-hdoc-type="example"><img src="re/3-tierExemplePhp.jpg" alt="3-tierExemplePhp.jpg"/></div><footer><div data-hdoc-type="tags"><span>PHP</span><span>Architecture</span><span>Oracle</span></div></footer></section><section><header><h1>Interfaçage avec PostgreSQL</h1></header><div><h6>Connexion à la BD</h6><p>$vConn = pg_connect("host=$vHost port=$vPort dbname=$vDbname user=$vUser password=$vPassword");</p></div><div><h6>Interrogation de la BD</h6><p>$vSql ="SELECT ...";
$vQuery=pg_query($vConn, $vSql);
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><div data-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 <a href="http://www.php.net/manual/en/ref.oci8.php">http://www.php.net/manual/en/ref.oci8.php</a>.</p></div><div data-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>
<span data-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><div data-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>
<span data-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><div data-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>
<span data-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>
<span data-hdoc-type="syntax">$mode</span> permet de paramétrer le <span data-hdoc-type="syntax">commit</span> (par défaut, le commit est envoyé automatiquement si l'exécution est correcte).</p></div><div data-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>
<span data-hdoc-type="syntax">oci_commit</span> valide la transaction en cours sur une connexion.</p><p>boolean oci_commit(connection_id connection); </p></div><div data-hdoc-type="example"><p>if(! oci_commit($conn)) {
 echo "Impossible de valider la transaction";
 exit;
}</p></div><div data-hdoc-type="remark"><h6>Rollback</h6><p>
<span data-hdoc-type="syntax">oci_rollback</span> permet d'annuler une transaction.</p></div><div><h6>Récupération d'enregistrements</h6><p>
<span data-hdoc-type="syntax">oci_fetch_array</span> retourne la ligne suivante (pour une instruction SELECT) dans un tableau à une dimension (il écrasera le contenu du tableau s'il existe). Par défaut, le tableau sera un tableau à double index, numérique et associatif.</p><p>array oci_fetch_array(statement_handle statement)</p></div><div data-hdoc-type="example"><p>while ($row=oci_fetch_array($statement)) {
 echo $results[0];
 echo $results[1];
 ...
}</p></div><div><h6>Déconnexion de la base de données</h6><p>
<span data-hdoc-type="syntax">oci_close</span> ferme une connexion Oracle.</p><p>boolean oci_close(connection_id connection); </p></div><div data-hdoc-type="example"><p>if (! oci_close($conn)) {
 echo "Impossible de fermer la connexion ";
 exit;
}</p></div><footer><div data-hdoc-type="tags"><span>PHP</span><span>Oracle</span><span>OCI</span></div></footer></section><section><header><h1>Interfaçage PHP avec MySQL</h1></header><div><p>Fait à partir de <a href="www.commentcamarche.net">www.commentcamarche.net</a>. Copyright 2003 Jean-François Pillou. Document soumis à la licence GNU FDL. </p><p>Complété à partir de MySQL 4 : Installation, mise en oeuvre et programmation.</p></div><div><h6>Connexion au serveur</h6><p>mysql_connect($host,$user,$passwd);</p></div><div><h6>Connexion à la base de données</h6><p>mysql_select_db($bdd);</p></div><div><h6>Exécution de requête SQL</h6><p>$result=mysql_query($query)</p></div><div><h6>Traitement de résultat de requête SELECT</h6><p>/* Test d'exécution de la requête */
if (! mysql_fetch_row($result)) {
 echo "Aucun enregistrement ne correspond\n";
}
else {
 while($row = mysql_fetch_row($result)) {
  ... $row[1] ... $row[2] ...
 }
}</p></div><div><h6>Déconnexion de la base de données</h6><p>mysql_close();</p></div><footer><div data-hdoc-type="tags"><span>PHP</span><span>MySQL</span></div></footer></section><section><header><h1>Objectifs</h1></header><div><p>Comprendre le rôle des langages applicatifs (PHP par exemple) comme sur-couche au dessus des SGBD et SQL</p><p>Savoir accéder à une base de données depuis un programme PHP</p></div></section><section><header><h1>Questions de synthèse</h1></header><div><p>A quoi sert une API PHP d'accès à une base de données ?</p></div></section><footer/></section><section><header><h1>Approfondissement PHP</h1></header><section><header><h1>Variables de session</h1></header><div data-hdoc-type="definition"><h6>Variable de session PHP</h6><p>Une variable de session PHP est une variable stockée sur le serveur.</p><p>C'est une variable temporaire qui a une durée limitée et est détruite à la déconnexion (fermeture du navigateur).</p><p>Les variables de session sont <em>partagées</em> par toutes les pages PHP d'une session (accès depuis un même navigateur). Elles permettent donc le passage d'information entre pages.</p></div><div data-hdoc-type="example"><h6>Exemple d'utilisation</h6><ul><li><p>Sauvegarde d'identifiants de connexion</p></li><li><p>Sauvegarde d'un panier d'achat</p></li><li><p>...</p></li></ul></div><div><h6>Démarrer une session</h6><p>&lt;?php session_start(); ?&gt;</p></div><div data-hdoc-type="remark"><p>Ce code est à placer au début de toutes les pages PHP qui souhaitent utiliser les variables de sessions, avant tout autre code PHP ou HTML.</p></div><div><h6>Utiliser les variables</h6><p>&lt;?php
...
$_SESSION['variable'] = valeur ;
...
?&gt;</p></div><div data-hdoc-type="example"><p>&lt;?php
// page1.php
session_start();
?&gt;
&lt;html&gt;
&lt;body&gt;
&lt;h1&gt;Page 1&lt;/h1&gt;
&lt;?php
$_SESSION['login'] = 'me';
$_SESSION['mdp'] = 'secret';
?&gt;
&lt;a href="page2.php"&gt;page 2&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</p><p>&lt;?php
// page2.php
session_start();
?&gt;
&lt;html&gt;
&lt;body&gt;
&lt;h1&gt;Page 2&lt;/h1&gt;
&lt;?php
echo $_SESSION['login'] ;
echo "&lt;br/&gt;" ;
echo $_SESSION['mdp'] ;
?&gt;
&lt;/body&gt;
&lt;/html&gt;</p><p>La page <span data-hdoc-type="syntax">page2.php</span> est en mesure d'afficher les informations de la page <span data-hdoc-type="syntax">page1.php</span>.</p></div><div><h6>Autres instructions</h6><ul><li><p>Supprimer une variable : <span data-hdoc-type="syntax">unset($_SESSION['variable'])</span>
</p></li><li><p>Supprimer toutes les variables : <span data-hdoc-type="syntax">session_unset()</span>
</p></li><li><p>Supprimer la session : <span data-hdoc-type="syntax">session_destroy()</span>
</p></li></ul></div><div data-hdoc-type="complement"><h6>Sources</h6><p>
<a href="http://www.phpsources.org/tutoriel-SESSIONS.htm">http://www.phpsources.org/tutoriel-SESSIONS.htm</a>
</p><p>
<a href="http://www.php.net/manual/fr/book.session.php">http://www.php.net/manual/fr/book.session.php</a>
</p></div><div data-hdoc-type="complement"><h6>Cookies</h6><p>Les sessions s'appuient sur les cookies, fichiers de données gérés côté client par le navigateur Web, pour stocker l'identifiant de session. Il est possible d'utiliser des sessions sans cookie, en passant l'identifiant de session dans l'URL.</p><p>
<a href="http://www.phpsources.org/tutoriel-cookies.htm">http://www.phpsources.org/tutoriel-cookies.htm</a>
</p></div><footer/></section><section><header><h1>Objets en PHP</h1></header><div><h6>Déclaration d'une classe</h6><p>class NomClasse {
 // Déclarations des attributs
 public $donneeMembre1;
 public $donneeMembre2;
 ...
 // Déclarations du constructeur
 function __construct () { 
  ...
 }
 // Déclarations des méthodes
 public function Nom_de_la_fonction_membre1(parametres) {
  ...
 }
 ...
}</p></div><div data-hdoc-type="remark"><h6>This</h6><p>Le mot clé <i>$this</i> permet d'accéder à l'objet en cours lors de la déclaration des méthodes.</p></div><div><h6>Instanciation d'objets</h6><p>$Nom_de_l_objet = new Nom_de_la_classe;</p></div><div><h6>Accès aux propriété</h6><p>$Nom_de_l_objet-&gt;Nom_de_la_propriété = Valeur;</p></div><div><h6>Accès aux méthodes</h6><p>$Nom_de_l_objet-&gt;Nom_de_la_méthode (parametre1,parametre2,...);</p></div><div data-hdoc-type="example"><h6>Classe de connexion à une base de données PosgreSQL</h6><p>&lt;?php
class Connect {
  var $fHost;
  var $fPort;
  var $fDbname;
  var $fUser;
  var $fPassword;
  var $fConn;
  function __construct () {
    $this-&gt;fHost="foo.fr";
    $this-&gt;fPort="5432";
    $this-&gt;fDbname="myDb";
    $this-&gt;fUser="Me";
    $this-&gt;fPassword="Secret";
  }
  function mConnect () {
    $this-&gt;fConn = pg_connect("host=$this-&gt;fHost port=$this-&gt;fPort dbname=$this-&gt;fDbname user=$this-&gt;fUser password=$this-&gt;fPassword") or die('Échec de la connexion : ' . pg_last_error());
  }
  function mClose () {
    pg_close($this-&gt;fConn);
  }
}
?&gt;</p></div><div data-hdoc-type="example"><h6>Utilisation de la classe de connexion</h6><p>&lt;?php
  include "connect_class.php";
  $vConnect = new Connect;
  $vConnect-&gt;mConnect();
?&gt;</p></div><div data-hdoc-type="complement"><p><a href="http://www.php.net/manual/fr/language.oop5.php">http://www.php.net/manual/fr/language.oop5.php</a></p></div><footer><div data-hdoc-type="tags"><span>PHP</span><span>Classe</span><span>Objet</span></div></footer></section><section><header><h1>PHP Data Objects</h1></header><div data-hdoc-type="definition"><p><q>PDO fournit une interface d'abstraction à l'accès de données, ce qui signifie que vous utilisez les mêmes fonctions pour exécuter des requêtes ou récupérer les données quelque soit la base de données utilisée.</q></p><p><a href="http://www.php.net/manual/fr/intro.pdo.php">http://www.php.net/manual/fr/intro.pdo.php</a></p></div><div data-hdoc-type="complement"><p><a href="http://php.net/manual/fr/book.pdo.php">http://php.net/manual/fr/book.pdo.php</a></p></div><footer/></section><footer/></section><section><header><h1>Bibliographie commentée sur les architectures Web et PHP</h1></header><div data-hdoc-type="complement"><h6>Références pratiques</h6><p>
PHP précis et concis
</p><p> Une référence très rapide et pratique à utiliser sur PHP. </p><p>
HTTP précis et concis
</p><p>Petite référence pour comprendre rapidement les bases du protocole HTTP.</p><p>
Apache précis et concis
</p><p> Petite référence pour configurer un serveur Apache.</p></div><footer/></section><section><header><h1>Application : Révisions Linux, PostgreSQL, HTML</h1></header><footer/></section><section><header><h1>Application : LAPP</h1></header><footer/></section><section><header><h1>Pratique : Une application Web avec PostgreSQL et PHP</h1><div data-hdoc-type="author">Stéphane Crozat (UTC) - http://www.utc.fr/ics/~stchttp://www.utc.fr/ics/~stc
</div><div data-hdoc-type="rights">by-nc-sa</div></header><section data-hdoc-type="introduction"><header><h1>Introduction</h1></header><div><p>Dans la première partie vous vous attacherez à la partie base de données, en utilisant PostgreSQL. Dans la seconde partie vous vous attacherez à la partie application en PHP et interface graphique en HTML.</p><p>Pensez à utiliser des documentations de PostgreSQL, par exemple :</p><ul><li><p>
<a href="http://search.postgresql.org/">http://search.postgresql.org/</a>
</p></li><li><p>
<a href="http://www.postgresql.org/docs/manuals/">http://www.postgresql.org/docs/manuals/</a>
</p></li><li><p>
<a href="http://www.postgresql.org/docs/8.2/interactive/datatype.html">http://www.postgresql.org/docs/8.2/interactive/datatype.html</a>
</p></li></ul></div></section><section data-hdoc-type="conclusion"><header><h1>Conclusion</h1></header><div><p>Proposez un bilan rapide de votre modélisation et des points importants pour l'implémentation de l'application.</p><p>Proposez un bilan rapide des aspects faciles et difficiles de PHP.</p></div></section><section><header><h1>Objectifs</h1></header><div><ul><li><p>Réaliser une application PHP pour exploiter une base de données</p></li><li><p>Utiliser PostgreSQL</p></li></ul></div></section><section><header><h1>Questions de synthèse</h1></header><div><p>Faites la synthèse de votre travail en reprenant les points méthodologiques les plus importants.</p></div></section><footer><div data-hdoc-type="tags"><span>PHP</span><span>PosgreSQL</span></div></footer></section></body></html>
application/x-hdoc+zip
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment