Outils de gestion des visiteurs en PDO

JPBruneau

Cet article regroupe la majeure partie des notions utiles à la bonne gestion des visiteurs d'une zone de site nécessitant une authentification. Vous y trouverez quelques bonus, tels que l'exploitation de la base de données en vue d'envoyer un e-mail à tous vos inscrits (ou une partie) grâce à votre liste de diffusion, le téléchargement d'avatars, un outil d'administration des visiteurs, etc.

Notez que tout cet article est conçu en PDO, il emploie un encodage Latin1.

Commentez

- Titre : Outils de gestion des visiteurs en PDO

- Auteur : JPBruneau

- Parution : 26 mai 2013

- Mise à jour : 8 juin 2013

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2012 JPBruneau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Avant-propos

- II. Prérequis

- III. Dans cet article

- IV. Liste des éléments de l'article

- V. Les includes majeurs

- VI. Les PHP principaux

- VII. Mise en place

- VIII. Remerciements

I - Avant-propos

S'adressant à tous ceux qui maîtrisent la « programmation permettant de gérer un site Web », cet article a pour but de vous donner une « Boîte à outils de gestion des visiteurs ». le découpage des PHP en modules indépendants vous facilitera, nous l'espérons, l'extraction de tout ou partie des codes présents dans cet article, afin de les adapter a vos besoins.

Developpez.com possède déjà un grand nombre de tutoriels et d'articles sur PDO, le log-in, les uploads, la gestion des e-mails, etc. Le but du présent article reste donc de regrouper en un seul article tous ces éléments en se limitant au strict minimum.

II - Prérequis

Bon programmeur comme vous l'êtes, vous savez faire un formulaire et en récupérer les saisies, vous maîtrisez également les cookies et sessions. Cependant, ces deux notions fondamentales pour la bonne gestion des visiteurs, seront revues en détail.

À ce sujet, je vous recommande cependant la lecture de ces deux articles :

- concernant les formulaires : article sur les formulaires ;

- concernant les cookies et sessions : article sur le cookies et sessions.

III - Dans cet article

Si vous dominez ce mécanisme, alors vous allez pouvoir faire une bonne révision sur :

- la gestion de base par des requêtes PDO ;

- le contrôle d'une authentification (cookies/sessions/captcha/enregistrement SQL par PDO) ;

- la gestion d'une mailing list ;

- la mise a jour d'un profil visiteur avec l'upload de son avatar, et autres modifications de son profil ;

- l'utilisation d'un outil d'administration de la base de données.

Maintenant, nous allons donc analyser un par un les PHP de notre article.

IV - Liste des éléments de l'article

Avant d'expliquer un à un chaque PHP, voici la liste des éléments de notre article :

- pdo.css : la feuille de style du « mini site », inutile de s'attarder ici…

- captcha.php : il s agit du captcha utilisé pour empêcher les moteurs de tester plein d'authentifications sur le site, il faut le considérer comme une image, il s'utilise dans IMG src=etc. ;

- index.php : est comme toujours, le point de départ, véritable lien vers tous les modules de l'article ;

- inscription.php : est le module principal gérant l'inscription et la validation des visiteurs ;

- vous y trouverez également le module de récupération de mot de passe oublié ;

- ce PHP inclut également lesw/form_saisie.php, ensemble des FORM de saisie d'une inscription que vous retrouverez dans le ZIP des sources ;

- mailing.php : outil d'administration complet de la base de données, qui inclut l'utilisation sommaire de la mailing list ;

- pdo_sql.php : module qui sera inséré dans tous les PHP utilisant PDO (contient également le DOCTYPE sommaire du site de l'article) ;

- site_ok.php : c'est le PHP où arrivent les visiteurs logués, c'est ici que nous leur proposons la mise à jour de leur profil ;

- visiteurs_maj.php : un tout petit PHP de mise à jour des visiteurs ;

- visiteurs_upload.php : son complément pour l'upload des avatars ;

- visiteurs.sql : il s'agit d'un exemple de SQL qui vous servira pour tester le tout !

Il vous suffit de l'importer dans votre base de données.

Dans le répertoire lesw/

- chopin.ttf : une petite police pour le captcha, nous en reparlerons ;

- wsession.php : inclus dans toutes les pages, c'est l'élément clé de l'authentification du visiteur ;

- index.php : bien sûr la protection de tout répertoire contre les hackers ;-).

Dans notre exemple, c'est dans ce répertoire que les avatars seront stockés.

J'aimerais insister sur le côté élémentaire de cet article, son but étant de vous regrouper des notions indispensables pour réaliser ce type de suivi des visiteurs dans un seul article.

Presque toutes les pages utilisant PDO, et l'authentification, ont un include :

- pdo_sql.php ;

- wsession.php.

C'est par l'analyse de ces deux PHP que nous commencerons.

V - Les includes majeurs

pdo_sql.php

Ceux qui ont suivi l'article sur le chat AJAX vont retrouver ce PHP qui remplit trois fonctions :

- la connexion à PDO (SQL) ;

- la sécurisation des POST, GET SESSION, etc. façon christele_r ;

- la génération (affichage) du DOCTYPE.

Notez que tous les fichiers PHP sont sécurisés pour ne pas être exécutables directement dans ce premier PHP. Vous découvrez le pourquoi d'une variable présente dans le PHP qui l'appelle en include.

pdo_sql.php

1. <?php

2. if (!isset($moiChri))   {

3. header('Location: index.php');

4. exit;

5. }

6. try {

7. $bdd = new PDO('mysql:host=localhost;dbname=jplyne', 'root', '');

8. $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

9. }

10. catch(Exception $e) {

11. die('Erreur : '.$e->getMessage());

12. }

13. function secur($a)

14. {

15. $a=str_replace("<","",$a);

16. $a=str_replace(">","",$a);

17. $a=str_replace("&&","",$a);

18. $a=str_replace("||","",$a);

19. //==== etc. au goût de chacun

20. return $a;

21. }

22. if ($moiChri=="O") {

23. //==== alors on affiche le DOCTYPE==et Haut de page==

24. ?>

25. <!- ICI &#8594;>

26. <?php } ?>

Donc reparlons de cette protection par les cinq premières lignes du PHP.
Si la condition d'existence de $moiChri n'est pas vérifiée, alors nous renvoyons le curieux à l'index du site ! Mais nous prenons soins de mettre un exit ; juste derrière en effet n'oubliez pas (et vous avez certainement des PHP avec ce cas de figure).

Oui, le reroutage aura bien lieu pour le visiteur, mais sans l'exit ; le PHP continuera à s'exécuter jusqu'au bout sur le serveur… alors n'oubliez jamais ce simple exit !

