<?xml
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Vader[FR] : ce n'est pas un blog, c'est un Sith</title>
	<link>https://vader-fr.fr/</link>
	
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://vader-fr.fr/spip.php?id_rubrique=42&amp;page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>Vader[FR] : ce n'est pas un blog, c'est un Sith</title>
		<url>https://vader-fr.fr/local/cache-vignettes/L144xH144/siteon0-c1872.jpg?1771612673</url>
		<link>https://vader-fr.fr/</link>
		<height>144</height>
		<width>144</width>
	</image>



<item xml:lang="fr">
		<title>Fonctions pour PDO</title>
		<link>https://vader-fr.fr/spip.php?article180</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article180</guid>
		<dc:date>2018-07-01T10:29:46Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>



		<description>
&lt;p&gt;PDO est une couche d'abstraction en PHP permettant d'adresser une base de donn&#233;es ind&#233;pendamment de son type (MySQL, PostGres, Oracle...) Par s&#233;curit&#233;, il est pr&#233;f&#233;rable de faire des requ&#234;tes param&#233;tr&#233;es afin d'&#233;viter l'injection SQL. Le contrecoup, c'est le rajout de code qui devient plus long &#224; &#233;crire. &lt;br class='autobr' /&gt;
Le code &#233;tant toujours le m&#234;me, il est toutefois possible de le simplifier en cr&#233;ant une fonction simple qu'il suffira d'appeler. &lt;br class='autobr' /&gt;
Cette premi&#232;re fonction permet de pr&#233;parer et ex&#233;cuter (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique42" rel="directory"&gt;Exemples de fonctions PHP&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;PDO est une couche d'abstraction en PHP permettant d'adresser une base de donn&#233;es ind&#233;pendamment de son type (MySQL, PostGres, Oracle...)&lt;br class='autobr' /&gt;
Par s&#233;curit&#233;, il est pr&#233;f&#233;rable de faire des requ&#234;tes param&#233;tr&#233;es afin d'&#233;viter l'injection SQL.&lt;br class='autobr' /&gt;
Le contrecoup, c'est le rajout de code qui devient plus long &#224; &#233;crire.&lt;/p&gt;
&lt;p&gt;Le code &#233;tant toujours le m&#234;me, il est toutefois possible de le simplifier en cr&#233;ant une fonction simple qu'il suffira d'appeler.&lt;/p&gt;
&lt;p&gt;Cette premi&#232;re fonction permet de pr&#233;parer et ex&#233;cuter une requ&#234;te, laquelle peut &#234;tre param&#233;tr&#233;e, et dont le r&#233;sultat pourra &#234;tre :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; plusieurs lignes, trait&#233;es ensuite dans une boucle foreach&lt;/li&gt;&lt;li&gt; un nombre de ligne modifi&#233;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Elle effectue donc un prepare, puis bindValue pour 0-n param&#232;tres, puis un execute, et renvoie l'objet requ&#234;te PDO. &lt;br class='autobr' /&gt;
les param&#232;tres de la requ&#234;tes sont fournis dans un tableau qui commence &#224; 1 (de pr&#233;f&#233;rence) ou z&#233;ro&lt;br class='autobr' /&gt;
la requ&#234;te doit donc avoir &#034; ?&#034; en param&#232;tre(s) afin de pouvoir les affecter depuis un tableau par indice, plus facilement traitable. voir l'exemple plus bas&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function prepexec($rek,$params,$db){ if (isset($params[0])){ $debut=0; $correc=1; $fin=sizeof($params)-1; }else{ $debut=1; $correc=0; $fin=sizeof($params); } $rk=$db-&gt;prepare($rek); // si tableau param vide, pas de bindValue =&gt; fonction unique prepare avec/sans param + exec for ($i=$debut;$i&lt;=$fin;$i++){ $typ_param=PDO::PARAM_STR;// PAR DEFAUT $param=$params[($i+$correc)]; if (preg_match(&#034;/[\w]+/&#034;,$param)){ $typ_param=PDO::PARAM_STR; } // PDO::PARAM_STR if (preg_match(&#034;/^[+-]?\d+$/&#034;,$param)){ $typ_param=PDO::PARAM_INT; } // PDO::PARAM_INT // PDO::PARAM_BOOL - MySQL might not support PARAM_BOOL if (preg_match(&#034;/^$/&#034;,$param)){ $typ_param=PDO::PARAM_NULL; } // PDO::PARAM_NULL $rk-&gt;bindValue($i,$param,$typ_param); } // renvoie la requ&#234;te pr&#233;par&#233;e et execut&#233;e $rk-&gt;execute(); // $nb=$rk-&gt;execute(); OU foreach ($rk as $result){ // donc $nb=prepexec(... ou $rk=prepexec puis foreach($rk... ou m&#234;me foreach(prepexec... return $rk; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;exemple d'appel :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; $rek=&#034;select count(login) as existe from utilisateur where login=?&#034;; $params[1]=$user; $rk=prepexec($rek,$params,$db); $existe=0; foreach ($rk as $result){ $existe=$result['existe']; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cependant, cela est encore trop long.&lt;br class='autobr' /&gt;
Cette deuxi&#232;me fonction va donc faire le boulot en appelant la premi&#232;re et en renvoyant la valeur attendue, unique, et dont le nom du champ est indiqu&#233;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function simplexec($rek,$params,$db,$nomvar){ $resultat=null; $rk=prepexec($rek,$params,$db); foreach ($rk as $result){ $resultat=$result[&#034;$nomvar&#034;]; } return $resultat; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Fonctions sur les mots de passe</title>
		<link>https://vader-fr.fr/spip.php?article179</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article179</guid>
		<dc:date>2018-07-01T10:27:49Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>



		<description>
