Internet et applications dans l`entreprise (4) PHP
Transcription
Internet et applications dans l`entreprise (4) PHP
Licence professionnelle « Management des organisations » Option « Systèmes d’information et Réseaux » Internet et applications dans l’entreprise (4) PHP O. Auzende 2009-2010 PHP ......................................................................................................................................................................... 3 Balises PHP ......................................................................................................................................................... 3 Variables, formatage des données, structures de contrôle ................................................................................... 3 Tirages aléatoires ................................................................................................................................................ 4 Exercice............................................................................................................................................................... 4 Variables provenant d'un formulaire ................................................................................................................... 5 Fonctions PHP..................................................................................................................................................... 5 Les sessions ......................................................................................................................................................... 6 PHP et MySQL ....................................................................................................................................................... 7 Fonctions PHP d’accès aux bases de données mySQL ....................................................................................... 7 Lecture de la base de données ............................................................................................................................. 7 Ecriture dans la base de données ......................................................................................................................... 9 Suppression dans la base de données .................................................................................................................. 9 Exercices ........................................................................................................................................................... 10 2 Internet et applications dans l’entreprise O. Auzende PHP PHP est un langage de scripts destiné à l’écriture d’applications Web. Les noms de fichiers attribués aux fichiers contenant des scripts PHP ont pour extension .php qui permet à l’interpréteur PHP de les reconnaître et de les exécuter immédiatement. Sur une machine individuelle, avec Apache utilisable en hôte local, les fichiers PHP se mettent dans le même répertoire que les pages HTML, donc généralement httpd/htdocs (sous Linux) ou www (easyPHP sous Windows). L’adresse fournie au navigateur pour l’affichage d’une page PHP est, pour les deux systèmes d’exploitation, http://localhost/page.php Si cette page contient un formulaire, l’appel à la page PHP devant traiter ce formulaire se fait par : <form method="get"/"post" action="page.php" > Balises PHP Le code PHP est encadré par des balises PHP. Styles de balise PHP : <?php ... Code PHP ... ?> o Les balises par défaut : o Les balises <script>: <SCRIPT LANGUAGE="php">...Code PHP ...</SCRIPT> Les balises d’ouverture courtes : <? ... Code PHP ... ?> (à éviter avec PHP 5) o Quand l’interpréteur PHP rencontre la balise d’ouverture, il interprète tous les caractères rencontrés jusqu’à ce qu’il trouve la balise de fermeture. Le script est alors exécuté et remplacé par le résultat qu’il produit. Variables, formatage des données, structures de contrôle o o o o o Les variables du langage sont représentées par un identificateur précédé du signe $, quel que soit le type de la variable : nombre (valeur numérique), chaîne de caractères, tableau, objet composite. Pour créer des variables avec PHP, il suffit d’en faire usage. Il est donc inutile de les déclarer. Si la variable $x représente un tableau avec un index numérique, on accède aux éléments individuels par la spécification $x[0], $x[1], etc. Si la variable $x représente un tableau avec un index associatif (un type énuméré tel que ("lundi", "mardi", "mercredi", etc.), on accède aux éléments individuels par la spécification $x["lundi"], $x["mardi"], etc. Les tableaux PHP peuvent avoir un index mixte (associatif et numérique). Ainsi, les éléments $x["lundi"] et $x[1] peuvent appartenir au même tableau. Page jours.php <html> <head> <title>utilisation de tableau en PHP</title> </head> <body> <p>Jours de la semaine en français et en anglais</p> <?php $tab[1]="lundi"; $tab[2]="mardi"; $tab[3]="mercredi"; $tab[4]="jeudi"; $tab[5]="vendredi"; $tab[6]="samedi"; $tab[7]="dimanche"; $tab["lundi"]="monday"; $tab["mardi"]="tuesday"; $tab["mercredi"]="wednesday"; $tab["jeudi"]="thursday"; $tab["vendredi"]="friday"; $tab["samedi"]="saturday"; $tab["dimanche"]="sunday"; echo "<table border='1'>\n"; for ($i = 1; $i < 8 ; $i++) { echo "<tr><td>",$tab[$i],"</td><td>",$tab[$tab[$i]],"</td></tr>"; } echo "</table>"; ?> </body> </html> 3 Avec des instructions d’affichage différentes : Page jours2.php <html> <head><title>utilisation de tableau en PHP</title></head> <body> <p>Jours de la semaine en français et en anglais</p> <?php $tab[1]="lundi"; $tab[2]="mardi"; $tab[3]="mercredi"; $tab[4]="jeudi"; $tab[5]="vendredi"; $tab[6]="samedi"; $tab[7]="dimanche"; $tab["lundi"]="monday"; $tab["mardi"]="tuesday"; $tab["mercredi"]="wednesday"; $tab["jeudi"]="thursday"; $tab["vendredi"]="friday"; $tab["samedi"]="saturday"; $tab["dimanche"]="sunday"; echo "<table border='1'>\n"; for ($i = 1; $i < 8 ; $i++) { printf("<tr><td>%s</td><td>%s</td></tr>",$tab[$i],$tab[$tab[$i]]); } echo "</table>"; ?> </body> </html> Les chaînes de formatage permettent de préciser comment les divers éléments doivent être affichés : printf("chaîne de formatage", éléments à afficher) ; Les structures de contrôle sont : if (test) { ... } else { ...} for (initialisation ; test ; incrémentation) { ... } while (test) { ... } do { ... } while (test); Tirages aléatoires Page comptes.php <html> <head><title>Entiers aleatoires</title></head> <body> <p>Je tire 100 entiers au hasard entre 1 et 100.<p> <?php $compteur1 = 0 ; $compteur2 = 0 ; for ($i=0; $i<100; $i++) { srand((double)microtime()*1000000); $randval = rand(1,100); if ($randval > 50) { $compteur1++ ; } else { $compteur2++; } } printf("Sur 100 tirages, il y a : <br>- %d entiers supérieurs à 50 <br>- %d entiers inférieurs ou egaux à 50.", $compteur1, $compteur2); ?> </body> </html> Exercice Ecrire une page PHP qui remplit un tableau $tab avec 50 entiers aléatoires compris entre 1 et 100 et fait afficher ces 50 entiers, séparés par des tirets. Ajouter ensuite le calcul de la somme des éléments du tableau, puis de leur moyenne, puis la recherche du plus grand élément et celle du plus petit élément du tableau. 4 Internet et applications dans l’entreprise O. Auzende Variables provenant d'un formulaire On récupère les valeurs des variables par $_GET["nom"] ou $_POST["nom"] selon la méthode de transmission des arguments employée. Page formulaire2.html <html> <head><title>Variables de formulaire</title></head> <body> <form action="valeurs.php" method="get"> <table> <tr><td>Nom :</td><td><input type="text" name="nom"></td></tr> <tr><td>Prenom : </td><td><input type="text" name="prenom"></td></tr> <tr><td>Ordinateur : </td> <td><select name="ordinateur"> <option value="pc">PC</option> <option value="mac">MAC</option> <option value="sun">Station Sun</option> <option value="autre">Autre</option> </select></td></tr></table> <input type="submit" value="Valider"> </form> </body> </html> Page valeurs.php <html> <head><title>Récupération des valeurs des variables</title></head> <body> <p>Vous avez donné comme renseignements :</p> <table> <?php $nom=$_GET["nom"]; echo "<tr><td>Nom : </td><td>$nom</td></tr>" ; $prenom=$_GET["prenom"]; echo "<tr><td>Prénom :</td> <td>$prenom</td></tr>" ; $ordinateur=$_GET["ordinateur"]; echo "<tr><td>Ordinateur : </td><td>$ordinateur</td></tr>"; ?> </table> </body> </html> Fonctions PHP Page carres.php <html> <head><title>fonctions</title></head> <body> <?php function carre ($num) { return $num * $num; } function cube($num) { return $num * $num * $num ; } ?> <p>Carrés et cubes des nombres entiers de 1 à 10</p> <?php echo "<table border='1'>"; for ($i=1;$i<=10;$i++){ printf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>", $i, carre($i), cube($i)) ; } echo "</table>"; ?> </body> </html> Les fonctions sont égnéralement déclarées dans un fichier externe que l’on inclut dans des pages PHP par un script : <?php include "fichier.php" ; ?> 5 Les sessions Une session permet de suivre un utilisateur pendant la durée de sa connexion à un site. La variable $_SESSION est stockée sur le serveur pendant environ 30 minutes et permet de mémoriser des renseignements concernant le visiteur. Exemple : page indexsession.html de connexion à un site demandant des renseignements à un visiteur : Page indexsession.html <html> <head><title>Connexion au site</title></head> <body> <form method="post" action="creeSession.php"> <table border="0" width="400" align="center"> <tr><td width="200"><b>Votre pseudo<b></td> <td width="200"><input type="text" name="pseudo"></td></tr> <tr><td width="200"><b>Votre mail<b></td> <td width="200"><input type="text" name="email"></td></tr> <tr><td colspan="2"> <input type="submit" name="submit" value="Entrer"></td></tr> </table> </form> </body> </html> La page creeSession.php initialise la session et y mémorise le pseudo et le mail : Page creeSession.php <?php // On démarre la session session_start(); // On vérifie que les informations ont été effectivement données if ( isset($_POST) && (!empty($_POST['pseudo'])) && (!empty($_POST['email'])) ) { extract($_POST); $_SESSION['pseudo'] = $pseudo; $_SESSION['email'] = $email; echo "Vous êtes à présent connecté au site"; ?> <form method="post" action="retrouve.php"> <input type="submit" value="Voir votre profil"> </form> La page retrouve.php permet, dans une autre page, de retrouver les informations à partir de la session : Page retrouve.php <?php // On appelle la session session_start(); // On affiche une phrase résumant les infos sur l'utilisateur courant echo "Pseudo : "; echo $_SESSION['pseudo']; echo "<br />"; echo "Email : "; echo $_SESSION['email']; echo "<br />"; ?> <form method="post" action="deconnect.php"> <input type="submit" value="Se déconnecter"> </form> La page deconnect.php permet de vider l’objet $_SESSION sur le serveur. Page deconnect.php <?php // On appelle la session session_start(); // On écrase le tableau de session $_SESSION = array(); // On détruit la session session_destroy(); ?> Fin de connexion. 6 Internet et applications dans l’entreprise O. Auzende PHP et MySQL Fonctions PHP d’accès aux bases de données mySQL La fonctions PHP mysql_connect() reçoit en argument le nom d’une machine hôte, le nom d’un utilisateur et son mot de passe. Son rôle est d’établir la connexion. Elle renvoie un identificateur de lien si la connexion a pu être établie et FALSE si une erreur s’est produite. La fonction mysql_select_db() permet de sélectionner une base de données particulière. La fonction mysql_query() transmet une requête SQL au serveur pour qu’il l’exécute. En cas de succès, elle renvoie l’identificateur d’un ensemble résultat, en l’occurrence une sous-table (virtuelle). Les fonctions le plus souvent utilisées mysql_connect : mysql_select_db : mysql_create_db : mysql_drop_db : mysql_query : mysql_fetch_array : mysql_fetch_row : mysql_result : mysql_insert_id() : mysql_close : Ouvre une connexion à un serveur MySQL. Sélectionne une base de données MySQL. Crée une base de données MySQL. Efface une base de données MySQL. Envoie une requête SQL à un serveur MySQL. Retourne une ligne de résultat sous la forme d'un tableau associatif. Retourne une ligne de résultat sous la forme d'un tableau. Retourne un champ d'un résultat. Ramène le dernier identificateur attribué. Ferme la connexion MySQL. Lecture de la base de données A l’aide du fichier mydb.dump, créer et remplir la base de données mySQL mydb : mysqladmin –u root create mydb mysql –u root mydb < mydb.dump Pour se connecter à la base, on définit un fichier mémorisant les paramètres de connexion. On inclut ensuite ce fichier dans toute page PHP faisant appel à la base. Fichier connexion.php <?php $host="localhost"; $login="root"; $base="mydb"; ?> Fichier lecture1.php : lecture des enregistrements lus en tableau à indice numérique <html> <body> <?php include "connexion.php"; ?> <?php $db=mysql_connect($host,$login); mysql_select_db($base,$db); $result=mysql_query("SELECT * FROM employes",$db); echo "<table border=1>\n"; echo "<tr><td>Prenom</td><td>Nom</td><td>Adresse</td><td>Service</td></tr>\n"; while ($lignes=mysql_fetch_row($result)) { printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n", $lignes[1],$lignes[2],$lignes[3],$lignes[4]); } echo "</table>\n"; ?> </body> </html> 7 Lecture de la table employes en tableau associatif et test préalable si résultat vide : Fichier lecture2.php <html> <body> <?php include "connexion.php"; ?> <?php $db=mysql_connect($host,$login); mysql_select_db($base,$db); $result=mysql_query("SELECT * FROM employes",$db); if ($lignes=mysql_fetch_array($result)) { echo "<table border=1>\n"; echo "<tr><td>Prenom</td><td>Nom</td><td>Adresse</td> <td>Service</td></tr>\n"; do { printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n", $lignes["prenom"],$lignes["nom"],$lignes["adresse"], $lignes["service"]); } while ($lignes=mysql_fetch_array($result)); echo "</table>\n"; } else {echo "table vide";} ?> </body> </html> Fichier interrogation.php : lecture ciblée <html> <body> <?php include "connexion.php"; ?> <?php $db=mysql_connect($host,$login); mysql_select_db($base,$db); ?> <form method="post" action="lecture3.php"> Salarié : <select name="id"> <?php $result=mysql_query("SELECT * FROM employes",$db); if ($lignes=mysql_fetch_array($result)) { do { printf("<option value=%s>%s</option>",$lignes["id"],$lignes["nom"]); } while ($lignes=mysql_fetch_array($result)); } ?> </select><br /> <input type="submit" value="OK"> </form> </body> </html> Fichier lecture3.php : réponse <html> <body> <?php include "connexion.php"; ?> <?php $db=mysql_connect($host,$login); mysql_select_db($base,$db); $id=$_POST["id"]; if ($id) { $result=mysql_query("SELECT * FROM employes WHERE id=$id",$db); $lignes=mysql_fetch_array($result); printf("Prenom : %s<br>",$lignes["prenom"]); printf("Nom : %s<br>",$lignes["nom"]); } else {echo "pas de reponse";} ?> </body> </html> 8 Internet et applications dans l’entreprise O. Auzende Ecriture dans la base de données Fichier ecriture.php : formulaire de demande d’insertion <html> <body> <?php include "connexion.php"; ?> <form method="get" action="ecriture1.php"> <table> <tr><td>Nom :</td> <td><input type="text" name="nom"></td></tr> <tr><td>Prenom :</td><td><input type="text" name="prenom"></td> </tr> <tr><td>Adresse :</td> <td><input type="text" name="adresse"></td></tr> <tr><td>Service :</td><td> <select name="service"> <?php $db=mysql_connect($host,$login); mysql_select_db($base,$db); $result=mysql_query("SELECT service FROM employes",$db); if ($lignes=mysql_fetch_array($result)) { do { printf("<option value=%s>%s</option>", $lignes["service"],$lignes["service"]); } while ($lignes=mysql_fetch_array($result)); } ?> </select></td></tr> </table> <input type="submit" name="submit" value="OK"> </form> </body> </html> Fichier ecriture1.php : réponse (insertion effective) <html> <body> <?php include "connexion.php"; ?> <?php $submit=$_GET["submit"]; if ($submit) { $db=mysql_connect($host,$login); mysql_select_db($base,$db); $prenom=$_GET["prenom"]; $nom=$_GET["nom"]; $adresse=$_GET["adresse"]; $service=$_GET["service"]; $sql="INSERT INTO employes (prenom, nom, adresse, service) VALUES ('$prenom','$nom','$adresse','$service')"; $result=mysql_query($sql); echo "enregistrement effectue"; } ?> </body> </html> Suppression dans la base de données La page suppression.php demande le numéro de l'employé à supprimer, puis la page suppression1.php supprime effectivement cet employé dans la table employes. Fichier suppression.php : formulaire de demande de suppression <html><body> <?php include "connexion.php"; ?> <?php $db=mysql_connect($host,$login); mysql_select_db($base,$db); ?> 9 <form method="get" action="suppression1.php"> Salarié à supprimer : <select name="id"> <?php $result=mysql_query("SELECT * FROM employes",$db); if ($lignes=mysql_fetch_array($result)) { do { printf("<option value=%s>%s</option>",$lignes["id"],$lignes["nom"]); } while ($lignes=mysql_fetch_array($result)); } ?> </select><br /> <input type="submit" value="OK"> </form> </body> </html> Fichier suppression1.php : réponse (suppression effective) <html> <body> <?php include "connexion.php"; ?> <?php $db=mysql_connect($host,$login); mysql_select_db($base,$db); ?> <?php $id=$_GET["id"]; if ($id) { $sql="DELETE FROM employes WHERE id=$id"; $result=mysql_query($sql); echo "Employe supprime"; } ?> </body> </html> Exercices Le fichier baseqcm.dump vous est fourni. Il commence ainsi : CREATE TABLE categories (num tinyint(2) NOT NULL AUTO_INCREMENT, intitule varchar(30), PRIMARY KEY(num), UNIQUE id(num)); INSERT INTO categories VALUES(1, 'technique'); INSERT INTO categories VALUES(2, 'culture'); INSERT INTO categories VALUES(3, 'utilisation'); CREATE TABLE questions (num tinyint(4) NOT NULL AUTO_INCREMENT, categorie tinyint(2), texte varchar(250), PRIMARY KEY(num), UNIQUE id(num)); CREATE TABLE reponses (num tinyint(5) NOT NULL AUTO_INCREMENT, question tinyint(4), texte varchar(100), qualite tinyint(2), PRIMARY KEY(num), UNIQUE id(num)); INSERT INTO questions VALUES(1, 1, 'La memoire centrale :'); INSERT INTO reponses VALUES(1, 1, 'se vide lorsqu\'on arrete l\'ordinateur', 3); INSERT INTO reponses VALUES(2, 1, 'conserve les donnees indefiniment', -1); INSERT INTO reponses VALUES(3, 1, 'transfere les donnees sur le disque dur avant de se vider', -1); INSERT INTO reponses VALUES(4, 1, 'ne se vide jamais', -1); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO questions VALUES(2, 1, 'Dans la mémoire centrale, on stocke :'); reponses VALUES(5, 2, 'les programmes et les donnees', 3); reponses VALUES(6, 2, 'les programmes seulement', -1); reponses VALUES(7, 2, 'les donnees seulement', -1); reponses VALUES(8, 2, 'Windows', -1); INSERT INSERT INSERT INSERT INSERT ... INTO INTO INTO INTO INTO questions VALUES(3, 1, 'Une disquette est :'); reponses VALUES(9, 3, 'une memoire remanente', 3); reponses VALUES(10, 3, 'une memoire volatile', -1); reponses VALUES(11, 3, 'une memoire permanente', -1); reponses VALUES(12, 3, 'une memoire rapide', -1); Placez ce fichier dans le dossier C:\Program Files\easyPHP1-8\mysql\bin 10 Internet et applications dans l’entreprise O. Auzende Allez dans ce dossier avec une fenêtre d’invite de commandes. Créez la base baseqcm par la commande : mysqladmin –u root create baseqcm Le remplissage de la base se fait alors par : mysql –u root baseqcm < baseqcm.dump Interrogation de la base Pour interroger votre base de données en mode interactif, lancez le programme mySQL par la commande : mysql -u root mysql affiche alors un prompt spécifique indiquant que l’interpréteur attend les requêtes. Tapez successivement : connect baseqcm; show tables; select * from categories; select * from questions; select * from reponses; pour vous connecter à votre base pour vérifier que les tables de votre base ont bien été créées pour voir le contenu des tables Vous pouvez maintenant tester des requêtes. Faites exécuter les requêtes suivantes et notez-en le texte : - nombre de questions de la première catégorie : ………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………. - textes des questions de la première catégorie : ………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………. - textes et réponses des questions de la première catégorie : ………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………. Quittez ensuite l’interpréteur par quit; Génération de QCM 1) Générer la page questions.php comportant les questions de la base et les réponses associées : 11 2) Modifier cette page en y introduisant un formulaire (method="post" et action="reponse.php") et en faisant apparaître des boutons radio devant chaque réponse. Le nom de la variable associée aux boutons radio correspondant aux réponses à la question 1 sera par exemple "q1", celui de la variable associée aux boutons radio des réponses à la question 2 sera "q2", etc. 3) Modifier encore cette page en faisant apparaître, pour chaque question, les réponses dans le désordre. Pour cela, initialiser un générateur de nombres aléatoires par la fonction srand(); tester la fonction shuffle permettant de permuter les éléments d'un tableau. 4) Ecrire la page reponse.php calculant le score réalisé par l’utilisateur lorsqu’il valide le formulaire de la page questions.php. 5) Ajout de catégorie Ecrire la page insercategorie.php ci-contre qui affiche les catégories existantes et demande le nom d’une nouvelle catégorie. Le formulaire fera appel comme action au fichier insertioncategorie.php avec la méthode POST. Ecrire ensuite la page réponse insertioncategorie.php qui réalise l’insertion dans la base et réaffiche les catégories existantes (ci-contre). 6) Ajout de question Ecrire la page inserquestion.php ci-contre. Le formulaire fera appel comme action au fichier insertionquestion.php avec la méthode POST. 12 Internet et applications dans l’entreprise O. Auzende Ecrire la page insertionquestion.php qui réalise l’insertion effective de la question et des réponses dans la base. A noter : on insère d’abord la question dans la table questions, on récupère son identificateur (son num) par la ligne $num=mysql_insert_id() ; qui ramène le dernier identificateur attribué puis on insère les réponses dans la table reponses. Affichage souhaité : Ecrire enfin une page index.html proposant de générer un QCM, d’ajouter une catégorie ou d’ajouter une question. 13