Vous êtes sur la page 1sur 27

Introduction.

Cette partie va nous permettre d'tudier quelques fonctions PHP spcifiques au traitement des chanes de caractres et nombres. Toutes ne seront pas vues ici, seules les principales.

2. Fonction STRLEN()
La fonction PHP STRLEN() renvoie la longueur de la chane de caractres. <?PHP $a=strlen("erer"); print($a); ?> affiche le chiffre 4, le nombre de caractres de la chane erer.

3. Fonctions Trim, Rtrim, ltrim


Ces fonctions permettre de supprimer les blancs dans une chane de caractres. Trim($variable) efface les blancs devant et derrire dans la chane de caractres, pas les espaces au milieu. RTRIM($variable) supprime les blancs droite de la chane de caractres. A partir de PHP 4.0.1, une oprante optionnelle a t rajoute: rtrim($text,caractres supprimer), par exemple: rtrim("Bonjour","jour") donne "Bon". LTRIM($variable) supprime les blancs gauche de la chane de caractres. A partir de PHP 4.0.1, une oprante optionnelle a t rajoute: ltrim($text,caractres supprimer), par exemple: ltrim("Bonjour","bon") donne "jour".

4. Minuscules - majuscules
STRTOLOWER($variable) transforme tous les caractres de la chane en minuscule STRTOUPPER($variable) transforme tous les caractres en majuscule UCWORDS($variable) transforme la premire lettre chaque mot en majuscule UCFIRST($chane-caractre) transforme la premire lettre de la chane en majuscule

5. Manipulation et modification de chanes


Ces fonctions PHP vont modifier le contenu d'une chane de caractres.

