IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Algorithmique et PHP

Image non disponible    VS    Image non disponible


précédentsommaire

III. Exemple de codage PHP d'un algorithme graphique (solution du TP)

Nous voici donc dans la partie qui nous permettra de savoir comment coder un algorithme graphique en PHP en trois étapes, comme on l'a vu : Algorithme graphique -> Algorithme littéral -> Code PHP.

III-A. Algorithme graphique

Voici sans plus attendre la solution que je propose.

Image non disponible

Visualisez de préférence le schéma sous pdf, certains navigateurs n'étant pas des plus fines bouches en matière de dessin vectoriel. Sinon, imprimez les images pour étudier de près le fonctionnement de l'algorithme, voire reconstituez le schéma sur DIA (ce que je recommande vivement pour votre propre formation sur ce tutoriel). Je pense qu'il est assez explicite pour ne pas avoir à le commenter.

DIA possède deux versions de plugin pour exporter un fichier vers le format vectoriel SVG (ou bien peut-être n'en possède-t-il qu'un, auquel cas les formats exportés seront peut-être incompatibles avec pas mal de programmes). Utilisez le premier format svg appelé Graphique Vectoriel Cairo. Ne pas confondre XImage non disponible! avec la même chose en mathématiques signifiant littéralement « il existe un unique X tel que... » - j'utilise le « ! » pour prendre le contraire de ce qui le précède, tout comme en programmation en général.

Voici les variables utilisées :

COOKIES SESSIONS VARIABLES NORMALES SQL
id_nick id_nick id_nick TABLE COLONNE
id_passwd   id_passwd BANNIS ip
connexion_auto   IP_Client nick
temp_nick   var_link cnt
temp_passwd   temp_nick email
temp_email   temp_email MEMBRES nick
    temp_passwd passwd
    temp_date email
      date
      TEMP_VARS nick
      passwd
      email
      date
      var_link
      VISITES nick
      date


Cette solution marche a priori convenablement. Ce graphe peut être bien sûr schématisé avec des syntaxes différentes, et sa forme peut changer. Mais le fonctionnement sera le même si on respecte les embranchements et le séquencement. Passons à présent à la traduction vers l'algorithme littéral.

III-B. Algorithme littéral

Suivez l'algorithme graphique en lisant l'algorithme littéral suggéré :

 
Sélectionnez
Fonction action(step, previous_step = false)
{
	SELON step, previous_step
	CAS step = 1
		[adresse ip du client] -> ip_client; fin;
	CAS step = 2
		[COOKIE]id_nick = [SESSION]id_nick; fin;
	CAS step = 4, previous_step = 2
		"vous êtes connecté [*", id_nick,"*]!";
		ajouter (VISITES, time(), id_nick);
		"deconnexion" -> onglet; fin;
	CAS step = 3
		effacer ([COOKIE] id_nick, [COOKIE] id_passwd);
		exit;
	CAS step = 5, previous_step = 1
		"Saisissez vos id ou [*inscrivez-vous*]. [*id oubliés*]?";
		"connexion" -> onglet;
		S = 5;
		NS = 6; fin;
	CAS step = 7
		incrémenter BANNIS[id_nick].cnt;
	CAS step = 8
		ajouter (MEMBRES.a);
		[COOKIE]temp_nick -> id_nick;
		temp_passwd -> id_passwd;
		effacer ([SQL]a,[COOKIE]a);
		ajouter (VISITES, date, id_nick); fin;
	CAS step = 5, previous_step = 8
		"Vous pouvez maintenant vous connecter. [*id oubliés*]?";
		"connexion" -> onglet;
		5 -> S;
		6 -> NS; fin;
	CAS step = 9
		effacer ([SQL]a,[COOKIE]a); fin;
	CAS step = 5, previous_step = 9
		"Problème de confirmation. Reconnectez-vous avec un autre compte ou [*réinscrivez-vous*].";
		"connexion" -> onglet;
		5 -> S;
		6 -> NS; fin;
	CAS step = 22
		incrémenter (BANNIS[ip_client].cnt);
		exit;
	CAS step = 10
		"Nick incorrect, ",id_nick,". [*id oubliés?*] [*S'inscrire?*]"; fin;
	CAS step = 5, previous_step = 10
		"connexion" -> onglet;
		5 -> S;
		6 -> NS; fin;
	CAS step = 11
		"Bad passwd. [*id oubliés*]? [*S'inscrire*]?"; fin;
	CAS step = 5, previous_step = 11
		"connexion" -> onglet;
		5 -> S;
		6 -> NS; fin;
	CAS step = 6
		id_nick -> [SESSION]id_nick;
		enregistrer ([COOKIE]id_nick, [COOKIE]passwd, [COOKIE]connexion_auto); fin;
	CAS step = 4, previous_step = 6
		"vous êtes connecté ", [*id_nick*],"!";
		ajouter (VISITES, date, id_nick);
		"deconnexion" -> onglet; FIN;
	CAS step = 20
		effacer([SESSION]id_nick);
		non -> [COOKIE]connexion_auto;
		"Saisissez vos id ou [*inscrivez-vous*]. [*id oubliés*]?";
		"connexion" -> onglet;
		5 -> S;
		6 -> NS; fin;
	CAS step = 19
		effacer(SESSION, COOKIES, [POURTOUT]MEMBRES[id_nick]);
		"Saisissez vos id ou [*inscrivez-vous*]. [*id oubliés*]?";
		"connexion" -> onglet;
		5 -> S;
		6 -> NS; fin;
	CAS step = 0
		"vous êtes connecté ,  [*id_nick*]."; FIN;
	CAS step = 0, previous_step = 15
		"saisissez infos nécessaires à la préinscription.";
		"inscription" -> onglet;
		15 -> S;
		18 -> NS; fin;
	CAS step = 16
		"Nick existe. [*id oubliés*]?";
		15 -> S;
		18 -> NS;
		"inscription" -> onglet; fin;
	CAS step = 17
		"Email existe. [*id oubliés*]?";
		15 -> S;
		18 -> NS;
		"inscription" -> onglet; fin;
	CAS step = 18
		mail(temp_email);
		var_link -> TEMP_VARS.var_link;
		temp_nick -> [COOKIE]temp_nick -> TEMP_VARS.temp_nick;
		temp_email -> [COOKIE]temp_email -> TEMP_VARS.temp_email;
		temp_passwd -> [COOKIE]temp_passwd -> TEMP_VARS.temp_passwd;
		temp_date -> TEMP_VARS.temp_date;
		"mail envoyé. Activez votre compte.";
		"connexion" -> onglet; FIN;
	CAS step = 14
		"donnez l'email fourni à l'inscription.";
		14 -> S;
		21 -> NS;
		"recup_id" -> onglet; fin;
	CAS step = 21
		TEMP_VARS.date.[VAR]email -> TEMP_VARS.date;
		effacer(COOKIES + COOKIES temp, [POURTOUT]MEMBRES[email] + [POURTOUT]TEMP_VARS[email]);
		email -> [COOKIE]temp_email -> [SQL]temp_email -> [COOKIE]temp_nick -> [SQL]temp_nick;
		random(8) -> [COOKIE]temp_passwd -> [SQL]temp_passwd;
		var_link -> TEMP_VARS.var_link;
		"mail envoyé. Réactivez votre compte.";
		"connexion" -> onglet; FIN;
	CAS step = 23
		"saisissez un mot de passe.";
		15 -> S;
		18 -> NS;
		"inscription" -> onglet; fin;
	CAS step = 24
		"email introuvable.";
		14 -> S;
		21 -> NS;
		"recup_id" -> onglet; fin;
}