Autre remarque,il vous faudra remplir l'identifiant SQL avec vos paramètres.
Nom de votre base de données, l'idenfiant de connexion et le mot de passe.
Et maintenez bien la ligne d'initialisation des erreurs et exceptions PDO.

Pour la fonction secur() ; c'est juste pour vous montrer, voulant ne saisir qu'un identifiant,
comment éliminer les éléments que nous refusons. Caractères anormaux dans un nom, prénom, e-mail, etc., libre a vous d'en concevoir d'autres.

Simplement, pour ceux qui débutent, sachez que ce module est efficace, simple et remplit bien son rôle…
Coté sécurité, aucun code sournois ne peut passer, d'autant que les PREPARE de PDO sont un barrage très efficace à toute intrusion. Vous verrez, c'est préparé dans les PHP de l'article.

En ce qui concerne l'encryptage du mot de passe pour le protéger, nous avons choisi d'ajouter un « grain de sel » au mot de passe et d'appliquer sha1() ce qui donne :

exemple mot de passe

<?php
$mdpsha1=$votre_mdp.'grainsel' ;
$mdpsha1=sha1($mdpsha1) ;
?>

Cependant, regardez des articles sur le sujet pour choisir votre méthode, par exemple : comment encoder les mots de passe

wsession.php

Ce deuxième include majeur va gérer tous les états d'un visiteur, il rend disponible dans toutes les pages PHP toutes les informations du visiteur, même si nous voulons son âge ou l'endroit où il habite, etc.

wsession,php

<?php
if (!isset($moiChri)){
echo '<meta http-equiv="refresh" content="0;URL=../index.php">';
exit;
}
$ControlNom= "visiteur";
$VisiteurMdpSha1= "";
$VisiteurOK= "";
$afficher = (isset($_SESSION['afficher'])) ? $_SESSION['afficher'] :'';
// 1=========DELOGUE si demande ( $_POST["dd"] est 1 ) ============
$dd = (isset($_POST['dd'])) ? $_POST['dd'] : 0;
if ($dd!=0 && $dd!=1) $dd=0;
if ( $dd==1 ) {
$dd=987;
setCookie('foxlog');
setCookie('foxlogmdp');
setCookie('foxlog','visiteur',(time()+60*60*24*365));
setCookie('foxlogmdp','mdp',(time()+60*60*24*365));
$_SESSION['VisiteurValide']="visiteur";$VisiteurValide="visiteur";
}
if ( $dd==0 ) {
// ===  si non on ne sait rien encore du visiteur =======
$VisiteurValide="visiteur";
// 2=== on reçoit un login valide cookie et session regénérés===
// === valable forcement car login est prioritaire ==
$login= (isset($_POST['login'])) ? secur($_POST['login']) : 'N';
$login_pseudo = (isset($_POST['login_pseudo'])) ?secur($_POST['login_pseudo']) : 'visiteur';
$login_mdp = (isset($_POST['login_mdp'])) ? secur($_POST['login_mdp']) : 'mdp';
$loginX=$login_mdp."axce32";
$login_mdpsha1=sha1($loginX);
// ==si le login est valide on met tout à jour COOKIE SESSION ===
if ($login_pseudo!="visiteur"){
$result = $bdd->prepare("SELECT * FROM visiteurs  WHERE  nom=:LeUsr ");
$result->bindValue(':LeUsr', $login_pseudo, PDO::PARAM_STR);
$result->execute();
while ($row = $result->fetch())  {
$ControlNom= $row['nom'];
$VisiteurMdpSha1= $row['VisiteurMdpSha1'];
$VisiteurOK= $row['VisiteurOK'];
}
if($ControlNom==$login_pseudo && $VisiteurMdpSha1==$login_mdpsha1 && $VisiteurOK=="O" ) {
$VisiteurValide=$ControlNom;
setCookie('foxlog',$ControlNom,(time()+60*60*24*365));
setCookie('foxlogmdp',$login_mdpsha1,(time()+60*60*24*365));
$_SESSION['VisiteurValide']=$VisiteurValide;
}
else $_SESSION['afficher']="<br />Erreur Login contrôlez votre saisie&#8230;<br /><br />";
}
if ($login=="N"){
// 3 ==========pas de delogage ni login voir SESSION =========
$VisiteurValide = (isset($_SESSION['VisiteurValide'])) ?$_SESSION['VisiteurValide'] : 'visiteur';
// ===  OUI dédà logue ON EN RESTE LÀ ========
$Cbon=99;
if ($VisiteurValide!="visiteur") $Cbon=0; //======SESSION VALIDE
//===quand session valide le cookie est toujours valide=======
if ($Cbon==99) {
// 4 == NON le visiteur vient d'arriver regardons son COOKIE==
if (!isset($_COOKIE["foxlog"])) $VisiteurValide="visiteur";
else $VisiteurValide=$_COOKIE["foxlog"];
if (!isset($_COOKIE["foxlogmdp"])) $userMDP_M5="mdp";
else $userMDP_M5=$_COOKIE["foxlogmdp"];
//======== on contrôle nom et mot de passe
if ($VisiteurValide!="visiteur"){
$result = $bdd->prepare("SELECT * FROM visiteurs  WHERE  nom=:LeUsr ");
$result->bindValue(':LeUsr', $VisiteurValide, PDO::PARAM_STR);
$result->execute();
while ($row = $result->fetch()){
$ControlNom= $row['nom'];
$VisiteurMdpSha1= $row['VisiteurMdpSha1'];
$VisiteurOK= $row['VisiteurOK'];
}
if($ControlNom!=$VisiteurValide || $VisiteurMdpSha1!=$userMDP_M5 || $VisiteurOK=="N" ){
// == rien n'est OK on vide tout ( session et cookie)==
$VisiteurValide="visiteur";
$_SESSION['VisiteurValide']="visiteur";
setCookie('foxlog','visiteur',(time()+60*60*24*365));
setCookie('foxlogmdp','mdp',(time()+60*60*24*365));
}
else //======== tout est OK
{
$VisiteurValide=$ControlNom;
setCookie('foxlog',$VisiteurValide,(time()+60*60*24*365));
setCookie('foxlogmdp',$VisiteurMdpSha1,(time()+60*60*24*365));
$_SESSION['VisiteurValide']=$VisiteurValide;
}
}
}
}
}
// ====================POUR TERMINER ON PREND TOUT LE USER===========
if ($VisiteurValide!="visiteur")  {
$result = $bdd->prepare("SELECT * FROM visiteurs  WHERE  nom=:LeUsr ");
$result->bindValue(':LeUsr', $VisiteurValide, PDO::PARAM_STR);
$result->execute();
while ($row = $result->fetch()){
$UserId= $row['id'];
$ControlNom= $row['nom'];
$ControlPreNom= $row['prenom'];
$ControlMail= $row['mail'];
$VisiteurMdpSha1= $row['VisiteurMdpSha1'];
$VisiteurOK= $row['VisiteurOK'];
$VisiteurX= $row['VisiteurX'];
$Avatar= $row['Avatar'];
}
}
// ====================== FIN ========================================
?>

