le cours sur PHP/mysql (en pdf)
Transcription
le cours sur PHP/mysql (en pdf)
DEUST ISR PHP/MYSQL PHP 1)historique On doit la première version de PHP à Rasmus Lerdorf qui l'a mise au point pour ses propres besoins en 1994. Cette version était destinée à son usage personnel, d'où le nom (Personal Home Pages). Cette version n'a pas été mise à disposition du public. Vers 1995, une version qui permettait l'exécution de quelques macros fut mise à disposition (gérer un livre d'or, un compteur de hits et quelques autres choses). En 1998, grâce à la collaboration de Zeev Suraski et Andy Gutmans, fondateurs de la sociétéZend, la version 3 voit le jour. Elle s’appelle désormais PHP : "Hypertext Preprocessor". La version 4 voit le jour en 2000. 2)principe PHP est un ensemble de fonctionnalité qu'il est possible d'insérer directement dans le code d'une page HTML, comme le JavaScript, mais ce code va s'exécuter du coté serveur. Cela permet donc de cumuler les avantages du JavaScript et d'un script CGI. Mais ne vous y trompez pas, écrire un code en PHP, ne dispense en rien du fait d'avoir à écrire des JavaScript, qui ont toujours une place dans les pages HTML, notamment pour vérifier la conformité des informations saisie dans les champs d'un formulaire par un visiteur, avant de traiter lesdites informations. Le principe est relativement simple, les éléments du langage PHP se trouveront toujours entre 2 balises particulières. <? et ?> ou <?php et ?> Ses balises pourront se placer n'importe où dans le code HTML. Il est également possible d'en mettre plusieurs fois dans une page.installation PHP est un module du programme serveur Web. L'un des plus utilisés est le serveur Web apache. Voici les procédures d'installation. Dans tous les cas, il vous faudra des droits root sous Linux/Unix ou administrateur sous Windows. BERNARD D. Page 1/27 DEUST ISR PHP/MYSQL sous Linux : Sur le site Web d’apache : www.apache.org <http://www.apache.org> récupérez les sources en .tar.gz du serveur version 1.3.X. (ou sur le site ftp ftp://ftp.inria.fr/pub/Apache/httpd/apache_1.3.29.tar.gz) Il existe une version 2.X, mais par principe, il ne faut jamais utiliser la dernière version disponible d'un produit (car au moins, sur l'avant-dernière version, les bugs sont connus et généralement corrigés). Sur le site Web de PHP : www.php.net <http://www.php.net> récupérez les sources (pas les binaires!!!) en .tar.gz du module PHP4.X. (ou sur le site http://www.php.net/get/php-4.3.4.tar.gz/from/fr.php.net/mirror) Placez les 2 fichiers archive dans le répertoire /usr/src (le créer si besoin). Décompressez les archives: $ gunzip -c apache_1.3.x.tar.gz | tar xf où X est votre version de l'archive. $ cd apache_1.3.x $ ./configure $ cd .. $ $ $ $ $ gunzip -c php-4.x.y.tar.gz | tar xf cd php-4.x.y ./configure --with-mysql --with-apache=../apache_1.3.x make make install $ $ $ $ cd ../apache_1.3.x ./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a make make install $ cd ../php-4.x.y $ cp php.ini-dist /usr/local/lib/php.ini Editez le fichier /usr/local/lib/php.ini et vérifiez la valeur de register_globals (on ou off), cela influencera la façon de traiter les données d'un formulaire. Editez le fichier httpd.conf qui doit se trouver dans le répertoire conf d'apache et ajouter la ligne suivante: AddType application/x-httpd-php .php Pour lancer le serveur web allez dans le répertoire bin d'apache et tapez: $ ./apachectl start BERNARD D. Page 2/27 DEUST ISR PHP/MYSQL sous Windows : récupérez apache sur le site ftp ftp://ftp.inria.fr/pub/Apache/httpd/binaries/win32/apache_1.3.29-win32-x86-no_src.exe Double-cliquez sur apache_1.3.29-win32-x86-no_src.exe renseigner les 3 champs domain (par exemple ici.fr) servername (mettez localhost) et email de l'admin (mettez ce que vous voulez). Choisissez de préférence d'installer apache sur un répertoire simple (par exemple d:\apache). Testez le bon fonctionnement de votre serveur en lançant apache (menu démarrer/apache/apache) puis dans votre navigateur donnez comme URL http://127.0.0.1 Vous devriez voir apparaître une page d'acceuil. ATTENTION!!! si vous utilisez windows XP vous devez d'abord arrêter le service IIS, sinon vous risquez d'avoir des conflits et d'atterrir sur la page d'accueil de IIS. récupérez le module php sur le site web http://www.php.net/get/php-4.3.4-Win32.zip/from/fr.php.net/mirror Décompressez l'archive dans un répertoire simple (par exemple d:\php). Copiez les fichiers php4ts.dll et php.ini-recommended dans votre répertoire système. Win9x Me: C:\Windows\ Win2k XP : C:\Winnt\ Il est possible d'installer php en tant que module ou comme cgi, et la procédure d'installation est différente suivant votre choix. Nous installerons PHP comme module d'apache. Copiez le fichier php4apache.dll (qui se trouve dans le répertoire sapi) dans votre répertoire système. Renommez php.ini-recommended (celui qui se trouve maintenant dans votre répertoire système) en php.ini. Ouvrez-le avec un éditeur de fichiers texte. Les lignes commentées sont symbolisées dansphp.ini par le point-virgule ; Trouvez la ligne doc_root. Elle permet de dire à PHP à partir de quel endroit sur votre disque il est "habilité" à s'executer. Sauf si vous savez ce que vous faîtes, mettez pour doc_root la même chose que ce que vous avez spécifié pour le DocumentRoot d'Apache. Trouvez la ligne de l'include_path, mais trouvez la bonne, celle concernant Windows, pas Unix. Décommentez-donc la ligne et spécifiez les répertoires qui seront parcourus en priorité lors d'un include() ou d'un require(). include_path = ".;d:\PHP\pear\" BERNARD D. Page 3/27 DEUST ISR PHP/MYSQL Trouvez la ligne extension_dir et modifiez-la pour indiquer le chemin vers le répertoire extensions de PHP (qui contient... toutes les extensions de PHP, en effet.). extension_dir = "d:\PHP\extensions\" Dans le fichier httpd.conf d'apache ajoutez/modifiez les lignes suivantes: LoadModule php4_module "d:\PHP\sapi\php4apache.dll" AddModule mod_php4.c DirectoryIndex index.html index.php AddType application/x-httpd-php .php .php3 .php4 .phtml 3)fonctionnalités PHP, comme le C, le JavaScript, ou encore le shell sous Unix, permet d'avoir un certain nombre de fonctionnalités. 3.1)les variables En PHP, toutes les variables sont précédées du symbole $. Le nom de la variable peut comporter des lettres, des chiffres, ainsi que le caractère _. Il n'est pas possible d'y inclure des espaces ou des caractères qui ne sont pas alphanumériques. Comme en C, les instructions se terminent par un ; . Exemple de variables: $a; $a_nom_de_variable_plutot_long; $1234; $riendespeciale23332___555_; Une variable peut contenir aussi bien des chaînes de caractères que des nombres, des tableaux, des objets ou des booléens. Exemple : $unnombre = "coucou"; $unechaine = 5430 ; Il est possible d'avoir des variables dites "dynamiques". Exemple: $nom = "robert" ; $je_suis_trop_fort="nom"; BERNARD D. Page 4/27 DEUST ISR PHP/MYSQL si j'ecris: print $nom; print $je_suis_trop_fort; print $$je_suis_trop_fort; j'aurais: robert nom robert 3.2)Les références aux variables: Il peut être utile dans certains cas, qu'une variable soit automatiquement mise à jour en fonction d'une autre. Regardons le code suivant: $a = 43 ; $b = $a ; $a = 123 ; print $b; affichera 43 Si par contre j'écris: $a = 43 ; $b = &$a ; $a = 123 ; print $b; j'obtiendrais à l'affichage : 123 ATTENTION Le code PHP, comme le code HTML, C ou JavaScript est interprété de haut en bas. Cela implique que vous devez faire attention à bien initialiser vos variables AVANT de les traiter. 3.3)les types Par défaut, les variables en PHP ne sont pas typées (comme en JavaScript). Ainsi, il est possible d'écrire un code comme celui qui suit sans avoir pour autant des erreurs: $a="coucou"; $a=3; $a=true; Cela permet une très grande flexibilité dans les scripts, mais cette flexibilité est parfois aussi source d'erreur ou du moins d'égarement. En effet, il ne sera pas rare que dans des scripts importants, le programmeur pense qu'une variable est d'un certain type à l'endroit où il l'utilise, alors qu'en fait, elle est d'un type complètement différent, voire même incompatible. BERNARD D. Page 5/27 DEUST ISR PHP/MYSQL Exemple: $a = 4; ... $a = "salut" ; ... // ici le programmeur pense que $a est de type entier $a = $a * 5 ; ce qui ne donnera pas le résultat espéré. En réalité, en PHP il existe 6 types de donnés : • • • • • • entier double (réel) chaîne booléen tableau objet Il est possible de tester le type d'une variable grâce à la fonction gettype(). Exemple : $a = 43 ; print gettype($a); $a="toto"; print gettype($a); affichera: integer string Il existe 2 façons pour modifier le type d'une variable. Soit avec la fonction settype(), soit avec un opérateur de cast. Exemple : $a = 3.14 ; settype($a,integer); → $a est devenu un entier. sa valeur sera donc 3. La même chose est possible en écrivant : $a = 3.14 ; $a = (integer) $a ; BERNARD D. Page 6/27 DEUST ISR PHP/MYSQL 3.4)les opérateurs 3.4.1)opérateur d'affectation comme en C : = exemple : $mavariable = "salut" ; 3.4.2)opérateur arithmétique comme en C : +, -, *, /, % exemple: $mavariable = 3 + 5 * 6 / 2 + 5 % 2; 3.4.3)opérateur de concaténation comme en JavaScript : . Exemple : $mavariable = "bonjour" . "le monde"; -> bonjour le monde 3.4.4)opérateur d'affectation supplémentaire comme en C : +=, -=, *=, /=, %=, .= exemples: $x = 3; $y = "coucou"; $x += 5 -> $x=8 $y .=" le monde"; -> $y="coucou le monde"; 3.4.5)opérateur de comparaison: comme en C : ==, !=, ===, >, <, >=, <= exemple: if ($a == $b) // test si $a possède la même valeur que $b if ($a === $b) // test si $a possède la même valeur que $b ET est de même type 3.4.6)opérateur logique: comme en C : &&, ||, !, or, xor, and exemple: if ($a==5 && $b<3) // test si $a possède la valeur 5 et si $b est plus petit que 3 3.4.7)Incrémentation, décrémentation automatique: comme en C : ++, -exemple : $x=1; $x++; -> $x = 2 BERNARD D. Page 7/27 DEUST ISR PHP/MYSQL 3.5)les constantes Il est parfois préférable, plutôt que d'utiliser des variables, d'utiliser des "variables" dont la valeur ne doit pas changer, bref, des constantes. Cela est faisable grâce à la fonction, define(). Exemple : define("PI", 3.14 ); Pour accéder à la constante, il n'est pas nécessaire d'avoir recours au symbole $. Ainsi pour afficher ma constante je peux écrire : print "la valeur de pi est : ".PI; 3.6)les conditions un branchement conditionnel se fait, comme en JavaScript, grâce à l'instruction if, avec éventuellement un else. if (condition) { ... } else { ... } Il est également possible d'utiliser un switch. switch (expression){ case resultat1 : ... break; ..... case resultatn : ... break; default : ... } Pour des questions pratiques, il peut être utile d'utiliser l'opérateur ternaire '?' . BERNARD D. Page 8/27 DEUST ISR PHP/MYSQL Exemple : ($a == $b)?$a++:$b++; si $a est égale à $b alors on incrémente $a sinon, on incrémente $b 3.7)les boucles Il existe 3 types de boucle en PHP : tant que la condition est vraie, faire une suite d'instructions. while (condition){ ... } Faire une suite d'instruction tant que la condition est vraie. do{ ... }while(condition) Lorsque l'on sait à l'avance combien de "tours de boucle " on doit faire, il faut utiliser une boucle pour. ATTENTION, la variable affectée d'une boucle pour est incrémentée ou décrémentée automatiquement jusqu'à ce que la condition de la boucle ne soit plus vraie. for (affectation; condition ; incrementation/decrementation){ ... } Il est possible de sortir d'une boucle avant la condition de fin à l'aide de l'instruction break. Il est également possible de sauter une itération grâce à l'instruction continue. Exemple : for ($i=0;$i<10;$i++){ $a = $i * 10; if ($a > 70) break; if ($a < 30) continue ; print "i = $i a = $a"; } affichera : BERNARD D. Page 9/27 DEUST ISR PHP/MYSQL 3.8)les tableaux Il existe plusieurs façons pour créer un tableau. La plus simple : $tab[] = "un" ; $tab[] = "deux" ; $tab[] = "trois" ; donne un tableau dont les indices vont de 0 à 2 et dont les valeurs sont respectivement "un", "deux", et "trois". Une autre façon de procéder est d'utiliser la fonction array(): $tab = array( "un", "deux", "trois") ; Il est possible de connaître le nombre d'éléments d'un tableau grâce à la fonction count(). count($tab) -> 3 Pour parcourir un tableau il est toujours possible d'utiliser une boucle for, mais une instructionforeach est plus convenable en PHP. Exemple : foreach ($tab as $valeur){ print $valeur; } Affichera : un deux trois fusionner des tableaux est très simple en PHP, grâce à la fonction array_merge. Exemple : $tab2 = array("quatre", "cinq"); $tabfusion = array_merge($tab, $tab2); foreach ($tabfusion as $valeur){ print $valeur; } Affichera : un deux trois quatre cinq BERNARD D. Page 10/27 DEUST ISR PHP/MYSQL De même, ajouter des valeurs à un tableau se fera à l'aide de la fonctionarray_push() . exemple : $nombredelements = array_push($tab, "quatre", "cinq"); foreach ($tab as $valeur){ print $valeur; } print "il y a $nombredelements elements dans le tableau"; Affichera : un deux trois quatre cinq il y a 5 elements dans le tableau La fonction array_slice va nous permettre d'extraire un bout de tableau d'un tableau. Exemple : $tab2 = array_slice($tab,2,2) ; • le premier argument de array_slice est le tableau duquel on souhaite extraire des données (le tableau ne sera pas modifié!!). • Le second argument de array_slice est l'indice à partir duquel on souhaite commencer à extraire les données. • Le dernier argument de array_slice est le nombre de données que l'on souhaite extraire (s'il n'est pas renseigné, on va jusqu'à la fin du tableau). $tab2 est le nouveau tableau créé avec les données extraites de $tab. ici $tab2 sera constitué ainsi : $tab2[0] -> "trois" $tab2[1] -> "quatre" 3.9)les tableaux associatifs Un tableau associatif est un tableau indexé par des chaînes de caractères plutôt que des chiffres. Exemple : $user[nom]="bidochon" ; $user[prenom]="robert "; $user["deuxieme prenom"]="gaston" ; $user[age]=54 ; On remarque que lorsque l'index est composé de caractères spéciaux comme un espace ou un caractère accentué, l'index est placé entre guillemets. BERNARD D. Page 11/27 DEUST ISR PHP/MYSQL Une autre façon de remplir ce tableau est : $user = array( nom => "bidochon", prenom => "robert", "deuxieme prenom" => "gaston", age =>54); pour afficher un tableau associatif, il faut utiliser la syntaxe suivante : foreach($user as $clef => $valeur){ echo "nom de l'index :"; echo $clef; echo "valeur se trouvant à l'index :"; echo $valeur; } Ce qui affichera : nom de l'index : nom valeur se trouvant à l'index : bidochon nom de l'index : prenom valeur se trouvant à l'index : robert nom de l'index : deuxieme prenom valeur se trouvant à l'index : gaston nom de l'index : age valeur se trouvant à l'index : 54 3.10)les tableaux multidimensionnels Un tableau multidimensionnel est un tableau qui comporte d'autres tableaux. Un exemple de déclaration d'un tableau multidimensionnel peut se faire de la façon suivante: $multitab = array( array("l0c0","l0c1","l0c2"), array("l1c0","l1c1","l1c2"), array ("l2c0","l2c1","l2c2") ); soit à l'affichage : echo $multitab[0][0]; -> l0c0 echo $multitab[2][2]; -> l2c2 echo $multitab[1][2]; -> l1c2 3.11)les fonctions Comme en C ou en JavaScript, il est possible d'utiliser et de définir des fonctions. La syntaxe est la suivante : function nom_de_la_fonction($parametre1, $parametre2, …,$parametreN){ // code de la fonction return une_valeur; // une_valeur peu être une variable. le return n'est pas obligatoire. } À l'inverse du C, il n'est pas nécessaire de définir le type de ce qui sera retourné par la fonction. Idem pour les paramètres de celle-ci. En revanche, toute variable définie dans la fonction restera locale à cette dernière. BERNARD D. Page 12/27 DEUST ISR PHP/MYSQL Exemple : function le_sens_de_la_vie(){ $reponse="celui qu'on lui donne"; } echo "quel est le sens de la vie ?" le_sens_de_la_vie(); echo "la reponse est :".$reponse; Affichera : quel est le sens de la vie ? la reponse est : Idem, avec une variable définie à l'extérieur de la fonction. $a = 5 ; function doubleval(){ $a = $a *2 ; echo "la valeur de a dans la fonction est : $a"; } echo "la valeur de a avant l'appel a la fonction est : $a"; doubleval(); echo "la valeur de a après l'appel a la fonction est : $a"; Affichera : la valeur de a avant l'appel a la fonction est : 5 la valeur de a dans la fonction est : 0 la valeur de a après l'appel a la fonction est : 5 Si l'on souhaite modifier une variable définie à l'extérieur d'une fonction il faut utiliser l'instructionglobal. $a = 5 ; function doubleval(){ global $a; $a = $a *2 ; echo "la valeur de a dans la fonction est : $a"; } echo "la valeur de a avant l'appel a la fonction est : $a"; doubleval(); echo "la valeur de a après l'appel a la fonction est : $a"; Affichera : la valeur de a avant l'appel a la fonction est : 5 la valeur de a dans la fonction est : 10 la valeur de a après l'appel a la fonction est : 10 BERNARD D. Page 13/27 DEUST ISR PHP/MYSQL 4)les formulaires PHP est surtout pratique pour la facilité de traitement des informations en provenance de formulaires. 4.1)les variables d'environnement Comme avec les CGI, il est possible d'avoir accès à un certain nombre de variables d'environnement. $HTTP_USER_AGENT nom du navigateur client $REMOTE_ADDR adresse IP du client $REQUEST_METHOD methode utilisée par la page formulaire dont nous recevons les information (get ou post). $QUERY_STRING données envoyées par une methode get $REQUEST_URI adresse complete de la requête $HTTP_REFERER adresse de la page à partir de laquelle la requête a été effectuée Il existe aussi une variable nommée $PHP_SELF qui donne le chemin du script en cours d'exécution. Cette variable est très utile lorsque l'on souhaite créer un formulaire qui se rappel lui-même. il suffit de donner $PHP_SELF comme argument de ACTION du formulaire. 4.2)méthode GET ou méthode POST Suivant la configuration que vous avez, vous ne pourrez pas récupérer les données en provenance d'un formulaire de la même façon, si vous avez utilisé une méthode GET ou une méthode POST pour l'envois de vos données. Si register_globals est à ON dans votre fichier php.ini , il vous suffira d'utiliser le nom de votre champ de formulaire précédé d'un $ pour pouvoir l'utiliser. Sinon, pour une method GET, il vous faudra utiliser la syntaxe suivante: $nomdevariable = $_GET["nomduchampdemonformulaire"]; pour une méthode POST: $nomdevariable = $_POST["nomduchampdemonformulaire"]; 4.3)la gestion des éléments d'un formulaire Il est possible de lister l'ensemble des champs et valeur en provenance d'un formaire grâce au script suivant: <html> <body> <?php $parametres = ( isset( $HTTP_POST_VARS) ) ? $HTTP_POST_VARS : $HTTP_GET_VARS ; foreach( $parametres as $nomchamp => $valeurchamp ) { echo "valeur de $nomchamp : $valeurchamp <br>"; } ?> </body> </html> BERNARD D. Page 14/27 DEUST ISR PHP/MYSQL voici un exemple de récupération des données en provenance d'un formulaire incluant un élément select multiple: <html> <body> <form action="listemul.php" method="post"> <select name="choix[ ]" multiple> <option> CD <option> CDR <option> DVDR <option> CDRW </select> <input type=submit value=go> </form> </body> </html> listemul.php <html> <body> <?php $i=1; foreach( $choix as $valeurchoix ) { echo "choix $i : $valeurchoix <br>"; $i++; } ?> </body> </html> Vous pouvez faire la même chose avec de checkbox: <html> <body> <form action="listemul.php" method="post"> <input type=checkbox name="checkchoix[ ]" value="cd"> CD<br> <input type=checkbox name="checkchoix[ ]" value="cdr"> CDR<br> <input type=checkbox name="checkchoix[ ]" value="dvdr"> DVDR<br> <input type=checkbox name="checkchoix[ ]" value="cdrw"> CDRW<br> <input type=submit value=go> </form> </body> </html> listemul.php <html> <body> <?php $i=1; foreach( $checkchoix as $valeurchoix ) { echo "choix $i : $valeurchoix <br>"; $i++; } ?> </body> </html> Formulaire de téléchargement de fichier: <html> <body> <form enctype="multipart/form-data" action="gestionupload.php" metho="post"> <input type="file" name="fupload"> <input type="submit" value="telechargement"> </form> </body> </html> BERNARD D. Page 15/27 DEUST ISR PHP/MYSQL Pour le téléchargement de fichier, il existe des variables globales: ELEMENT CONTIENT $HTTP_POST_FILES[fupload][name] Nom du fichier EXEMPLE Toto.png $HTTP_POST_FILES[fupload][size] Taille du fichier 368 $HTTP_POST_FILES[fupload][type] Type du fichier Image/png gestionupload.php <?php $repertoire_destination="/lesuploads/"; // répertoire ou sera stoké le fichier if ( isset(fupload)){ $repertoire_destination .=$HTTP_POST_FILES[fupload][name]; copy( $fupload, $repertoire_destination) or die("Pb copy fichier"); } ?> 4.4)les sessions Une façon de pouvoir conserver une variable d'une page à une autre est d'utiliser des variables de sessions. Chaque visiteur accédant à votre page web se voit assigné un identifiant unique, appelé 'identifiant de session'. Il peut être stocké soit dans un cookie, soit propagé dans l'URL. Le support des sessions vous permet d'enregistrer un nombre illimité de variables qui doivent être préservées entre les requêtes. Lorsqu'un visiteur accède à votre site, PHP va vérifier automatiquement (si session.auto_start est activé1) ou sur demande (explicitement avec session_start() ou implicitement avec session_register()) si il existe une session du même nom. Si c'est le cas, l'environnement précédemment sauvé sera recréé. Exemple 1. Enregistrer une variable avec $_SESSION. <?php session_start(); // Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien if (!isset($_SESSION['compteur'])) { $_SESSION['compteur'] = 0; } else { $_SESSION['compteur']++; } ?> Exemple 2. Retirer une variable de session avec $_SESSION et register_globals inactif. <?php session_start(); // Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien unset($_SESSION['compteur']); ?> Exemple 3. Retirer une variable de session avec $_SESSION et register_globals activé, après l'avoir enregistré avec $_SESSION. <?php session_start(); // Avec PHP 4.3 et plus récent, vous pouvez simplement utiliser l'exemple précédent session_unregister('compteur'); ?> BERNARD D. Page 16/27 DEUST ISR PHP/MYSQL Exemple 4. Enregistrer une variable avec register_globals activé <?php ?> if (!session_is_registered('compteur')) { session_register("compteur"); $compteur = 0; } else { $compteur++; } 4.5)les cookies Une façon de pouvoir conserver des informations entre 2 connections à un site est de placer un petit fichier sur la machine cliente. C'est le principe des cookies. Il est possible de créer un cookie grâce à la fonction setcookie. bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]]) setcookie() définit un cookie qui sera envoyé avec le reste des en-têtes. Les cookies doivent passer avant tout autre en-tête (c'est une restriction des cookies, pas de PHP). Cela vous impose d'appeler cette fonction avant toute balise <HTML> ou <HEAD>. Tous les arguments sauf name (nom) sont optionnels. Si seul le nom est présent, le cookie portant ce nom sera supprimé du navigateur de l'internaute. Vous pouvez aussi utiliser une chaîne vide comme valeur, pour ignorer un argument. Le paramètre expire est un timestamp UNIX, du même genre que celui retourné par time() ou mktime(). Le paramètre secure indique que le cookie doit être uniquement transmis à travers une connexion HTTPS sécurisée. Une fois que le cookie a été placé, il est accessible dans les variables globales $_COOKIE ou bien $HTTP_COOKIE_VARS arrays. Notez que les autoglobales telles que $_COOKIE sont disponibles en PHP depuis la version 4.1.0. $HTTP_COOKIE_VARS existe depuis PHP 3. Les valeurs de cookies existent aussi dans la variable $_REQUEST. Erreurs communes : • Les cookies ne seront accessibles qu'au chargement de la prochaine page, ou au rechargement de la page courante. • Les cookies doivent être effacés avec les mêmes paramètres que ceux utilisés lors de leur création. Exemple 1. Exemples avec setcookie() <?php setcookie("TestCookie","Valeur de test"); setcookie("TestCookie",$value,time()+3600); /* expire dans une heure */ setcookie("TestCookie",$value,time()+3600,"/~rasmus/",".utoronto.ca",1); ?> Notez que la partie "valeur" du cookie sera automatiquement encodée URL lorsque vous envoyez le cookie et, lorsque vous le recevez, il sera automatiquement décodé, et affecté à la variable du même nom que le cookie. Pour voir le résultat, essayez les scripts suivants : Exemple 2. Affectation des valeurs de cookie <?php // Afficher un cookie echo $_COOKIE["TestCookie"]; echo $HTTP_COOKIE_VARS["TestCookie"]; // Une autre méthode pour afficher tous les cookies print_r($_COOKIE); ?> Lorsque vous effacez un cookie, vous devriez toujours vous assurer que sa date d'expiration est déjà passée, pour déclencher le mécanisme de votre navigateur. Voici comment procéder : BERNARD D. Page 17/27 DEUST ISR PHP/MYSQL Exemple 3. Exemple d'effacement de cookies avec setcookie() <?php // utilisation de la date moins une heure setcookie ("TestCookie", "", time() - 3600); setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".exemple.com", 1); ?> Vous pouvez aussi utiliser les cookies avec des tableaux, en utilisant la notation des tableaux. Cela a pour effet de créer autant de cookies que votre tableau a d'éléments, mais lorsque les cookies seront reçus par PHP, les valeurs seront placées dans un tableau : Exemple 4. Utilisation des tableaux avec setcookie() <?php setcookie( "cookie[three]", "cookiethree" ); setcookie( "cookie[two]", "cookietwo" ); setcookie( "cookie[one]", "cookieone" ); if ( isset( $cookie ) ) { while( list( $name, $value ) = each( $cookie ) ) { echo "$name == $value<br>\n"; } } ?> Note : Pour plus d'informations sur les cookies, voyez les spécifications de cookies de Netscape à http://www.netscape.com/newsref/std/cookie_spec.html et RFC 2965. Vous pourrez noter que le paramètre expire prend un timestamp unique, et non pas la date au format Jour, JJ-Mois-AAAA HH:MM:SS GMT, car PHP fait la conversion en interne. Microsoft Internet Explorer 4 utilisé avec le Service Pack 1 ne gère pas bien les cookies qui possèdent un paramètrepath. Netscape Communicator 4.05 et Microsoft Internet Explorer 3.x semblent ne pas gérer correctement les cookies lorsquepath et time ne sont pas fournis. 5)les fichiers Pour alléger les scripts PHP, il est possible de placer les scripts contenant des fonctions, par exemple, dans un fichier, que l'on va inclure dans un autre fichier php. Cela se fait grâce à la fonction include(); Exemple: desfonctions.php <?php function un(){ echo "un<br>"; } function deux(){ echo "deux<br>"; } function trois(){ echo "trois<br>"; } ?> monscriptutilisateur.php <?php include("desfonctions.php"); echo "<html><body>"; un(); deux(); trois(); echo "</body></html>"; ?> BERNARD D. Page 18/27 DEUST ISR PHP/MYSQL 6)les images dynamiques En php, il est possible de créer des image de façon dynamique. Exemple: img.php <?php header("Content-type: image/png"); $image = imagecreate( 200, 200); imagepng($image); ?> dynimage.html <html> <body> <img src="img.php"> </body> </html> Cela va afficher une image vide de 200x200. Pour créer une image avec un fond noir, et une phrase ecrite en bleu on peut écrire le code suivant: <?php header ("Content-type: image/png"); $im = @imagecreate (50, 100) or die ("Impossible d'initialiser la librairie GD"); $background_color = imagecolorallocate ($im, 0, 0, 0); $text_color = imagecolorallocate ($im, 0, 0, 255); imagestring ($im, 1, 5, 5, "Juste du texte bleu", $text_color); imagepng ($im); ?> Il est possible de faire des rectangles, des arcs, des cercles, des polygones, etc. Faite une recherche sur www.php.net avec commen mot clef imagecreate. 7)PHP/apache vs ASP/IIS le "couple" apache/PHP n'est pas le seul utilisé pour le développement de site WEB dynamique. Il existe un autre "couple" célèbre, il s'agit de IIS/ASP. IIS : Internal Internet Server ASP : Active Server Page Ses deux produits sont développés et diffusés par Microsoft. Si au début de PHP, il n'y avait aucune comparaison possible entre les 2 produits, ce n'est aujourd'hui, plus le cas. En effet, chacun offre à présent à peu de choses près les mêmes fonctionnalités. Même si Microsoft propose un environnement de développement plus élaboré grâce, entre autres, à son visual interdev De plus en plus de sociétés de développement WEB se tournent vers la solution alternative apache/PHP. La principale raison de cette tendance est, évidemment, financière, car le coût des licences microsoft n'est pas gratuit (licence windows server, licence outils de développement, licence IIS, licence SQL server, etc.). BERNARD D. Page 19/27 DEUST ISR PHP/MYSQL 8)Conclusion Pour résumer, le langage PHP est une bonne alternative aux scripts CGI, tant qu'il n'est pas question d'accéder à des périphériques de la machine serveur(imprimante, caméra, etc.). Tous les jours, la communauté internet met à disposition des fonctions, ou des modules permettant de simplifier encore davantage certaines tâches. Si l'on s'aperçoit que le langage par lui-même n'est pas très compliqué à utiliser, il s'avère que la difficulté réside désormais plus dans l'architecture et l'agencement des pages d'un site WEB, plutôt que dans la complexité du langage. Une fois que l'on sait ce que nous voulons dire, et sous quelle forme, le développement technique d'un site WEB est bien plus simple. Le développement d'un site WEB n'est pas que l'affaire de technicien. Pour réaliser un bon site WEB, il faut des infographistes, des commerciaux, des chefs de projet, des informaticiens, et surtout, des personnes qui ont des choses à faire passer (information, produit -> site marchand, etc.) sur le WEB. Le langage PHP est toujours en évolution et déjà une version 5 pointe le bout de son nez. Mais le langage de programmation dynamique serait bien moins attrayant s'il ne permettait pas d'utiliser une source considérable d'information que sont les bases de données. BERNARD D. Page 20/27 DEUST ISR PHP/MYSQL MYSQL 9)définition d'une base de données Une base de données est un ensemble de fichiers partagés par des utilisateurs et exploité par des programmes. Une base de données contient des informations représentant des objets du monde extérieur ainsi que des relations entre ces objets. Exemple: • Les informations contenues représentent une réalité extérieure au système. Listes d’adresses, Pièces, Lieu de stockage… • Plusieurs utilisateurs peuvent partager ces fichiers avec des préoccupations différentes. Statistiques, Gestion de stock, Prise de commandes… • Les applications ne sont pas indépendantes. Elles appartiennent en général à la même entité (entreprise). 10)structure d'une base de données Utilisateurs Programme d’application A Programme d’application B Programme d’application C Niveau Externe Programmeurs d’applications Niveau conceptuel Modèle de données principal Administrateurs Niveau physique Archivage des données 10.1)Fonctions principales: 10.1.1)Description de la base La description de la base (modèle de données) est réalisée par un langage de définition de données LDD. 10.1.2)Manipulation de la base Les manipulations de la base (accès, mise à jour) s’effectue à l’aide d’un langage de manipulation de donnée LDM. L’utilisation courante de la base se fait par intermédiaire du LDM soit sous forme de requêtes soit par un ensemble de requêtes regroupé dans un sous programme. BERNARD D. Page 21/27 DEUST ISR PHP/MYSQL 10.1.3)Protection d’accès Un langage de contrôle de données LDC permet de définir des permissions au niveau des utilisateurs de la base de données. 10.2)Objectifs • • • Utilisation d’une approche commune pour accéder aux données Éviter la redondance d’informations Fiabilité • Cohérence de l’information • Confidentialité • Ne pas perdre d’informations 10.3)Composantes de la base: • • Des Tables Des champs Des clés Des relations Les données sont placées dans des tables. Les tables sont composées de : • Colonnes (champs) spécifiant les attributs. • Lignes (rangées) spécifiant les valeurs de ces attributs. Exemple: CLIENTS NumClient Nom Ville 1 bernard Le mans 2 durand paris 3 bidochon evaille Une clé détermine une rangée d’une table de manière unique Une clé peut être un simple champ ou plusieurs champs : • Numéro de client (table clients) • Numéro INSEE • Numéro de client + date commande (table commandes) 10.4)Forme canonique d'une base: CLIENTS(NumClient, Nom, Ville) les colonnes de la clé primaire sont soulignées. COMMANDES({NumClient},{NumPiece},Quantite) Les clés étrangères sont entre accolades. Les clés étrangères sont les colonnes du tableau qui sont membres de la clé primaire dans un autre tableau. COMMANDES {NumClient} {Numpieces} Quantite 1 2 3 2 1 1 2 2 5 BERNARD D. Page 22/27 DEUST ISR PHP/MYSQL 10.5)Les relations: CLIENTS COMMANDES NumClient Nom Ville NumClient Numpieces Quantite 1 bernard Le mans 1 2 3 2 durand paris 2 1 1 3 bidochon evaille 2 2 5 PIECES Numpieces Description Prix 1 Un crayon 1 2 Un dvdR 10 3 4 Un clavier USB 11 Ecran plat 150 IL y à des relations entre les tables. Grâce à la table COMMANDE, il est possible de savoir que Monsieur durand a commander 5 DVDR à 10 €. 11)le langage SQL Afin de pouvoir manipuler les bases de données facilement, on utilise un langage de requêtes nomméSQL(Structured Query Language). 11.1)Les types de données: Type de données: CHAR(n) • chaîne de caractères de longueur fixe n • longueur par défaut 1 • longueur minimum 1,longueur maximum 255 • constantes: ‘DUPONT’ ‘Dupont, Marc’ ‘Titre “Coucou”’ ‘1234’ ‘NULL’ Type de données: VARCHAR(n) • • • • • +/- équivalent a VARCHAR2(n) chaîne de caractères de longueur variable et de taille maximum n uniquement sur Oracle/MySQL sinon CHAR VARYING(n) valeur de n maximum = 2000 caractères sur Oracle constantes identiques a CHAR(n) BERNARD D. Page 23/27 DEUST ISR PHP/MYSQL Type de données: NUMBER(p) • • • En MySQL NUMERIC(p,0) nombre entier positif, négatif ou nul de p chiffres constantes: 0 +0 +1234 -123123 1234 Type de données: NUMBER(p,s) • • nombre rationnel en virgule fixe de p chiffres au total dont s après la virgule constantes de type NUMBER(4,1): 0,0 123,5 -123,7 -3,0 • • d'après la configuration, il faut utiliser ‘.’ ou ‘,’ ! certains SQL dont MySQL utilisent NUMERIC(p,s) Type de données: LONG • • chaîne de caractères de taille variable jusqu'à 2 Gbytes limité à un seul attribut par table Type de données: DATE • • date (siècle, année, mois, jour, heure, minute, seconde) constantes (format OSI aaaa-mm-jj) ‘2000-09-06 ’ ‘1999-02-30’ pas correct ! SYSDATE => date et heure actuelle • l'arithmétique fonctionne sur les dates: ‘2000/09/06’ - ‘2000/09/05’ => 1 ‘2000/09/07’ + 10 => ‘2000/09/17’ Type de données: NULL • la valeur NULL est spéciale NULL appartient à tous les domaines: CHAR, LONG, NUMBER, … signifie que la ligne n’a pas de valeur pour cet attribut • ne pas confondre avec ‘‘ 0 0.0 11.2)Créer une table: CREATE TABLE s_dept (id NUMERIC(7,0) , name VARCHAR(25) , region_id NUMERIC(7,0) ) ; • une instruction SQL peut être sur plusieurs lignes • une instruction SQL est toujours terminee par ‘;’ • remarque les exemples sont donnés pour Oracle, la syntaxe et l ’affichage de MySQL sont légèrement différents • crée la table correspondant a S_DEPT(id, name, region_id) • attention la clé primaire n ’est pas encore définie BERNARD D. Page 24/27 DEUST ISR PHP/MYSQL 11.3)Effacer une table: DROP TABLE NomDeLaTable ; 11.4)Recherche, ajout, modification, suppression des données d'une table: 11.4.1)Ajout: INSERT INTO s_dept VALUES (10, 'Finance', 1); où si toutes les colonnes ne sont pas spécifiées (les colonnes non spécifiées auront NULL comme valeur): INSERT INTO s_dept(name,id) VALUES ('Finance', 10); 11.4.2)Recherche: SELECT est composée des clauses SELECT FROM WHERE GROUP BY HAVING ORDER BY ; • les clauses doivent TOUJOURS respecter cet ordre • seules les clauses SELECT et FROM sont obligatoires • liste la(les) colonne(s) à afficher exemple: select id from s_dept; recherche toutes les valeurs du champ id de la table s_dept. • un ‘*’ indique que toutes les colonnes sont à afficher select * from s_dept; recherche toutes les valeurs de tous les champs de la table s_dept Clause WHERE (en option) permet de définir l’ensemble des conditions auxquelles doivent satisfaire les lignes du tableau résultant select nom, prenom from user where dept = 72 ; affiche tous noms et prenoms des personnes présente dans la table user et résidant dans le département 72. La clause ORDER BY permet de présenter le tableau avec des lignes triées par défaut, le tri est effectué en ordre ascendant le tri est effectué en ordre descendant pour les attributs suivis de DESC si plusieurs attributs figurent après ORDER BY, le tri est effectué prioritairement sur le premier attribut, puis le second, … Conditions: comparaison simple =, <, <=, >, >=, <>, != valables pour NUMBER, CHAR, VARCHAR, DATE valent NULL si un des termes de la comparaison est NULL pour CHAR et VARCHAR, SQL tient en compte les majuscules et minuscules ! BERNARD D. Page 25/27 DEUST ISR PHP/MYSQL Opérateurs logiques: priorité les opérateurs logiques peuvent être combinés entre eux ! ordre de priorité NOT AND OR emploi de parenthèses possibles pour changer l’ordre d'évaluation 11.4.3)Modifier des données d'une table: Instruction UPDATE consiste en trois clauses: UPDATE SET WHERE seules UPDATE et SET sont nécessaires attention, sans WHERE toutes les lignes de la table sont modifiées! UPDATE nom-table SET attribut1=expression1, attribut2=expression2 WHERE condition update s_emp set salary=salary*1.1 ; Va augmenter tous les salaires de 10% . 11.4.4)Supprimer des données d'une table: Instruction DELETE FROM DELETE FROM nom-table WHERE condition La clause WHERE est optionnelle mais sans elle toutes les lignes sont effacées! 12)Fonctions PHP pour la base de données MYSQL Grâce au langage PHP et SQL, certaines fonctions en PHP permettent d'accéder facilement à une base de données. Pour une question pratique, nous verrons les fonctions permettant de manipuler une base de données nommée MYSQL, mais le principe reste le même pour d'autres base de données. Exemple: Nous avons une base de données qui s'appelle MABASE. Cette base de données se trouve sur un serveur qui posède l'adresse IP 192.9.200.7 . Elle contient 2 tables: USER LOGIN PASSWORD dbernard motdepasse rbidochon raymonde ADRESSE LOGIN RUE dbernard 13 rue du vide VILLE TEL Le mans 72000 "02 43 02 43 02" rbidochon 5 impasse du litron lyons BERNARD D. CP 69000 "05 04 03 01 00" Page 26/27 DEUST ISR PHP/MYSQL Ecrivons un code PHP qui va afficher la liste des login et des mots de passe des personnes présentes dans la table USER. <html> <body> <?php $db = "MABASE"; // nom de la base $connection = mysql_connect("192.9.200.7", "root", "tropdurelemotdepasse"); // je me connecte au serveur de base de données qui est en 192.9.200.7, // en tant qu'utilisateur de la base ayant pour login root // et pour mot de passe tropdurelemotdepasse if (!$connection) // la connexion est refusee j'arrête le script die ("connexion au serveur de base de donnees refusee"); mysql_select_db($db, $connection) // choix de la base de données or die ("acces au la base de donnee $db refusee"); $requete = "select login, password from USER;"; // la requete $result = mysql_query($requete,$connection); // envois de la requete au serveur if (!$result) // s'il y a un probleme on s'arrête. die("probleme d'acces à la table user"); $nbligne = mysql_num_rows($result); //nbligne prend le nombre de login correspondant // a la requete if ($nbligne==0) echo "il n'y a aucun utilisateur"; // affichage de la liste des logins for ($i=0;$i<$nbligne;$i++){ $tab=mysql_fetch_array($result); // tab est un tableau qui recupere les // champs login et password du resultat // de la requete // avec tab[login] -> valeur du login (on peut ecrire aussi tab[0]) // tab[password] -> valeur du mot de passe associe (on peut ecrire aussi tab[1]) echo "login :".$tab[0]."<br>"; echo "mot de passe :".$tab[password]."<br>"; } mysql_close($connection); ?> </body> </html> 13)Conclusion Quelle que soit la base de données, il faudra toujours passer par les phases de connection et de choix d'une base avant de pouvoir faire des requêtes SQL sur celle-ci via PHP. Le couple MYSQL/PHP est très utilisé sur le WEB, et il existe bien d'autre fonctions, liées à la manipulation de cette base de données par php, que nous n'avons pas listées ici. Pour plus d'information, allez voir le site www.php.net. BERNARD D. Page 27/27