si (S [EXISTEPAS]) 0 -> S;
si (PS [EXISTEPAS]) 0 -> NS;

si (G [EXISTE])
SELON (G)
{
	CAS "connexion" fin;
	CAS "deconnexion" 
		si ([SESSION]id_nick [EXISTEPAS]) exit;
		0 -> PS;
		20 -> S; fin;
	CAS "desinscription"
		si ([SESSION]id_nick [EXISTEPAS]) exit;
		0 -> PS;
		19 -> S; fin;
	CAS "inscription"
		si ([SESSION]id_nick [EXISTE]) exit;
		0 -> PS;
		15 -> S; fin;
	CAS "recup_id"
		si ([SESSION]id_nick [EXISTE]) exit;
		0 -> PS;
		14 -> S; fin;
}

sinon
	SELON (PS,S)
	{
		CAS PS = 0, S = 0
			si ([SESSION]id_nick [EXISTE]) step(0); FIN;
			sinon step(1);
			si (ip_client [PASELEMENTDE] BANNIS:ips)
			{
				si ([COOKIE]temp_nick [EXISTEPAS])
				{
					si ([COOKIE]connexion_auto = "oui" ET [COOKIE]nick [EXISTE] ET [COOKIE]id_passwd [EXISTE])
					{
						si ([COOKIE]id_nick [PASELEMENTDE] BANNIS:ids)
						{
							si (MEMBRES[[COOKIE]id_nick].[COOKIE]id_passwd = MEMBRES[[COOKIE]id_nick].id_passwd)
							{
								step(2);
								step(4,2); FIN;
							}
							sinon step(3); fin;
						}
						sinon
						{
							step(7);
							step(3);
						}

					}
					sinon step(5,1);
				}
				sinon
				{
					si 	(	var_link				|			)
						(	[COOKIE]temp_nick			|	TEMP_VARS	)
						(	[COOKIE]temp_passwd	= 		|			)
						(	[COOKIE]temp_email			|			)
					{
						step(8);
						step(5,8);
					}
					sinon
					{
						step(9);
						step(5,9);
					}
				}
			}
			sinon step(22);

			CAS PS = 5, S = 6
				si (id_nick = '' ou [PASELEMENTDE] MEMBRES:nicks)
				{
					step(10);
					step(5,10);
				}
				sinon si (id_passwd != MEMBRES[id_nick].passwd)
				{
					step(11);
					step(5,11);
				}
				sinon
				{
					step(6);
					step(4,6); FIN;
				}
			CAS PS = 0, S = 20
				step(20);
			CAS PS = 0, S = 19
				step(19);
			CAS PS = 0, S = 15
				step(0,15);
			CAS PS = 15, S = 18
				si (temp_nick [ELEMENTDE](MEMBRES:ids, BANNIS:ids)) step(16); FIN;
				sinon si (temp_email [ELEMENTDE] (MEMBRES:emails, BANNIS:emails) ou invalide) step(17); FIN;
				sinon si (temp_passwd = '') step (23); FIN;
				sinon step(18); FIN;
			CAS PS = 0, S = 14
				step(14); FIN;
			CAS PS = 14, S = 21
				si (email [ELEMENTDE] (MEMBRES:emails)) step(21); FIN;
				sinon step(14); FIN;
		}
	}
}

Il aurait été intéressant de changer la couleur des variables dans ce code pour pouvoir les distinguer. À la place, on aura des [SQL] [VAR] [COOKIE] [SESSION] au début du nom des variables pour les différencier quand c'est nécessaire. À noter que les variables en MAJUSCULES se réfèrent à SQL. Cet algorithme étant la traduction directe de l'algorithme graphique, La compréhension devrait être aussi simple. J'ai cependant rajouté une petite chose indépendante du diagramme, telle que la gestion d'une variable GET G (les onglets) qui peut forcer le passage à un diagramme de fond bleu. Les liens sont mis entre [* *] mais ces [* *] ne sont pas présents dans l'algorithme de base, ce dernier étant rédigé avec de la couleur, et en utilisant les styles souligné, gras et italique. Aussi vous pouvez vous permettre de copier-coller le code en l'arrangeant par vous-même pour en améliorer la lecture.

III-C. PHP

Nous voici enfin dans le vif du sujet.

Ceci étant la partie principale de ce tuto, elle risque de s'avérer longue à assimiler. Mais elle ne représente que l'aspect technique et l'idée d'ensemble de ce tuto est d'ores et déjà acquise. Vous avez déjà tous les outils théoriques et pratiques pour programmer de la manière la plus paisible.

Il me semblait nécessaire d'appuyer tout ça avec ce TP pour bien vous démontrer la possibilité d'une telle façon de programmer en PHP, dont la priorité est l'ordre et la rigueur, l'efficacité... La simplicité, dans ce monde pas très évident de PHP qui regorge de fonctions parfois inutiles, parfois incompatibles avec certains serveurs, parfois obsolètes, voire... erronées.