En un regard, vous voyez que l'ordre logique ligne par ligne de ce PHP respecte la logique d'analyse des éléments pouvant intervenir :

- le visiteur a-t-il demandé a être délogué ? Un formulaire situé dans index.php met le POST dd à 1.
Dans ce cas, inutile de chercher aucun contrôle, car si un visiteur a pu cliquer cet ordre c'est parce qu'il était logué. De toute façon, comme vous le voyez, son cookie est vidé et sa session, avec comme valeurs visiteur pour l'identifiant et mdp pour le mot de passe ! Ce moyen est intéressant, car il permet de contrôler une vraie valeur c'est toujours plus simple ;

- c'est quelle que soit la raison, lorsque nous recevons un identifiant/mot de passe là encore bien placé dans la logique de cette page, car même s'il s agit d'un visiteur déjà logué, il peut vouloir changer de profil, donc nous ne contrôlons pas s'il est ou non logué !
Par contre nous allons regarder si son pseudo (nom) et mot de passe existent,
Si oui alors nous recréons son cookie, ses variables et ses variables de session ;

- nous voici sans rien, alors que connaissons-nous de ce visiteur ?
Donc la logique veut que s'il est déjà dans une session, c'est qu'il vient d'une autre page ou revient assez vite avant que sa session soit expirée !
Il est donc conforté comme identifié, reste à recharger toutes ses données au cas où ;

- alors si nous arrivons ici, c'est parce que ce visiteur vient d'arriver.
Il nous reste donc à contrôler s'il a un cookie valide, et dans ce cas créer sa session et charger ses données.

Un simple PHP destiné à l'include, mais c'est bien là le cœur de tout notre boîte a outils !

VI - Les PHP principaux

Reste à prendre un par un nos outils

index.php :arrivée normale sur les outils, il propose d'accéder selon vos droits a tous les outils, mais bien sur c'est dans ce PHP que j'ai placé l'identification classique des visiteurs.
Avec la demande de récupération des mots de passe perdus.
Ou l'inscription au site.
Si l'utilisateur est « admin » mot de passe admin l'accès à tous les outils est alors ouvert.

index.php

<?php
session_start();
$moiChri="O";
require("pdo_sql.php");
include("lesw/wsession.php");
$_SESSION['Etape_en_cour']=1; //==si demande inscription on sera en étape 1
//== de la procédure
?>
<div class="centre01">
<br /><span class="leTitre">gestion visiteurs</span><br />
<?php
echo "<span class='LaFonte_4_Coul1' >".$afficher."</span><br />";
$_SESSION['afficher']="";

// ====notre moteur wsession.php a donc indiqué
// ====qui nous visite et son état====
// 1 ===========il doit se loguer================
if ($VisiteurValide =="visiteur") //==en effet il n'a pas de nom==
{
// ==alors nous proposons trois choix
// ==se loguer
// ==redemander mdp perdu
// ==s'inscrire
?>
Vous devez être connecté pour accéder a cette partie du site<br /><br />
<a href="inscription.php" class="LesA12" >inscrivez-vous si vous n'êtes pas inscrit</a>
<br /><br /><br />
Ou connectez-vous<br /><br /><br /><br /><br />
<form method='post' action='index.php' ><br />
Login nom : <input type='text' name='login_pseudo'  size='40'   /><br />
Mot de passe :<input type='password' name='login_mdp'  size='40'   /><br />
<input type='hidden' name='login'  value='login'  />
<br /><br />
<input type='submit' name='submit' value='Envoyer'  />
</form>
<br /><br />
<form method='post' action='inscription.php' >
<input type='hidden' name='DemandeMDP'  value='mdp'  />
<input type='submit' name='submit' value='Mot de passe oublie'  />
</form>
</div>
<?php
}
// 2=====il s'agit de l'admin donc tout les outils possibles=========
if ($VisiteurValide =="admin")
{
?>
<img src="lesw/admin.jpg" alt="" /> Bonjour Admin
<form method='post' action='index.php' >
<input type='hidden' name='dd'  value='1'  />
<input type='submit' name='submit' value='Deconection'  />
</form> <br /><br /><br /><br />
<a href="mailing.php" class="LesA12" >Gérer les users (administration)</a><br />
<a href="site_ok.php" class="LesA12" >entrez dans le site utilisateur</a><br />
<br /><br />
</div>
<?php
}
// 3=======un visiteur avec un log-in valide peut aller sur le site protégé==

if ($VisiteurValide !="admin" && $VisiteurValide !="visiteur")
{
echo "<br /><img src='lesw/".$Avatar."' alt='' /> Bonjour ".$VisiteurValide." <form method='post' action='index.php' ><input type='hidden' name='dd'  value='1'  /><input type='submit' name='submit' value='Deconection'  /></form><br /><br />";
?>
<a href="site_ok.php" class="LesA12" >entrez dans le site</a><br />
<br /><br />
</div>
<?php
}
?>
</body></html>

Également en parcourant index.php, vous verrez que la valeur de session qui positionne les sept étapes de inscription.php est mise à 1 dès le début de l'index.php, en effet ce sera toujours par index.php que ce module sera appelé.

Pour le reste, les trois cas possibles de l'index sont clairement décrits ;-).

inscription.php : toute la gestion de l'inscription basique d'un visiteur, il s'agit du plus gros PHP, mais en fait assez simple, son organisation : la récupération des POST/GET/SESSIONS avec un premier contrôle pour rejeter ceux qui sont déjà identifiés (inscrits), ensuite commencent les étapes d'affichage des textes légaux avec demande d'accord, etc.Et enfin la saisie nom, e-mail et mot de passe du visiteur.
Nous sommes alors à la phase 4 avec l'envoi de l'e-mail de validation :

inscription.php

<?php
session_start();
$moiChri="O";
require("pdo_sql.php");
include("lesw/wsession.php");
$L_Etape=99;
/* == renseignez votre site, votre e-mail (le provider indique dans php.ini)= */
$AdrWebSimpleTexte="mon site web ";
$MailValidation="validator@orange.fr";
$AdrWeb="http://127.0.0.1/le0www";
/* sur un site  $AdrWeb="http://www.tonsite.com"; */
/* en local l'alias de EasyPHP */

// ====================on récupère tout les POST possibles================
$nomM = (isset($_POST['nomM'])) ? secur($_POST['nomM']) : "";
$Nouveau_MotPasseR = (isset($_POST['Nouveau_MotPasseR'])) ? secur($_POST['Nouveau_MotPasseR']) : "";
$MotPasse_confirmR = (isset($_POST['MotPasse_confirmR'])) ? secur($_POST['MotPasse_confirmR']) : "";