ADDSLASHES($variable): ajoute les anti-slashes \ devant les caractres spciaux. Cette fonction est utilise pour les fonctions Print(''") et ECHO''" et lors d'introduction de valeurs via un formulaire. exemple: ADDSLASHES("L'entreprise") donne "L\'entreprise". STRIPSLASHES($variable): supprime les anti-slashes, notamment utilise lors de version imprimable. CHUNK_SPLIT($variable,nb caractres, caractre de sparation): permet de scinder une chane de caractre. Exemple: CHUNK_SPLIT($bonbon,"3","-") donne bon-bonSTRSTR($variable,"caractre") recherche le caractre et affiche le reste de la chane, y compris le caractre. Exemple: STRSTR("YBET informatique","i") affiche "informatique". STR_replace("caractre remplacer","caractre de remplacement",$variable) remplace dans la chane $variable les caractres replacer par le caractre de remplacement et l'assigne une variable. Cette fonction PHP tient compte de la casse. Exemple: $texte=STR_REPLACE("i","y'","ibet"). Print($texte); donne ybet. SUBSTR (chaine, numero_depart [,longueur] ) rcupre longueur caractres sans la chane partir du numero de dpart. Exemple: Il n'y a pas de fonction left en PHP. Pour rcuprer les 5 premiers caractres d'une chane $chaine, la commande est SUBSTR ($chaine,0,5); HTMlentities($variable) remplace le caractre par son quivalent HTML si possible. Exemple: HTMlentities(" ") affiche &nbsp; EREG($variable1,$variable2) recherche si la chane $variable1 est contenue dans $variable2, renvoie une valeur logique. Exemple, vrification du pays suivant le numro de TVA <?php if (ereg("BE","BE718409912")){ echo"Belgique";} else{ Echo"Hors Belgique"; } ?> Explode($caractere,$chaine[,int limit]) coupe la variable texte $chaine en deux en supprimant le caractre de sparation $caractere. Le rsultat est renvoy sous forme de tableau. L'option limit ( partir de la version 4.0.1, une valeur entire) permet de dfinir le nombre maximum de lignes du tableau renvoye par la fonction. La dernire ligne contient alors le reste de la chane. <?php $tableau=array[]; $chane="Ma maman est invite";

$tableau=Explode("a",$chaine,2); print($tableau[0]); print($tableau[1]); ?> STRPOS($variable,$variable1): revoie le nombre de caractre devant la lettre $variable1. Exemple: STRPOS ("YBET informatique,"i") renvoie le nombre 5. Si le rsultat est 0, le caractre n'est pas repris dans la chane. nl2br($chane) affiche les sauts de lignes en remplaant les /n par <br>. Nous en reparlerons

Spcifiques nombres
DECHEX($valeur): renvoie la valeur hexadcimale d'un nombre. CEIL($valeur): renvoie le nombre entier suprieur. FLOOR($valeur): renvoie le nombre entier infrieur Round($valeur,$nb): renvoie l'arrondit de $valeur avec $nb chiffres derrire la virgule. Si $nb est omis, il est considr comme 0 chiffres derrire la virgule. is_int() renvoie true si le contenu est un entier, false sinon. intval() convertit une chane en variable entire Nous verrons d'autres fonctions PHP dans les chapitres suivants mais ceux-ci sont les principaux

Grer la base de donne MySQL

1. Introduction.
Dans le prcdant chapitre, nous avons cr une base de donne MYSQL et une table manuellement avec PHPMyADMIN. Nous aurions galement pu rentrer des donnes ou modifier des donnes existantes mais le but de cette formation est de grer des bases de donnes MySql l'aide de pages crites en langage PHP (programmation). Cette partie va reprendre les commandes ncessaires. L'ensemble des parties suivantes de ce cours ncessitent le dmarrage de EasyPhp.

2. Principe.
Pour utiliser une base de donne crite en MySQL, il faut: 1. Connexion au serveur Cration d'une ressource Authentification Slection de la base de donne 2. Utilisation des tables MySQL (via PHP) Lecture Ecriture 3. Dconnexion du serveur Toutes les fonctions PHP pour grer une base ou une table MySQL commencent par mysql_. La connexion au serveur se fait par la commande: mysql_connect($serveur,$login, $mot-passe). Dans le cas d'une base de donne cre avec EasyPhp, le serveur est localhost, le login est root, mot de passe vide. Pour une base de donne hberge sur un serveur Internet, ces paramtres sont fournis par votre hbergeur. La fonction mysql_connect() renvoie une ressource si la connexion a russie, sinon, elle renvoie le message d'erreur False. Une fois que la ressource est tablie, elle est sauvegarde et utilisable par les autres fonctions utilisant la base de donne. Par dfaut, le script PHP utilise la dernire connexion ouverte. Cette commande ne doit donc tre utilise qu'une seule fois. Pour fermer la connexion, la commande utiliser est mysql_close. Exemple de connexion:

<?php if(!mysql_connect('localhost','root')){ Echo'Connection Impossible'; exit();

} else{ Echo'Connexion russie'; } // instructions sur la base de donne mysql_close(); ?>

Si la connexion choue, le programme PHP affichera Connexion impossible. Si la connexion au serveur est tablie, PHP affichera Connexion russie. La fonction Exit() (ou son quivalente die("Message")) permet d'arrter le script si la connexion n'est pas russie. L'tape suivante va slectionner la base de donne que nous avons cr. Mysql_select_db('ybet') slectionne la base de donnes (DB) YBET que nous avons cr au chapitre prcdant manuellement. Les tables sont elles slectionnes dans la requte.

3. Commandes MySQL
C'est maintenant que a va se compliquer. MySQL est une vritable base de donne qui travaille par requtes. PHP ne va servir que comme application client pour envoyer ces requtes. La premire partie est donc de crer les requtes en SQL et de les transfrer ensuite par PHP. En gros, on va crer une variable en PHP qui reprend la ligne de commande. Comme le but de ce tutorial n'est pas de crer des applications SQL, mais bien d'utiliser les bases de donnes via une interface PHP, je ne vois que quelque commandes utiles que nous transfrerons par PHP ensuite

3.1 Requte d'insertion


Il y a plusieurs mthodes de rentrer des donnes (d'insrer). Toutes utilisent la commande INSERT nom_table. Diffrentes options sont galement proposes INSERT nom_table VALUES (nom colonne 1, nom colonne 2, ...) (valeur 1, valeur 2, ...). Il y a donc plusieurs mthodes pour insrer des donnes dans une table. 1. Une liste de colonnes et une liste de valeurs : Insert nom_table(nom colonne 1,nom colonne 2) Values(valeur colonne 1,valeur colonne 2) Dans notre cas, la table MySQL s'appelle annonce avec comme nom de champs code et titre (remarque: SQL ne fait pas de distinctions majuscules / minuscules dans les nom des champs. La commande SQL est par exemple: Insert annonce(code,TITRE) Values("users0001","Maison Vendre Pin"). 2. Une liste de valeurs noms - valeurs: INSERT nom_table SET nom colonne1=valeur1, nom colonne 2=valeur 2, ... INSERT annonce SET code='users0003',titre='magasin informatique YBET'

3.2. Slectionner la base de donne.


Use nom_base_ donne permet de slectionner une base de donne par dfaut. Sans cette commande, vous pouvez dans certaines fonctions nommer la table comme: base.table

3.3. Slection d'enregistrements


La commande SELECT permet de slectionner des enregistrements dans une table. Sa syntaxe complte est SELECT [distinct] liste_colonne FROM table [WHERE definition] [Order BY [ASC | DESC], ...] [Limit [offset,] lignes] La version la plus simple: Select Liste_colonne FROM table permet de slectionner l'ensemble des lignes d'une table suivant la liste des colonnes si vous avez utilis la commande USE au pralable. Dans le cas contraire, utilisez la commande Select Liste_colonne FROM base.table Pour slectionner toutes les colonnes, utilisez la commande SELECT * From TABLE L'option Where permet de filtrer les enregistrements. Select * FROM table Where Titre='YBET' slectionne tous les enregistrements ou le champ titre est gal YBET dans la table "table". Vous pouvez utiliser les oprateurs de comparaison suivants pour la condition. ! || && = <> ou != <= >= > < Like Fonction logique Non, inverse Fonction logique OU (OR) Fonction logique ET, toutes les conditions doivent tre remplies (AND) gal Diffrent Infrieur ou gal Suprieur ou gal Suprieur Infrieur permet de prendre le mot l'intrieur de la chane. % remplace n'importe quel nombre de caractres, y compris 0. _ remplace 1 seul caractre.

ORDER BY permet de trier les rsultats de la requte MySQL.

Select * FROM table order by code rcupre tous les enregistrements de la table et les trie suivant le code. Par dfaut, le tri est par ordre croissant (ou avec l'option ASC). Pour trier par ordre dcroissant, utiliser ORDER BY DESC LIMIT permet de limiter le nombre de lignes renvoyes, par exemple LIMIT 50 limite aux 50 premiers rsultats. Vous pouvez galement utiliser 2 arguments, par exemple LIMIT 2,20. Le 2 spcifie de ne pas prendre les 2 premires lignes, mais les 20 suivantes.

3.4. Modification d'enregistrements.


La commande SQL Update permet de modifier le contenu d'un enregistrement. La syntaxe complte est: UPDATE nom_table SET nom_colonne1=contenu1, [nom_colonne2=contenu2, ...] [WHERE conditions] [LIMIT] Les options Where et Limit sont quivalentes celles ci-dessus. Vous pouvez galement incrmenter directement une valeur. Par exemple: UPDATE annonce SET code, code+1 incrmente le code de 1 UPDATE annonce SET code, code*2 multiplie le code par 2 La commande UPDATE renvoie automatiquement le nombre de colonnes qui ont t modifies.

3.5. Effacement d'enregistrements


Cette fonction se fait par la commande DELETE. La commande complte est de type: DELETE FROM table [WHERE condition] [LIMIT]

4. Liaison MySQL - PHP


L'envoie de commandes MySQL par un programme php se fait l'aide de la commande mysql_query($requte SQL). La premire partie est donc l'enregistrement de la requte dans une variable. La deuxime est l'envoi de la variable. En cas d'erreur, la fonction mysql_query($requte) renvoie la valeur FALSE. Pour rcuprer le message d'erreur, on utilise la commande SQL mysql_error(). Ceci va nous amener modifier immdiatement notre scritp PHP.

4.1. Slection de la base de donne


Pour pouvoir accder aux donnes d'une table, vous devez slectionner la base de donne au pralable par la commande: Mysql_select_db(nom_base);

4.2. Insertion de donnes dans une table


Nous allons adapter les requtes SQL sous forme d'une valeur pour la transmettre comme variable la base de donne. <?php if(!mysql_connect('localhost','root')){ Echo'Connection Impossible'; exit(); } else{ Echo'Connexion russie'; } Mysql_select_db('ybet'); $requete="Insert annonce(code,TITRE) Values('users0002','Maison Vendre Florenville')"; $valeur=mysql_query($requete); $erreur=mysql_error(); print($erreur);

?>

Analysons ces lignes de commandes. La premire partie vue plus haut nous permet de nous connecter la base de donne YBET. Nous allouons ensuite la variable $requete la valeur de la requte SQL d'insertion qui transmet la valeur users0002 au champ code et la valeur Maison vendre Florenville au champ TITRE. La commande suivante va transfrer la requte via la commande mysql_query et retourner une valeur la variable PHP $erreur (True ou False). Dans le cas d'erreur, la fonction mysql_error() renvoie le message d'erreur que nous affichons l'cran par la commande Print, la variable $valeur ne renvoie rien (false, comme la requte n'a pas t excute). Dans le cas o la requte s'est bien passe, la variable $valeur renvoit 1 (True) et $erreur, rien. Nous n'affichons donc que $erreur, la seule intressante. Dans le cas o nous utilisons la commande INSERT table SET colonne1=valeur1, colonne2=valeur2, le script PHP est presque identique. La fonction SET est insre dans la mme ligne.

<?php if(!mysql_connect('localhost','root')){

Echo'Connection Impossible'; exit(); } else{ Echo'Connexion russie'; } Mysql_select_db('ybet'); $requete="INSERT annonce SET code='users0004',TITRE='magasin informatique YBET'"; $valeur=mysql_query($requete); $erreur=mysql_error(); print($erreur); ?>

4.3. Recherches d'enregistrements


La requte SQL associe est SELECT FROM. Dans le cas de la fonction mysql_query(), la rponse est la valeur trouve. Reprenons les enregistrements insrs cidessus et affichons les champs contenant users0004.

<?php ... $requete="SELECT * FROM 'users000'"; $valeur=mysql_query($requete); print($valeur); ... mysql_close() ?>

N'affichera rien, tout simplement parce que notre table contient effectivement la valeur users0004 mais nous demandons d'afficher en fait 2 variables (puisque la table contient les champs code ET titre). $valeur, le rsultat de la commande mysql_query($requete) est une matrice (une variable tableau). La commande utilise est finalement mysql_fetch_array($valeur) qui va crer un table reprenant chaque fois les noms des colonnes. Lorsqu'il ne reste plus de lignes lire, mysql_fetch_array() retourne FALSE. Le script PHP devient:

<?php // ouverture de la base de donne $requete="SELECT * FROM annonce where code='users0004'"; $valeur=mysql_query($requete); print(mysql_error()); $tableau=mysql_fetch_array($valeur); print($tableau['code']); print($tableau['TITRE']); mysql_close()

?>

Ce script ne fonctionne que s'il n'y a qu'une seule ligne correspondant notre filtrage. La solution passe par la commande WHILE. Nous allons faire tourner cette fonction en boucle tant que des donnes sont transmises. La commande mysql_num_rows() permet de connatre le nombre de lignes affiches (mysql_affected_rows(), identique, est utilise pour les requtes d'effacement ou de modification d'enregistrement). En utilisant la commande en bouche WHILE:

<?php if(!mysql_connect('localhost','root')){ Echo'Connection Impossible<br>'; exit(); } else{ Echo'Connexion russie <br>'; } Mysql_select_db('ybet'); $requete="SELECT * FROM annonce where code='users0004'"; $valeur=mysql_query($requete); print(mysql_num_rows($valeur).' ligne(s)<br>'); while ($tableau=mysql_fetch_array($valeur)){ print("<b>".$tableau["code"]."<br>".$tableau["TITRE"]."</b>\n"); } mysql_close() ?>

Voici le rsultat dans notre base de donne actuelle Connexion russie 1 ligne(s) users0004 magasin informatique YBET

Crer une table dans une base de donne MySQL avec PHP
1. Introduction.
Dans les 2 chapitres prcdents, nous avons cr une base de donne MYSQL en local et commencer apprendre les commandes MySQL. Cette partie va nous permettre de crer de manire automatique une base de donne. Ces commandes sont ncessaires pour une installation automatique, mais aussi parce que tous les hbergeurs Internet n'autorise pas une gestion complte de la base de donne par une interface propre. La base de donne MySQL doit tre pralablement cre de manire manuelle sur votre hbergement qui vous donnera les renseignements ncessaires: nom du serveur, le login et le mot de passe d'accs. A la cration, cette base de donnes est vide. Vous pouvez utiliser une seule base de donne pour des applications diffrentes le cas chant, condition de ne pas insrer 2 tables sous le mme nom. Cette solution est utiliser pour la majorit des hbergements qui n'autorisent qu'une seule base de donne, mme si cette solution ralentit le traitement.

2. Syntaxe
La commande SQL associe est CREATE TABLE [IF NOT EXIST] nom_table (definition-colonne, Index) Si une table du mme nom existe dans la base de donne, un message d'erreur est renvoy. Si vous utilisez la commande optionnelle IF NOT EXIST, non seulement il n'y a pas de message d'erreur, mais la table n'est pas non plus cre. la partie dfinition-colonne reprend:

nom-colonne type [NOT NULL ou NUL] [DEFAULT valeur-par-defaut) [AUTO_INCREMENT] [PRIMARY KEY]

Dans Index, on retrouve


Primary Key (index_nom-colonne) INDEX [Nom-index] (index-nom-colonne, ...) UNIQUE [INDEX] (index-nom-colonne, ...)

Ces notions ont dj t vues dans le chapitre "crer une base de donne en local"

3. Exemple de cration

Nous allons crer une table dans notre base de donne YBET dont le nom est CONTENU. Voici la liste des champs insrer: primarytypes de variable key, remarque Instruction SQL Index numrique, Primary- auto code int primary key NOT NULL code integer key incrmentation auto_increment titre de l'annonce limite 120 titre VARCHAR(120) titre varchar(120) not null caractres, insensible la casse texte limit description TEXT 65535 description blob not null caractres adresse et nom photo varchar(255) de la photo, photo varchar(255) 255 caractres caractre limit Ville VARCHAR(40) index ville varchar(40), index(ville) 40 caractres choix entre Belgique, pays Pays type enum France, enum('Belgique','France','Luxembourg') Luxembourg dcimal avec 2 chiffres prix decimal(10,2) prix decimal(8,2) not null derrire la virgule dateinsertion date date courte dateinsertion date telephone varchar(15) telephone varchar(15) mail varchar(30) mail varchar(30) Nous pourrons ventuellement crer des champs supplmentaires ou modifier les attributs des champs par la suite. Dans notre version locale sous EasyPhp, le serveur est localhost, le login est root, sans mot de passe. <?php if(!mysql_connect('localhost','root')){ Echo'Connection Impossible'; exit(); } else{ Echo'Connexion russie'; } Mysql_select_db('ybet');

// cette partie ouvre la base de donne $requete="CREATE TABLE if not exists contenu (code int primary key NOT NULL auto_increment,titre varchar(120) not null,description TEXT not null,photo varchar(255), ville varchar(40),pays enum('Belgique','France','Luxembourg'),prix decimal(8,2) not null,dateinsertion date,telephone varchar(15),mail varchar(30),index(ville))"; $erreur=mysql_query($requete); $erreur1=mysql_error(); print($erreur."<br>"); print($erreur1); mysql_close(); ?> L'ensemble des commandes ont dj ts vues dans les chapitres prcdents. La difficult est de crer la requte SQL. Chaque champ est spar par une virgule. Dans le cas de l'index, il peut tre insr juste derrire le champs ou la fin de la requte: Index(ville(10)) indexe seulement sur les 10 premiers caractres du champ ville.

4. Suppression d'une table


Vous pouvez supprimer une table dans une base de donne existante par la commande SQL: DROP table [if exists] nom_table (, nom_table1, ...) Par exemple, pour supprimer la table contenu ci-dessus, utilisez les lignes de commandes PHP <?php if(!mysql_connect('localhost','root')){ Echo'Connection Impossible'; exit(); } else{ Echo'Connexion russie'; } Mysql_select_db('ybet'); // cette partie ouvre la base de donne $requete="DROP table if exists contenu"; $valeur=mysql_query($requete); $erreur1=mysql_error(); print($valeur."<br>"); print($erreur1); mysql_close(); ?> Il vous reste copier les codes ci-dessus dans le dossier www de Easyphp et d'excuter les diffrentes requtes pour essayer ces commandes et les adapter votre propre utilisation. Remarquez que ces commandes sont automatiquement excutes par le programme d'installation lorsque vous installez un forum, un portal, un livre d'or, site de vente en ligne, ...

sous licence GPL. Les commandes DROP sont galement utilisables dans la console MYPHPADMIN de votre hbergement Internet.

10.A. Exercice PHP: un petit formulaire de contact


1 Introduction - 2. Le formulaire - 3. Vrification des donnes entres - 4. Transfert dans la base de donne MySQL - 5. Envoi votre adresse mail - 6. Le dveloppement complet.

1. Introduction.
Les diffrentes prcdentes parties de cette formation nous permettent maintenant de commencer quelques exercices comme un simple formulaire de contacts (mises jours, inscriptions aux news, ...) insrer sur votre site. Celui-ci est volontairement "dpouill", vous pourrez le complter. L'nonc: Crer un formulaire de contact reprenant le nom et l'adresse mail. Les donnes doivent tre vrifies, un nom et une adresse mail valide. Ce formulaire est auto-invocant. Si les donnes sont correctes, elles doivent tre sauvegardes dans une table MySQL que nous appellerons formulaire reprenant uniquement ces 2 donnes. les donnes doivent galement tre envoyes dans votre bote mail.

J'ai volontairement limit le nombre de champs 2. Il n'y a pas de listes de choix, ... ceci va faciliter la cration du formulaire La table doit tre au pralable cre dans EasyPhp.

Les champs

Nous n'utilisons pas de cls primaires, index, ...

2. Le formulaire
Comme le fichier contact.php doit tre auto-invocant, le formulaire doit tre affich en PHP. $form="<form method=\"POST\"> <p>Nom: <input type=\"text\" name=\"nom\" size=\"30\" value=\"Nom\"></p> <p>Votre adresse mail: <input type=\"text\" name=\"mail\" size=\"30\" value=\"Votre adresse mail\"></p> <p><input type=\"submit\" value=\"Envoyer\" name=\"B1\"></p> </form>"; echo $form; Remarquez que nous lui donnons une valeur par dfaut: la zone NOM reprend le texte nom, la zone mail reprend la valeur "Votre adresse mail". Ce n'est pas obligatoire, sauf que les tests ci-dessous seront modifis.

3. Vrification des valeurs entres.


La partie ci-dessus s'insre au-dessus du formulaire. Les valeurs entres par l'utilisateur sont directement modifies pour supprimer les blancs et insrer le caractre \ devant les guillemets et apostrophes. Si la valeur envoye est gale la valeur par dfaut, un message d'erreur s'affiche. Les tests sur l'adresse mail vrifient simplement si elle n'est pas nulle et si le caractre @ existe, suivi de caractres. if (isset($_POST['B1'])) { // teste les valeurs. $nom=trim(addslashes($_POST['nom'])); $mail=trim(addslashes($_POST['mail'])); $tableau=array(); $tableau=Explode("@",$mail,2); // echo $tableau[0]; if ($nom=="" || $nom=="Nom") { echo "Veuillez rentrer un nom"; }elseif ($mail==""){ echo "Rentrez une adresse mail"; }elseif (!isset($tableau[1])) { echo"Rentrez une adresse valide"; }else{ // entre des valeurs dans la table MySQL, envoi des donnes une adresse mail. }

4. Transfert dans la base de donne


Le transfert des donnes vers la base de donnes ne se fait que si les donnes sont valides. Rien de bien spcial, nous ne vrifions mme pas si l'utilisateur existe dj (mais vous pouvez le faire comme exercice). if(!mysql_connect('localhost','root')){ Echo'Connection Impossible'; exit(); } else{ Echo'Connexion russie'; } Mysql_select_db('ybet'); $requete="insert formulaire SET nom='$nom', mail='$mail'" ; $resultat=mysql_query($requete); //die ();

5. Envoi dans votre bote mail


La dernire fonction est d'envoyer les donnes par mail. Elle utilise la fonction PHP mail(destinataire, sujet, message, headers). Cette fonction renvoie true si le message est bien envoy, false sinon. Les diffrents composants doivent au pralable tre dfinis dans les variables. // envoi par mail $date=date('Ymd'); $message=date("d/m/Y H:m:s\n")."\n Nouveau contact: "."\n nom: ".$nom."\n Adresse mail: ".$mail; $entetes = "From: contact@site.be\nReply-to: contact@site.be\n"; $sujet="Nouveau contact ".$nom; $webmaster=('contact@site.be'); mail($webmaster,$sujet,$message,$entetes); Elle vient la suite de l'entre des donnes dans la base de donne. Remarques: La fonction mail ne fonctionne pas sous Easyphp en local et doit se faire sur un serveur. Les diffrentes adresses mail doivent tre corriges selon votre propre adresse mail.

Premier formulaire d'entre des petites annonces


1. Introduction.
Une fois la table MySql cre, la prochaine tape est de crer le formulaire et d'envoyer les donnes vers la base MySQL. Nous avons dj vu une large partie dans un chapitre prcdant. Deux mthodes sont utilisables avec leurs avantages et leurs dfauts. 1. La premire mthode utilise un formulaire en HTML et un autre fichier en PHP qui vrifie les donnes. C'est la mthode la plus simple. Par contre, en cas de donnes incorrectes, elle ncessite que l'utilisateur reviennent en arrire avec le navigateur pour corriger. 2. La deuxime mthode utilise un seul fichier PHP qui insre et vrifie les donnes. On appelle de type de formulaire auto-invocant. Par facilit dans ce cours, nous utilisons ici la mthode HTML. L'autre mthode sera utilise plus tard.

2. Cration du formulaire
La premire partie va crer le formulaire en HTM (insr dans 1 fichier php) reprenant les diffrents champs crer: Nom d'utilisateur (*) Mot de passe (*) (minimum 5 caractres) Adresse mail (*) Titre Nom (*) Prnom (*) Adresse (minimum 5 caractres) Code Postal Ville (*) (minimum 3 caractres) Pays (*) Tlphone

Date de naissance: Jour mois Anne Remarque, ce formulaire n'envoie aucune donnes

Les champs uid (numro d'utilisateur), type (utilisateur, administrateur, ...) et regdate (date d'inscription) ne sont pas reprises dans le formulaire, elle seront insres automatiquement en PHP. Ce formulaire peut ventuellement tre crer par FrontPage (ce qui est plus facile), mais voici le codage en html. <form method="POST" action="mail.php" name="creer-utilisateur"> <p>Nom d'utilisateur (*) <input type="text" name="username" size="25"></p> <p>Mot de passe (*) <input type="password" name="password" size="40"> (minimum 5 caractres)</p> <p>Adresse mail (*) <input type="text" name="email" size="60"></p> <p>Titre <select size="1" name="titre"> <option selected>Monsieur</option> <option>Madame</option> <option>Mademoiselle</option> </select></p> <p>Nom (*) <input type="text" name="nom" size="25"> Prnom (*) <input type="text" name="prenom" size="25"></p> <p>Code Postal <input type="text" name="codepost" size="10"> Ville (*) <input type="text" name="ville" size="25"> (minimum 3 caractres)</p> <p>Pays (*) <input type="text" name="pays" size="20"></p> <p>Tlphone <input type="text" name="telephone" size="20"></p> <p>Date de naissance: Jour <input type="text" name="bday" size="2"> mois <input type="text" name="bmonth" size="2"> Anne <input type="text" name="byear" size="4"></p> <p> <p> <input type="submit" name="ok" value="Envoyer" /></p> </form>

3. Mthode POST et GET


Deux mthodes sont utilise pour transfrer un message, la mthode POST et la mthode GET. GET est la mthode par dfaut. 1. GET envoie les informations via l'URL comme: http://www.ybet.be/mail.php? ok=envoyer&titre='Monsieur' Toutes les variables sont reprises dans l'URL comme nom-variable=valeur 2. POST par contre n'utilise par l'URL fait passer les informations via l'en-tte HTTP , en mme temps que les informations de navigation (adresse IP, version navigateur, rsolution cran, ...). Cette mthode est donc plus scurise. La mthode GET ne permet que de transfrer quelques octets, la mthode post permet d'envoyer des variables de grande taille. La mthode de rception des donnes est galement diffrente.

$_GET (PHP4 compris) rassemble les donnes transmises par la mthode GET (dans les versions 4 et infrieures, on utilisait HTTP_POST_VARS) $_POST (PHP4 compris) rcupre les donnes par la mthode POST (PHP 4 et infrieures: HTTP_POST_VARS)

Pour savoir si les donnes sont transmises, il suffit de vrifier si des valeurs sont incluses dans la variable tableau. $_GET['nom-variable']='valeur-variable' est quivalent $_POST['nom-variable']='valeur-variable' Dans cette formation, nous utiliserons POST. Elle se retrouve dans l'en-tte du formulaire: <form method="POST" action="mail.php" name="creer-utilisateur"> qui demande envoie le rsultat au fichier mail.php avec comme titre (optionnel) creer-utilisateur.

4. Traitement de l'information.
Une fois les donnes envoyes avec le bouton OK, le fichier suivant que nous appellerons mail.php par facilit va: 1. Rcuprer les donnes (si elles existent) 2. Vrifier les informations obligatoires et la taille des informations transmises 3. Transmettre un message d'erreur en cas de donnes non valides 4. Vrifier si l'adresse mail et le nom d'utilisateur n'existent pas dj dans la table "member" 5. Transmettre un message d'erreur en cas de duplicate 6. Si l'ensemble est correct, le fichier va transmettre les donnes dans la table "member"

Chaque variable de notre formulaire va correspondre une variable php. Par facilit, nous allons faire correspondre le nom du champ (titre par exemple) avec le mme nom de variable PHP ($titre). Les vrifications effectuer sont:

Champs obligatoires Longueur minimum et maximum des champs. Vrification d'une adresse mail valide. Nom Variable PHP correspondante Valeur nulle autorise valeur minimum, maximum Liste: Monsieur, Madame, Mademoiselle. (Cette partie est faite par le formulaire) 3,25 3,25 4,10 3,25 3,20 8,20 8,60, caractre @, serveur mail 2,25 5,40 chiffre entre 1 et 31 chiffre entre 1 et 12 chiffre entre 1900 et 2050

titre

$titre

Non

nom prenom codepostal ville pays telephone email username password bday bmonth byear

$nom $prenom $codepostal $ville $pays $telephone $email $username $password $bday $bmonth $byear

Non Non Oui Oui Non Non Non Non Non Oui Oui Oui

5. Rcupration des donnes.


L'ensemble des variables vont tre rcupres dans notre fichier mail.php par la commande HTTP_POST_VARS, soit <?php $titre=$_POST['titre']; echo $titre; ?> Mais est-ce ncessaire. Finalement nous pouvons directement utiliser le rsultat de la variable tableau $HTTP_POST_VARS['nom-variable'].

6. Vrification des donnes


La premire partie va vrifier le nombre de caractres des champs. Pour cela, nous allons crer une fonction comme vu au chapitre 4 de ce cours en ligne. Ceci va viter de longues lignes de codes. function taille_variable($variable,$taille_min=0,$taille_max=0){ global $_POST; if(!isset($_POST[$variable])){ // valeur non dfinie return false; }elseif (strlen($_POST[$variable])<$taille_min){ return False; }elseif(strlen($_POST[$variable])>$taille_max){ return FALSE; } return True; } Analysons cette fonction.

La premire partie demande 3 arguments: le nom de la variable, la taille minimum et la taille maximum. En ajoutant une valeur pour les paramtres maximum et minimum, nous donnons une valeur par dfaut si ces 2 variables ne sont pas transmises la fonction. La deuxime ligne global $_POST; dclare la variable. C'est ncessaire pour toutes fonctions. Par contre, une fois ouverte dans une fonction, elle est accessible pour l'ensemble de script. La suite utilise la fonction STRLEN() qui vrifie le nombre de caractres. Nous l'avons dj tudie au chapitre 6.

Certains champ sont optionnels. Par contre, si une valeur est rentre, nous devons vrifier si les informations de taille sont correctes. Remarquez que dans ce cas, nous utilisons une nouvelle fonction if. Certaines versions PHP n'acceptent pas l'imbrications de fonctions IF. if (strlen($_POST['codepost'])<>0){ if(!taille_variable('codepost',4,10)){ echo 'Code Postal invalide, entre 4 et 10 caractres'; echo'<br>'; } } Au total, si le contenu est correct, la valeur renvoye est TRUE, False sinon. La partie complte de vrification de la taille devient: <?php if(!taille_variable('username',2,25)){ echo'Login invalide, rentrez minimum 2 caractres';

echo'<br>'; }elseif (!taille_variable('password',5,40)){ echo'Mot de passe invalide, rentrez minimum 5 caractres, 40 caractres maximum'; echo'<br>'; }elseif (!taille_variable('email',8,60)){ echo'email invalide, rentrez minimum 8 caractres'; echo'<br>'; }elseif(!taille_variable('nom',3,25)){ echo'Nom invalide, rentrez votre nom (minimum 3 lettres)'; echo'<br>'; }elseif (!taille_variable('prenom',3,25)){ echo'Prnom invalide, rentrez votre nom'; echo'<br>'; } } if (strlen(_POST['codepost'])<>0){ if(!taille_variable('codepost',4,10)){ echo'Code Postal invalide, entre 4 et 10 caractres'; echo'<br>'; } } if (!taille_variable('ville',3,25)){ echo'Ville invalide, rentrez minimum 3 caractres'; echo'<br>'; }elseif (!taille_variable('pays',3,20)){ echo'Pays invalide, rentrez minimum 3 caractres'; echo'<br>'; }elseif (strlen($_POST['telephone'])<>0){ if (!taille_variable('telephone',5,20)){ echo'Numro de tlphone non valide'; echo'<br>'; } } if (strlen($_POST['bday'])<>0){ if (!taille_variable('bday',1,2)){ echo'Jour de naissance invalide, rentrez 2 chiffres'; echo'<br>'; }if (($_POST['bday'])<"1"){ echo'Jour infrieur 1'; echo'<br>'; }elseif (($_POST['bday'])>"31"){ echo'Jour suprieur 31'; echo'<br>'; } } if (strlen($_POST['bmonth'])<>0){ if (!taille_variable('bmonth',2,2)){ echo'Mois de naissance invalide, rentrez 2 chiffres'; echo'<br>';

} if ($_POST['bmonth']<1){ echo'Mois de naissance >0'; echo'<br>'; }elseif ($_POST['bmonth']>12){ echo'Mois de naissance <12'; echo'<br>'; } } if (strlen($_POST['byear'])<>0){ if (!taille_variable('byear',2,2)){ echo'Anne de naissance invalide, rentrez 2 chiffres'; echo'<br>'; } if ($_POST['byear']<1900){ echo'Anne de naissance >1900'; echo'<br>'; }elseif ($_POST['byear']>2020){ echo'Anne de naissance <2020'; echo'<br>'; } } ?> <p>Recommencez, revenez en arrire avec votre navigateur</a></p> <?php function taille_variable($variable,$taille_min=0,$taille_max=0){ global $_POST; if(!isset($_POST[$variable])){ // valeur non dfinie return false; }elseif (strlen($_POST[$variable])<$taille_min){ return False; }elseif(strlen($_POST[$variable])>$taille_max){ return FALSE; } return True; } ?>

7. Vrification de l'adresse Mail.


Il nous faut encore corriger certaines parties, notamment au niveau de l'adresse mail o nous ne vrifions que la taille. Deux vrifications sont possibles: le caractres @ doit tre inclut dans l'adresse, nous pouvons galement vrifier si le DNS accepte les mails. La vrification du caractre @ dans la chane mail va utiliser la fonction strpos() que nous avons vu au chapitre 6 de cette formation. Comme rappel

STRPOS($variable,$variable1): revoie le nombre de caractre devant la lettre $variable1. Exemple: STRPOS ("YBET informatique,"i") renvoie le nombre 5. Si la rponse est false, le caractre n'est pas trouv dans la chane. if (!strpos($_POST['email'],'@')){ echo 'Adresse mail non valide'; // vrifie si le caractre @ est inclus dans la chane } Nous aurions galement pu vrifier la position du caractre dans la chane. En premier, l'adresse mail n'est pas valide, moins de 5 positions avant la fin de la chane est galement une adresse de messagerie invalide (exemple: ybet@a.b n'est pas valide puisque les nom de domaine incluent minimum 2 caractres pour l'extension, le point plus au moins 1 lettre). Nous allons simplement interroger le serveur. Pour accepter des adresses mails, le serveur DNS doit tre configurer spcifiquement. Ceci n'est pas rellement une preuve que l'adresse de messagerie est effectivement valide, le nom utilisateur peut tre faux avec un serveur valide. Cette vrification se fait en 2 parties: la rcupration du nom de domaine et l'envoi de la vrification au serveur. Commenons par rcuprer le nom utilisateur et le nom de domaine par la fonction PHP explode(). Cette fonction renvoie les 2 valeurs dans un tableau. Nous allons galement utiliser la fonction list pour rcuprer les 2 valeurs sous forme de variable. La fonction de rcupration devient list($user,$dns)=explode("@",$_POST['email'] checkdnsrr($dns) renvoie true si le nom de domaine est configur, false sinon. Cette fonction n'est pas normalement pas utilisable sous windows. Vous ne pourrez donc pas la tester directement avec EasyPhp. If (!checkdnsrr($dns)){ echo'L\'adresse mail n'est pas valide'; } Au total: list($user,$dns)=explode("@",$_POST['email'] If (!checkdnsrr($dns)){ echo'L\'adresse mail n'est pas valide'; } L'ensemble de la procdure devient: <?php if(!taille_variable('username',2,25)){ echo'Login invalide, rentrez minimum 2 caractres'; echo'<br>';

}elseif (!taille_variable('password',5,40)){ echo'Mot de passe invalide, rentrez minimum 5 caractres, 40 caractres maximum'; echo'<br>'; }elseif (!taille_variable('email',8,60)){ echo'email invalide, rentrez minimum 8 caractres'; echo'<br>'; } if (!strpos($_POST['email'],'@')){ echo'Adresse mail non valide'; } list($user,$dns)=explode("@",$_POST['email']); If (!checkdnsrr($dns)){ echo'L\'adresse mail n\'est pas valide'; } if(!taille_variable('nom',3,25)){ echo'Nom invalide, rentrez votre nom (minimum 3 lettres)'; echo'<br>'; }elseif (!taille_variable('prenom',3,25)){ echo'Prnom invalide, rentrez votre nom'; echo'<br>'; } } if (strlen($_POST['codepost'])<>0){ if(!taille_variable('codepost',4,10)){ echo'Code Postal invalide, entre 4 et 10 caractres'; echo'<br>'; } } if (!taille_variable('ville',3,25)){ echo'Ville invalide, rentrez minimum 3 caractres'; echo'<br>'; }elseif (!taille_variable('pays',3,20)){ echo'Pays invalide, rentrez minimum 3 caractres'; echo'<br>'; }elseif (strlen($_POST['telephone'])<>0){ if (!taille_variable('telephone',5,20)){ echo'Numro de tlphone non valide'; echo'<br>'; } } if (strlen($_POST['bday'])<>0){ if (!taille_variable('bday',1,2)){ echo'Jour de naissance invalide, rentrez 2 chiffres'; echo'<br>'; }if (($_POST['bday'])<"1"){ echo'Jour infrieur 1'; echo'<br>'; }elseif (($_POST['bday'])>"31"){ echo'Jour suprieur 31';

echo'<br>'; } } if (strlen($_POST['bmonth'])<>0){ if (!taille_variable('bmonth',2,2)){ echo'Mois de naissance invalide, rentrez 2 chiffres'; echo'<br>'; } if ($_POST['bmonth']<1){ echo'Mois de naissance >0'; echo'<br>'; }elseif ($_POST['bmonth']>12){ echo'Mois de naissance <12'; echo'<br>'; } } if (strlen($_POST['byear'])<>0){ if (!taille_variable('byear',2,2)){ echo'Anne de naissance invalide, rentrez 2 chiffres'; echo'<br>'; } if ($_POST['byear']<1900){ echo'Anne de naissance >1900'; echo'<br>'; }elseif ($_POST['byear']>2020){ echo'Anne de naissance <2020'; echo'<br>'; } } ?> <p>Recommencez, revenez en arrire avec votre navigateur</a></p> <?php function taille_variable($variable,$taille_min=0,$taille_max=0){ global $_POST; if(!isset($_POST[$variable])){ // valeur non dfinie return false; }elseif (strlen($_POST[$variable])<$taille_min){ return False; }elseif(strlen($_POST[$variable])>$taille_max){ return FALSE; } return True; } ?>