&lt;p&gt;Diverses fonctions pour g&#233;rer l'authentification d'utilisateurs et le stockage s&#233;curis&#233; des mots de passe dans la BDD. &lt;br class='autobr' /&gt;
V&#233;rification de la complexit&#233; d'un mot de passe &lt;br class='autobr' /&gt;
si la fonction renvoie une cha&#238;ne vide lorsqu'on l'appelle, tout baigne. &lt;br class='autobr' /&gt; function chk_complex_mp($motpass) $message=&#034;&#034; ; $patterns[0]=&#034;/^.*[A-Z].*+$/&#034; ;	$complexe[0]=&#034;Il faut au moins une lettre majuscule&#034; ; $patterns[1]=&#034;/^.*[a-z].*+$/&#034; ;	$complexe[1]=&#034;Il faut au moins une lettre minuscule&#034; ; (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique42" rel="directory"&gt;Exemples de fonctions PHP&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Diverses fonctions pour g&#233;rer l'authentification d'utilisateurs et le stockage s&#233;curis&#233; des mots de passe dans la BDD.&lt;/p&gt;
&lt;div class=&#034;onglets_bloc_initial&#034;&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;V&#233;rification de la complexit&#233; d'un mot de passe&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;si la fonction renvoie une cha&#238;ne vide lorsqu'on l'appelle, tout baigne.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function chk_complex_mp($motpass){ $message=&#034;&#034;; $patterns[0]=&#034;/^.*[A-Z].*+$/&#034;;	$complexe[0]=&#034;Il faut au moins une lettre majuscule&lt;br/&gt;&#034;; $patterns[1]=&#034;/^.*[a-z].*+$/&#034;;	$complexe[1]=&#034;Il faut au moins une lettre minuscule&lt;br/&gt;&#034;; $patterns[2]=&#034;/^.*[0-9].*+$/&#034;;	$complexe[2]=&#034;Il faut au moins un chiffre&lt;br/&gt;&#034;; $patterns[3]=&#034;/^.{8,}$/&#034;; $complexe[3]=&#034;Il faut au moins 8 caract&#232;res&lt;br/&gt;&#034;; for ($i=0;$i&lt;sizeof($patterns);$i++){ $pattern=$patterns[$i]; if (!preg_match(&#034;$pattern&#034;,$motpass)){ $message.=$complexe[$i]; } } return $message; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Hashage de mot de passe avec sel, par algorithme choisi&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Cette fonction n'est qu'un exemple de fonction de cryptage, il est possible de faire plus souple/plus complexe.&lt;br class='autobr' /&gt;
A partir d'un mot de passe en clair, d'une cha&#238;ne de salage et d'un algorithme de hashage, elle :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; casse le sel en 3 parties de 10 caract&#232;res&lt;/li&gt;&lt;li&gt; casse le mot de passe en 3 parties &#233;gales&lt;/li&gt;&lt;li&gt; hash une premi&#232;re fois les morceaux de mot de passe m&#233;lang&#233;s aux morceaux de sel&lt;/li&gt;&lt;li&gt; re-casse le mot de passe sal&#233; et hash&#233; en 3 parties &#233;gales&lt;/li&gt;&lt;li&gt; et enfin re-m&#233;lange le sel avec le mot de passe hash&#233;.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function genere_motpasse($motpasse,$alt,$algo){ $alt1=substr($alt, 0, 10); $alt2=substr($alt, 10, 10); $alt3=substr($alt, 20, 10); $taillepass=strlen($motpasse); $taillemorceau=intval($taillepass/3); $pass1=substr($motpasse,0,$taillemorceau); $pass2=substr($motpasse,$taillemorceau,$taillemorceau); $pass3=substr($motpasse,($taillemorceau*2)); $passfin=hash($algo,&#034;$pass1$alt1$pass2$alt2$pass3$alt3&#034;); $taillepassf=strlen($passfin); $taillemorceauf=intval($taillepassf/3); $passf1=substr($passfin,0,$taillemorceauf); $passf2=substr($passfin,$taillemorceauf,$taillemorceauf); $passf3=substr($passfin,($taillemorceauf*2)); $passfou=&#034;$passf1$alt1$passf2$alt2$passf3$alt3&#034;; // le mot de passe coup&#233;, sal&#233;, hash&#233; et re-sal&#233; est : return $passfou; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;G&#233;n&#233;ration de mot de passe al&#233;atoire et/ou de sel&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;voir l'&lt;a href=&#034;https://fr.wikipedia.org/wiki/Salage_%28cryptographie%29&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;article&lt;/a&gt; sur le salage en informatique sur Wikipedia.&lt;/p&gt;
&lt;p&gt;Cette fonction g&#233;n&#232;re donc une cha&#238;ne al&#233;atoire, par exemple pour le sel al&#233;atoire, qui devra &#234;tre stock&#233;, &#233;ventuellement pour chaque utilisateur.&lt;br class='autobr' /&gt;
Cela permet de se prot&#233;ger (dans une certaine mesure) des attaques par rainbow table.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// g&#233;n&#232;re une cha&#238;ne alpha-num&#233;rique al&#233;atoire de longueur $taille function genere_chaine_aleatoire($taille) { $code_aleatoire=&#034;&#034;; $chaine=&#034;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&#034;; srand((double)microtime()*1000000); for($i=0; $i&lt;$taille; $i++) { $code_aleatoire.=$chaine[rand()%strlen($chaine)]; // ou $code_aleatoire .= substr($chaine,rand()%(strlen($chaine)),1); // ou $code_aleatoire .= $chaine[ rand(0, ($nb_chars-1)) ]; } // ou $code_aleatoire = str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'); return $code_aleatoire; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;si l'on veut casser et m&#233;langer le sel et le mot de passe avant/apr&#232;s cryptage selon les chiffres compris dans le sel, il est possible, &#224; sa g&#233;n&#233;ration, de rajouter une cha&#238;ne &#034;0 &#224; 9&#034; au sel si celui-ci ne contient pas de chiffre, puis de m&#233;langer le sel par la fonction str_shuffle().&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Choix d'un algorithme de hashage&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Ce bout de code cherche dans le tableau renvoy&#233; par la fonction &#034;hash_algos&#034; les meilleurs algorithmes de hashage.&lt;br class='autobr' /&gt;
hash_algos() renvoie les algorithmes support&#233;s sur le syst&#232;me.&lt;/p&gt;
&lt;p&gt;Une fois trouv&#233;, l'algorithme &#224; utiliser pourra &#234;tre stock&#233; soit dans le fichier connect.php, soit dans la base de donn&#233;es, dans une table de m&#233;ta-variables.&lt;br class='autobr' /&gt;
Les algorithmes &#224; chercher sont tri&#233;s par ordre &#034;de pr&#233;f&#233;rence&#034; du plus s&#251;r (sha512, whrilpool...) au moins s&#251;r (crc32).&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; // chercher dans hash_algos si sha512, sha256, sha1... sont utilisables. $algos_prefs=array(&#034;sha512&#034;, &#034;whirlpool&#034;, &#034;sha384&#034;, &#034;ripemd320&#034;, &#034;sha256&#034;, &#034;snefru256&#034;, &#034;ripemd256&#034;, &#034;snefru&#034;, &#034;gost&#034;, &#034;sha224&#034;, &#034;ripemd160&#034;, &#034;ripemd128&#034;, &#034;fnv164&#034;, &#034;joaat&#034;, &#034;crc32b&#034;, &#034;adler32&#034;, &#034;fnv132&#034;, &#034;crc32&#034;); $algo=null; $i=0; $nbalgos=sizeof($algos_prefs); while (($i&lt;$nbalgos)&amp;&amp;($algo==null)){ if (in_array($algos_prefs[$i],hash_algos())){ $info.=&#034;&lt;span class=\&#034;info\&#034;&gt;&#034;.$algos_prefs[$i].&#034; est support&#233;&lt;/span&gt;&lt;br/&gt;&#034;; $algo=$algos_prefs[$i]; }else{ $info.=&#034;&lt;span class=\&#034;debug\&#034;&gt;&#034;.$algos_prefs[$i].&#034; non support&#233;&lt;/span&gt;&lt;br/&gt;&#034;; $i++; } } if ($algo==null){ $info.=&#034;&lt;span class=\&#034;error\&#034;&gt;Aucun algorithme support&#233; parmi ceux cherch&#233;s&lt;/span&gt;&lt;br/&gt;&#034;; $debug.=&#034;Aucun algorithme support&#233; parmi ceux cherch&#233;s&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Transformer une dur&#233;e en secondes en sa description textuelle</title>
		<link>https://vader-fr.fr/spip.php?article178</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article178</guid>
		<dc:date>2018-07-01T10:23:43Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>



		<description>