$DemandeMDP = (isset($_POST['DemandeMDP'])) ? secur($_POST['DemandeMDP']) : "";
$L_Etape = (isset($_POST['L_Etape'])) ? secur($_POST['L_Etape']) : 99;

$avant13 = (isset($_POST['avant13'])) ? secur($_POST['avant13']) : "";
$apre13 = (isset($_POST['apre13'])) ? secur($_POST['apre13']) : "";

$accord = (isset($_POST['accord'])) ? secur($_POST['accord']) : "";
$non_accord = (isset($_POST['non_accord'])) ? secur($_POST['non_accord']) : "";

$VerifiCaptcha = (isset($_POST['VerifiCaptcha'])) ? secur($_POST['VerifiCaptcha']) : "x";
$inscription_nom = (isset($_POST['inscription_nom'])) ? secur($_POST['inscription_nom']) : "X";
$inscription_mail = (isset($_POST['inscription_mail'])) ? secur($_POST['inscription_mail']) : "Y";
$inscription_mail2 = (isset($_POST['email_confirm'])) ? secur($_POST['email_confirm']) : "Z";
$mdpX = (isset($_POST['Nouveau_MotPasseI'])) ? secur($_POST['Nouveau_MotPasseI']) : "Y";
$mdpX2 = (isset($_POST['MotPasse_confirm'])) ? secur($_POST['MotPasse_confirm']) : "Y2";
$NomPourMailMDP = (isset($_POST['NomPourMailMDP'])) ? secur($_POST['NomPourMailMDP']) : "";
$MailPourMailMDP = (isset($_POST['MailPourMailMDP'])) ? secur($_POST['MailPourMailMDP']) : "";

$captcha = (isset($_SESSION['captcha'])) ? $_SESSION['captcha'] : 'xxx';

// =====si nous démarrons Etape est mis à 1  ==========================
$Etape_en_cour = (isset($_SESSION['Etape_en_cour'])) ? $_SESSION['Etape_en_cour'] :1;
// =====si nouveau mot de passe on traite de suite et retour au login===
if($Nouveau_MotPasseR!="" && $Nouveau_MotPasseR==$MotPasse_confirmR && $L_Etape==8) {
$brouillon=$Nouveau_MotPasseR."axce32";
$VisiteurMdpSha1=sha1($brouillon);

$req = $bdd->prepare("UPDATE visiteurs SET VisiteurMdpSha1 = :LeSha1  WHERE nom = :Avat");
$req->bindValue(':LeSha1', $VisiteurMdpSha1, PDO::PARAM_STR);
$req->bindValue(':Avat', $nomM, PDO::PARAM_STR);
$req->execute();
echo "<meta http-equiv='refresh' content='0;URL=index.php'>";
exit;
}
// =========== les GET lors des mails de validation =======
// ========== on force alors  l'Etape à 7 ou 8 ===============
$ValuiM = (isset($_GET['ValuiM'])) ? secur($_GET["ValuiM"]) : 'xx';
$VanomM = (isset($_GET['VanomM'])) ? secur($_GET["VanomM"]) : 'xx';

$Valui = (isset($_GET['Valui'])) ? secur($_GET["Valui"]) : '';
$Valavat = (isset($_GET['Valavat'])) ? secur($_GET["Valavat"]) : 'xx';
// =======le mail a été validé à l'inscription on finalise===
if ($Valui!="" && $Valavat!="")
{
$L_Etape=7;
$Etape_en_cour=7;
$_SESSION['Etape_en_cour']=7;
}
// ==Mdp=====le mail a été validé on ressaisit son mot de passe===
if ($ValuiM!="xx" && $VanomM!="")
{
//=======contrôle sécurité==
$result = $bdd->prepare("SELECT * FROM visiteurs  WHERE  nom=:LeUsr ");
$result->bindValue(':LeUsr', $VanomM, PDO::PARAM_STR);
$result->execute();
while ($row = $result->fetch())
{  $controler= $row['VisiteurMdpSha1']; }
if($controler!=$ValuiM)
{
$_SESSION['afficher']=" Vous utilisez une procédure anormale recommencez";
echo '<meta http-equiv="refresh" content="0;URL=index.php">';
exit;
}
$L_Etape=8;
$Etape_en_cour=8;
$_SESSION['Etape_en_cour']=8;
}

// ========Seuls les visiteur peuvent entrer dans ce module========
// =========Si l'inscription est OK =======================
if ($VisiteurValide!="visiteur") //==logue donc on sort====
{
echo '<meta http-equiv="refresh" content="0;URL=index.php">';
exit;
}
if($L_Etape==99) $L_Etape=$Etape_en_cour;
$_SESSION['Etape_en_cour']=$L_Etape;
$FlagEtape=0;
// ======================Étape 1 12ans ================

if ($L_Etape==1 && $apre13!="") {$L_Etape=2;$_SESSION['Etape_en_cour']=$L_Etape;$FlagEtape=0;}
if ($L_Etape==1 && $avant13!="") {$L_Etape=2;$_SESSION['Etape_en_cour']=$L_Etape;$FlagEtape=99;}

