Créez l`arborescence suivante : Créez une base de données maroc
Transcription
Créez l`arborescence suivante : Créez une base de données maroc
MAROC Créez l’arborescence suivante : Dsc00001.jpg Dsc00002.jpg Dsc00003.jpg Dsc00004.jpg Dsc00005.jpg Créez une base de données maroc et une table pagetype id clé primaire Les enregistrements Page 1 Laurent Lallias Greco Php niv2 Créez commun.php le fichier de connexion commun.php <?php /********** déclaration des variables de connexion **********/ $host = "localhost"; $user = "root"; $password = ""; $bdd = "maroc"; $table="pagetype"; /********** connection au serveur **********/ $link=@mysql_connect($host, $user, $password) or die ("Connexion au serveur impossible"); /********** connection à la base de données **********/ $retour=@mysql_select_db($bdd,$link) or die("Impossible de se connecter"); ?> Créez index.php la page d'accueil index.php <html><head> <title>Administration du site</title> </head><body> <?php # inclusion dans le fichier des paramètres de connexion include ("admin/connexions/commun.php"); # lecture de la table $query = "SELECT * FROM $table"; $result=mysql_query($query); # test pour savoir s'il y a des enregistrements if (mysql_numrows($result)>0) { # création du formulaire echo " <form method=\"post\" action=\"index.php\">"; # impression de la combo box contenant les titres possibles # par défaut on décide d'afficher le premier enregistrement $id=1 # on teste malgré tout si l'internaute n'a pas choisi de voir un autre enregistrement Page 2 Laurent Lallias Greco Php niv2 # si ce choix existe, il est dans $_POST["choix_titre"] # auquel cas on affectera $id avec cette valeur if (isset($_POST["choix_titre"])) $id=$_POST["choix_titre"];else $id=1; echo "<select name=\"choix_titre\">"; while ($row=mysql_fetch_row($result)) { #$row[0] correspond au numéro d'enregistrement echo "<option value=\"$row[0]\""; if($row[0]==$id) echo " selected=\"selected\""; echo">$row[1]</option>"; if($row[0]==$id) { $titre=$row[1]; #$row[1] correspond au titre $texte1=$row[2]; #$row[2] correspond au texte à gauche de l'image $texte2=$row[3]; #$row[3] correspond au texte à droite de l'image $image=$row[4]; #$row[4] correspond à l'image } } echo "</select>"; # bouton valider echo "<input type=\"submit\" name=\"submit\" value=\"Ok\">"; echo "</form>"; #on affiche le titre echo "<h2>$titre</h2>"; #on crée un tableau echo " <table width=\"100%\" border=\"0\" cellspacing=\"0\"> <tr> <td>$texte1</td> <td width=320><img src=$image width=\"320\" height=\"240\"></td> <td>$texte2</td> </tr> </table> "; } else { echo "<a href=\"admin/ajout.php\">Enregistrement vide ! </a>"; } ?> </body></html> Page 3 Laurent Lallias Greco Php niv2 Créez index.php la page d'accueil administration index.php <html> <head> <title>Administration du site</title> </head> <body bgcolor="#FF9933"> <?php /**********include du fichier de connexion*********/ include("connexions/commun.php"); /*** On cherche tous les enregistrements ***/ $query = "SELECT * FROM $table"; /*** envoi de la requête à la base ***/ $result = mysql_query($query); /*** on compte le nombre d’enregistrements***/ $nb=mysql_numrows($result); echo " <p align=center><font face=\"Arial, Helvetica, sans-serif\"> Votre table comporte ".$nb." enregistrement(s) </font></p> "; /*** le résultat de la requete est stocké dans un tableau ***/ while($row = mysql_fetch_row($result)) { /** on affiche tous les champs sauf Id **/ echo " <table width=\"100%\" border=\"1\" cellspacing=\"0\"> <tr><td> <table width=\"100%\" border=\"0\" cellspacing=\"0\"> <tr><!- on affiche le contenu de la table dans des zones de texte--> <td ><textarea cols=\"15\" rows=\"3\">$row[1]</textarea></td> <td ><textarea cols=\"15\" rows=\"3\">$row[2]</textarea></td> <td ><textarea cols=\"15\" rows=\"3\">$row[3]</textarea></td> <td ><img src=../$row[4] width=128 height=96></td> </tr> <tr bgcolor=\"#cccccc\"> Page 4 Laurent Lallias Greco Php niv2 <td colspan=\"4\"><!- on appelle un des scripts en passant l'id en paramètre--> <a href=\"suppression.php?id=$row[0]\" >Supprimer cette page</A> <a href=\"modification.php?id=$row[0]\" >Modifier cette page</A> <a href=\"ajout.htm\">Ajouter une page</a> </td> </tr> </table> </td></tr> </table> "; } /*** on ferme la connexion ***/ mysql_close($link); ?> </body> </html> Créez ajout.htm le formulaire d'ajout d'enregistrement ajout.htm <html> <body> <!-- Le type "multipart/form-data" est utilisé pour soumettre des formulaires qui contiennent des données non-ASCII, et des données binaires--> <form enctype="multipart/form-data" action="ajout_page.php" method="post"> <p>Tapez ici votre titre :<br> <textarea name="titre" cols="100" rows="10"></textarea> </p> <p>Tapez ici votre texte1 :<br> <textarea name="texte1" cols="100" rows="10"></textarea> </p> <p>Tapez ici votre texte2 :<br> <textarea name="texte2" cols="100" rows="10"></textarea> </p> <p>Votre fichier image :<br> <!-- Le champ caché MAX_FILE_SIZE (en octets) doit précéder le champ input de type file et sa valeur représente la taille maximale acceptée du fichier. Ceci est considéré comme un conseil pour le navigateur. Info que l'on peut traiter avec PHP--> Page 5 Laurent Lallias Greco Php niv2 <input type="hidden" name="MAX_FILE_SIZE" value="2000000"> <input name="imageenplus" type="file" size="50" > </p> <p align="center"> <input type="submit" value="Ajoutez votre page"> </p> </form> <p align=center><a href="index.php">Retour à la page d'administration</a></p> </body> </html> Créez ajout_page.php le script d'ajout d'enregistrement ajout_page.php <?php /******************************** Variables d'environnement $_FILES["image_plus "]["name"]; on récupère le nom $_FILES["image_plus "]["size"]; on récupère la taille $_FILES["image_plus "]["type"]; on récupère son type mime $_FILES["image_plus "]["tmp_name"]; on récupère le nom temporaire $_FILES["image_plus "]["error"]; on récupère le code erreur ********************************/ #on récupère le nom d'origine de l'image téléchargée $image_plus_name=$_FILES["imageenplus"]["name"]; #on récupère le nom temporaire de l'image téléchargée $image_plus_tmp=$_FILES["imageenplus"]["tmp_name"]; #on récupère les titres et textes $titre=$_POST["titre"]; $texte1=$_POST["texte1"]; $texte2=$_POST["texte2"]; # concaténation afin de définir le chemin de stockage*/ # images/ est le chemin d'accès au dossier images # $image_plus est le nom de la variable transmise par le formulaire $namefile="images/" . $image_plus_name; $namefilecopy="../".$namefile; # on teste si le fichier image existe déjà sur le serveur on ne veut pas l'écraser if(!file_exists($namefilecopy)){ # copie du fichier dans le dossier adéquat, avec le nom adéquat # Rq la commande copy (source, dest) Page 6 Laurent Lallias Greco Php niv2 # copy() fait une copie du fichier. Elle renvoie 1 en cas de succès, autre chose sinon if ($image_plus_tmp) copy($image_plus_tmp,$namefilecopy); # Pour avoir le temps de voir le fichier temporaire dans le dossier tmp # sleep(5); /**********include du fichier de connexion*********/ include("connexions/commun.php"); /********** infos à ajouter dans la table **********/ $query = "INSERT INTO $table(titre,texte1,texte2,image) VALUES('$titre','$texte1','$texte2','$namefile')"; /********** stockage dans la bdd **********/ $result = mysql_query($query); /********** déconnection avec MySQL **********/ mysql_close($link); } else { echo "Le fichier que vous cherchez à télécharger existe déjà "; } echo " <br/>L'image uploadée s'appelle ".$_FILES["imageenplus"]["name"]."<br/> - Sa taille est de : ".$_FILES["imageenplus"]["size"]." octets<br/> - Son type est : ".$_FILES["imageenplus"]["type"]."<br/>"; echo "<p align=\"center\">vous venez d'ajouter une page à votre site <br/>"; echo "<a href=\"index.php\">Retour à la page d'administration</a></p>"; ?> Page 7 Laurent Lallias Greco Php niv2 Quelques types MIME Lors d'une transaction entre un serveur web et un navigateur internet, le serveur web envoie en premier lieu le type MIME du fichier envoyé au navigateur, afin que ce dernier puisse savoir de quelle manière afficher le document. Un type MIME est constitué de la manière suivante : Content-type: type_mime_principal/sous_type_mime Une image GIF a par exemple le type MIME suivant : Content-type: image/gif Type MIME Type de fichier Extension associée application/pdf Fichiers Adobe Acrobat pdf image/gif Images gif gif image/jpeg ou image/pjeg Images Jpeg jpg,jpeg,jpe multipart/x-zip Fichiers archive zip zip text/html Fichiers HTML htm,html video/mpeg Vidéos MPEG mpeg,mpg,mpe video/quicktime Vidéos QuickTime qt,mov video/msvideo Vidéos Microsoft Windows avi video/x-sgi-movie Vidéos MoviePlayer movie Le traitement d'erreurs $_FILES["xxx"]["error"]==Valeur; Le code d'erreur associé au téléchargement de fichier. Introduit en PHP 4.2.0 UPLOAD_ERR_OK ou Valeur : 0. Aucune erreur, le téléchargement est correct. Exemple : $_FILES["imageenplus "]["error"]==0; UPLOAD_ERR_INI_SIZE ou Valeur : 1. Le fichier téléchargé excède la taille de upload_max_filesize, configurée dans le php.ini. UPLOAD_ERR_FORM_SIZE ou Valeur : 2. Le fichier téléchargé excède la taille de MAX_FILE_SIZE, qui a été spécifiée dans le formulaire HTML. UPLOAD_ERR_PARTIAL ou Valeur : 3. Le fichier n'a été que partiellement téléchargé. UPLOAD_ERR_NO_FILE ou Valeur : 4. Aucun fichier n'a été téléchargé. Page 8 Laurent Lallias Greco Php niv2 Créez suppression.php suppression.php <html> <head><title>suppression.php</title></head> <body> <?php /**********include du fichier de connexion*********/ include("connexions/commun.php"); /*** On cherche l'enregistrement qui correspond à l'id ***/ $query = "SELECT * FROM $table where id=".$_GET["id"]; /*** envoi de la requête à la base ***/ $result = mysql_query($query); /*** le résultat de la requete est stocké dans un tableau ***/ $row = mysql_fetch_row($result); $image="../".$row[4]; echo " <table width=\"100%\" border=\"0\" cellspacing=\"0\"> <tr> <td>$row[1]</td> <td>$row[2]</td> <td>$row[3]</td> <td><img src=$image width=\"128\" height=\"96\"></td> </tr> <tr> <td colspan=\"4\" align=\"center\"> <A href=\"conf_suppr.php?id=$row[0]&filename=$image\"> Confirmez la suppression de l'enregistrement</A> </td> </tr> <tr> <td colspan=\"4\" align=\"center\"> <A href=\"index.php\">Annuler - Retour à l'administration</A> </td> </tr> <tr> <td colspan=\"4\" align=\"center\"> <A href=\"modification.php?id=$row[0] \">Modifiez l'enregistrement</A> Page 9 Laurent Lallias Greco Php niv2 </td> </tr> </table> "; /*** on ferme la connexion ***/ mysql_close($link); ?> </body> </html> Créez conf_suppr.php conf_suppr.php <? /**********include du fichier de connexion*********/ include("connexions/commun.php"); /*** On supprime l'enregistrement qui correspond à l'id ***/ $query = "DELETE FROM $table WHERE id=".$_GET["id"]; /*** On supprime le fichier qui correspond à l'image ***/ unlink($_GET["filename"]); /*** envoi de la requête à la base ***/ $result = mysql_query($query); /*** on ferme la connexion ***/ mysql_close($link); echo "<p align=\"center\">Vous venez de détruire l'enregistrement ".$_GET["id"]."<br>"; echo "<a href=\"index.php\" >Retour à l'administration</A></p>"; ?> Créez modification.php le formulaire de modification modification.php <?php /**********include du fichier de connexion*********/ Page 10 Laurent Lallias Greco Php niv2 include("connexions/commun.php"); /*** On cherche l'enregistrement qui correspond à l'id ***/ $query = "SELECT * FROM $table where id=".$_GET["id"]; /*** envoi de la requête à la base ***/ $result = mysql_query($query); /*** le résultat de la requete est stocké dans un tableau ***/ $row = mysql_fetch_row($result); echo " <h1 align=\"center\"> Page à modifier</h1> <table width=\"100%\" border=\"1\" cellspacing=\"0\"> <tr> <td>$row[1]</td> <td>$row[2]</td> <td>$row[3]</td> <td><img src=../$row[4] width=128 height=96></td> </tr> </table> <hr> <h1 align=\"center\"> Modification</h1> <form enctype=\"multipart/form-data\" action=\"modif_page.php?id=$row[0]\" method=\"post\"> <p>Tapez ici votre titre</p> <p> <textarea name=\"titre\" cols=\"150\">$row[1]</textarea> </p> <p>Tapez ici votre texte1</p> <p> <textarea name=\"texte1\" cols=\"150\">$row[2]</textarea> </p> <p>Tapez ici votre texte2</p> <p> <textarea name=\"texte2\" cols=\"150\">$row[3]</textarea> </p> <p>Votre fichier image : <input type=\"file\" name=\"monfichier\" > <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"100000\"> <input type=\"submit\" value=\"Modif de la page\"> </p> </form> "; /*** on ferme la connexion ***/ mysql_close($link); Page 11 Laurent Lallias Greco Php niv2 echo "<a href=\"index.php\">Retour à la page d'administration</a></p>"; ?> Créez modif_page.php modif_page.php <? /**********include du fichier de connexion*********/ include("connexions/commun.php "); $id=$_GET["id"]; $titre=$_POST["titre"]; $texte1=$_POST["texte1"]; $texte2=$_POST["texte2"]; if ($_FILES["monfichier"]["name"]) { /******* récupération du nom du fichier uploadé**********/ $nomfichier="images/" . $_FILES["monfichier"]["name"]; /******** copie du fichier dans le dossier adéquate*****/ $nomfichiercopy="../".$nomfichier; copy($_FILES["monfichier"]["tmp_name"],$nomfichiercopy); /********** infos à mettre à jour dans la table - l'image a été changée**********/ $query = "UPDATE $table SET titre='$titre',texte1='$texte1',texte2='$texte2',image='$nomfichier' WHERE id='$id'"; } ELSE { /********** infos à mettre à jour dans la table - l'image ne change pas**********/ $query = "UPDATE $table SET titre='$titre',texte1='$texte1',texte2='$texte2' WHERE id='$id'"; } /********** stockage dans la bdd **********/ $result = mysql_query($query); /********** déconnection avec MySQL **********/ mysql_close($link); echo "<p align=\"center\">vous venez de modifier la page ".$id." de votre site <br>"; echo "<a href=\"index.php\">Retour à la page d'administration</a></p>"; ?> Page 12 Laurent Lallias Greco Php niv2 Protection Fichier .htaccess du dossier admin AuthName "Acces Restreint" AuthType Basic AuthUserFile 'c:\program files\easyPHP1-8\www\maroc\admin\connexions\.htpasswd' <LIMIT GET POST> Require valid-user </LIMIT> Fichier .htaccess du dossier connexions <LIMIT GET POST> deny from all </LIMIT> Fichier .htpasswd du dossier connexions Laurent:lallias Quelques remarques AuthType Basic précise qu'il faut utiliser AuthUserFile pour l'authentification. La commande AuthUserFile permet de définir l'emplacement du fichier contenant les logins et les mots de passe des utilisateurs autorisés à accéder à une ressource donnée. require valid-user précise que l'on autorise uniquement les personnes identifiées. La balise LIMIT possède en attribut la valeur GET (en majuscule) et/ou la valeur POST, afin de définir le type de méthode du protocole HTTP auxquelles la restriction s'applique Page 13 Laurent Lallias Greco Php niv2 LES COOKIES Objectif : Identifier de manière durable un client, un usager du site. Les cookies sont donc des petits fichiers texte stockés sur la machine du client permettant ainsi de le reconnaître. Création de Cookies et php Syntaxe de la fonction : setcookie(name, value,expire,path,domaine) name : nom donné à la variable cookie value : information stockée dans le cookie expire : temps unix pendant lequel sera actif le cookie (s'exprime en secondes) path : Le chemin indique le répertoire du site où le cookie possède une validité. La valeur par défaut est la racine du site web. "/" signifie que le cookie est valide sur tout le site. "/cookies/" signifie que le cookie est valide sur le dossier cookies domaine : permet de préciser à partir de quelle url on pourra manipuler le cookie déposé sur la machine client. ".lallias.com" valide sur le domaine et sous domaines lallias.com "www.lallias.com" valide uniquement sur le domaine lallias.com (option par défaut) <? /* création de la variable cookie date_visiteur */ setcookie("date_visiteur",date("d/m/y"),time()+3600, "/ " ); /* création de la variable cookie langue précisant quelle est la langue du navigateur */ $lang=getenv("HTTP_ACCEPT_LANGUAGE"); setcookie("langue",$lang,time()+3600, "/ " ); //ou encore //setcookie("langue", getenv("HTTP_ACCEPT_LANGUAGE"),time()+3600, "/ " ); ?> Page 14 Laurent Lallias Greco Php niv2 Rq : la fonction setcookie doit être appelée en début de script avant toutes instructions HTML. Avec Internet Explorer : • Si le script générateur du cookie est stocké dans la racine du site visité, le nom du cookie généré sur la machine du client contiendra le nom du domaine visité. Si un script du site www.lallias.com crée un cookie sur votre machine celui ci s'appellera : nomutilsateur@lallias[1].txt • Si le script générateur est stocké dans un sous dossier du site, le nom du cookie généré sur la machine du client contiendra le nom du dossier Si un script du site www.lallias.com/dossier crée un cookie sur votre machine celui ci s'appellera : [email protected] sauf s'il a été précisé dans le paramètre path la valeur "/". Chez certains hébergeurs le fait de stocker les scripts de traitement de cookies dans des sous dossiers peut entrainer des disfonctionnements. setcookie("date_visiteur",date("d/m/y"),time()+600,"/") Les cookies sont stockés dans un sous dossier nommé cookies. Il y a un fichier par cookie. Avec FireFox : Il n'y a qu'un seul fichier qui rassemble tous les cookies. Il s'appelle cookies.txt et se trouve dans un sous-dossier de Application Data… Sur Firefox, on peut visualiser le fichier des coolkies par : Outils>Options>Vie Privée>Cookies Page 15 Laurent Lallias Greco Php niv2 Afficher le contenu d'un cookie Les cookies sont stockés dans un tableau associatif nommé $ _COOKIE. Deux possibilités nous sont offertes pour consulter l’ensemble des cookies : <?php /* On peut utiliser une boucle WHILE */ while($valeur=each($_COOKIE)) { echo "$valeur[0] $valeur[1]<br>"; } $ _COOKIE ?> Ou <?php /* On peut utiliser un FOREACH */ foreach($_COOKIE as $cle=>$valeur) { echo "$cle $valeur<br>"; } ?> Pour afficher un cookie particulier on peut aussi utiliser la notation suivante : echo $_COOKIE["nomducookie"]; Détruire un cookie Le principe de destruction d’un cookie est très simple. C'est à la charge du navigateur de supprimer un cookie dont la date est expirée. Pour le détruire, il suffit donc de le redéfinir avec une date révolue. setcookie("nomducookie") ou encore setcookie("nomducookie","", time() - 3600) Ici, on récupère le tampon horaire auquel on retire une heure. Attention : si lors de la création vous avez spécifiez /, il faut le remettre lors de la destruction Savoir si le navigateur client accepte les cookies A partir d'un premier script (script1.php), vous envoyez un cookie au client et vous redirigez le client vers un second script (script2.php). Dans ce second Page 16 Laurent Lallias Greco Php niv2 script, vous tentez de relire votre cookie. S'il existe, c'est que le navigateur du client accepte les cookies. Code de script1.php <?php setcookie("test", "1"); Header("Location: script2.php"); ?> Code de script2.php <?php if(isset($_COOKIE["test"])) echo "Le client accepte les cookies :)"; else echo "Le client n'accepte pas les cookies :("; ?> Rappel : isset($test) est une fonction qui Détermine si une variable (ici $test) est affectée Exemple de gestion de cookie en http://www.lallias.com/cookies/cookie_form.htm ou http://www.cabare.org/formation/php/cookies/cookie_form.htm Dans un premier temps nous allons créer un formulaire demandant son nom à l'internaute se connectant à notre site. <html><body> <form action="cookie_ecriture.php" method="post"> Nom du client <input type = "text" name="nom" /> <input type = "submit" /> </form> </body></html> Page 17 Laurent Lallias Greco Php niv2 Ce formulaire appelle un script nommé cookie_ecriture.php qui : - mémorise ce nom dans un cookie (internaute) - mémorise la date et l'heure de connexion dans un autre cookie (date) <?php $nom=$_POST["nom"]; /*création d'un cookie nommé "internaute" qui conserve le nom de l'internaute */ setcookie("internaute",$nom,time()+3600,"/"); /*création d'un cookie nommé date qui conserve la date de connexion*/ setcookie("date",date( "d/m/y à H:i:s"),time()+3600,"/"); echo "<a href=\"cookie_lecture.php\">Lire le cookie</a>"; ?> Sur ce script existe un lien vers un fichier nommé cookie_lecture.php qui affiche à l'écran l'ensemble des cookies <?php echo "Bonjour,<br> ". $_COOKIE["internaute"]; echo " comment allez vous depuis le ". $_COOKIE["date"]; echo ". <br>Au revoir ". $_COOKIE["internaute"]; echo ". <br><a href=\"cookie_suppression.php\">Effacer les cookies</A>"; ?> Sur ce script existe un lien vers un fichier nommé cookie_suppression.php qui efface les cookies : <?php /*Suppression d'un cookie nommé internaute qui conserve le nom*/ setcookie("internaute","",time()-3600,"/"); /*Suppression d'un cookie nommé date qui conserve la date de connexion*/ setcookie("date","",time()-3600,"/"); echo "<br><a href=\" cookie_lecture.php\">Lire un cookie</A>"; echo "<br><a href=\" cookie_form.htm \">Ecrire un nouveau cookie</A>"; ?> Page 18 Laurent Lallias Greco Php niv2 SESSIONS (PHP 4) Principe • • • Lorsque l'on démarre une session php, le serveur lui affecte un identifiant de session nommé PHPSESSID (abréviation : SID). A partir de ce moment toutes les variables de session que vous allez créer dans vos scripts seront : Ou stockées sur le serveur dans un fichier ressemblant à un cookie (mais coté serveur!!). C'est l'option par défaut. Ou stockées dans une table de base de données que vous aurez créée à cet effet. Ou stockées dans les mémoires des processeurs du serveur. Les variables enregistrées comme variables de session sont utilisables dans d'autres scripts. Les sessions vont donc servir au passage de paramètres entre scripts. Exemple 1 : une gestion de client (hyper simplifiée) On veut demander par le biais d'un formulaire html : • le nom d'un client • le choix d'un type de matériel Le nom et le produit seront transmis à un script php (ident.php) qui affichera ces informations et les définira comme variables de session. http://www.lallias.com/session_client_niv1/index.htm <html><body> <form action="ident.php" method="post"> Nom du client <input type="text" name="client" /><br/> Choix du produit <select name="produit"> <option >Imprimante</option> <option >Micro ordinateur</option> <option >Souris</option> <option >Tapis</option> </select> <input type="submit" value="Commander" /> </form> </body></html> le formulaire appelle un script nommé ident.php Page 19 Laurent Lallias Greco Php niv2 Remarques Une session est activée par une instruction session_start(). Attention l'instruction activant une session doit être la première du script. Création d'une session : session_start( ) Permet de créer une session ou de continuer la session courante. Création d'une variable de session : $_SESSION["nomdelavariable"] Enregistre une variable avec le nom nomdelavariable dans la session courante. Suppression du cookie de session : session_destroy( ) Détruit toutes les données associées à la session courante. Connaître le nom du fichier de session : session_id( ) Le script (ident.php) <?php /*on démarre une session*/ session_start(); echo "Bonjour, une session a été créée. Permet de créer une session ou continue la session courante. Ici va servir à créer une sesssion <br/>Elle se nomme ".session_id(). " <br/>Cet identificateur de session sera valable tant que vous n'aurez pas quitté notre site et votre navigateur<br/>"; echo "<hr>"; /*on récupére la date et l'heure dans une variable date*/ $date=date("d/m/y à H:i:s"); /*on affecte la variable pommade */ /*la portée de cette variable ne dépassera pas ce script*/ $pommade="vous êtes l'un de nos meilleurs clients "; /*on crée une variable de session nommée client*/ $_SESSION["client"]=$_POST["client"]; /*on crée une variable de session nommée produit*/ $_SESSION["produit"]=$_POST["produit"]; /*on crée une variable de session nommée date*/ $_SESSION["date"]=$date; echo "Bienvenue ".$_POST["client"]." $pommade <br/>"; echo "Nous sommes le ".$date ; echo " et vous désirez commander le produit suivant : ".$_POST["produit"]." <br/>"; Page 20 Laurent Lallias Greco Php niv2 /*appel d'un autre script dans lequel on pourra utiliser les variables client, produit et date mais pas pommade*/ echo "<a href=suite.php> Suite</a>"; ?> Le script suite.php Les variables de session sont accessibles on peut donc continuer à dialoguer avec l'internaute client. <?php session_start(); Ici session_start va permettre de continuer à utiliser les variables de session existantes echo "vous utilisez le fichier de session nommé :".session_id(); /*on peut utiliser la variable de session $client*/ echo "<br />Vous êtes : ".$_SESSION["client"]." <br/>"; /*on ne peut pas utiliser la variable $pommade*/ echo " $pommade <br/>"; /*on peut utiliser la variable de session $date*/ echo "Vous vous êtes connectés le : ".$_SESSION["date"]." <br/>"; /*on peut utiliser la variable de session $produit*/ echo " et vous nous avez commandé le produit suivant : ".$_SESSION["produit"]." <br/>"; echo "Nous allons mettre fin à la session... à bientôt <br/>"; session_destroy(); /*appel d'un autre script dans lequel on ne pourra utiliser aucune variable*/ echo "<a href=suite_et_fin.php> Suite et fin</a>"; ?> Suppression du cookie contenant les variables de session Le script suite_et_fin.php Les variables de session ont été détruites, elles ne sont plus accessibles. <?php session_start(); /*aucune des variables n'est accessible*/ echo "Vous êtes : ".$_SESSION["client"]." <br/>"; echo "Produit commandé : ".$_SESSION["produit"]." <br/>"; echo "A la date du : ".$_SESSION["date"]." <br/>"; Page 21 Laurent Lallias Greco Php niv2 ?> Attention : Si vous ne fermez pas le navigateur et que vous vous reconnectez au site, le précédent cookie est réactivé. Page 22 Laurent Lallias Greco Php niv2 CONNECTION /DECONNECTION Arborescence Fichier des paramètres de connection Fichier s'affichant lorsque l'utilisateur s'est identifié. La vérification se fait par le test de la variable de session créée et initialisée lors de la connection (index.php) Permet la saisie du login, du mot de passe et vérifie leur validité dans une table nommée admin. Si tout se passe bien on accède au fichier réussite sinon on reste sur index.php Base de données et table Le fichier connect.php <?php $hostname = "localhost"; $database = "login_logout"; $username = "root"; $password = ""; $NumId = mysql_connect($hostname, $username, $password) or die("Impossible"); mysql_select_db($database, $NumId); ?> Page 23 Laurent Lallias Greco Php niv2 Le fichier index.php <?php if (!isset($_SESSION)) { session_start(); } if (isset($_POST['login'])) { $login=$_POST['login']; $password=$_POST['password']; $redirectSucces = "pages/reussite.php"; $redirectEchec = "index.php"; require_once('pages/connections/connect.php'); $query="SELECT login, mdp FROM admin WHERE login='$login' AND mdp='$password'"; $Login = mysql_query($query, $NumId) or die("impossible"); $User = mysql_num_rows($Login); if ($User) { $_SESSION['Username'] = $login; header("Location: $redirectSucces" ); } else { header("Location: $redirectEchec" ); } } ?> <html> <body> <form action="index.php" method="post"> Utilisateur : <input name="login" type="text" /><br/> Mot de passe : <input name="password" type="text" /><br/> <input type="submit" name="Submit" value="Envoyer" /> </form> </body> </html> Page 24 Laurent Lallias Greco Php niv2 Le fichier reussite.php <?php if (!isset($_SESSION)) { session_start(); } /********************* Restriction d'accès **********************/ /* Définition de la page vers laquelle on sera envoyé si on tente d'ouvrir cette page sans être loggé*/ $restrictGoTo = "../index.php"; /* on teste l'existence d'une variable de session*/ if (!isset($_SESSION['Username'])){ /* Si la variable n'existe pas, on redirige vers la page définie dans $restrictGoTo */ header("Location: ". $restrictGoTo); exit; } /********************* Déconnexion **********************/ if (isset($_GET['Logout'])and $_GET['Logout']=="true"){ /*session_destroy()*/ unset($_SESSION['Username']); header("Location:../index.php "); } ?> <html> <body> REUSSITE<br/> <a href="<?php echo $_SERVER['PHP_SELF']."?Logout=true" ?>">Déconnecter</a> </body> </html> Page 25 Laurent Lallias Greco Php niv2 Header Si vous voulez rediriger le visiteur vers une autre page Syntaxe : header('Location: mapage.php'); mapage.php est l'adresse de la page vers laquelle vous voulez rediriger (qui peut aussi être de la forme mapage.php?param1=val1&m2=val2) Important Cette fonction doit être utilisée avant d'envoyer des données html, sous peine de produire une erreur. unset Si vous voulez détruire une variable Syntaxe : unset(nom_de_la variable) exemple avec une variable de session : unset($_SESSION['Username']) $_SERVER["PHP_SELF"] Cette variable très utile vous permet de récupérer le nom du fichier courant. Syntaxe : $_SERVER["PHP_SELF"] Exemple : <a href="<?php echo $_SERVER['PHP_SELF']."? Logout=true" ?>">Déconnecter</a> Require_once Equivalent à include mais vous êtes assurés que ce code ne sera ajouté qu'une seule fois Syntaxe : Require_once("nomfichier.ext") ; Page 26 Laurent Lallias Greco Php niv2 REDIRECTION SIMPLE Fichier .htaccess #Dans le cas ci dessous le lien est fait vers formation-conseil.php et en fait on appelle test.php #Pour indiquer à apache qu'il doit utiliser le module RewriteEngine : RewriteEngine on #RewriteRule : Déclare une règle de réécriture. #RewriteRule URL_affichée URL_réelle RewriteRule ^formation-conseil\.php$ test.php #Suivant les hébergeurs on doit ou pas préciser le chemin absolu #RewriteRule ^formation-conseil\.php$ /Rewriting-Url-niv1/test.html #ou #RewriteRule ^formation-conseil\.php$ test.html #Remarque # ^ : début de la chaîne # $ : fin de la chaîne # \ : caractère d’échappement #Pour que cela fonctionne il faut que : #Le module mod_rewrite soit actif : #(fichier de configuration d'Apache (httpd.conf) doit contenir cette ligne #LoadModule rewrite_module libexec/mod_rewrite.so #ou #LoadModule rewrite_module modules/mod_rewrite.so (easyphp) #ainsi que celle-ci : AddModule mod_rewrite.c Page 27 Laurent Lallias Greco Php niv2 Fichier index.php <?php echo " <a href=\"formation-conseil.php\"> Appel du fichier test.php mais en le faisant passer pour le fichier formationconseil.php </a>"; ?> Fichier test.php <html> <head><title>Test</title></head> <body> <?php echo "OK ! Vous êtes dans le fichier test.php"; ?> </body> </html> Page 28 Laurent Lallias Greco Php niv2 REDIRECTION ET PASSAGE DE PARAMETRES Fichier .htaccess RewriteEngine on RewriteRule ^formation-photoshop\.php$ test.php?id=1&rubrique=2&article=5 Fichier index.php <?php echo "<a href=\"formation-photoshop.php\">Formation Photoshop</a>"; echo "<br/>On appelle test.php?id=1&rubrique=2&article=5"; ?> Fichier test.php <html><head><title>Test</title></head><body> <?php echo "Le fichier appelé s'appelle en fait article.php. "; echo "On lui a passé 3 arguments : un id, un numéro de rubrique et un numéro d'article<br/>"; echo "- Le id vaut ".$_GET['id']."<br/>"; echo "- La rubrique vaut ".$_GET['rubrique']."<br/>"; echo "- L'article vaut ".$_GET['article']."<br/>"; ?> </body></html> Page 29 Laurent Lallias Greco Php niv2 REDIRECTION ET PASSAGE DE PARAMETRES Fichier .htaccess RewriteEngine on RewriteRule ^article-([0-9]+)-([0-9]+)\.html$ test.php?id=$1&num=$2 [L] Fichier index.php <?php echo "<a href=\"article-1-1.html\">Article 1 </a><br/>"; echo "<a href=\"article-1-2.html\">Article 1 bis </a><br/>"; echo "<a href=\"article-2-1.html\">Article 2 </a><br/>"; echo "<a href=\"article-2-2.html\">Article 2 bis </a><br/>"; ?> Fichier test.php <html><head><title>Test</title></head><body> <?php if (!isset($_GET['id']) OR !isset($_GET['num'])) { echo "Pas de Valeur";} else { echo "id vaut ".$_GET['id']; echo "et num vaut ".$_GET['num']; } ?> </body></html> Page 30 Laurent Lallias Greco Php niv2 REDIRECTION ET PASSAGE DE PARAMETRES Fichier .htaccess RewriteEngine on RewriteRule ^article-(.+)-(.+)\.html$ test.php?titre=$1&soustitre=$2 [L] Fichier index.php <?php echo"<a href=\"article-Photoshop-Masque_de_fusion.html\">Article Photoshop et Masque de fusion </a><br/>"; ?> Fichier test.php <html> <head> <title>Test<?php echo $_GET['titre']." ".$_GET['soustitre']; ?></title> </head> <body> <?php if (!isset($_GET['titre']) OR !isset($_GET['soustitre'])) { echo "Pas de Valeur";} else { echo "Le titre est ".$_GET['titre']." et sous titre est ".$_GET['soustitre']; } ?> </body> </html> Page 31 Laurent Lallias Greco Php niv2 Quelques expressions régulières et paramètres à connaître : . N’importe quel caractère * Zéro ou N occurrence(s) de l’expression qui précède (N>0) .* Une suite de 0 à l'infini caractère(s) + Une ou N occurrence(s) de l’expression qui précède (N > 1) [abcd] n’importe quel caractère de cette liste [a-z]+ Une ou plusieurs lettres [0-9]+ Un ou plusieurs chiffres [^abcd] blanc|noir tout caractère non compris dans la liste (tout sauf a, b, c ou d) alternative, soit « blanc », soit « noir » ^ ancre de début de ligne $ ancre de fin de ligne \ [L] ( ) permet d’échapper tout caractère qui suit et lui ôter sa signification particulière, par exemple \. Indique au serveur Apache d'arrêter ces recherches lorsqu'il a trouvé une correspondance Permet de capturer ce qui se trouve à l'intérieur afin de le réutiliser dans la suite de la règle. $1 correspond au premier couple de parenthèses $2 correspond au deuxième couple de parenthèses Page 32 Laurent Lallias Greco Php niv2 JOINTURE Base de données et tables • Créez une base de données nommée biblio • Créez une première table nommée auteurs : Avec id clé primaire • Créez une deuxième table nommée livres : Avec id clé primaire • Insérez des enregistrements dans les tables Fichier de connexion jointure.php du dossier Connections <?php $hostname_jointure = "localhost"; $database_jointure = "biblio"; $username_jointure = "root"; $password_jointure = ""; $table1="auteurs"; $table2="livres"; /********** connection au serveur **********/ $jointure = mysql_connect($hostname_jointure, $username_jointure, $password_jointure) or die("Erreur Connexion au serveur"); /********** connection à la base de données **********/ $select=@mysql_select_db($database_jointure,$jointure) or die("erreur connection base de données"); ?> Page 33 Laurent Lallias Greco Php niv2 Insertion d'un auteur dans la table. inscription_auteur.php <?php require_once('Connections/jointure.php'); if(isset($_GET["message"])) echo $_GET["message"]; if (!isset($_POST["nom"])){ echo "<br/>Inscription d'un auteur <br/>"; ?> <form method="post" action="inscription_auteur.php"> <p>Nom de l'auteur <input name="nom" type="text" /> </p> <p>Prénom de l'auteur <input name="prenom" type="text" /> </p> <p> <input type="submit" name="Submit" value="Ajouter"> </p> </form> <? } else { $message="Bonjour, "; if (empty($_POST['nom']) OR empty($_POST['prenom'])) { $message.="Prob de nom ou de prénom"; } else { $nom=$_POST['nom']; $prenom=$_POST['prenom']; $query_auteur="INSERT INTO $table1(nom,prenom) VALUES ('$nom','$prenom')"; $resultat=mysql_query($query_auteur); if ($resultat) $message.="Auteur inscrit "; else $message.="Problème d'inscription "; } header("location:inscription_auteur.php?message=$message"); } ?> Insertion d'un livre dans la table. inscription_livre.php <?php require_once('Connections/jointure.php'); $query_auteur = "SELECT id, nom, prenom FROM $table1"; Page 34 Laurent Lallias Greco Php niv2 $auteur = mysql_query($query_auteur) or die(mysql_error()); $totalRows_auteur = mysql_num_rows($auteur); if(isset($_GET["message"])) echo $_GET["message"]; if (!isset($_POST["nom"])){ echo "<br/>Inscription d'un ouvrage <br/>"; ?> <form method="post" action="inscription_livre.php"> <p>Nom du livre <input name="nom" type="text"> </p> <p>Auteur du livre <select name="auteur"> <?php while ($row_auteur = mysql_fetch_assoc($auteur)) { ?> <option value="<?php echo $row_auteur['id'];?>"> <?php echo $row_auteur['nom']; ?> </option> <?php } ;?> </select> <p><input type="submit" name="Submit" value="Ajouter"></p> </form> <? } else { $message="Bonjour, "; if (empty($_POST['nom'])) { $message.="Prob de nom "; } else { $nom=$_POST['nom']; $idauteur=$_POST['auteur']; $query_livre="INSERT INTO $table2(nom,idauteur) VALUES ('$nom','$idauteur')"; $resultat=mysql_query($query_livre); if ($resultat) $message.="Livre inscrit "; else $message.="Problème d'inscription "; } header("location:inscription_livre.php?message=$message"); }?> Affichage avec jointure. affiche.php <? require_once('Connections/jointure.php'); Page 35 Laurent Lallias Greco Php niv2 $query="SELECT livres.nom, auteurs.nom, auteurs.prenom FROM livres, auteurs WHERE auteurs.id=livres.idauteur"; $result = mysql_query($query); while($row = mysql_fetch_array($result)) { echo " <b>$row[0]</b> $row[1] $row[2]<br> "; } ?> Recherche <? require_once('Connections/jointure.php'); if(!empty($_POST["nomauteur"])) { $nomauteur=$_POST["nomauteur"]; $query="SELECT livres.nom, auteurs.nom, auteurs.prenom FROM livres, auteurs WHERE auteurs.id=livres.idauteur AND auteurs.nom LIKE '%$nomauteur%'"; $result = mysql_query($query); while($row = mysql_fetch_array($result)) { echo "<b>$row[0]</b> $row[1] $row[2]<br>"; } } ?> <form method="post" action="recherche.php"> <p>Nom de l'auteur <input name="nomauteur" type="text" /> </p> <p> <input type="submit" name="Submit" value="Recherche"> </p> </form> Page 36 Laurent Lallias Greco Php niv2 Page 37 Laurent Lallias Greco Php niv2 INITIATION AUX CLASSES - LA POO Classe Propriété et Méthode Déclaration de la classe class nom_de_la_classe { } Définition de la classe - Les propriétés Les propriétés correspondent à des variables dont la visibilité s'étend sur l'ensemble du code qui compose la classe. On appelle cela aussi variables membres. Elles se définissent en début de classe. class nomdelaclasse { var $nom_de_la_variable_membre;// en php4 public $nom_de_la_variable_membre;// en php5 } Exemple class compactdisc // déclaration de la classe compactdisc { var $titrecd; //public $titrecd; // déclaration d’une variable membre var $date; // déclaration d’une variable membre //public $date; } Instanciation de classe En programmation orientée classe, l'instanciation est la création d'un objet à partir d'une classe. Revient à créer une variable Pour déclarer l'instance d'une classe on utilise le mot clé : new $nom_de_la_nouvelle_variable =new nom_de_la_classe(); Les parenthèses sont optionnelles. Elles ne seront utilisées que lorsqu'il y aura des paramètres à passer Exemple : la variable $cd est une instance de la classe compactdisc $cd =new compactdisc(); Pour invoquer une propriété de la classe lorsque l’on est en dehors de la classe (pour affecter une variable membre) on utilise un accesseur -> $nom_de_l’instance->nom_de_la_variable_membre… Vocabulaire On dit que $cd est un objet de type "compactdisc". On dit que $cd est une instance de la classe "compactdisc". "variable membre" et "propriété" sont synonymes. Page 38 Laurent Lallias Greco Php niv2 Exemple 1 : Affectation des variables membres réalisée dans la classe <?php class exemple1 // déclaration de la classe exemple1 { var $titrecd="Ms Office"; //public $titrecd; déclaration et affectation d’une variable membre var $date="02/01/2003"; //public $date; déclaration et affectation d’une variable membre } /* instanciation de la classe exemple1 */ $cd =new exemple1; echo "Le Cd de $cd->titrecd a été acheté le $cd->date "; ?> Exemple 2 : Affectation des variables membres réalisée hors de la classe <?php class exemple2 // déclaration de la classe exemple2 { var $titrecd; //public $titrecd; déclaration d’une variable membre var $date; déclaration d’une variable membre //public $date; } /* instanciation de la classe exemple2 */ $cd =new exemple2; $cd->titrecd="Open Office"; // affectation de la propriété (de la variable membre) titrecd $cd->date="01/01/2009"; // affectation de la propriété (de la variable membre) date echo "Le Cd de $cd->titrecd a été acheté le $cd->date "; ?> Exemple complet : soit le formulaire permettant la saisie du titre et de la date d'achat cd_niveau1.html <html><body> <form method="post" action="cd_niveau1.php"> Titre du cd : <input type="text" name="titre"/><br/> Date d'achat : <input type="text" name="date_achat"/> <input type="submit"></form> </body></html> Script php cd_niveau1.php <?php class compactdisc // déclaration de la classe compactdisc { var $titrecd; //public… // déclaration d'une variable membre, d'une propriété var $date; // déclaration d'une variable membre, d'une propriété //public… } /* instanciation de la classe compactdisc */ $cd =new compactdisc(); /* $_POST["titre"] est une variable renseignée par le biais du formulaire */ Page 39 Laurent Lallias Greco Php niv2 $cd->titrecd=$_POST["titre"]; /* $_POST["datacha"] est une variable renseignée par le biais du formulaire */ $cd->date=$_POST["date_achat "]; echo "Le Cd de $cd->titrecd a été acheté le $cd->date "; ?> Déclaration de classe - Les méthodes (fonctions membres) On les appelle aussi fonctions membres. Il s'agit de fonctions qui ont pour but de réaliser un traitement et peuvent par conséquent utiliser les variables membres de la classe. Dans une fonction membre, le mot clé $this désigne la classe courante. Pour invoquer une propriété de la classe ou une méthode de la classe on utilise un accesseur -> Pour une propriété $this->nom_de_la_variable_membre Pour une méthode $nom_de_la_nouvelle_variable->nom_de_la_fonction_membre() Exemple 1 : la fonction membre affiche les variables affectées localement <?php class exemple1 // déclaration de la classe exemple1 { var $titrecd="Adobe"; //public $titrecd; déclaration et affectation d’une variable membre var $date="12/01/2008"; //public $date; déclaration et affectation d’une variable membre function affiche() { echo $this->titrecd."<br/>"; echo $this->date."<br/>"; } } /* instanciation de la classe exemple1 */ $cd =new exemple1; $cd->affiche(); ?> Exemple 2 : Affectation des variables membres réalisée hors de la classe. Appel de la fonction membre sans passage de paramètres. <?php class exemple2 // déclaration de la classe exemple2 { var $titrecd; //public $titrecd; déclaration d’une variable membre var $date; déclaration d’une variable membre //public $date; function affiche() { echo $this->titrecd."<br/>"; Page 40 Laurent Lallias Greco Php niv2 echo $this->date."<br/>"; } } /* instanciation de la classe exemple2 */ $cd =new exemple2; $cd->titrecd="Open Office"; // affectation de la propriété (de la variable membre) titrecd $cd->date="01/01/2009"; // affectation de la propriété (de la variable membre) date $cd->affiche(); ?> Exemple 3 : Appel de la fonction membre avec passage de paramètres. <?php class exemple3 // déclaration de la classe exemple3 { var $titrecd; //public $titrecd; déclaration d’une variable membre var $date; déclaration d’une variable membre //public $date; function affiche($a,$b) { echo $this->titrecd=$a."<br/>"; echo $this->date=$b."<br/>"; } } /* instanciation de la classe exemple3 */ $cd =new exemple3; $cd->affiche("Open Office","01/01/09"); ?> Exemple : cd_niveau2.html <html><body> <form method="post" action="cd_niveau2.php"> Titre du cd : <input type="text" name="titre"/><br/> Date d'achat : <input type="text" name="date_achat"/> <input type="submit"></form> </body></html> cd_niveau2.php <?php class compactdisc // déclaration de la classe compactdisc { var $titrecd; //public… // déclaration d'une variable membre (propriété) var $date; // déclaration d'une variable membre (propriété) //public… Affichage et affectation de la variable membre /* déclaration de la méthode affichetitre */ function affichetitre($titr,$datach){ echo "Titre du cd : ".$this->titrecd=$titr; echo "<br/>" ; Appel de membre la fonction $this-> affichedate($datach); Page 41 Laurent Lallias Greco Php niv2 } Affichage et affectation de la variable membre /* déclaration de la méthode */ function affichedate($dat){ echo "Date d'achat : ".$this->date=$dat; echo "<br/>" ; } } /* instanciation de la classe compactdisc */ $cd =new compactdisc; /* appel de la fonction membre (méthode) avec paramètres */ $cd->affichetitre($_POST["titre"],$_POST["date_achat"]); ?> Le constructeur de classe Le constructeur est en fait une fonction membre : En php4 : qui porte impérativement le même nom que la classe En php5 : qui s'appelle __construct() Attention avec 2 _ Cette fonction est appelée automatiquement lors de la création d'un objet (lors de l'instanciation de la classe). C'est donc le moment privilégié pour réaliser les initialisations que l'on désire. Le constructeur permet d'initialiser les variables membres et d'effectuer divers traitements initiaux. Exemple : cd_niveau3.html <html><body> <form method="post" action="cd_niveau3.php"> Titre du cd : <input type="text" name="titre"/><br/> Date d'achat : <input type="text" name="date_achat"/> <input type="submit"/></form> </body></html> cd_niveau3.php <?php class compactdisc // déclaration de la classe compactdisc { var $titrecd; //public… // déclaration d'une variable membre var $date; // déclaration d'une variable membre //public… /* constructeur de classe ici reçoit 2 paramètres */ function compactdisc($titr,$datach){ // en php5 : function __construct($titr,$datach){ if (empty($titr)) { echo "Titre du cd : ".$this->titrecd="Aucun titre tapé"; echo "<br/>" ; Page 42 Laurent Lallias Greco Php niv2 Affichage et affectation de la variable membre } else { echo "Titre du cd : ".$this->titrecd=$titr; echo "<br/>" ; } if (empty($datach)) { echo "Date d'achat : ".$this->date="Aucune date tapée"; echo "<br/>" ; } else { echo "Date d'achat : ".$this->date=$datach; } } } /* instanciation avec passage de 2 paramètres */ $cd =new compactdisc($_POST["titre"],$_POST["date_achat"]); ?> Remarques Il ne peut exister qu'un seul constructeur par classe. Il est conseillé de placer chaque classe dans un fichier portant le nom de cette classe (ex: compactdisc.class.php) et d'utiliser des include() ou des require(). <?php include("compactdisc.class.php"); /* instanciation avec passage de 2 paramètres */ $cd =new compactdisc($_POST["titre"],$_POST["datacha"]); ?> L'héritage L'héritage permet de réutiliser du code déjà existant pour l'adapter à ses besoins. En d'autres termes, il permet, à partir d'une classe déjà existante, d'en créer une nouvelle qui reprendra ses caractéristiques ce qui nous permettra de les adapter à d'autres besoins sans modifier la classe de base. Syntaxe class nouvelle_classe_heritiere extends classe_dont_on_herite { . } Le mot clé "parent" permet quant à lui d'accéder à partir d'une classe aux fonctions membres de la classe de base ainsi qu'aux variables membres. parent::nom_de_la_fonction_membre(); parent::$this->nom_de_la variable_membre; L'opérateur :: est nommé ORP (Opérateur de Résolution de Portée). Exemple : Page 43 Laurent Lallias Greco Php niv2 <?php class exemple1 { public $titre="Ceci est le titre de la classe parent"; public $prix; public $nbre; public $totalht; public $taux_tva; public $tva; public $totalttc; function cout($p,$c) { $this->prix=$p; $this->nbre=$c; $this->totalht=$this->prix*$this->nbre; $this->tva=$this->totalht*$this->taux_tva; $this->totalttc=$this->totalht+$this->tva; echo "HT : ".$this->totalht."<br/>"; echo "Taux TVA : ".$this->taux_tva."<br/>"; echo "TVA : ".$this->tva."<br/>"; echo "TTC : ".$this->totalttc."<br/>"; } } class fils extends exemple1 On demande l'affichage de la variable membre titre (définie dans la classe parent exemple1) { function fils() { echo parent::$this->titre."<br/>"; On affecte la variable membre taux_tva (définie dans la classe parent exemple1) parent::$this->taux_tva="0.10"; parent::cout(10,12); } } $enfant=new fils; On appelle la fonction membre cout (définie dans la classe parent exemple1) ?> Exemple 2 Ce script correspond à la classe compactdisc. compactdisc.class.php dans le dossier heritage Fichier nommé <?php class compactdisc // déclaration de la classe compactdisc { var $titrecd; // en php5 public $titrecd; déclaration d'une variable membre var $date; // en php5 public $date; déclaration d'une variable membre function compactdisc($titr,$datach){ // en php5 function __construct($titr,$datach) { Page 44 Laurent Lallias Greco Php niv2 echo "Titre du cd : ".$this->titrecd=$titr; echo "<br/>" ; echo "Date d'achat : ".$this->date=$datach; echo "<br/>" ; } } ?> Ce script correspond à la classe cdaudio (héritière de la classe compactdisc). Fichier nommé cdaudio.class.php dans le dossier heritage <?php class cdaudio extends compactdisc { var $artiste ;//en php5 public $artiste; /* constructeur de la classe cdaudio */ function cdaudio($titre,$datachat,$art) { // en php5 function __construct($titre,$datachat,$art) { echo "<br/>Le nom de l'artiste est : ".$this->artiste=$art; echo "<br/>" ; /* appel du constructeur de classe compactdisc avec passage de paramètres */ /* ce constructeur appartient à la classe de base compactdisc qui est le parent */ /* de la classe cdaudio */ parent::compactdisc($titre,$datachat); //en php5 parent::__construct } } ?> Ce script correspond à la classe dvd (héritière de la classe compactdisc). Fichier nommé dvd.class.php dans le dossier heritage <?php class dvd extends compactdisc { var $réalisateur; //public… var $acteur_princ; //public… var $actrice_princ; //public… /* constructeur de la classe dvd */ function dvd($titre,$datachat,$act1,$act2) { echo "<br/>L'acteur principal est : ".$this->acteur_princ=$act1; echo "<br/>L'actrice principale est : ".$this->actrice_princ=$act2; echo "<br/>" ; /* appel du constructeur de classe compactdisc avec passage de paramètres */ /* ce constructeur appartient à la classe de base compactdisc qui est le parent */ /* de la classe dvd */ parent::compactdisc($titre,$datachat); //en php5 parent::__construct } } ?> Fichier nommé index.php dans le dossier heritage Page 45 Laurent Lallias Greco Php niv2 <?php include("compactdisc.class.php"); include("cdaudio.class.php"); include("dvd.class.php"); if(!empty ($_POST["titre"])){$titre=$_POST["titre"];}else { $titre="No title";} if(!empty ($_POST["date_achat"])){$date_achat=$_POST["date_achat"];}else { $date_achat="No date";} if(!empty ($_POST["artiste"])){$artiste=$_POST["artiste"];}else { $artiste="No artiste";} if(!empty ($_POST["acteur"])){$acteur=$_POST["acteur"];}else { $acteur="No acteur";} if(!empty ($_POST["actrice"])){$actrice=$_POST["actrice"];}else { $actrice="No actrice";} if(isset($_POST["typ"])){$typ=$_POST["typ"];}else { $typ="autre";} switch ($typ){ case "cdaudio" : echo "Il s'agit d'un cd audio";$cd =new cdaudio($titre,$date_achat,$artiste); break; case "dvd" : echo "Il s'agit d'un dvd";$cd =new dvd($titre,$date_achat,$acteur,$actrice); break; default : echo" <form method=\"post\" action=\"index.php\"> Titre du cd :<br/> <input type=\"text\" name=\"titre\" value=\"$titre\"/><br/> Date d'achat : <br/> <input type=\"text\" name=\"date_achat\" value=\"$date_achat\"/><br/> Type de CD<br/> <input type=\"radio\" name=\"typ\" value=\"dvd\" /> DVD <input type=\"radio\" name=\"typ\" value=\"cdaudio\"/> Cd audio<br/> <br/> Nom artiste : Uniquement si CD audio<br/> <input type=\"text\" name=\"artiste\" value=\"$artiste\"/><br/> Nom acteur: Uniquement si DVD<br/> <input type=\"text\" name=\"acteur\" value=\"$acteur\"/><br/> Nom actrice: Uniquement si DVD<br/> <input type=\"text\" name=\"actrice\" value=\"$actrice\"/><br/> <input type=\"submit\"/></form> "; break;}?> Page 46 Laurent Lallias Greco Php niv2 Classe et connexion à une bdd Créons la bdd mabase et la table suivante : CREATE TABLE `articles` ( `id` TINYINT NOT NULL AUTO_INCREMENT , `titre` VARCHAR( 255 ) NOT NULL , `contenu` VARCHAR( 255 ) NOT NULL , `auteur` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `id` ) ); Fichier global.inc.php <?php $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "mabase"; $table = "articles"; $connexion = @mysql_connect($db_host, $db_user, $db_pass) or die ("Erreur de connexion"); $db = mysql_select_db($db_name, $connexion) or die("Erreur de connexion"); Class article { var $id; // En php5 public à la place de var var $titre; // En php5 public à la place de var var $contenu; // En php5 public à la place de var var $auteur; // En php5 public à la place de var // en php5 function __construct() function article() // en php4 { $this->id=-1; // on initialise id à -1 si l'insertion fonctionne id sera modifié } function insert_article() { global $table; $sql = "INSERT INTO $table (titre, contenu, auteur) "; $sql .= "VALUES ('$this->titre', '$this->contenu', '$this->auteur');"; if (mysql_query($sql)) { /* mysql_insert_id() retourne l'identifiant */ /* AUTO_INCREMENTE par la dernière requête. */ Page 47 Laurent Lallias Greco Php niv2 $this->id = mysql_insert_id(); } } function lire_article($id) { global $table; $sql = "SELECT id, titre, contenu, auteur "; $sql .= "FROM $table "; $sql .= "WHERE id = '$id'"; $rsql = mysql_query($sql); if (mysql_num_rows($rsql) != 0) { /*mysql_result retourne les infos de la 1° ligne du tableau de réponses*/ /*la première ligne est numérotée 0 */ $this->id = mysql_result($rsql, 0, "id"); $this->titre = mysql_result($rsql, 0, "titre"); $this->contenu = mysql_result($rsql, 0, "contenu"); $this->auteur = mysql_result($rsql, 0, "auteur"); } } } ?> Fichier affiche.php <?php include ("global.inc.php"); $monArticle = new article(); $monArticle->lire_article($_POST["id"]); echo "Titre : ".$monArticle->titre."<br/>"; echo "Contenu : ".$monArticle->contenu."<br/>"; echo "Auteur : ".$monArticle->auteur."<br/>"; ?> Fichie insert.php <?php include ("global.inc.php"); $newarticle = new article(); $newarticle->titre = $_POST["titre"]; Page 48 Laurent Lallias Greco Php niv2 $newarticle->contenu = $_POST["contenu"]; $newarticle->auteur = $_POST["auteur"]; $newarticle->insert_article(); if ($newarticle->id <> -1) { echo "Le nouvel article a bien été créé. "; } else { echo "Un problème est survenu lors de la création de l'article. "; } echo "; ?> Fichier index.htm <html> <body> <form name="form1" method="post" action="insert.php"> <h2 align="center">Fiche à remplir </h2> <table width="400" border="0" align="center"> <tr> <td width="50%"><div align="right">Titre de l'ouvrage</div></td> <td width="50%"><input name="titre" type="text" ></td> </tr> <tr> <td><div align="right">Contenu</div></td> <td><input name="contenu" type="text" /></td> </tr> <tr> <td><div align="right">Auteur</div></td> <td><input name="auteur" type="text" /></td> </tr> <tr> <td><div align="right"> <input type="submit" name="Submit" value="Envoyer"/> </div></td> <td><input type="reset" value="Réinitialiser"/></td> </tr> </table> </form> </body> </html> Page 49 Laurent Lallias Greco Php niv2 Fichier affiche.htm <html> <body> <form name="form1" method="post" action="affiche.php"> <h2 align="center">Fiche à chercher </h2> <table width="400" border="0" align="center"> <tr> <td width="50%"><div align="right">Numéro Id </div></td> <td width="50%"><input name="id" type="text"/></td> </tr> <tr> <td><div align="right"> <input type="submit" value="Envoyer"/> </div></td> <td><input type="reset" value="Réinitialiser"/></td> </tr> </table> </form> </body> </html> Page 50 Laurent Lallias Greco Php niv2 Linéariser un objet - Sérialisation d'un objet Linéariser un objet c'est le transformer en une chaîne de caractères. Celle-ci peut alors être stockée, comme n'importe quelle autre chaîne de caractères, dans un fichier ou transmise comme une variable à une autre page. L'objet initial est récupéré intact en soumettant cette chaîne à la fonction de dé sérialisation (délinéarisation). Pour cela on dispose de deux fonctions : $chaine = serialise ($objet); $objet = unserialise ($chaine); La fonction serialize() permet de stocker dans une variable l'objet traité puis de le "récupérer" grâce à une autre fonction unserialize(). La fonction serialise ne sauvegarde pas les fonctions membres d'un objet. Ainsi, lors de l'appel à la fonction unserialise, la classe correspondante doit être déclarée. On voit ici l'intérêt de mettre les classes dans des fichiers séparés. get_class() - Retourne la classe d'un objet string get_class ( object obj ) get_class retourne la classe de l'objet obj . get_class retourne FALSE si obj n'est pas un objet. urlencode() - Encode une chaîne en URL string urlencode ( string str ) urlencode retourne une chaîne dont les caractères non alpha-numériques (hormis -_. ) sont remplacés par des séquences commençant par un caractère pourcentage ( % ), suivi de deux chiffres hexadécimaux. Les espaces sont remplacés par des signes plus ( + ). Ce codage est celui qui est utilisé pour poster des informations dans les formulaires HTML. urlencode est pratique pour transmettre des informations via une URL. Utilisation de variables d'URL Fichier index.php dans le dossier serialize (les fichiers cdrom.class.php cdaudio.class.php compactdisc.class.php sont inchangés). Dans cet exemple nous allons simplement passer la chaine de caractères par l'URL à un fichier nommé affiche.php les informations concernant l'objet créé. On commence par remplir le formulaire : Après avoir soumis le formulaire on obtient : Page 51 Laurent Lallias Greco Php niv2 Remarque : Nom de la classe Objet Après avoir cliqué sur le lien Afficher la suite, on obtient : Le fichier index.php <?php include("compactdisc.class.php"); include("cdaudio.class.php"); include("dvd.class.php"); if(!empty($_POST["titre"])){$titre=$_POST["titre"];}else { $titre="No titre";} if(!empty($_POST["datacha"])){$datacha=$_POST["datacha"];}else { $datacha="No date";} if(!empty($_POST["genre"])){$genre=$_POST["genre"];}else { $genre="No genre";} if(isset($_POST["typ"])){$typ=$_POST["typ"];}else { $typ="autre";} switch ($typ){ case "cdaudio" : $cd =new cdaudio($_POST["titre"],$_POST["datacha"],$_POST["genre"]); $cdserial=urlencode(serialize($cd)); /* on serialize l'objet cd */ echo "Voici les paramètres passés en arguments<br/>".serialize($cd); echo "<br/><a href=\"affiche.php?var=$cdserial\">Afficher la suite</a>"; break; case "dvd" : $cd =new dvd($_POST["titre"],$_POST["datacha"],$_POST["genre"]); $cdserial=urlencode(serialize($cd)); /* on serialize l'objet cd */ echo "Voici les paramètres passés en arguments<br/>".serialize($cd); echo "<br/><a href=\"affiche.php?var=$cdserial\">Afficher la suite</a>"; break; default : echo" <form method=\"post\" action=\"index.php\"> Titre du cd :<br/> <input type=\"text\" name=\"titre\" value=\"$titre\"/><br/> Date d'achat : <br/> <input type=\"text\" name=\"datacha\" value=\"$datacha\"/><br/> Genre musical ou Catégorie logicielle : <br/> <input type=\"text\" name=\"genre\" value=\"$genre\"/><br/> Type de CD<br/> <input type=\"radio\" name=\"typ\" value=\"dvd\"/> DVD <input type=\"radio\" name=\"typ\" value=\"cdaudio\"/> Cd audio<br/> <br/> <input type=\"submit\"/> Page 52 Laurent Lallias Greco Php niv2 "; break; }?> </body> </html> fichier affiche.php <?php include("compactdisc.class.php"); include("cdaudio.class.php"); include("cdrom.class.php"); $cdserialize = unserialize ($_GET["var"]); echo "Titre du cd : ".$cdserialize->titrecd."<br/>"; echo "Date d'achat du cd : ".$cdserialize->date."<br/>"; /* on teste de quelle classe est l'objet : l'objet est-il de classe dvd ? */ if (get_class ($cdserialize)=="dvd") echo "Catégorie du film : ".$cdserialize->categorie."<br/>"; /* on teste de quelle classe est l'objet : l'objet est-il de classe cdaudio ? */ if (get_class ($cdserialize)=="cdaudio") echo "Genre musical : ".$cdserialize->genremusical. "<br/>"; ?> Utilisation des variables de session Fichier index.php dans le dossier serialize2 (les fichiers cdrom.class.php cdaudio.class.php compactdisc.class.php sont inchangés). Dans cet exemple nous allons simplement passer (par variable de session) à un fichier nommé affiche.php les informations concernant l'objet créé. Fichier index.php <?php session_start(); include("compactdisc.class.php"); include("cdaudio.class.php"); include("dvd.class.php"); if(!empty($_POST["titre"])){$titre=$_POST["titre"];}else { $titre="No titre";} if(!empty($_POST["datacha"])){$datacha=$_POST["datacha"];}else { $datacha="No date";} if(!empty($_POST["genre"])){$genre=$_POST["genre"];}else { $genre="No genre";} if(isset($_POST["typ"])){$typ=$_POST["typ"];}else { $typ="autre";} switch ($typ){ case "cdaudio" : $cd =new cdaudio($_POST["titre"],$_POST["datacha"],$_POST["genre"]); /* on serialize l'objet cd */ $_SESSION["cdserial"]=serialize($cd); echo "<br/><a href=\"affiche.php\">Afficher la suite</a>"; break; Page 53 Laurent Lallias Greco Php niv2 case "dvd" : $cd =new dvd($_POST["titre"],$_POST["datacha"],$_POST["genre"]); /* on serialize l'objet cd */ $_SESSION["cdserial"]=serialize($cd); echo "<br/><a href=\"affiche.php\">Afficher la suite</a>"; break; default : echo" <form method=\"post\" action=\"index.php\"> Titre du cd :<br/> <input type=\"text\" name=\"titre\" value=\"$titre\"/><br/> Date d'achat : <br/> <input type=\"text\" name=\"datacha\" value=\"$datacha\"/><br/> Genre musical ou Catégorie du film : <br/> <input type=\"text\" name=\"genre\" value=\"$genre\"/><br/> Type de CD<br/> <input type=\"radio\" name=\"typ\" value=\"dvd\"/> dvd <input type=\"radio\" name=\"typ\" value=\"cdaudio\"/> Cd audio<br/> <br/> <input type=\"submit\"/> "; break; } ?> Fichier affiche.php dans dossier serialize2 <?php session_start(); include("compactdisc.class.php"); include("cdaudio.class.php"); include("dvd.class.php"); $cdserialize = unserialize ($_SESSION["cdserial"]); echo "Titre du cd : ".$cdserialize->titrecd."<br/>"; echo "Date d'achat du cd : ".$cdserialize->date."<br/>"; /* on teste de quelle classe est l'objet : l'objet est-il de classe dvd ? */ if (get_class ($cdserialize)=="dvd") echo "Catégorie du film : ".$cdserialize->categorie."<br/>"; /* on teste de quelle classe est l'objet : l'objet est-il de classe cdaudio ? */ if (get_class ($cdserialize)=="cdaudio") echo "Genre musical : ".$cdserialize->genremusical."<br/>"; session_destroy(); ?> Page 54 Laurent Lallias Greco Php niv2 MAROC....................................................................................................................................1 Créez l’arborescence suivante :............................................................................................................... 1 Créez une base de données maroc et une table pagetype ........................................................................ 1 Les enregistrements............................................................................................................................. 1 Créez commun.php le fichier de connexion ............................................................................................ 2 Créez index.php la page d'accueil ........................................................................................................... 2 Créez index.php la page d'accueil administration ................................................................................... 4 Créez ajout.htm le formulaire d'ajout d'enregistrement........................................................................... 5 <P>TAPEZ ICI VOTRE TITRE :<BR> .....................................................................................5 Créez ajout_page.php le script d'ajout d'enregistrement ......................................................................... 6 Quelques types MIME......................................................................................................................... 8 Le traitement d'erreurs......................................................................................................................... 8 Créez suppression.php............................................................................................................................. 9 Créez conf_suppr.php............................................................................................................................ 10 Créez modification.php le formulaire de modification ......................................................................... 10 Créez modif_page.php........................................................................................................................... 12 /******** COPIE DU FICHIER DANS LE DOSSIER ADEQUATE*****/ ..................................12 $NOMFICHIERCOPY="../".$NOMFICHIER; .........................................................................12 ELSE ......................................................................................................................................12 Protection .............................................................................................................................................. 13 Fichier .htaccess du dossier admin .................................................................................................... 13 Fichier .htaccess du dossier connexions............................................................................................ 13 Fichier .htpasswd du dossier connexions .......................................................................................... 13 Quelques remarques .......................................................................................................................... 13 LES COOKIES.......................................................................................................................14 Objectif :................................................................................................................................................ 14 Création de Cookies et php ................................................................................................................... 14 Afficher le contenu d'un cookie............................................................................................................. 16 Détruire un cookie ................................................................................................................................. 16 Savoir si le navigateur client accepte les cookies.................................................................................. 16 Code de script1.php........................................................................................................................... 17 Code de script2.php........................................................................................................................... 17 Exemple de gestion de cookie ............................................................................................................... 17 SESSIONS (PHP 4) ...............................................................................................................19 Principe.................................................................................................................................................. 19 Exemple 1 : une gestion de client (hyper simplifiée) ............................................................................ 19 Le script (ident.php) ......................................................................................................................... 20 Le script suite.php ............................................................................................................................. 21 Le script suite_et_fin.php .................................................................................................................. 21 CONNECTION /DECONNECTION ........................................................................................23 Arborescence ......................................................................................................................................... 23 Base de données et table........................................................................................................................ 23 Le fichier connect.php........................................................................................................................... 23 Le fichier index.php .............................................................................................................................. 24 Le fichier reussite.php ........................................................................................................................... 25 Header ................................................................................................................................................... 26 Syntaxe :............................................................................................................................................ 26 Important ........................................................................................................................................... 26 Page 55 Laurent Lallias Greco Php niv2 unset ...................................................................................................................................................... 26 Syntaxe :............................................................................................................................................ 26 $_SERVER["PHP_SELF"] ................................................................................................................... 26 Syntaxe :............................................................................................................................................ 26 Require_once......................................................................................................................................... 26 Syntaxe :............................................................................................................................................ 26 REDIRECTION SIMPLE ........................................................................................................27 Fichier .htaccess .................................................................................................................................... 27 Fichier index.php................................................................................................................................... 28 Fichier test.php ...................................................................................................................................... 28 REDIRECTION ET PASSAGE DE PARAMETRES ..............................................................29 Fichier .htaccess .................................................................................................................................... 29 Fichier index.php................................................................................................................................... 29 Fichier test.php ...................................................................................................................................... 29 REDIRECTION ET PASSAGE DE PARAMETRES ..............................................................30 Fichier .htaccess .................................................................................................................................... 30 Fichier index.php................................................................................................................................... 30 Fichier test.php ...................................................................................................................................... 30 REDIRECTION ET PASSAGE DE PARAMETRES ..............................................................31 Fichier .htaccess .................................................................................................................................... 31 Fichier index.php................................................................................................................................... 31 Fichier test.php ...................................................................................................................................... 31 JOINTURE .............................................................................................................................33 Base de données et tables ...................................................................................................................... 33 Fichier de connexion jointure.php du dossier Connections................................................................... 33 Insertion d'un auteur dans la table. inscription_auteur.php ................................................................... 34 Insertion d'un livre dans la table. inscription_livre.php ........................................................................ 34 Affichage avec jointure. affiche.php ..................................................................................................... 35 Recherche .............................................................................................................................................. 36 INITIATION AUX CLASSES - LA POO.................................................................................38 Classe Propriété et Méthode.................................................................................................................. 38 Déclaration de la classe ..................................................................................................................... 38 Définition de la classe - Les propriétés ............................................................................................. 38 Instanciation de classe ....................................................................................................................... 38 Vocabulaire ....................................................................................................................................... 38 Déclaration de classe - Les méthodes (fonctions membres).............................................................. 40 Le constructeur de classe....................................................................................................................... 42 Remarques ......................................................................................................................................... 43 L'héritage............................................................................................................................................... 43 Syntaxe .............................................................................................................................................. 43 Classe et connexion à une bdd .............................................................................................................. 47 Linéariser un objet - Sérialisation d'un objet......................................................................................... 51 get_class() - Retourne la classe d'un objet......................................................................................... 51 urlencode() - Encode une chaîne en URL ......................................................................................... 51 Utilisation de variables d'URL .......................................................................................................... 51 Utilisation des variables de session ................................................................................................... 53 Page 56 Laurent Lallias Greco Php niv2