&lt;p&gt;// transforme une dur&#233;e en secondes en sa description textuelle function sec2txt($durees) $tabpuis=array(&#034;seconde&#034;,&#034;minute&#034;,&#034;heure&#034;,&#034;jour&#034;) ; // + 30j/mois, 12 mois/an... ? $tabfrac=[60,60,24] ; $traite=$durees ; $puiss=0 ; $duree=&#034;&#034; ; while ($traite&gt;=$tabfrac[$puiss]) $reste=$traite%$tabfrac[$puiss] ; $fraction=($traite-$reste)/$tabfrac[$puiss] ; if ($reste&gt;0) $duree=($duree !=&#034;&#034;) ?&#034; $duree&#034; :$duree ; (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique42" rel="directory"&gt;Exemples de fonctions PHP&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// transforme une dur&#233;e en secondes en sa description textuelle function sec2txt($durees){ $tabpuis=array(&#034;seconde&#034;,&#034;minute&#034;,&#034;heure&#034;,&#034;jour&#034;); // + 30j/mois, 12 mois/an... ? $tabfrac=[60,60,24]; $traite=$durees; $puiss=0; $duree=&#034;&#034;; while ($traite&gt;=$tabfrac[$puiss]){ $reste=$traite%$tabfrac[$puiss]; $fraction=($traite-$reste)/$tabfrac[$puiss]; if ($reste&gt;0){ $duree=($duree!=&#034;&#034;)?&#034; $duree&#034;:$duree; $duree=($reste&gt;1)?&#034;$reste &#034;.$tabpuis[$puiss].&#034;s&#034;.$duree:&#034;$reste &#034;.$tabpuis[$puiss].$duree; } $puiss++; $traite=$fraction; } $duree=($duree!=&#034;&#034;)?&#034; $duree&#034;:$duree; $duree=($traite&gt;1)?&#034;$traite &#034;.$tabpuis[$puiss].&#034;s&#034;.$duree:&#034;$traite &#034;.$tabpuis[$puiss].$duree; return $duree; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Transformer un nombre (entier naturel) en sa description textuelle</title>
		<link>https://vader-fr.fr/spip.php?article177</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article177</guid>
		<dc:date>2018-07-01T10:20:45Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>



		<description>