// ======================Étape 2 agréée oui non===========
if ($L_Etape==2 && $non_accord!="" && $accord=="" && $FlagEtape!=99)
{
echo '<meta http-equiv="refresh" content="0;URL=index.php">';
exit;
}
if ($L_Etape==2 && $non_accord=="" && $accord!="" && $FlagEtape!=99)
{$L_Etape=3;$_SESSION['Etape_en_cour']=$L_Etape;$FlagEtape=99;}
// =========Etape 3 sera l'enregistrement (saisie)=============
// =========Etape 4 demande e-mail récupération MDP==============
if ($DemandeMDP!="")
{
$_SESSION['afficher']=$DemandeMDP;
$DemandeMDP="";
$L_Etape=5;
}
//============ Étape 5 envoi du mot de passe ==============================
if ($L_Etape==5)
{
$_SESSION['Etape_en_cour']=$L_Etape;
$FlagPro=0;
$Syntaxe='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#';
$MailPourMailMDP = strtolower($MailPourMailMDP);
if(preg_match($Syntaxe,$MailPourMailMDP)){ $FlagPro=0;}
else $FlagPro=99;
if($NomPourMailMDP!="") {$X=0;}
else $FlagPro=99;
if ( $FlagPro==0)
{
$LeNom="";
$LeMail="";
$VisiteurMdpSha1="";
$VisiteurOK= "";
$result = $bdd->prepare("SELECT * FROM visiteurs  WHERE  nom=:LeUsr ");
$result->bindValue(':LeUsr', $NomPourMailMDP, PDO::PARAM_STR);
$result->execute();
while ($row = $result->fetch())
{
$LeNom= $row['nom'];
$LeMail= $row['mail'];
$VisiteurMdpSha1= $row['VisiteurMdpSha1'];
$VisiteurOK= $row['VisiteurOK'];
}
if ($LeNom==$NomPourMailMDP && $LeMail==$MailPourMailMDP)
{
$X_A = "".$LeNom." <".$LeMail.">";
$X_De = "From: Forum ".$AdrWebSimpleTexte." <".$MailValidation.">";
$Le_Objet = "Message du Forum ".$AdrWebSimpleTexte." pour mot de passe\n\n\n";
$Le_Body = "Bonjour ".$LeNom." , ce message est destiné à vous rendre\n";
$Le_Body .= "votre mot de passe\n";
$Le_Body .= "=========================== \n";
$Le_Body .= "Notez bien votre Pseudo et réactivez votre Mot de passe\n";
$Le_Body .= "\n".$LeNom." \n";
$Le_Body .= "\n".$AdrWeb."/inscription.php?ValuiM=".$VisiteurMdpSha1."&VanomM=".$LeNom."\n";
$Le_Body .= "\nAu plaisir de vous lire,\n";
$Le_Body .= "\nL'équipe du forum.\n\n\n";
mail($X_A, $Le_Objet, $Le_Body, $X_De);
$_SESSION['afficher']=" Un mail vous a été envoyé validez le<br /> pour saisir votre mot de passe";
echo '<meta http-equiv="refresh" content="0;URL=index.php">';
exit;
}
}
}
// =================OUI CAR SERA LU APRÈS SAISIE====================
if ($Etape_en_cour==3)
{

$Pro=0;
if ($VerifiCaptcha == $captcha)  $x="";
else {$_SESSION['afficher']="Veuillez entrer le bon Code de contrôle !";$Pro=99;}

$Syntaxe='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#';
$inscription_mail = strtolower($inscription_mail);
$inscription_mail2 = strtolower($inscription_mail2);

if(preg_match($Syntaxe,$inscription_mail)) $X=0;
else {$_SESSION['afficher']="E-mail incorrect ";$Pro=99;}
if(preg_match($Syntaxe,$inscription_mail2)) $X=0;
else {$_SESSION['afficher']="E-mail incorrect ";$Pro=99;}

if($inscription_mail!=$inscription_mail2) {$_SESSION['afficher']="E-mail différents ";$Pro=99;}

if($mdpX!=$mdpX2) {$_SESSION['afficher']="Mots de passe différents ";$Pro=99;}

if (ctype_alnum($inscription_nom)) $X=0;
else {$_SESSION['afficher']=$inscription_nom." pas alphanumérique";$Pro=99;}

if (ctype_alnum($mdpX)) $X=0;
else {$_SESSION['afficher']=$mdpX." pas alphanumérique";$Pro=99;}
if($Pro!=0) $_SESSION['captcha']="";
// ##== Si $Pro=0 on peut essayer de traiter ====
if ( $Pro==0)
{
$LeNom="";
$LeMail="";
$result = $bdd->prepare("SELECT * FROM visiteurs WHERE  nom=:LeUsr ");
$result->bindValue(':LeUsr', $inscription_nom, PDO::PARAM_STR);
$result->execute();
while ($row = $result->fetch())
{
$LeNom= $row['nom'];
}
if ($LeNom==$inscription_nom) {$_SESSION['afficher']="".$inscription_nom." existe déjà";$Pro=99;}
$result = $bdd->prepare("SELECT * FROM visiteurs WHERE  mail=:LeUsr ");
$result->bindValue(':LeUsr', $inscription_mail, PDO::PARAM_STR);
$result->execute();
while ($row = $result->fetch())
{
$LeMail= $row['mail'];
}
if ($LeMail==$inscription_mail) {$_SESSION['afficher']="".$inscription_mail." existe déjà";$Pro=99;}
}
// ##==== Pro toujours à zéro parfait on continue de traiter l'Etape 3
if ( $Pro==0)
{
$LeNom=$inscription_nom;
$LeMail=$inscription_mail;
$brouillon=$mdpX2."axce32";
$VisiteurMdpSha1=sha1($brouillon);
$VisiteurOK= "N";
$VisiteurX="".$captcha."";
$Avatar="sans.gif";

$ajout = $bdd->prepare("INSERT  INTO visiteurs (nom, mail,VisiteurMdpSha1,VisiteurOK,VisiteurX,Avatar ) VALUES ( :nom,:mail,:VisiteurMdpSha1,:VisiteurOK,:VisiteurX,:Avatar)");
$ajout->bindValue(':nom', $LeNom, PDO::PARAM_STR);
$ajout->bindValue(':mail', $LeMail, PDO::PARAM_STR);
$ajout->bindValue(':VisiteurMdpSha1', $VisiteurMdpSha1, PDO::PARAM_STR);
$ajout->bindValue(':VisiteurOK', $VisiteurOK, PDO::PARAM_STR);
$ajout->bindValue(':VisiteurX', $VisiteurX, PDO::PARAM_STR);
$ajout->bindValue(':Avatar', $Avatar, PDO::PARAM_STR);
$ajout->execute();
$X_A = "".$LeNom." <".$LeMail.">";
$X_De = "From: ".$AdrWebSimpleTexte." <".$MailValidation.">";
$Le_Objet = "Message du Forum ".$AdrWebSimpleTexte." pour validation\n\n\n";
$Le_Body = "Bonjour ".$LeNom." , ce message est destiné à terminer votre enregistrement  \n\n";
$Le_Body .= "Merci de cliquer sur ce lien: \n";
$Le_Body .= "=========================== \n";
$Le_Body .= "\n".$AdrWeb."/inscription.php?Valui=".$captcha."&Valavat=".$LeNom."\n";
$Le_Body .= "Notez bien vos Pseudo et Mot de passe\n";
$Le_Body .= "\n".$LeNom." Mot de passe ".$mdpX2."\n";
$Le_Body .= "\nAu plaisir de vous lire,\n";
$Le_Body .= "\nL'équipe du forum.\n";
mail($X_A, $Le_Objet, $Le_Body, $X_De);
$L_Etape=6; // === l Etape 6 TERMINE L'ENREGISTEMENT
}
}
// ================Étape 7======================
// === validation de l'e-mail
$Pg7="";