Voici donc le fameux code.

 
Sélectionnez
<?php
session_start();

include("includes/bbcode.php");
include("includes/identifiants.php");

function random($car) // retourne une chaine aléatoire de $car caractères
{
	$string = "";
	$chaine = "abcdefghijklmnpqrstuvwxy";
	srand((double)microtime()*1000000);
	for($i=0; $i<$car; $i++)
	{
		$string .= $chaine[rand()%strlen($chaine)];
	}
	return $string;
}
function url_ok($url)
{
	return ("[color=#00FF00]".$url."[/color]");
}

function action($step, $previous_step = false)
{
//////////////////////////////////////////////////////////////////////////////////
!!      utilisez plutôt des classes - l'utilisation de global n'est ici que     !!
!!                            pour les besoins du TP                            !!
//////////////////////////////////////////////////////////////////////////////////

		$ip_client,
		$id_nick,
		$id_passwd,

		$onglet,

		$message_boite_connexion,
		$message_boite_deconnexion,
		$message_boite_inscription,
		$message_recuperation_identifiants,

		$S, $NS,
		$temp_nick,
		$temp_passwd,
		$temp_email,
		$temp_date;

	$chaine_switch = ($previous_step==false) ? $step : $step.",".$previous_step;
 
	switch($chaine_switch)
	{
		case "1": $ip_client = $_SERVER["REMOTE_ADDR"];
		break;
		case "2": $_SESSION['id_nick'] = $_COOKIE['id_nick'];
		break;
		case "4,2":
			$message_boite_deconnexion = forum_code("Vous êtes connecté, [url=./profile_view.php?id=".$_SESSION['id_nick']."][alt voir 
profil]".$_SESSION['id_nick']."[/url].",TRUE);
			mysql_query("INSERT INTO universe_visites
				(nick_id, date_id)
				VALUES ('".$id_nick."', ".time().")")	or die(mysql_error());
			$onglet = "deconnexion";
		break;
		case "3": setCookie('id_nick');
			setCookie('id_nick');
			unset($_COOKIE['id_nick']);
			unset($_COOKIE['id_passwd']);
			exit;
		break;
		case "5,1":
			$message_boite_connexion = forum_code("Saisissez vos identifiants pour vous connecter. Si vous n'en avez pas, vous pouvez [url=
./messagerie.php?g=inscription][alt inscription]vous inscrire[/url].","no_pop_up");
			$S = 5;
			$NS = 6;
			$onglet = "connexion";
		break;
		case "7": mysql_query("UPDATE universe_bannis
SET banni_cnt = banni_cnt + 1
WHERE banni_nick = '".$_SESSION['id_nick']."'") or die(mysql_error());
		break;
		case "8": mysql_query("INSERT INTO universe_membres
(nick, passwd, email, date_inscription)
VALUES ('".$temp_nick."', '".$temp_passwd."', '".$temp_email."','".$temp_date."')");
				$id_nick = $_COOKIE['temp_nick'];
				$id_passwd = $_COOKIE['temp_passwd'];
				setCookie('temp_nick');
				unset($_COOKIE['temp_nick']);
				setCookie('temp_passwd');
				unset($_COOKIE['temp_passwd']);
				setCookie('temp_email');
				unset($_COOKIE['temp_email']);
				mysql_query("DELETE FROM universe_temp_vars WHERE temp_nick='".$temp_nick."'");
			// on en profitera pour nettoyer les vars > 30 jours :
				mysql_query("DELETE FROM universe_temp_vars WHERE temp_date +
					60*60*24*30 < ".time());
				mysql_query("INSERT INTO universe_visites
					(nick_id, date_id) VALUES ('".$id_nick."', ".time().")");
		break;
		case "5,8":
			$message_boite_connexion = forum_code("Saisissez vos identifiants pour vous connecter. Si vous n'en avez pas, vous pouvez 
[url=./messagerie.php?g=inscription][alt inscription]vous inscrire[/url].","no_pop_up");
			$S = 5;
			$NS = 6;
			$onglet = "connexion";
		break;
		case "9":
			$temp_nick = $_COOKIE['temp_nick'];
			setCookie('temp_nick');
			unset($_COOKIE['temp_nick']);
			setCookie('temp_passwd');
			unset($_COOKIE['temp_passwd']);
			setCookie('temp_email');
			unset($_COOKIE['temp_email']);
			mysql_query("DELETE FROM universe_temp_vars WHERE temp_nick='".$temp_nick."'");
  // on en profitera pour nettoyer les vars > 30 jours :
			mysql_query("DELETE FROM universe_temp_vars WHERE temp_date + 60*60*24*30 < ".time());
		break;
		case "5,9":
			$message_boite_connexion = forum_code("[color=#ff0000]Votre compte n'a pas pu être activé. Veuillez [url=./messagerie.php
?g=inscription][alt inscription]vous réinscrire[/url], ou essayez de vous connecter avec un autre compte.[/color]","no_pop_up");
			$S = 5;
			$NS = 6;
			$onglet = "connexion";
		break;
		case "22":
			mysql_query("UPDATE universe_bannis SET banni_cnt = banni_cnt + 1 WHERE banni_ip = '".$ip_client."'") or die(mysql_error());
			exit;
		break;
		case "10":
			$message_boite_connexion = forum_code("[color=#ff0000]Le nick saisi \"$id_nick\" est incorrect. [url=./messagerie.php?g=
recup_id][alt récupération par mail]Récupérez vos identifiants[/url], ou [url=./messagerie.php?g=inscription][alt inscription]
réinscrivrez-vous[/url].[/color]","no_pop_up");
		break;
		case "5,10":
			$S = 5;
			$NS = 6;
			$onglet = "connexion";
		break;
		case "11":
			$message_boite_connexion = forum_code("[color=#ff0000]Le mot de passe saisi est incorrect. [url=./messagerie.php?g=recup_id]
[alt récupération par mail]Récupérez vos identifiants[/url], ou [url=./messagerie.php?g=inscription][alt inscription]
réinscrivrez-vous[/url].[/color]","no_pop_up");
		break;
		case "5,11":
			$S = 5;
			$NS = 6;
			$onglet = "connexion";
		break;
		case "6": 
			$_SESSION['id_nick'] = $id_nick;
			setcookie ("id_nick", $id_nick, time()+60*60*24*30);
			setcookie ("id_passwd", $id_passwd, time()+60*60*24*30);
			if (isset($_POST['connexion_auto'])) setcookie ("connexion_auto", "oui",time()+60*60*24*30);
		break;
		case "4,6":
			$message_boite_deconnexion = forum_code("Vous êtes connecté, [url=./profile_view.php?id=".$_SESSION['id_nick']."]
[alt voir profil]".$_SESSION['id_nick']."[/url].",TRUE);
			mysql_query("INSERT INTO universe_visites
(nick_id, date_id) VALUES ('".$id_nick."', ".time().")");
			$onglet = "deconnexion";
		break;
		case "20":
			$_SESSION = array();
			session_destroy();
			setcookie ("connexion_auto");
			unset($_COOKIE['connexion_auto']);
			$message_boite_connexion = forum_code("Saisissez vos identifiants pour vous connecter. Si vous n'en avez pas, vous pouvez 
[url=./messagerie.php?g=inscription][alt inscription]vous inscrire[/url].","no_pop_up");
			$S = 5;
			$NS = 6;
			$onglet = "connexion";
		break;
		case "19":
			mysql_query("DELETE FROM universe_membres WHERE nick='".$_SESSION['id_nick']."'");
			unset($_SESSION['id_nick']);
			setcookie ("connexion_auto");
			unset($_COOKIE['connexion_auto']);
			setCookie('id_nick');
			unset($_COOKIE['id_nick']);
			setCookie('temp_nick');
			unset($_COOKIE['temp_nick']);
			setCookie('temp_passwd');
			unset($_COOKIE['temp_passwd']);
			setCookie('temp_email');
			unset($_COOKIE['temp_email']);
			$message_boite_connexion = forum_code("Saisissez vos identifiants pour vous connecter. Si vous n'en avez pas, vous pouvez 
[url=./messagerie.php?g=inscription][alt inscription]vous inscrire[/url].","no_pop_up");
			$S = 5;
			$NS = 6;
			$onglet = "connexion";
		break;
		case "0": 
			$message_boite_deconnexion = forum_code("Vous êtes connecté, [url=./profile_view.php?id=".$_SESSION['id_nick']."]
[alt voir profil]".$_SESSION['id_nick']."[/url].",TRUE);
			$onglet = "deconnexion";
		break;
		case "0,15":
			$message_boite_inscription = "Saisissez les informations nécessaires à votre nscription: ";
			$onglet = "inscription";
			$S = 15;
			$NS = 18;
		break;
		case "16":
			$message_boite_inscription = forum_code("[color=#ff0000]Le nick $id_nick que vous avez saisi est invalide ou existe déjà.[/color]");
			$S = 15;
			$NS = 18;
			$onglet = "inscription";
		break;
		case "17":
			$message_boite_inscription = forum_code("[color=#ff0000]L'e-mail que vous avez saisi est invalide ou existe déjà.[/color]");
			$S = 15;
			$NS = 18;
			$onglet = "inscription";
		break;
		case "23":
			$message_boite_inscription = forum_code("[color=#ff0000]Saisissez un mot de passe.[/color]");
			$S = 15;
			$NS = 18;
			$onglet = "inscription";
		break;
		case "18":
			$temp_nick = $_POST['temp_nick'];
			$temp_passwd = md5($_POST['temp_passwd']);
			$temp_email = $_POST['temp_email'];
			$var_link = random(20);
			mysql_query("INSERT INTO universe_temp_vars
(temp_nick, temp_passwd, temp_email, temp_date, var_link)
VALUES ('".$temp_nick."', '".$temp_passwd."', '".$temp_email."', '".time()."', '".$var_link."')");
			setcookie ("temp_nick", $temp_nick, time()+60*60*24*30);
			setcookie ("temp_passwd", $temp_passwd, time()+60*60*24*30);
			setcookie ("temp_email", $temp_email, time()+60*60*24*30);
			$message_bienvenue = "
Bienvenue sur UNIVERSE.
Veuillez conserver cet e-mail dans vos archives. Les informations
concernant votre compte sont les suivantes :
----------------------------
Nom d'utilisateur : $temp_nick
Mot de passe : ".$_POST['temp_passwd']."
Lien vers le site : http://naytheet.free.fr/UNIVERSE/index.php
----------------------------
Votre compte est actuellement inactif. Vous ne pouvez pas l'utiliser
jusqu'à ce que vous vous rendiez sur le lien suivant :
http://naytheet.free.fr/UNIVERSE/messagerie.php?var_link=$var_link
Veuillez conserver précieusement votre mot de passe car il a été crypté
dans notre base de données et nous ne pourrons pas le retrouver à votre
place. Cependant, si vous oubliez votre mot de passe, vous pouvez en
demander un nouveau qui sera activé de la même manière que ce compte.
Nous vous remercions de votre inscription.";
mail($temp_email, 'Bienvenue sur "Universe"' , $message_bienvenue);
			$message_boite_connexion = "Un mail d'activation de votre compte vous a été envoyé à l'adresse e-mail que vous avez fournie.
Vous devez activer votre compte avant de vous connecter.";
			$onglet = "connexion";
		break;
		case "14":
			$message_recuperation_identifiants = "Saisissez l'e-mail que vous avez fournie pour votre inscription : ";
			$S = 14;
			$NS = 21;
			$onglet = "recup_id";
		break;
		case "21":
			$temp_email = $_POST['email_recup'];
			$requete_email_recup = mysql_query("
SELECT email, date_inscription FROM universe_membres WHERE email = '".$temp_email."'") or die(mysql_error());
			$email_recup = mysql_fetch_array($requete_email_recup);
			$temp_date = $email_recup['date_inscription'];
			setCookie("connexion_auto");
			unset($_COOKIE['connexion_auto']);
			setCookie('id_nick');
			unset($_COOKIE['id_nick']);
			setCookie('temp_nick');
			unset($_COOKIE['temp_nick']);
			setCookie('temp_passwd');
			unset($_COOKIE['temp_passwd']);
			setCookie('temp_email');
			unset($_COOKIE['temp_email']);
			mysql_query("DELETE FROM universe_membres WHERE email='".$temp_email."'");
			mysql_query("DELETE FROM universe_temp_vars WHERE temp_email='".$temp_email."'");
			mysql_query("DELETE FROM universe_temp_vars WHERE temp_date + 60*60*24*30 < ".time())
			$temp_passwd = random(8);
			$var_link = random(20);
			mysql_query("INSERT INTO universe_temp_vars
(temp_nick, temp_passwd, temp_email, temp_date, var_link)
VALUES ('".$temp_email."', '".md5($temp_passwd)."', '".$temp_email."', '".$temp_date."', '". $var_link."')");
			setCookie("temp_nick", $temp_email, time()+60*60*24*30);
			setCookie("temp_passwd", md5($temp_passwd), time()+60*60*24*30);
			setCookie("temp_email", $temp_email, time()+60*60*24*30);
			$message_bienvenue = "
Bienvenue sur UNIVERSE.
Veuillez conserver cet e-mail dans vos archives. Les informations
concernant votre compte sont les suivantes :
----------------------------
Nom d'utilisateur : $temp_nick
Mot de passe : ".$_POST['temp_passwd']."
Lien vers le site : http://naytheet.free.fr/UNIVERSE/index.php
----------------------------
Votre compte est actuellement inactif. Vous ne pouvez pas l'utiliser
jusqu'à ce que vous vous rendiez sur le lien suivant :
http://naytheet.free.fr/UNIVERSE/messagerie.php?var_link=$var_link
Veuillez conserver précieusement votre mot de passe car il a été crypté
dans notre base de données et nous ne pourrons pas le retrouver à votre
place. Cependant, si vous oubliez votre mot de passe, vous pouvez en
demander un nouveau qui sera activé de la même manière que ce compte.
Nous vous remercions de votre inscription.";
mail($temp_email, 'Bienvenue sur "Universe"' , $message_bienvenue);
			$message_boite_connexion = "Un mail de réactivation de votre compte vous a été envoyé à l'adresse e-mail que vous avez fournie.
Vous devez activer votre compte avant de vous connecter.";
			$onglet = "connexion";
		break;
		case "24":
			$message_recuperation_identifiants = "email introuvable.";
			$S = 14;
			$NS =21;
			$onglet = "recup_id";
		break;
 }
}
if (isset($_POST['step'])) $PS = $_POST['step'];
else $PS = 0;
if (isset($_POST['next_step'])) $S = $_POST['next_step'];
else $S = 0;
if (isset($_GET['g']))
{
	$G = $_GET['g'];
	switch ($G)
 {
		case "connexion":
		break;

		case "deconnexion":
			if (!isset($_SESSION['id_nick'])) exit;
			$PS = 0;
			$S = 20;
		break;

		case "desinscription":
			if (!isset($_SESSION['id_nick'])) exit;
			$PS = 0;
			$S = 19;
		break;

		case "inscription":
			if (isset($_SESSION['id_nick'])) exit;
			$PS = 0;
			$S = 15;
		break;

		case "recup_id":
			if (isset($_SESSION['id_nick'])) exit;
			$S = 14;
		break;
		default:
		exit;
 }
}

if (isset($_POST['sedeconnecter']))
{
	$PS = 0; $S = 20;
} 
if (isset($_POST['sedesinscrire']))
{
	$PS = 0; $S = 19;
} 
if (isset($_POST['monprofil']))
{
 // redirection
} 
$PS_S = $PS.",".$S;
switch ($PS_S)
{
	case "0,0":
	if (isset($_SESSION['id_nick']))
	{
		action(0);
		break;
	} else action(1);
	$requete_verification_ip_bannis = mysql_query("SELECT banni_ip FROM universe_bannis
WHERE (banni_ip = '".$ip_client."')") or die(mysql_error());
	if (mysql_num_rows($requete_verification_ip_bannis) < 1)
	{
		if(!isset($_COOKIE['temp_nick']) || ($_COOKIE['temp_nick']) == '')
		{
			if((($_COOKIE['connexion_auto'])==="oui") && ($_COOKIE['id_nick']!=="") && ($_COOKIE['id_passwd']!==""))
			{
				$requete_verification_id_bannis = mysql_query("
SELECT banni_nick FROM universe_bannis
WHERE (banni_nick = '".$id_nick."')") or die(mysql_error());
				if (mysql_num_rows($requete_verification_id_bannis) < 1)
				{
					$requete_verification_id = mysql_query("SELECT nick, passwd FROM universe_membres
WHERE (nick = '".$_COOKIE['id_nick']."' AND passwd = '".$_COOKIE['id_passwd']."')") or die(mysql_error());
					if (mysql_num_rows($requete_verification_id) > 0)
					{
						action(2);
						action(4,2);
					} else
					{
						action(3);
						break;
					}
				} else
				{
					action(7);
					action(3);
				}
			} else action(5,1);
		} else
		{
			if ((isset($_GET['var_link']))
				&& ($_COOKIE['temp_nick'] !== '')
				&& ($_COOKIE['temp_passwd'] !== '')
				&& ($_COOKIE['temp_email'] !== ''))
			{
				$var_link = $_GET['var_link'];
				$temp_nick = $_COOKIE['temp_nick'];
				$temp_passwd = $_COOKIE['temp_passwd'];
				$temp_email = $_COOKIE['temp_email'];
				$requete_temp_vars = mysql_query("
SELECT var_link, temp_nick, temp_passwd, temp_email, temp_date
FROM universe_temp_vars
WHERE (var_link = '".$var_link."')") or die(mysql_error());
				$temp = mysql_fetch_array($requete_temp_vars);
				$temp_date = $temp['temp_date'];
				if (($temp_nick == $temp['temp_nick']) && ($temp_passwd == $temp['temp_passwd']) && ($temp_email == $temp['temp_email']))
				{
					action(8);
					action(5,8);
				} else
				{
					action(9);
					action(5,9);
				}
			} else
			{
				action(9);
				action(5,9);
			}
		}
	} else action(22);
	break;
	case "5,6":
		$id_nick = $_POST['id_nick'];
		$id_passwd = md5($_POST['id_passwd']);
		$requete_identification= mysql_query("
SELECT membre_id, nick, passwd
FROM universe_membres
WHERE nick = '".$id_nick."'") or die(mysql_error());
		$id = mysql_fetch_array($requete_identification);

		if (mysql_num_rows($requete_identification) < 1)
		{
			action(10);
			action(5,10);
		} elseif ($id['passwd'] != $id_passwd)
		{
			action(11);
			action(5,11);
		} else
		{
			action(6);
			action(4,6);
		}
	break;
	case "0,20":
		action(20);
	break;
	case "0,19":
		action(19);
	break;
	case "0,15":
		action(0,15);
	break;
	case "15,18":
		if (isset($_POST['temp_email'])) $temp_email = $_POST['temp_email'];
		if (isset($_POST['temp_nick'])) $temp_nick = $_POST['temp_nick'];
		if (isset($_POST['temp_nick']))
		{
			$requete_verification_nicks = mysql_query("SELECT 'found' FROM 
(select count(*) as c1 from universe_membres WHERE nick = '".$temp_nick."') AS t1,
(select count(*) as c2 FROM universe_temp_vars WHERE temp_nick = '".$temp_nick."') AS t2,
(select count(*) as c3 from universe_bannis WHERE banni_nick = '".$temp_nick."') AS t3
WHERE c1 > 0 OR c2 > 0 OR c3 > 0") or die(mysql_error());
			if ((mysql_num_rows($requete_verification_nicks) >= 1) || ($temp_nick == ''))
			{
				action(16);
				break;
			} else
			{
				if (isset($_POST['temp_email']))
				{
					$requete_verification_email_membres = mysql_query("SELECT email FROM universe_membres 
WHERE email = '".$temp_email."'") or die(mysql_error());
					$requete_verification_email_bannis = mysql_query("SELECT banni_email FROM universe_bannis 
WHERE banni_email = '".$temp_email."'") or die(mysql_error());
					if ( (mysql_num_rows($requete_verification_email_bannis) >= 1)
|| (mysql_num_rows($requete_verification_email_membres) >= 1)
|| (isset($temp_email) )
&& (!preg_match("#^([a-zA-Z0-9_\-\.]*)[a-zA-Z0-9]@([a-zA-Z0-9\-\.]*)[azA-Z0-9]\.[a-zA-Z]{2,3}$#",$temp_email)))
					{
						action(17);
						break;
					}
					if ($_POST['temp_passwd']=='') action(23);
					else action(18);
				}
			}
		}
	break;
	case "0,14":
		action(14);
	break;
	case "14,21":
		$temp_email = $_POST['email_recup'];
		$requete_verification_email_membres = mysql_query("
			SELECT email
			FROM universe_membres
			WHERE email = '".$temp_email."'") or die(mysql_error());
		if (mysql_num_rows($requete_verification_email_membres) >= 1) action(21);
		else action(24);
	break;
}

include("includes/debut.php");

?>

<body style='background-color: black; background-image: url("images/fond.jpg"); margin: auto; 
background-repeat: repeat;'>

	<div id='A1'>
 </div>
	<div id='A2'>
  <!-- A0 -->
<?php 	include("includes/menu_a2.php"); ?>
 </div>
	<div id='A3'>
 </div>
	<div id='B1'>
 </div>
	<div id='B2'>
 </div>
	<div id='B3'>
 </div>
	<div id='C1'>
 </div>
	<div id='C2'>
 </div>
	<div id='C3'>
 </div>
</body>
</html>

À l'exception des variables magiques post et get servant à initialiser la position dans l'algo graphique, l'utilisation de global est ici inappropriée. Prière d'utiliser des classes pour rendre les variables accessibles aux fonctions. La page contenant d'autres div, le nom de la classe utilisée pour cette section pourra s'appeler « B2 », ou plus explicitement « GestionCompte ». Le code de ce TP ne visait qu'à illustrer le concept du passage algo graphique -> PHP, je me suis permis de passer sur les structures de données propres au langage orienté objet.

III-D. Remarques et conclusion

III-D-1. Les cookies

Les cookies n'étant effacés que lors d'une fin de session du navigateur, les tests d'existence de cookies sont améliorés avec un test de contenu vide ou non s'ils sont présents.

III-D-2. Les requêtes SQL

 
Sélectionnez
mysql_query("DELETE FROM universe_temp_vars WHERE temp_nick='".$temp_nick."'");
	// on en profitera pour nettoyer les vars > 30 jours :
mysql_query("DELETE FROM universe_temp_vars WHERE temp_date + 60*60*24*30 < ".time());

En même temps d'activer un compte, on met à jour la table en effaçant ici les comptes mis en attente d'activation de plus de trente jours. Cela peut servir par exemple à effacer des spammers ayant échoué. Il est possible et recommandé de fusionner les requêtes pour un gain de temps. Les requêtes SQL étant sujettes à mettre du temps à s'exécuter, si le site est fréquenté, celui-ci aura du mal à répondre rapidement donc autant diminuer le nombre de requêtes. On pourra alors préférer la requête suivante :

 
Sélectionnez
mysql_query("DELETE FROM universe_temp_vars WHERE temp_nick='".$temp_nick."' OR temp_date + 60*60*24*30 < ".time());
 
Sélectionnez
	case "15,18":
		if (isset($_POST['temp_email'])) $temp_email = $_POST['temp_email'];
		if (isset($_POST['temp_nick'])) $temp_nick = $_POST['temp_nick'];
		if (isset($_POST['temp_nick']))
		{
			$requete_verification_nicks = mysql_query("
SELECT 'found' FROM 
(select count(*) as c1 from universe_membres WHERE nick = '".$temp_nick."') AS t1,
(select count(*) AS c2 FROM universe_temp_vars WHERE temp_nick = '".$temp_nick."') AS t2,
(select count(*) as c3 from universe_bannis WHERE banni_nick = '".$temp_nick."') AS t3
WHERE c1 > 0 OR c2 > 0 OR c3 > 0") or die(mysql_error());
			if ((mysql_num_rows($requete_verification_nicks) >= 1) || ($temp_nick == ''))
			{
				action(16);

Case "15,18" : Pour ce premier if, nous nous trouvons donc ici sur le premier losange testant l'existence du pseudo dans les tables des membres, des membres dont l'activation du compte est en attente, ou des bannis. Je ne suis pas des plus doués en matière de SQL, aussi je vais vous expliquer la démarche de cette requête que j'ai pu trouver en cherchant sur Google. Elle est basée sur trois sous-requêtes t1, t2 et t3. Chacune de ces sous-requêtes compte le nombre de lignes dans lesquelles se trouve le contenu de la variable post temp_nick dans chacune de ces tables. Si on trouve plus de zéro ligne dans au moins une des tables (i.e. si le pseudo est présent dans l'une de ces tables) on aura un résultat de la requête et donc au moins une ligne dans le tableau résultant de la requête. Peu nous importe le résultat de la requête, il est interprété comme un booléen. Cette requête est purement conditionnelle.

III-E. Les autres fichiers PHP

L'include identifiants.php concerne la connexion à votre base de données.

III-E-1. debut.php

 
Sélectionnez
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/
	xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
<?php
// liste des noms de fenêtre correspondant aux fichiers PHP à parser
		$titre= array
(
		"/" => "Naytheet.fr",
		"/UNIVERSE/messagerie.php" => "UNIVERSE - messagerie",
		"/NAYTHEET.FR/UNIVERSE/messagerie.php" => "UNIVERSE - messagerie"
);
// récupération du nom de fichier css dynamique - il doit avoir le même nom que le fichier PHP correspondant.
		$identification = $_SERVER["REMOTE_ADDR"];
		$fichier_css_dynamique = substr($_SERVER['PHP_SELF'], 0, -4).'_css.php';
?>
		<title><?php echo $titre[$_SERVER['PHP_SELF']]; ?></title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" type="text/css" media="screen" href="<?php echo $fichier_css_dynamique?>"
		<link rel="SHORTCUT ICON" href="favicon.ico">
	</head>

III-E-2. menu_a2.php

Ceci concerne le fichier appelé pour l'affichage :

 
Sélectionnez
<?php
if (!isset($preremplissage_nick)) $preremplissage_nick = '';
if (!isset($preremplissage_email)) $preremplissage_email = '';
$onglet_inscription_active = '
	<li class="active">
		<a href="messagerie.php?g=inscription"> Inscription </a>
	</li>';
$onglet_inscription_passive = '
	<li class="passive">
		<a href="messagerie.php?g=inscription"> Inscription </a>
	</li>';
$onglet_inscription_disabled = '
	<li class="disabled">
		<a> Inscription </a>
	</li>';
$onglet_connexion_active = '
	<li class="active">
		<a href="messagerie.php?g=connexion"> Connexion </a>
	</li>';
$onglet_connexion_passive = '
	<li class="passive">
		<a href="messagerie.php?g=connexion"> Connexion </a>
	</li>';
$onglet_connexion_disabled = '
	<li class="disabled">
		<a> Connexion </a>
	</li>';
$onglet_deconnexion_active = '
	<li class="active">
		<a href="messagerie.php?g=deconnexion"> Déconnexion </a>
	</li>';
$onglet_deconnexion_passive = '
	<li class="passive">
		<a href="messagerie.php?g=deconnexion"> Déconnexion </a>
	</li>';
$onglet_deconnexion_disabled = '
	<li class="disabled">
		<a> Déconnexion </a>
	</li>';
$preremplissage_temp_nick = (isset($_POST['temp_nick'])) ? $_POST['temp_nick'] : '';
$preremplissage_nick = (isset($_POST['nick'])) ? $_POST['nick'] : '';
$preremplissage_temp_email = (isset($_POST['temp_email'])) ? $_POST['temp_email'] : '';
$form_connexion = "
<div id='form_A2'>
	<label for='nick'>nick : </label>
	<input type='text' name='id_nick' value='$preremplissage_nick'><br/>
	<label for='passwd'>mot de passe : </label>
	<input type='password' name='id_passwd'><br/>
	<label>Connexion automatique </label><input type='checkbox' style='border: none' name='connexion_auto' />
	<input type='submit' />
	<label for='oubli'>".forum_code("Vous avez oublié vos identifiants? [url=./messagerie.php?g=recup_id][alt récupération par 
mail]cliquez ici[/url]","no_pop_up")."</label>
</div>";
$form_deconnexion = "
<div id='form_A2'>
	<input type='submit' name='sedeconnecter' value='Se déconnecter' />
	<input type='submit' name='sedesinscrire' value='Se désinscrire' />
	<input type='submit' name='monprofil' value='Mon profil' />
</div>";
$form_inscription = "
<div id='form_A2'>
	<label for='temp_nick'>nick : </label>
	<input type='text' name='temp_nick' value='$preremplissage_temp_nick'><br/>
	<label for='temp_passwd'>mot de passe : </label>
	<input type='text' name='temp_passwd'><br/>
	<label for='temp_email'>e-mail : </label>
	<input type='text' name='temp_email' value='$preremplissage_temp_email'><br/>
	<input type='submit' />
</div>";
$form_recuperation = "
<div id='form_A2'>
	<label for='email_recup'>e-mail : </label>
	<input type='text' name='email_recup'><br/>
	<input type='submit' />
</div>";
if ($onglet == "recup_id")
{
	$affichage_onglets = $onglet_inscription_passive.
		$onglet_connexion_active.
		$onglet_deconnexion_disabled;
	$affichage_contenu = "<span class ='message_normal'>$message_recuperation_identifiants</span>$form_recuperation";
}

if ($onglet == "inscription")
{
	$affichage_onglets = $onglet_inscription_active.
		$onglet_connexion_passive.
		$onglet_deconnexion_disabled;
	$affichage_contenu = "<span class ='message_normal'>$message_boite_inscription</span>$form_inscription";
}
if ($onglet == "connexion")
{
	$affichage_onglets = $onglet_inscription_passive.
		$onglet_connexion_active.
		$onglet_deconnexion_disabled;
	$affichage_contenu = "<span class ='message_normal'>$message_boite_connexion</span>$form_connexion";
}
if ($onglet == "deconnexion")
{
	$affichage_onglets = $onglet_inscription_disabled.
		$onglet_connexion_disabled.
		$onglet_deconnexion_active;
	$affichage_contenu = "<span class ='message_normal'>$message_boite_deconnexion</span>$form_deconnexion";
}?>
<ul id="onglets">
	<?php echo $affichage_onglets ?>
</ul>
<form action='./messagerie.php' method='post'>
	<INPUT TYPE=HIDDEN NAME="step" VALUE="<?php echo $S ?>" >
	<INPUT TYPE=HIDDEN NAME="next_step" VALUE="<?php echo $NS ?>" >
	<?php echo $affichage_contenu ?>
</form>

Les petits boxes au-dessus des actions sur l'algo graphique sont représentés par les variables de préremplissage. Voici enfin le CSS dynamique utilisé pour paramétrer l'aspect visuel du site :

III-E-3. messagerie_css.php

 
Sélectionnez
<?php header("Content-type: text/css");
// abscisses
$w = 33.29;
// ordonnées
$h = 33.25;
// variables d'initialisations
$INIT_MESSAGERIE = ' position: absolute;
	border: solid green 1px;
	overflow: auto;';
$INIT_CASES_MESSAGERIE = 'position: absolute;
	border: solid green 1px;
	width: '.$w.'%;
	height: '.$h.'%;
	overflow: auto;';
// variables de positionnement pour MESSAGERIE
$MESSAGERIE_width = "99.8%";
$MESSAGERIE_height = "99.8%";
// formulaire A2 (connexion, etc.)
$form_A2_top = "50%";
$form_A2_left = "20%";
?>
/* pas de tableau pour plus de lisibilité du programme */
input
{
	border: solid green 1px;
	color: white;
	background-color: black;
}
.message_normal
{
	font-family : courier new;
	color : white;
}
#form_A2
{
	position: absolute;
	top: <?php echo $form_A2_top ?>;
	left: <?php echo $form_A2_left ?>;
	text-align: right;
	color: white;
}
#A1
{
	<?php echo $INIT_CASES_MESSAGERIE ?>; /* couleur du cadre; hauteur / largeur. */
}
#A2
{
	<?php echo $INIT_CASES_MESSAGERIE ?>;
	left: <?php echo $w ?>%; /* positionnement de la cellule. */
#A3
{
	<?php echo $INIT_CASES_MESSAGERIE ?>
	left: <?php echo $w * 2?>%;
	color: white;
}
#B1
{
	<?php echo $INIT_CASES_MESSAGERIE ?>
	top: <?php echo $h?>%;
}
#B2
{
	<?php echo $INIT_CASES_MESSAGERIE ?>
	top: <?php echo $h?>%;
	left: <?php echo $w?>%;
}
#B3
{
	<?php echo $INIT_CASES_MESSAGERIE ?>
	top: <?php echo $h?>%;
	left: <?php echo $w * 2?>%;
}
#C1
{
	<?php echo $INIT_CASES_MESSAGERIE ?>
	top: <?php echo $h * 2?>%;
}
#C2
{
	<?php echo $INIT_CASES_MESSAGERIE ?>
	top: <?php echo $h * 2?>%;
	left: <?php echo $w?>%;
}
#C3
{
	<?php echo $INIT_CASES_MESSAGERIE ?>
	top: <?php echo $h * 2?>%;
	left: <?php echo $w * 2?>%;
}
#onglets
{
	padding-bottom : 25px;
	border-bottom : 1px solid green;
	margin-left : 0;
	margin-top : 0;
	font : 14px Batang, arial, serif;
	list-style-type : none; /* pour enlever les puces */
}
#onglets li
{
	float: left;
	border : 1px solid green;
	height : 24px; /* à modifier suivant la taille de la police pour centrer le texte dans l'onglet */
	background-color: transparent;
}
#onglets .active a
{
	color : #000000;
	background-color : #FFFFFF;
}
#onglets .disabled a, #onglets .disabled a:hover
{
	display : block;
	filter : alpha(opacity=10);
	<?php if ( strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') )
	{?>
		background-color : #FFFFFF;
	<?php }else
	{?>
		background-color : #444444;
<?php
	} ?>
	-moz-opacity : 0.3;
	opacity : 0.3;
	color : #000000;
}
#onglets .passive a
{
	display : block;
	color : #FFFFFF;
	background-color : #000000;
}
#onglets a
{
	display: block;
	padding : 4px;
	color : #000000;
	text-decoration : none;
}
#onglets a:hover, #onglets .passive a:hover
{
	color : #000000;
	background-color : #FFFFFF;
}





Voilà pour le TP qui marque la fin de ce tutoriel. En espérant qu'il motive à coder plus rigoureusement, mais surtout qu'il fasse avancer les débutants dans la manière de coder, cette technique est basée simplement sur une conciliation entre la logique de programmation d'un algorithme et le codage PHP d'une page Web. Pour la suite, la contrainte d'utiliser sans cesse des requêtes nous amènera à plutôt manipuler des fichiers contenant les données directement chez l'utilisateur.

III-F. Remerciements

Ce tutoriel n'aurait pas pu être validé sur developpez.com sans les corrections indispensables effectuées par Claude.
Maxime Gault (_Max_) a pu me guider le long des étapes de validation.
Last but not least, mention spéciale pour deux personnages-clés de ce site :

  • Djibril, qui a pu établir la liaison entre mon labo et le QG ;
  • Maître Nono40, qui est resté alerte sur le forum privé.

Les modifications qu'ils ont apportées aux outils de rédaction du cours (LaTex, EditeurXML\x{0085}) et leurs explications m'ont permis de rédiger ce cours façon developpez.com.
Je tiens à souligner l'appui fondamental de sans lequel on n'aurait pu construire le plan de travail.
Pour les personnes de mon entourage, dans l'ordre antichronologique :
celles et ceux qui ont lu mon tutoriel avant qu'il ne soit publié et qui se reconnaîtront ;
Catherine Gourion, qui m'a montré une faille de sécurité dans l'algorithme et je la remercie grandement pour son soutien ;
Jean Louis Tutard, qui m'a grandement apporté en CSS, HTML, sitemapping et quincaillerie WEB fondamentale ;
la plupart des professeurs de l'IUT informatique Bordeaux I à Talence... de 1996 à 1999 (M. Duluc, etc.) qui ont réveillé ma passion pour l'algorithmique et l'informatique alors que je programmais déjà (mais bien mal) ;
tous les professeurs en productique (à qui je dédie ce tutoriel), et formateurs en automatisme et informatique industrielle, du lycée Pape Clément (avant 1995) et de l'AFPA de Pau. Vous conviendrez que ces algorithmes graphiques ressemblent assez à des grafcets...


précédentsommaire

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 Cédric Avril Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.