&lt;p&gt;// transforme un nombre en sa description textuelle function num2txt($num) $res=($num1) $res.=$tabchiffres[$milnum[0]].&#034; cent&#034; ; $res.=(($milnum[1]&gt;0)||($milnum[2]&gt;0)||($puiss&gt;=2)) ?&#034;s&#034; :&#034;&#034; ; if ($taillenum&gt;=2) // si 2 chiffres, traiter dizaines $pos=($taillenum==3) ?1:0 ; $res.=($res !=&#034;&#034;) ?&#034; &#034; :&#034;&#034; ; //$res.=($pos !=0) ?&#034; &#034; :&#034;&#034; ; $next=$pos+1 ; // si 1 if ($milnum[$pos]==1) if (($milnum[$next]&gt;=1)&amp;&amp;($milnum[$next]&lt;=6)) // onze &#224; (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique42" rel="directory"&gt;Exemples de fonctions PHP&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// transforme un nombre en sa description textuelle
function num2txt($num){ $res=($num&lt;0)?&#034;moins&#034;:&#034;&#034;; $tabchiffres=array(&#034;&#034;,&#034;un&#034;,&#034;deux&#034;,&#034;trois&#034;,&#034;quatre&#034;,&#034;cinq&#034;,&#034;six&#034;,&#034;sept&#034;,&#034;huit&#034;,&#034;neuf&#034;); // commence &#224; z&#233;ro ! $tabdix=array(&#034;&#034;,&#034;onze&#034;,&#034;douze&#034;,&#034;treize&#034;,&#034;quatorze&#034;,&#034;quinze&#034;,&#034;seize&#034;); // idem $tabdizaines=array(&#034;&#034;,&#034;dix&#034;,&#034;vingt&#034;,&#034;trente&#034;,&#034;quarante&#034;,&#034;cinquante&#034;,&#034;soixante&#034;);	// idem $trnum=number_format($num); // pas de partie d&#233;cimale, une , entre chaque millier $tabnum=explode(&#034;,&#034;,$trnum); $puiss=count($tabnum); // 1 = entre 0 et 999, 2 = entre 1000 et 999 999 milliers, 3 = entre 1 000 000 et 999 999 999 milions, 4 =... $tabpuis=array(&#034;&#034;,&#034;&#034;,&#034;mille&#034;,&#034;million&#034;,&#034;milliard&#034;); // centaine/dizaine de milliards, centaine/dizaine de million, centaine/dizaine de millier, centaine/dizaine/unit&#233; foreach ($tabnum as $milnum){ $taillenum=strlen($milnum); $res.=($res!=&#034;&#034;)?&#034; &#034;:&#034;&#034;; $verrounite=false; if ($taillenum==3) { // si 3 chiffres, traiter centaines // si 0 = rien, sinon x cent(s) if ($milnum[0]==1){ $res.=&#034;cent&#034;; } if ($milnum[0]&gt;1){ $res.=$tabchiffres[$milnum[0]].&#034; cent&#034;; $res.=(($milnum[1]&gt;0)||($milnum[2]&gt;0)||($puiss&gt;=2))?&#034;s&#034;:&#034;&#034;; } } if ($taillenum&gt;=2) { // si 2 chiffres, traiter dizaines $pos=($taillenum==3)?1:0; $res.=($res!=&#034;&#034;)?&#034; &#034;:&#034;&#034;; //$res.=($pos!=0)?&#034; &#034;:&#034;&#034;; $next=$pos+1; // si 1 if ($milnum[$pos]==1){ if (($milnum[$next]&gt;=1)&amp;&amp;($milnum[$next]&lt;=6)){ // onze &#224; seize $res.=$tabdix[$milnum[$next]]; $verrounite=true; }else{ // 0 +	si 7 &#224; 9 = dix- $res.=$tabdizaines[1]; $res.=($milnum[$next]&gt;=7)?&#034;-&#034;:&#034;&#034;; } } // si 2 &#224; 6 if (($milnum[$pos]&gt;1)&amp;&amp;($milnum[$pos]&lt;7)){ $res.=$tabdizaines[$milnum[$pos]]; $res.=($milnum[$next]&gt;0)?&#034;-&#034;:&#034;&#034;; } // si 7, 8 et 9 qui utilisent aussi le chiffre des unit&#233;s if ($milnum[$pos]==7){ $res.=&#034;soixante&#034;; if ($milnum[$next]==0){ $res.=&#034;-dix&#034;; } if ($milnum[$next]==1){ $res.=&#034; et onze&#034;; } if (($milnum[$next]&gt;=2)&amp;&amp;($milnum[$next]&lt;=6)){ $res.=&#034;-&#034;.$tabdix[$milnum[$next]]; } if ($milnum[$next]&gt;=7){ $res.=&#034;-dix-&#034;.$tabchiffres[$milnum[$next]]; } $verrounite=true; } if ($milnum[$pos]==8){ //$verrounite=true; $res.=&#034;quatre-vingt&#034;; if ($milnum[$next]&gt;1){ $res.=&#034;-&#034;; } } if ($milnum[$pos]==9){ $res.=&#034;quatre-vingt&#034;; if ($milnum[$next]==0){ $res.=&#034;-dix&#034;; } if (($milnum[$next]&gt;=1)&amp;&amp;($milnum[$next]&lt;=6)){ $res.=&#034;-&#034;.$tabdix[$milnum[$next]]; } if ($milnum[$next]&gt;=7){ $res.=&#034;-dix-&#034;.$tabchiffres[$milnum[$next]]; } $verrounite=true; } } if ($taillenum&gt;=1) { // si 1 chiffres $pos=$taillenum-1; // dernier chiffre 2-1 = 1 ? 3-1=2 if ($pos==0){ // 1 seul chiffre, donc si &gt;1 ou 1 et puiss = 1, afficher le chiffre $res.=(($milnum&gt;1)||(($milnum==1)&amp;&amp;($puiss==1)))?$tabchiffres[$milnum]:&#034;&#034;; }else{ if ((!$verrounite)&amp;&amp;($milnum[$pos]!=0)){ // si chiffre dizaine != 7, 8 ou 9 $pre=$pos-1; if ($milnum[$pre]==0){ $res.=$tabchiffres[$milnum[$pos]]; } // si dizaine if ($milnum[$pre]==1){ // d&#233;j&#224; un tiret $res.=$tabchiffres[$milnum[$pos]]; } // si vingt &#224; 60 ou 80, et 1, mettre x et 1 if (((($milnum[$pre]&gt;=2)&amp;&amp;($milnum[$pre]&lt;=6))||($milnum[$pre]==8))&amp;&amp;($milnum[$pos]==1)){ $res.=&#034;et-&#034;.$tabchiffres[$milnum[$pos]]; } // si vingt &#224; 60 ou 80 et pas 1 if (((($milnum[$pre]&gt;=2)&amp;&amp;($milnum[$pre]&lt;=6))||($milnum[$pre]==8))&amp;&amp;($milnum[$pos]!=1)){ $res.=$tabchiffres[$milnum[$pos]]; } } } } // si total&gt;1, mettre le tabpuiss[puiss] if (($milnum&gt;=1)&amp;&amp;($tabpuis[$puiss]!=&#034;&#034;)){ $res.=($res!=&#034;&#034;)?&#034; &#034;:&#034;&#034;; $res.=$tabpuis[$puiss]; // mille est invariable // mais million, non $res.=(($puiss==3)&amp;&amp;($milnum&gt;1))?&#034;s&#034;:&#034;&#034;; } $puiss--; } if ($num==0){ $res=&#034;z&#233;ro&#034;; } return $res;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