if ($Valui!="" && $Valavat!="" && $L_Etape==7)
{
// == 1 on contrôle
$pasbon=0;
$UserId="";
$LeNom="";
$LeMail="";
$UserAvat="";
$VisiteurMdpSha1="";
$VisiteurOK= "";
$VisiteurX= "";
$result = $bdd->prepare("SELECT * FROM visiteurs  WHERE  nom=:LeUsr ");
$result->bindValue(':LeUsr', $Valavat, PDO::PARAM_STR);
$result->execute();
while ($row = $result->fetch())
{
$LeNom= $row['nom'];
$VisiteurX= $row['VisiteurX'];
$VisiteurMdpSha1= $row['VisiteurMdpSha1'];
}
if ($LeNom!=$Valavat || $VisiteurX!=$Valui)
{
$Pg7="Enregistrement impossible pour ".$Valavat."";
}
// == 2 on valide et flag a Ok
if ($LeNom==$Valavat && $VisiteurX==$Valui && $pasbon==0)
{
$result = $bdd->prepare("UPDATE visiteurs SET VisiteurOK = 'O',VisiteurX= ' ' WHERE nom = :Avat");
$result->bindValue(':Avat', $Valavat, PDO::PARAM_STR);
$result->execute();
$L_Etape=4;
$_SESSION['Etape_en_cour']=4;
}
}
// ===tout est contrôlé on affiche la saisie selon Etape ====
echo ("<span class='LaFonte_4_Coul1' >".$afficher."</span>");
$_SESSION['afficher']="";
echo ("<br /><table width=100% border=1><tr><td><br />");
include("lesw/form-saisie.php");
?>
<br /><br /><br /><br /><br />
</td></tr></table>
</body></html>

mailing.php : l'intérêt de ce module administration est avant tout de rassembler
toutes les fonctions élémentaires de PDO dans la gestion d'une table SQL par PDO.
Avec le petit plus de la liste qui en plus fait office de mailing list. Les fonctions sont clairement séparées : ajout, modification, suppression et mailing !

mailing.php

<?php
session_start();
$moiChri="O";
require("pdo_sql.php");
// ====contrôle des POST= et GET==========
$a = (isset($_GET['a'])) ? secur($_GET['a']) : '';
if($a=="a" || $a=="m" || $a=="s" || $a=="Mail" || $a=="Mail2") $_SESSION['aa']=$a;
$a = (isset($_SESSION['aa'])) ? $_SESSION['aa'] : 'm';

$SonNom = (isset($_POST['nom'])) ? secur($_POST['nom']) : '';
$SonPreNom = (isset($_POST['prenom'])) ? secur($_POST['prenom']) : '';
$id_data = (isset($_POST['modid'])) ? $_POST['modid'] : 0;
$id_data=intval($id_data);
$SonMail = (isset($_POST['mail'])) ? secur($_POST['mail']) : '';
$avatar = (isset($_POST['Avatar'])) ? secur($_POST['Avatar']) : 'vide.gif';
$mdp_sha1="mdp";
$mdp = (isset($_POST['SonMdp'])) ? secur($_POST['SonMdp']) : 'mdp';
if ($mdp!="mdp"){
$X=$mdp."axce32";
$mdp_sha1=sha1($X);
}
?>
<div class="centre01">
<br /><span class="leTitre">gestion visiteurs</span><br /><br />
<input type="button" value="Retour index" OnClick="window.location.href='index.php'">
<input type="button" value="Ajouter" OnClick="window.location.href='mailing.php?a=a'">
<input type="button" value="Modifier" OnClick="window.location.href='mailing.php?a=m'">
<input type="button" value="Supprimer" OnClick="window.location.href='mailing.php?a=s'">
<input type="button" value="Mailing" OnClick="window.location.href='mailing.php?a=Mail'">

<br /><br />

<?PHP
if($a=="a"){ echo ("Vous êtes en phase d'Ajout<br />");}
if($a=="m"){ echo ("Vous êtes en phase de Modification<br />");}
if($a=="s"){ echo ("Vous êtes en phase de Suppression<br />");}

// 1======================  Suppression =======================

if($a=="s")
{
if (isset($_POST["LaTbl"]))
{
$delete = $bdd->prepare('DELETE FROM visiteurs WHERE id = :userid');
echo "vous avez coché<br />";
for ($a1=0; $a1<count($_POST['LaTbl']); $a1++)
{
$xx=intval($_POST['LaTbl'][$a1]);
$delete->bindValue(':userid', $xx, PDO::PARAM_INT);
$delete->execute();
}
}
//=========on affiche ou réaffiche======================
echo "<form method='POST' action='mailing.php'><table class='LaTblCenter'>";
$req = $bdd->prepare('SELECT * FROM visiteurs');
$req->execute();
while ($donnees = $req->fetch())
{
echo "<tr><td><input type='checkbox' name='LaTbl[]' value='".$donnees['id']."'>".$donnees['id']." - ".$donnees['nom']." - ".$donnees['prenom']."</td></tr>";
}

echo "</table><br /><br /><input type='submit' value='Suprimer'></form>";
}
// 2======================  modification =======================
if($a=="m")
{
//==modif1====pas de choix on affiche la liste==============
if($id_data==0)
{
echo "<form method='POST' action='mailing.php'><table class='LaTblCenter'>";
$req = $bdd->prepare('SELECT * FROM visiteurs');
$req->execute();
while ($donnees = $req->fetch())
{
echo "<tr><td><input type='radio' name='modid' value='".$donnees['id']."'>".$donnees['id']." - ".$donnees['nom']." - ".$donnees['prenom']."</td></tr>";
}
echo "</table><br /><br /><input type='submit' value='Modifier'></form>";
}
if($id_data!=0 && $SonNom=="")
{
//==modif2============on va saisir========================
echo ("<br /><form method='POST' action='mailing.php'><br />");
$req = $bdd->prepare('SELECT * FROM visiteurs WHERE id= :userid');
$req->bindValue(':userid', $id_data, PDO::PARAM_INT);
$req->execute();
$donnees = $req->fetch();
echo ("<input type='hidden' name='modid'  value=".$id_data."><br />");
echo ("<br /><input type='hidden' name='nom'  value=".$donnees['nom']."><br />");
echo ("<input type='hidden' name='Avatar'  value=".$donnees['Avatar']."><br />");
echo ("Nom <input type='text' name='nom2' SIZE='25' value='".$donnees['nom']."' disabled='disabled'><br />");
echo ("Prenom <input type='text' name='prenom' SIZE='25' value='".$donnees['prenom']."'><br />");
echo ("Mail <input type='text' name='mail' SIZE='40' value='".$donnees['mail']."'><br />");
echo ("Avatard <input type='text' name='Avatar2' SIZE='25' value='".$donnees['Avatar']."' disabled='disabled'><br />");
echo ("<input type='submit' value=' Modifier ' ><br /><br />");
echo ("<br /><br /></form>");
}
if($id_data!=0 && $SonNom!="")
{
//==modif3========on va enregistrer les modifications=========
$Lupdate = $bdd->prepare("UPDATE visiteurs SET  prenom= :prenom ,mail= :mail,Avatar= :Avatar WHERE nom = :nom  ");
$Lupdate->bindValue(':nom', $SonNom, PDO::PARAM_STR);
$Lupdate->bindValue(':prenom', $SonPreNom, PDO::PARAM_STR);
$Lupdate->bindValue(':mail', $SonMail, PDO::PARAM_STR);
$Lupdate->bindValue(':Avatar', $avatar, PDO::PARAM_STR);
$Lupdate->execute();
echo " ".$SonNom." - ".$SonPreNom." est bien modifié<br />";
echo "<input type='button' value='Retour' OnClick='window.location.href=\"mailing.php?a=m\"'>";
}
}
// 3======================   ajout    =======================

if($a=="a")
{
if($SonNom!="")
{
$VisiteurOK="O";
$avatar="sans.gif";
//==============on va enregistrer un nouveau si saisie ok
$ajout = $bdd->prepare("INSERT  INTO visiteurs (nom, prenom,mail,VisiteurMdpSha1,VisiteurOK,Avatar) VALUES ( :nom, :prenom,:mail,:VisiteurMdpSha1,:VisiteurOK,:Avatar)");
$ajout->bindValue(':nom', $SonNom, PDO::PARAM_STR);
$ajout->bindValue(':prenom', $SonPreNom, PDO::PARAM_STR);
$ajout->bindValue(':mail', $SonMail, PDO::PARAM_STR);
$ajout->bindValue(':VisiteurMdpSha1', $mdp_sha1, PDO::PARAM_STR);
$ajout->bindValue(':VisiteurOK', $VisiteurOK, PDO::PARAM_STR);
$ajout->bindValue(':Avatar', $avatar, PDO::PARAM_STR);
$ajout->execute();
echo "<br /> ".$SonNom." - ".$SonPreNom." est bien ajouté<br />";
}
//==============on saisit un nouveau
echo ("<br /><form method='POST' action='mailing.php'><br />");
echo ("Nom <input type='text' name='nom' SIZE='25' value=''><br />");
echo ("Prenom <input type='text' name='prenom' SIZE='25' value=''><br />");
echo ("Mail <input type='text' name='mail' SIZE='40' value=''><br />");
echo ("MdPasse <input type='password' name='SonMdp' SIZE='40' value=''><br />");
echo ("<input type='submit' value=' Ajouter ' ><br /><br />");
echo ("<br /><br /></form>");
}
// ==============cas de la mailing list=============

if($a=="Mail")
{
?>
<input type="button" value="Abandon" OnClick="window.location.href='index.php'">
<input type="button" value="Mailing confirmez" OnClick="window.location.href='mailing.php?a=Mail2'">
<?php
}
if($a=="Mail2")
{
/* == renseignez votre site, votre e-mail (le provider indiqué dans php.ini)= */
$AdrWebSimpleTexte="mon site web ";
$MailValidation="validator@orange.fr";
$AdrWeb="http://127.0.0.1/le0www";
/* sur un site  $AdrWeb="http://www.tonsite.com"; */
/* en local l'alias de EasyPHP */
$Le_Objet="Voeux 2013";
$a=0;
$Le_Body = "";
$Le_Html="mailing.htm";
$Sa_Ligne=file($Le_Html);
$NbrLig=count($Sa_Ligne)-1;
for($i=0;$i<=$NbrLig;$i++)
{
$Le_Body .= $Sa_Ligne[$i];
}

$req = $bdd->prepare('SELECT * FROM visiteurs');
$req->execute();
while ($donnees = $req->fetch())
{
$a++;
$X_De = "MIME-Version: 1.0\r\n";
$X_De .= "content-type: text/html; charset=utf-8\r\n";
$X_De .= "From: ".$AdrWebSimpleTexte." <".$MailValidation.">";
$X_A = "".$donnees['nom']." <".$donnees['mail'].">";
$fl=mail($X_A, $Le_Objet, $Le_Body, $X_De);
echo  $a." == ".$X_A." ".$donnees['nom']."<br />";
}
}
//========================================
?>
</div></body></html>

site_ok.php : il s'agit de la première page réservée aux visiteurs identifiés.
En conséquence, au départ nous contrôlons qu'il s'agit bien d'un visiteur identifié !
Juste dans cette page nous proposons « voulez-vous éditer votre profil » :

site_ok.php

<?php
session_start();
$moiChri="O";
require("pdo_sql.php");
include("lesw/wsession.php");
if ($VisiteurValide =="visiteur") {
echo '<meta http-equiv="refresh" content="0;URL=index.php">';
exit;
}
?>
<div class="centre01">
<br /><span class="leTitre">gestion visiteurs</span><br />
<?php
echo "<br /><img src='lesw/".$Avatar."' alt='' /> Bonjour ".$VisiteurValide." <br /><br />";
?>
Voilà&#8230; vous êtes en zone protégée&#8230;<br />
<a href="index.php" class="LesA12" >Retour a l'index</a><br />
<a href="visiteurs_maj.php" class="LesA12" >Mise à jour de votre profil</a><br />
</div>
</body></html>

visiteurs_maj.php :pour simplifier l'intégration (pour les débutants).
Avec le petit plus de l'upload d'un avatar… à ce sujet, attention de bien mettre le type
dans le form d'upload :

<form name="formulaire" method="POST"
action="visiteurs_upload.php"  enctype="multipart/form-data" >

Pour le reste, n'oubliez pas que les INPUT disabled='disabled' n'envoient pas de _POST !! Attention a ce point !

visiteurs_maj.php

<?php
session_start();
$moiChri="O";
require("pdo_sql.php");
include("lesw/wsession.php");
if ($VisiteurValide =="visiteur")
{
echo '<meta http-equiv="refresh" content="0;URL=index.php">';
exit;
}
$message = (isset($_GET['message'])) ? secur($_GET['message']) : '';
$Limg = (isset($_GET['Limg'])) ? secur($_GET['Limg']) : '';
$lui = (isset($_GET['lui'])) ? secur($_GET['lui']) : '';
$prenom = (isset($_POST['prenom'])) ? secur($_POST['prenom']) : '';
?>
<div class="centre01">
<br /><span class="leTitre">gestion visiteurs</span><br />
<?PHP
echo ("".$message."<br />");
if ($Limg!="")
{
echo ("<img src='lesw/".$lui."' alt='' ><br />");
$Avatar=$lui;
$MiseAJour = $bdd->prepare("UPDATE visiteurs SET  Avatar= :Avatar WHERE nom= :LeNom  ");
$MiseAJour->bindValue(':LeNom', $ControlNom, PDO::PARAM_STR);
$MiseAJour->bindValue(':Avatar', $Avatar , PDO::PARAM_STR);
$MiseAJour->execute();
}
else {echo ('<img src="lesw/'.$Avatar.'" alt="" ><br />');}
if ($prenom!="")
{
$MiseAJour = $bdd->prepare("UPDATE visiteurs SET  prenom= :prenom  WHERE nom= :LeNom  ");
$MiseAJour->bindValue(':LeNom', $ControlNom, PDO::PARAM_STR);
$MiseAJour->bindValue(':prenom', $prenom  , PDO::PARAM_STR);
$MiseAJour->execute();
$ControlPreNom=$prenom;
}

echo "<br /><input type='button' value='Retour' OnClick='window.location.href=\"index.php\"'>";
?>

<br />

<br /><br />
<form name="formulaire" method="POST"
action="visiteurs_upload.php"  enctype="multipart/form-data" >
<input type="hidden" name="MAX_FILE_SIZE" value="40000" />
<input id="fichier1"  name="fichier1" type="file"  /><br />
<input value="Valider" name="submit" type="submit" />
</form>
<br /><br />
<form name="formulaire2" method="POST" action="visiteurs_maj.php" >
<?php
echo "<input type='text' name='nom' SIZE='25' value='".$ControlNom."' disabled='disabled'><br />";
echo "<input type='text' name='prenom' SIZE='25' value='".$ControlPreNom."'><br />";
echo "<input type='text' name='mail' SIZE='40' value='".$ControlMail."' disabled='disabled'><br />";
?>
<input value="Valider" name="submit" type="submit" />
</form>
</div>
</body></html>

visiteurs_upload.php :modèle basique d'upload en liaison avec le PHP précédent :

visiteurs_upload.php

<?php
if (isset($_FILES['fichier1'])) $LeFic=trim($_FILES['fichier1']['name']);
else $LeFic="";
$message="";
if(  $LeFic!="" )
{
$poid_max="40000";
$destin="lesw/";
$taille = getimagesize($_FILES['fichier1']['tmp_name']);
$poid = filesize($_FILES['fichier1']['tmp_name']);
$message="";
if(substr($LeFic,-3) !="jpg")
{$message="L image doit être au format JPEG/JPG";}
if ($poid>$poid_max)
{$message=" l'image est trop lourde&#8230; 40 ko maxi";}
if ($poid<=$poid_max && $message=="")
{
// === on supprime les accents et les espaces du nom de l'image
$LeFic = strtr($LeFic,  "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖ&#216;òóôõö&#248;ÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûü&#255;&#209;&#241;",
"aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn");
// === on supprime les espaces
$LeFic=str_replace(" ","_",$LeFic);
// === on met en minuscules
$LeFic=strtolower($LeFic);
$newnom=$destin.$LeFic;
if (file_exists($destin.$LeFic))
{
$message="L'image existe déjà sur le site ";
}
else
{
copy($_FILES['fichier1']['tmp_name'],$destin.$LeFic);
$imagefile=$destin.$LeFic;
$src_img = imagecreatefromjpeg($imagefile);
$message="L image ".$LeFic." est copiée";
}
}
}

$Limg=$imagefile;
print "<script type='text/javascript'>window.location='visiteurs_maj.php?Limg=".$Limg."&lui=".$LeFic."&message=".$message."'</script>";
exit;
?>

captcha.php : ce captcha très simple, il est comme de nombreux captcha, un simple générateur d'image aléatoire représentant un texte ! Considérez donc que son seul emploi n'est valide que comme toute image, un src= d'une IMG. Ce PHP, outre le fait de générer un code sous forme d'image, préserve ce code dans une valeur de session. Il utilise le fichier de polices lesw/chopin.ttf :

patcha,php

<?php
session_start();
$_SESSION['captcha']="";
header ("Content-type: image/png");
$image = imagecreate(100, 100);
$blanc = imagecolorallocate($image, 255, 255, 255);
$noir = imagecolorallocate($image, 0, 0, 0);
$gris = imagecolorallocate($image, 200,200,200);
$jaune = imagecolorallocate($image, 255, 255, 0);
$rouge = imagecolorallocate($image, 200, 39, 45);
$vert = imagecolorallocate($image, 45, 255, 39);
$cyan = imagecolorallocate($image, 0, 255, 255);
$magenta = imagecolorallocate($image, 200, 0, 200);
$orange = imagecolorallocate($image, 255, 160, 0);
$bleu = imagecolorallocate($image, 60, 75, 200);
$bleuclair = imagecolorallocate($image, 156, 227, 254);
$vertf = imagecolorallocate($image, 20, 140, 17);

$couleurs = Array($vert, $noir, $jaune, $blanc, $rouge, $cyan, $magenta, $orange, $bleu, $bleuclair, $gris, $vertf);
$Tcouleurs = count($couleurs);
$Lcouleurs = Array($noir, $rouge, $magenta, $bleu, $vertf);
$TLcouleurs = count($Lcouleurs);
$polices = 'lesw/chopin.ttf';
$carac = '0123456789abcdefghijklmnopqrstuvwxyz';
$Tcarac = strlen($carac);
$couleur_aleat = $Lcouleurs[mt_rand(0,$TLcouleurs-1)];
$ecart = 200/10+4;
$i = 0;
while($i <= 2){
$lettre = $carac[mt_rand(0, $Tcarac-1)];
$_SESSION['captcha'] .= $lettre;
$taille = mt_rand(25,35);
$angle = mt_rand(-15,15);
$y = mt_rand(35, 45);
imagettftext($image, $taille, $angle, $ecart*$i+15, $y, $couleur_aleat, $polices, $lettre);
$i++;
}
imagepng($image);
?>

VII - Mise en place

- Récupérez le ZIP contenant les éléments que nous avons décrits plus haut ;

- Importez dans EasyPHP (phpMyAdmin) visiteurs.sql sans oublier de préciser latin1.
Tous les autres éléments sont placés tels que décrits plus haut y compris le répertoire lesw/ ;

- Imaginons que tout cela en local soit dans c:\xxx\test_pdo\
créez dans votre configuration EasyPHP l'alias.

Alias "/outils" "c:/xxx/test_pdo/"
<Directory "c:/xxx/test_pdo">
Options Indexes FollowSymLinks Includes
AllowOverride All
#Order allow,deny
Allow from all
</Directory>

Parfait tout est prêt ! Bonne découverte !

Vous pouvez télécharger les sources :

- tous les éléments de Code de la racine du site de test

- tous les éléments de Le répertoire lesw du test

VIII - Remerciements

Je remercie max pour sa relecture attentive, ainsi que dourouc05 . Je remercie également ceux qui m'ont aidé pour cet article, zoom61 et vermine sans qui cet article n'aurait pu aboutir.