<?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=17&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>
<item xml:lang="fr">
		<title>Exemples de fonctions PHP</title>
		<link>https://vader-fr.fr/spip.php?article174</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article174</guid>
		<dc:date>2016-07-27T08:09:54Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>


		<dc:subject>PHP</dc:subject>
		<dc:subject>D&#233;veloppement web</dc:subject>

		<description>
&lt;p&gt;Retour des erreurs &lt;br class='autobr' /&gt;
Lorsque les erreurs et autres messages &#224; caract&#232;re informatif sont g&#233;r&#233;s dans les diff&#233;rents blocs, et empil&#233;s dans une variable qui sera au final affich&#233;e dans un bloc d&#233;di&#233; (lequel peut &#234;tre d&#233;pliant gr&#226;ce au CSS). Si l'on souhaite un style diff&#233;rent selon le niveau d'erreur atteint, les diff&#233;rents blocs peuvent faire appel &#224; cette fonction, qui use d'op&#233;rateurs ternaires. &lt;br class='autobr' /&gt;
Il est aussi possible d'utiliser une variable globale pour le niveau d'erreur actuel, ce qui (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique17" rel="directory"&gt;Les pages dynamiques avec PHP/MySQL&lt;/a&gt;

/ 
&lt;a href="https://vader-fr.fr/spip.php?mot2" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot9" rel="tag"&gt;D&#233;veloppement web&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&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;Retour des erreurs&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Lorsque les erreurs et autres messages &#224; caract&#232;re informatif sont g&#233;r&#233;s dans les diff&#233;rents blocs, et empil&#233;s dans une variable qui sera au final affich&#233;e dans un bloc d&#233;di&#233; (lequel peut &#234;tre d&#233;pliant gr&#226;ce au CSS).&lt;br class='autobr' /&gt;
Si l'on souhaite un style diff&#233;rent selon le niveau d'erreur atteint, les diff&#233;rents blocs peuvent faire appel &#224; cette fonction, qui use d'op&#233;rateurs ternaires.&lt;/p&gt;
&lt;p&gt;Il est aussi possible d'utiliser une variable globale pour le niveau d'erreur actuel, ce qui simplifie les appels &#224; la fonction.&lt;/p&gt;
&lt;p&gt;3 niveaux d'erreur sont g&#233;r&#233;s :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; info : tout va bien, on affiche un (ou plus) message(s) juste pour information&lt;/li&gt;&lt;li&gt; debug : attention, risque d'erreur, tout n'est pas optimal&lt;/li&gt;&lt;li&gt; error : erreur critique&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 raise_debuglvl($lvl,$actuel){ $debuglvl=$actuel; $debuglvl=(($lvl==&#034;info&#034;)&amp;&amp;($actuel==&#034;info&#034;))?&#034;info&#034;:$debuglvl; $debuglvl=(($lvl==&#034;debug&#034;)&amp;&amp;($actuel!=&#034;error&#034;))?&#034;debug&#034;:$debuglvl; $debuglvl=($lvl==&#034;error&#034;)?&#034;error&#034;:$debuglvl; return $debuglvl;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La d&#233;claration du bloc d'affichage :&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;// bloc d'information - l'image sert au d&#233;ploiement mais reste affich&#233;e dans le bloc d&#233;pli&#233; if ($debug!=&#034;&#034;){ switch ($debuglvl) { case &#034;info&#034; : $debugimg=&#034;notif-info.gif&#034;; break; // ou action-s-valide case &#034;debug&#034; : $debugimg=&#034;notif-warning.gif&#034;; break; case &#034;error&#034; : $debugimg=&#034;notif-error.gif&#034;; break; default: $debugimg=&#034;notif-warning.gif&#034;; break; } echo &#034;&lt;div id=\&#034;debug\&#034; class=\&#034;$debuglvl\&#034;&gt; &lt;img src=\&#034;imj/$debugimg\&#034; alt=\&#034;$debuglvl\&#034;/&gt; $debug &lt;/div&gt;&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La page appelante d&#233;clare les variables &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debug&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$info&lt;/code&gt; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debug&lt;/code&gt; contiendra les messages &#224; afficher dans le bloc d&#233;di&#233;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$info&lt;/code&gt; contiendra les messages &#224; afficher dans la page.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Les pages appel&#233;es (via &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;include&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;require&lt;/code&gt; empileront dans ces variables les messages qu'elles souhaitent soulever.&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debug.=&#034;message&#034;;&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$info.=&#034;message&#034;;&lt;/code&gt;, cette derni&#232;re variable pouvant &#234;tre affich&#233;e dans la page puis vid&#233;e.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;exemple d'utilisation&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;
&lt;p&gt;dans un script g&#233;rant le login d'un utilisateur, on r&#233;cup&#232;re (en &#233;tape 2) login/mot de passe.&lt;br class='autobr' /&gt;
Selon ce qui est fourni, on retourne en &#233;tape 1 en affichant un message d'erreur.&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;if ($etape==2){ if ((isset($_POST[&#034;user&#034;]))&amp;&amp;($_POST[&#034;user&#034;]!=&#034;&#034;)){ $user=$_POST[&#034;user&#034;]; // v&#233;rifier pas d'espace (entre autre) if (!preg_match(&#034;/^[a-z][a-z0-9]+$/&#034;,$user)){ $debug.=&#034;nom utilisateur non conforme&lt;br/&gt;&#034;; } }else{ $debug.=&#034;nom utilisateur manquant&lt;br/&gt;&#034;; } if ((isset($_POST[&#034;motpass&#034;]))&amp;&amp;($_POST[&#034;motpass&#034;]!=&#034;&#034;)){ $motpass=$_POST[&#034;motpass&#034;]; // v&#233;rifier pas d'espace (entre autre) if (!preg_match(&#034;/^[a-zA-Z0-9]+$/&#034;,$user)){ $debug.=&#034;mot de passe non conforme&lt;br/&gt;&#034;; } }else{ $debug.=&#034;mot de passe manquant&lt;br/&gt;&#034;; } if ($debug!=&#034;&#034;){ $etape=1; $info=$debug; raise_debuglvl(&#034;debug&#034;,$debuglvl); }
}
if ($etape==2){
// comparaison BDD
}
if ($etape==1){ echo &#034;&lt;div id=\&#034;navig\&#034; class=\&#034;$page\&#034;&gt; Bloc navigation &lt;/div&gt; &lt;div id=\&#034;contenu\&#034; class=\&#034;$page\&#034;&gt; $info &#034;; // formulaire }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;son style CSS&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;
&lt;p&gt;pour un bloc d&#233;pliable CSS situ&#233; en haut &#224; gauche de la page :&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;#debug { position:absolute; top:0; left:0; width:32px; height:32px; z-index:42; line-height:0; font-size:0;
}
#debug img { height:auto; width:auto; max-height:32px; max-width:32px; visibility:visible;
}
#debug:hover { height:auto; width:auto; min-height:100px; min-width:200px; line-height:normal; font-size:1em; overflow-y:auto;
}
#debug:hover img { height:auto; width:auto;
}
#debug:hover img#deploi_debug { height:0; width:0; visibility:hidden;
}
/* =========================================== Messages de d&#233;bogages =========================================== */
#debug.error{ background-color:#FF0000;
}
#debug.error:hover { background-color:#FF8C00;
} #debug.debug { background-color:#FF8C00; }
#debug.info { background-color:#ADD8E6;
}
#debug.debug:hover, #debug.info:hover { background-color:#ADD8E6;
}
.debug { color:#FF8C00; /*#FFB30A;*/ /*#FFA501;*/
}
.info { color:#40820D; }
.error { color:#FF0000; font-weight:bold;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&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;redirection en https&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Pas vraiment une fonction, mais un petit bout de code &#224; mettre dans la section &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;head&gt;...&lt;/head&gt;&lt;/code&gt;.&lt;br class='autobr' /&gt;
Si la page est acc&#233;d&#233;e en http non s&#233;curis&#233;, on redirige vers le mode s&#233;curis&#233; https, via une balise meta.&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; // 'HTTPS' est d&#233;fini &#224; une valeur non-vide si le script a &#233;t&#233; appel&#233; via le protocole HTTPS. if ((!isset($_SERVER['HTTPS']))||($_SERVER['HTTPS']==&#034;&#034;)){ $url=&#034;https://&#034;.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; echo &#034;&lt;meta http-equiv='Refresh' content=\&#034;0; url=$url\&#034;/&gt;&#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>V) Requ&#234;tes SQL</title>
		<link>https://vader-fr.fr/spip.php?article87</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article87</guid>
		<dc:date>2012-11-07T17:46:33Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>



		<description>
&lt;p&gt;La base cit&#233;e en exemple, &#224; savoir une gestion de biblioth&#232;que, est un exemple &#034;bateau&#034; r&#233;current dans l'apprentissage du php/sql. La gestion de bases plus complexes sera &#233;voqu&#233;e ult&#233;rieurement. &lt;br class='autobr' /&gt; Lecture &lt;br class='autobr' /&gt;
Une requ&#234;te est g&#233;n&#233;ralement constitu&#233;e des 4 &#233;l&#233;ments suivants. la liste des champs &#224; s&#233;lectionner : SELECT champ1, champ2... la liste des tables dans lesquelles r&#233;cup&#233;rer ces champs : FROM table1, table2... une clause de filtrage : WHERE condition une clause de tri et/ou de groupage : (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique17" rel="directory"&gt;Les pages dynamiques avec PHP/MySQL&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;La base cit&#233;e en exemple, &#224; savoir une gestion de biblioth&#232;que, est un exemple &#034;bateau&#034; r&#233;current dans l'apprentissage du php/sql.&lt;br class='autobr' /&gt;
La gestion de bases plus complexes sera &#233;voqu&#233;e ult&#233;rieurement.&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt; Lecture &lt;/h3&gt;
&lt;p&gt;Une requ&#234;te est g&#233;n&#233;ralement constitu&#233;e des 4 &#233;l&#233;ments suivants.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; la liste des champs &#224; s&#233;lectionner : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;SELECT champ1, champ2...&lt;/code&gt;&lt;/li&gt;&lt;li&gt; la liste des tables dans lesquelles r&#233;cup&#233;rer ces champs : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;FROM table1, table2...&lt;/code&gt;&lt;/li&gt;&lt;li&gt; une clause de filtrage : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;WHERE condition&lt;/code&gt;&lt;/li&gt;&lt;li&gt; une clause de tri et/ou de groupage : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ORDER BY/GROUP BY/HAVING&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;clause SELECT&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On y liste les champs &#224; s&#233;lectionner dans la base.&lt;br class='autobr' /&gt;
Les champs accessibles sont ceux des tables list&#233;es dans la clause FROM.&lt;br class='autobr' /&gt;
Si des champs de tables diff&#233;rentes ont le m&#234;me nom, on mettra le nom de leur table suivi du nom du champ, s&#233;par&#233;s par un point : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.&lt;/code&gt;&lt;br class='autobr' /&gt;
Par exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select livre.nom,adherent.nom from livre, adherent&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Cette requ&#234;te n'a aucune utilit&#233; et va combiner tous les noms d'adh&#233;rents de la biblioth&#232;que avec tous les noms de livres. &lt;br class='autobr' /&gt;
Le nombre de lignes de r&#233;sultat sera donc &#233;gal au nombre de lignes de la table adh&#233;rent multipli&#233; par le nombre de lignes de la table livre.&lt;/p&gt;
&lt;p&gt;Il existe des champs sp&#233;ciaux, qui correspondent &#224; des fonctions, dont :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; count(nom_champ) qui compte le nombre d'occurrence du champ nom_champ.&lt;/li&gt;&lt;li&gt; max(nom_champ) qui retourne la valeur maximale prise par le champ nom_champ&lt;/li&gt;&lt;li&gt; min(nom_champ) qui renvoie la valeur minimale&lt;/li&gt;&lt;li&gt; avg(champ) qui renvoie la moyenne&lt;/li&gt;&lt;li&gt; sum(champ) pour additionner&lt;/li&gt;&lt;li&gt; ...&lt;/li&gt;&lt;li&gt; distinct(nom_champ) qui s&#233;lectionne les valeurs diff&#233;rentes. Par exemple, un count(distinct(nom_champ)) comptera le nombre d'occurrences diff&#233;rentes de nom_champ, donc sans compter les doublons.&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;* &lt;/code&gt; est un champ sp&#233;cial signifiant que l'on prend tous les champs de toutes les tables list&#233;es dans la clause FROM.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Dans le cas de champs sp&#233;ciaux, il sera pr&#233;f&#233;rable d'utiliser des alias afin de faciliter la r&#233;cup&#233;ration des donn&#233;es, via le mot cl&#233; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;as&lt;/code&gt;.&lt;br class='autobr' /&gt;
Par exemple &lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select count(identifiant) as nblivre from livre&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;clause FROM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On y liste les tables sur lesquelles s'effectuent la s&#233;lection, s&#233;par&#233;es par des virgules.&lt;/p&gt;
&lt;p&gt;Bien que la connexion initiale se fasse sur une base unique, on peut faire une s&#233;lection sur plusieurs bases en pr&#233;cisant le nom de la base avant celui de la table, les deux &#233;tant s&#233;par&#233;s par un &#034;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.&lt;/code&gt;&#034;.&lt;br class='autobr' /&gt;
Il est l&#224; aussi possible d'utiliser des alias par le mot cl&#233; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;as&lt;/code&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select champ1 from table1 as t1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;En cas de s&#233;lection sur plusieurs tables, il est pr&#233;f&#233;rable d'op&#233;rer une jonction sur leurs points communs.&lt;br class='autobr' /&gt;
Le cas &#233;ch&#233;ant, le syst&#232;me de gestion va tester la combinaison de chaque ligne de chaque table avec toutes les autres lignes de toutes les tables list&#233;es.&lt;br class='autobr' /&gt;
Cela multiplie inutilement les tests par la suite.&lt;/p&gt;
&lt;p&gt;Il y a plusieurs types de jonctions, mais la plus courante est la jonction interne.&lt;/p&gt;
&lt;p&gt;Par exemple, si la table des emprunts fait r&#233;f&#233;rence &#224; un utilisateur et un livre, alors on va op&#233;rer une jonction sur l'identifiant utilisateur (utilisateur + emprunt) et sur l'identifiant livre (livre + emprunt).&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select livre.titre,nom,date_emprunt from livre inner join emprunt on (emprunt.livre=livre.id) inner join adherent on (emprunt.adherent=adherent.id) &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A noter, une sous-requ&#234;te peut servir de table. Cela consommera plus de ressources, mais parfois c'est le seul moyen.&lt;/p&gt;
&lt;p&gt;Pour reprendre l'exemple de la biblioth&#232;que, on pourrait compter le nombre de fois par personne o&#249; les livres ont &#233;t&#233; rendus en retard, puis prendre ceux dont le nombre de fois .... est sup&#233;rieur ou &#233;gal &#224; 3.&lt;/p&gt;
&lt;p&gt;On fera alors quelque chose comme&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; SELECT nom_personne from (SELECT count(*) as nombre_retard,nom_personne from emprunts inner join personnes on (emprunts.id_personne=personnes.id_personnes) where (date_rendu-date_pret)&gt;=X group by id_personne) where nombre_retard&gt;=3&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cela est &#233;galement faisable avec une clause HAVING, ce qui all&#233;gerait la requ&#234;te.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;clause WHERE&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La clause WHERE permet d'effectuer un filtre sur les lignes cr&#233;&#233;es par les clauses SELECT ... FROM ..&lt;/p&gt;
&lt;p&gt;Ce filtre est ex&#233;cut&#233; apr&#232;s le calcul de ces lignes. C'est pourquoi il est pr&#233;f&#233;rable de passer par une jonction dans la clause FROM lorsque cela est possible pour effectuer une correspondance entre deux (ou plus) tables.&lt;/p&gt;
&lt;p&gt;Ce filtre est constitu&#233; d'une ou plusieurs conditions&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; s&#233;par&#233;es par les mots-cl&#233;s :&lt;/li&gt;&lt;li&gt; &#034;and&#034; (et) si toutes les conditions doivent &#234;tre remplies&lt;/li&gt;&lt;li&gt; &#034;or&#034; (ou) si une seule des conditions suffit&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; segment&#233;es par des parenth&#232;ses &#034;(&#034; et &#034;)&#034; si besoin.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Une condition peut &#234;tre :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; comparaison de deux champs avec signes &#034;=&#034;, &#034;&gt;&#034;, &#034;&gt;=&#034;, &#034;&lt;&#034;, &#034;&lt;=&#034; et &#034;&lt;&gt;&#034; (diff&#233;rence) ainsi que le mot-cl&#233; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;LIKE&lt;/code&gt;, pour comparaison de texte&lt;/li&gt;&lt;li&gt; pr&#233;sence ou nom de la valeur d'un champ dans une sous-requ&#234;te gr&#226;ce au mot cl&#233; &#034;in&#034; ou &#034;not in&#034;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Par exemple, les personnes qui n'ont pas emprunt&#233; de livres sont celles qui ne sont pas pr&#233;sentes dans la table des emprunts.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;SELECT nom_personne FROM personnes WHERE id_personne NOT IN (select distinct(id_personne) from emprunts);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Pour le texte, la comparaison avec le mot-cl&#233; LIKE s'effectue g&#233;n&#233;ralement sur une partie du contenu : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;WHERE champ LIKE '%valeur%'&lt;/code&gt; filtrera les lignes dont le champ texte &#034;champ&#034; contient (entre autre) le texte &#034;valeur&#034;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ORDER BY/GROUP BY/HAVING&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; ORDER BY est une clause de tri.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;On peut trier selon un ou deux champs, dans l'ordre ascendant (ASC) ou descendant (DESC)&lt;br class='autobr' /&gt;
Par exemple, tri sur une date, du plus ancien au plus r&#233;cent donc de la plus petite date &#224; la plus grande = ASC&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select ... order by champ1 ASC&lt;/code&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; GROUP BY est une clause de regroupement selon une &#233;galit&#233; d'un champ.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Par exemple, pour avoir le nombre d'emprunts de chaque personne :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select count(*) as nbemprunts, id_personne from emprunts GROUP BY id_personne&lt;/code&gt;&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; HAVING permet de filtrer sur les fonctions d'agr&#233;gat (et non de &#034;simples&#034; champs contrairement &#224; la clause WHERE).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Par exemple, pour r&#233;cup&#233;rer les personnes ayant plus de 50 emprunts.&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select nom, count(emprunts.date_emprunt) as nbemprunts from personne inner join emprunts on (personne.id_personne=emprunts.id_personne) group by emprunts.id_personne having count(emprunts.date_emprunt)&gt;=50&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LIMIT&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette clause permet de limiter le nombre de r&#233;sultats renvoy&#233;s.&lt;br class='autobr' /&gt;
Cela peut &#234;tre utile pour un syst&#232;me de pagination.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;select ..... LIMIT debut,nombre&lt;/code&gt;&lt;br class='autobr' /&gt;
o&#249; d&#233;but correspond &#224; la premi&#232;re r&#233;ponse r&#233;cup&#233;r&#233;e (le tableau des r&#233;ponses commence &#224; z&#233;ro) et nombre... le nombre de r&#233;ponses &#224; prendre.&lt;/p&gt;
&lt;p&gt;Par exemple, pour r&#233;cup&#233;rer les 10 plus gros emprunteurs (non pas sur leur masse pond&#233;rale mais sur leur nombre d'emprunts) :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;SELECT nbemprunts,nom_personne from (select max(count(*)) as nbemprunts, id_personne from emprunts group by id_personne) t1 inner join personne on (t1.id_personne=personne.id_personne) order by nbemprunts DESC LIMIT 0,10&lt;/code&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Modification de la base de donn&#233;es&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Mise &#224; jour&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La clause principale de la requ&#234;te n'est plus SELECT mais UPDATE.&lt;/p&gt;
&lt;p&gt;Les clauses secondaires (de filtre et choix de table) sont toujours valables.&lt;/p&gt;
&lt;p&gt;On met &#224; jour un champ d'une ou plusieurs lignes d'une table, en fonction de la valeur d'autres champs de ces m&#234;mes lignes (ou pas).&lt;/p&gt;
&lt;p&gt;Comme toujours, on commence par mettre la requ&#234;te SQL dans une variable cha&#238;ne de caract&#232;res.&lt;br class='autobr' /&gt;
$reku=&#034;update operation_type set nom=\&#034;$nom\&#034; where id=$id&#034; ;&lt;/p&gt;
&lt;p&gt;puis on l'ex&#233;cute, tout simplement&lt;br class='autobr' /&gt;
$resu=mysql_query($reku) ;&lt;/p&gt;
&lt;p&gt;la syntaxe de la requ&#234;te est de type UPDATE table SET CHAMP=nouvelle_valeur WHERE condition&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suppression&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La clause principale de la requ&#234;te n'est plus SELECT mais DELETE.&lt;/p&gt;
&lt;p&gt;Les clauses secondaires (de filtre et choix de table) sont toujours valables.&lt;/p&gt;
&lt;p&gt;On efface des lignes d'une table en fonction de la valeur de champs ce ces m&#234;mes lignes.&lt;/p&gt;
&lt;p&gt;Comme toujours, on commence par mettre la requ&#234;te SQL dans une variable cha&#238;ne de caract&#232;res.&lt;br class='autobr' /&gt;
$rekd1=&#034;delete from operation_type where parent=$id&#034; ;&lt;/p&gt;
&lt;p&gt;puis on l'ex&#233;cute, tout simplement&lt;br class='autobr' /&gt;
$resd1=mysql_query($rekd1) ;&lt;/p&gt;
&lt;p&gt;la syntaxe de la requ&#234;te est de type DELETE FROM table WHERE condition&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>IV) Interactions PHP/base SQL - principes</title>
		<link>https://vader-fr.fr/spip.php?article86</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article86</guid>
		<dc:date>2012-06-29T08:08:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>



		<description>
&lt;p&gt;D'abord, il faut se connecter &#224; la base. mysql_connect('serveur_bdd','utilisateur_bdd','mot_de_passe_bdd','MYSQL') ; // or die ? mysql_select_db(&#034;nom_base&#034;) ; &lt;br class='autobr' /&gt;
Ces quelques lignes de code pourront &#234;tre mises seulement dans un fichier php que l'on va ensuite inclure dans toutes les pages qui en auront besoin. include &#034;connect.php&#034; ; &lt;br class='autobr' /&gt;
Note : le syst&#232;me d'inclusion en PHP (include, require, include_once...) sera &#233;voqu&#233; dans un autre article. &lt;br class='autobr' /&gt;
Puis on construit la requ&#234;te exemple : (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique17" rel="directory"&gt;Les pages dynamiques avec PHP/MySQL&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;D'abord, il faut se connecter &#224; la base.&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;mysql_connect('serveur_bdd','utilisateur_bdd','mot_de_passe_bdd','MYSQL'); // or die ?
mysql_select_db(&#034;nom_base&#034;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ces quelques lignes de code pourront &#234;tre mises seulement dans un fichier php que l'on va ensuite inclure dans toutes les pages qui en auront besoin.&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;include &#034;connect.php&#034;;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Note : le syst&#232;me d'inclusion en PHP (include, require, include_once...) sera &#233;voqu&#233; dans un autre article.&lt;/p&gt;
&lt;p&gt;Puis on construit la requ&#234;te&lt;br class='autobr' /&gt;
exemple :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$rek_sel=&#034;select * from spip_articles where id_rubrique=$id_rubrique_diapo and statut='publie' order by 'date' DESC limit $debut,$par_page &#034;; // order by date DESC &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ici, il faut conna&#238;tre suffisamment le langage SQL pour cr&#233;er la requ&#234;te. &lt;br class='autobr' /&gt;
Cela sera d&#233;taill&#233; dans l'article suivant, il faut simplement retenir pour l'instant le fait que l'on met une requ&#234;te texte en langage SQL dans une variable PHP.&lt;/p&gt;
&lt;p&gt;On l'ex&#233;cute&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$res_sel=mysql_query($rek_sel);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;et on r&#233;cup&#232;re le r&#233;sultat&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Si le r&#233;sultat ne peut comporter qu'une seule ligne maximum.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On envoie le r&#233;sultat brut renvoy&#233; par la pr&#233;c&#233;dente commande dans un tableau (d'une seule ligne, de fait), lequel est associatif (chaque colonne est nomm&#233;e selon les champs choisis dans la clause SELECT de la requ&#234;te plus haut).&lt;br class='autobr' /&gt;
Puis on r&#233;cup&#232;re la valeur du ou des champs cibl&#233;s.&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_compt=&#034;select count(*) as total from spip_articles where id_rubrique=$id_rubrique_diapo and statut='publie'&#034;;
$res_compt=mysql_query($rek_compt); $row_total=mysql_fetch_array($res_compt,MYSQL_ASSOC);
$total=$row_total[&#034;total&#034;];&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On prendra soin de tester si la valeur retourn&#233;e est nulle ou cha&#238;ne vide, quand cela risque de se produire (ici, on a fait un comptage des lignes, donc forc&#233;ment non vide, entre 0 et n).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Si le r&#233;sultat comporte ou risque de comporter plusieurs lignes :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On envoie le r&#233;sultat brut renvoy&#233; par la commande pr&#233;c&#233;dente dans un tableau, lequel est de type associatif (chaque colonne est nomm&#233;e selon les champs choisis dans la clause SELECT de la requ&#234;te plus haut).&lt;br class='autobr' /&gt;
Puis on traite ce tableau ligne par ligne par une boucle WHILE (tant que le tableau de r&#233;sultat renvoie une ligne, traiter la ligne).&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;while ($row_sel=mysql_fetch_array($res_sel,MYSQL_ASSOC)){ $id=$row_sel[&#034;id_article&#034;]; $titre=htmlentities($row_sel[&#034;titre&#034;]); $texte=htmlentities($row_sel[&#034;texte&#034;]); ... ...
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, htmlentities(texte) est une fonction PHP qui permet de transformer les caract&#232;res sp&#233;ciaux - qui risquent d'&#234;tre interpr&#233;t&#233;s en html - par leur code html &#233;quivalent.&lt;/p&gt;
&lt;p&gt;Enfin, on ferme la connexion &#224; la base.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mysql_close();&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;M&#234;me si le serveur g&#232;re les connexions inactives, c'est plus propre.&lt;/p&gt;
&lt;p&gt;A noter, le SQL est un langage complet, les requ&#234;tes peuvent donc devenir tr&#232;s complexes.&lt;br class='autobr' /&gt;
Cela n'&#233;tant pas l'objet de cet article, seules les bases seront &#233;voqu&#233;es ici.&lt;br class='autobr' /&gt;
Un article sur le SQL &#034;avanc&#233;&#034; pourra &#234;tre &#233;crit plus tard.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>III) Requ&#234;te HTML et traitement PHP</title>
		<link>https://vader-fr.fr/spip.php?article63</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article63</guid>
		<dc:date>2012-03-31T15:10:33Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>



		<description>
&lt;p&gt;Pour qu'un script php puisse g&#233;n&#233;rer une page diff&#233;rente en fonction des besoins de l'utilisateur, il faut lui fournir des param&#232;tres et leurs valeurs. &lt;br class='autobr' /&gt;
Il existe pour cela 2 m&#233;thodes : la m&#233;thode GET, qui envoie les param&#232;tres dans l'url. Cela a 2 inconv&#233;nients : la taille (limite de 256 caract&#232;res pour l'url) et la s&#233;curit&#233; (affichage en clair des informations transmises) la m&#233;thode POST, qui envoie les param&#232;tres d'une mani&#232;re transparente. &lt;br class='autobr' /&gt;
Pour la premi&#232;re requ&#234;te, il n'y a pas (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique17" rel="directory"&gt;Les pages dynamiques avec PHP/MySQL&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Pour qu'un script php puisse g&#233;n&#233;rer une page diff&#233;rente en fonction des besoins de l'utilisateur, il faut lui fournir des param&#232;tres et leurs valeurs.&lt;/p&gt;
&lt;p&gt;Il existe pour cela 2 m&#233;thodes :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; la m&#233;thode GET, qui envoie les param&#232;tres dans l'url. Cela a 2 inconv&#233;nients : la taille (limite de 256 caract&#232;res pour l'url) et la s&#233;curit&#233; (affichage en clair des informations transmises)&lt;/li&gt;&lt;li&gt; la m&#233;thode POST, qui envoie les param&#232;tres d'une mani&#232;re transparente.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour la premi&#232;re requ&#234;te, il n'y a pas d'autre moyen, mais par la suite on pourra utiliser des variables de session (en cookie ou non).&lt;br class='autobr' /&gt;
Cela sera d&#233;taill&#233; dans un autre article.&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;M&#233;thode GET&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;h3 class=&#034;spip&#034;&gt;Envoi par m&#233;thode GET&lt;/h3&gt;
&lt;p&gt;Cette m&#233;thode est plut&#244;t r&#233;serv&#233;e aux liens, mais peut servir aux formulaires, si les donn&#233;es &#224; transmettre ne sont pas trop grandes.&lt;/p&gt;
&lt;p&gt;Cela consiste &#224; envoyer les param&#232;tres et leurs valeurs dans l'url, selon la norme suivante :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; on signale l'envoi de param&#232;tres par un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;?&lt;/code&gt; apr&#232;s l'adresse du script.&lt;/li&gt;&lt;li&gt; les param&#232;tres/valeurs sont s&#233;par&#233;s par des &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&amp;&lt;/code&gt;&lt;/li&gt;&lt;li&gt; les espaces sont remplac&#233;s par des &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;+&lt;/code&gt;&lt;/li&gt;&lt;li&gt; les param&#232;tres sont s&#233;par&#233;s de leur valeur par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;=&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Dans un lien&lt;/strong&gt;, cela donne par exemple :&lt;br class='autobr' /&gt;
&lt;a href=&#034;http://graindimage.org/charger_diapo.php?id=0&amp;delai=0&#034; target=&#034;_blank&#034;&gt;http://graindimage.org/charger_diapo.php?id=0&amp;delai=0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ici, les donn&#233;es contenues dans la r&#233;ponse sont ensuite utilis&#233;es par un script JavaScript pour le diaporama de la &lt;a href=&#034;http://graindimage.org/&#034; target=&#034;_blank&#034;&gt;&lt;b&gt;page de garde&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On peut par ailleurs voir les requ&#234;tes et leur r&#233;ponse dans l'onglet r&#233;seau &lt;del&gt;de Firebug&lt;/del&gt; des outils de d&#233;veloppement web :&lt;/p&gt;
&lt;dl class='spip_document_95 spip_documents spip_documents_center'&gt;
&lt;dt&gt;&lt;img src='https://vader-fr.fr/local/cache-vignettes/L500xH252/capture-3c3c8.png?1771673957' width='500' height='252' alt='' /&gt;&lt;/dt&gt;
&lt;dt class='spip_doc_titre' style='width:350px;'&gt;&lt;strong&gt;Firebug - requ&#234;tes&lt;/strong&gt;&lt;/dt&gt;
&lt;/dl&gt;
&lt;p&gt;Cela peut permettre d'avoir des informations compl&#233;mentaires en cas de besoin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dans un formulaire&lt;/strong&gt;, la requ&#234;te sera cr&#233;&#233;e lors du clic sur le bouton/image/lien de validation.&lt;br class='autobr' /&gt;
On proc&#232;de alors comme ceci :&lt;br class='manualbr' /&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;form method=&#034;GET&#034; action=&#034;adresse_script.php&#034;&gt;&lt;/code&gt; d&#233;claration du formulaire - quel script r&#233;cup&#232;re les informations, et comment on les envoie. L'adresse du script sera de pr&#233;f&#233;rence relative, depuis celle de la page en cours.&lt;/p&gt;
&lt;p&gt;une fois le formulaire d&#233;clar&#233;, il faut y mettre des champs :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;input type=&#034;text&#034; name=&#034;nom_parametre&#034;&gt;&lt;/code&gt; un champ cha&#238;ne de caract&#232;res. Ont peut pr&#233;ciser entre autres les attributs size (taille de la zone de saisie) et maxlength (taille maximale du texte que l'on peut saisir).&lt;br class='autobr' /&gt;
ce qui donne &lt;input type=&#034;text&#034; name=&#034;nom_parametre&#034;&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;input type=&#034;password&#034; name=&#034;nom_parametre&#034;&gt;&lt;/code&gt; un champ cha&#238;ne de caract&#232;res cach&#233;s, par exemple pour un mot de passe. Celui-ci &#233;tant affich&#233; en clair en mode GET, il est pr&#233;f&#233;rable de ne l'utiliser qu'en POST&lt;br class='autobr' /&gt;
exemple &lt;input type=&#034;password&#034; name=&#034;nom_parametre&#034;&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;input type=&#034;hidden&#034; name=&#034;nom_parametre&#034;&gt;&lt;/code&gt; un champ cach&#233;. l'utilisateur ne saisira aucune information, celle-ci pouvant &#234;tre inscrite en dur dans le formulaire, ou r&#233;cup&#233;r&#233;e par une variable de session ou une saisie pr&#233;c&#233;dente.&lt;br class='manualbr' /&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;textarea name=&#034;nom_parametre&#034;&gt;&lt;/textarea&gt;&lt;/code&gt; pour une zone de texte. on peut entre autres pr&#233;ciser cols et rows pour le nombre de colonnes (nombre de caract&#232;res dans une ligne) et de lignes.&lt;br class='autobr' /&gt;
exemple :&lt;/p&gt;
&lt;textarea name=&#034;nom_parametre&#034; cols=40 rows=4&gt;&lt;/textarea&gt;
&lt;p&gt;Il existe aussi d'autres types de champ, notamment pour l'envoi de fichiers. Le traitement de ceux-ci &#233;tant tr&#232;s particulier, il ne sera pas abord&#233; ici.&lt;/p&gt;
&lt;p&gt;Il va de soi que les noms des champs devront &#234;tre diff&#233;rents.&lt;/p&gt;
&lt;p&gt;Pour valider le formulaire, il y a 2 champs sp&#233;ciaux possibles :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;input type=&#034;submit&#034; value=&#034;ce_qui_est_ecrit_sur_le_bouton&#034;&gt;&lt;/code&gt; un bouton&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;input type=&#034;image&#034; src=&#034;chemin_vers_fichier_image&#034;&gt;&lt;/code&gt; une image&lt;/p&gt;
&lt;p&gt;il existe aussi un champ sp&#233;cial pour remise &#224; z&#233;ro du formulaire. Le sujet de cet article &#233;tant le PHP et non l'HTML, il ne sera pas abord&#233; ici.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;/form&gt;&lt;/code&gt; et on n'oublie pas de fermer le formulaire.&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;M&#233;thode POST&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;h3 class=&#034;spip&#034;&gt;Envoi par m&#233;thode POST&lt;/h3&gt;
&lt;p&gt;Cette m&#233;thode est plut&#244;t r&#233;serv&#233;e aux formulaires, mais peut servir aux liens, moyennant un petit bricolage qu'il faut tout de m&#234;me &#233;viter.&lt;/p&gt;
&lt;p&gt;On proc&#232;de pratiquement pareil que pour le GET :&lt;br class='manualbr' /&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;form method=&#034;POST&#034; action=&#034;adresse_script.php&#034;&gt;&lt;/code&gt; d&#233;claration du formulaire - ici, on indique non plus la m&#233;thode GET mais POST&lt;/p&gt;
&lt;p&gt;les champs sont les m&#234;mes que ceux d&#233;crits pr&#233;c&#233;demment.&lt;/p&gt;
&lt;p&gt;ici, si l'on souhaite afficher un lien au lieu d'un bouton, l'astuce est de passer par un &#034;bouton image&#034; sans image source. &lt;br class='autobr' /&gt;
C'est alors le texte alternatif qui sera affich&#233;. Le probl&#232;me est que sous IE, la petite croix rouge de &#034;image absente&#034; sera quand m&#234;me affich&#233;e.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;input type=&#034;image&#034; src=&#034;&#034; alt=&#034;texte_a_afficher&#034;&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Cela peut servir pour, par exemple, un tri par clic sur l'ent&#234;te de la colonne d'un tableau, l'ordre de tri, le d&#233;but et les filtres passant en champs cach&#233;s.&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;/form&gt;&lt;/code&gt; et on n'oublie pas de fermer le formulaire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les attributs HTML &#233;tant assez vari&#233;s pour les diff&#233;rentes balises d&#233;crites dans cet article, seuls les plus courants ont &#233;t&#233; d&#233;crits.&lt;br class='autobr' /&gt;
Le sujet de cet article est le PHP, et non l'HTML.&lt;/strong&gt;&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;Traitement des param&#232;tres&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;h3 class=&#034;spip&#034;&gt;R&#233;cup&#233;ration et traitement des param&#232;tres en PHP&lt;/h3&gt;
&lt;p&gt;Que ce soit GET ou POST, les instructions de r&#233;cup&#233;ration des param&#232;tres seront mises de pr&#233;f&#233;rence au d&#233;but du script.&lt;/p&gt;
&lt;p&gt;Le code PHP est toujours entre deux balises &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;?php&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;?&gt;&lt;/code&gt;.&lt;br class='autobr' /&gt;
Chaque instruction PHP doit se finir par un point-virgule &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;;&lt;/code&gt;&lt;br class='autobr' /&gt;
Il est pr&#233;f&#233;rable d'indenter le code pour qu'il soit plus lisible. &lt;br class='autobr' /&gt;
Des &#233;diteurs comme gedit (sous Linux) ou Notepad++ (sous Windows) sont capables de reconna&#238;tre la syntaxe et de colorier le texte en cons&#233;quence. Cela permet de mieux suivre le code, et notamment rep&#233;rer les &#034; ;&#034; manquants.&lt;br class='autobr' /&gt;
Les commentaires sont indiqu&#233;s par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;// commentaire sur une ligne&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/* commentaires sur plusieurs lignes */&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;if (isset($_GET[&#034;id&#034;])){ &lt;/code&gt; Il est plus propre de tester auparavant si le param&#232;tre existe, en clair, s'il est d&#233;fini (is set)&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt; $idd=$_GET[&#034;id&#034;];&lt;/code&gt; Si oui, on le r&#233;cup&#232;re par la commande $_GET[&#034;nom_param&#232;tre&#034;] ;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;}else{&lt;/code&gt; Il est pr&#233;f&#233;rable aussi de pr&#233;voir une valeur &#034;par d&#233;faut&#034;, au cas o&#249;. De m&#234;me on aurait pu pr&#233;voir une v&#233;rification de la valeur du param&#232;tre. De fait, il est plus simple de mettre cela plus loin dans le script.&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt; $idd=0; &lt;/code&gt; la valeur par d&#233;faut&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;}&lt;/code&gt; &lt;br class='autobr' /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Pour des variables en POST, le $_GET devient $_POST :&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;if (isset($_POST[&#034;id&#034;])){ $idd=$_POST[&#034;id&#034;]; }else{ $idd=0; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut m&#234;me imbriquer les deux m&#233;thodes, en essayant par exemple GET puis POST :&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;if (isset($_GET[&#034;id&#034;])){ $idd=$_GET[&#034;id&#034;]; }else{ if (isset($_POST[&#034;id&#034;])){ $idd=$_POST[&#034;id&#034;]; }else{ $idd=0; } }&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;p&gt;&lt;strong&gt;Pour le traitement des valeurs r&#233;cup&#233;r&#233;es et les fonctions/structures de PHP, voir les articles suivants...&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>II) Fonctionnement de PHP &amp; MySQL</title>
		<link>https://vader-fr.fr/spip.php?article62</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article62</guid>
		<dc:date>2012-03-30T13:09:51Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>



		<description>
&lt;p&gt;Combiner des scripts PHP avec une base de donn&#233;es, comme MySQL, permet de lire, voire m&#234;me de modifier la base de mani&#232;re transparente, par page web. &lt;br class='autobr' /&gt;
Un script, en fonction d'une requ&#234;te utilisateur (recherche multi-crit&#232;res...ou liens g&#233;n&#233;r&#233;s par lecture de la base) ira chercher les donn&#233;es pour g&#233;n&#233;rer la page contenant les informations demand&#233;es, et voire m&#234;me modifiera les informations contenues dans la base en cons&#233;quence. &lt;br class='autobr' /&gt;
Cela permet par exemple de faire une page web d'annuaire en (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique17" rel="directory"&gt;Les pages dynamiques avec PHP/MySQL&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Combiner des scripts PHP avec une base de donn&#233;es, comme MySQL, permet de lire, voire m&#234;me de modifier la base de mani&#232;re transparente, par page web.&lt;/p&gt;
&lt;p&gt;Un script, en fonction d'une requ&#234;te utilisateur (recherche multi-crit&#232;res...ou liens g&#233;n&#233;r&#233;s par lecture de la base) ira chercher les donn&#233;es pour g&#233;n&#233;rer la page contenant les informations demand&#233;es, et voire m&#234;me modifiera les informations contenues dans la base en cons&#233;quence.&lt;/p&gt;
&lt;p&gt;Cela permet par exemple de faire une page web d'annuaire en intranet avec outil de recherche par nom/pr&#233;nom/service/bureau, ou de g&#233;rer une biblioth&#232;que et ses emprunts.&lt;/p&gt;
&lt;p&gt;..... ou de cr&#233;er un site en mettant le contenu en ligne ais&#233;ment par interface web, sans avoir besoin de connaissances en informatique, et de proposer aux visiteurs de participer &#224; la vie du site en postant des commentaires ou en r&#233;agissant dans un forum.&lt;/p&gt;
&lt;p&gt;Il existe des applications bien plus pouss&#233;es de PHP &amp; MySQL, permettant par exemple de faire de la gestion de parc informatique/helpdesk/inventaire/d&#233;ploiement d'application/d&#233;couverte r&#233;seau/cartographie... (il s'agit de &lt;a href=&#034;http://glpi-project.org/&#034; target=&#034;_blank&#034;&gt;&lt;b&gt;ceci&lt;/b&gt;&lt;/a&gt; et &lt;a href=&#034;http://plugins.glpi-project.org/#/plugin/archires&#034; target=&#034;_blank&#034;&gt;&lt;b&gt;cela&lt;/b&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;Sch&#233;ma de synth&#232;se&lt;/h3&gt;
&lt;p&gt;&lt;span class='spip_document_94 spip_documents spip_documents_center'&gt;
&lt;img src='https://vader-fr.fr/local/cache-vignettes/L500xH369/web-php-sql-81081.png?1771673957' width='500' height='369' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;L&#233;gende :&lt;br class='autobr' /&gt;
1) Requ&#234;te client vers serveur, au format HTML. Le fonctionnement de ces requ&#234;tes sera d&#233;taill&#233; dans un autre article.&lt;br class='autobr' /&gt;
2) Le script PHP, en fonction des besoin, g&#233;n&#232;re une requ&#234;te SQL (langage de la base de donn&#233;es)...&lt;br class='autobr' /&gt;
3) ... et r&#233;cup&#232;re le r&#233;sultat calcul&#233; par le syst&#232;me de gestion de la base de donn&#233;es&lt;br class='autobr' /&gt;
4) Apr&#232;s avoir g&#233;n&#233;r&#233; le contenu de la page en fonction des donn&#233;es r&#233;cup&#233;r&#233;es dans la base, le serveur envoie la page html au client.&lt;br class='autobr' /&gt;
5) &#201;ventuellement, un script JavaScript inclut dans la page html, et ex&#233;cut&#233; par le navigateur client, envoie une requ&#234;te vers le serveur&lt;br class='autobr' /&gt;
Le navigateur affiche toujours la page.&lt;br class='autobr' /&gt;
6) La page serveur cibl&#233;e par cette requ&#234;te particuli&#232;re effectue un traitement et envoie le r&#233;sultat au navigateur, qui va alors modifier la page affich&#233;e dans le navigateur en temps r&#233;el.&lt;br class='autobr' /&gt;
On peut de cette mani&#232;re recharger une partie pr&#233;cise de la page, ce qui est plus l&#233;ger pour le r&#233;seau que le rechargement de la page enti&#232;re.&lt;br class='autobr' /&gt;
Cette man&#339;uvre est totalement transparente pour l'utilisateur, qui peut continuer la lecture de la page tout au long des phases 5 et 6.&lt;br class='autobr' /&gt;
C'est par exemple le cas pour le diaporama de la page de garde &lt;a href=&#034;http://www.graindimage.org&#034; target=&#034;_blank&#034;&gt;&lt;b&gt;Grain d'Image&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>I) Pr&#233;sentations de PHP &amp; MySQL</title>
		<link>https://vader-fr.fr/spip.php?article61</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article61</guid>
		<dc:date>2012-03-29T20:09:48Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>



		<description>
&lt;p&gt;PHP est un langage interpr&#233;t&#233;, qui va &#234;tre ex&#233;cut&#233; par le serveur afin de g&#233;n&#233;rer du contenu &#224; envoyer au navigateur client (page web html, script javascript, r&#233;ponse XML, image...). &lt;br class='autobr' /&gt;
Il est donc indispensable de conna&#238;tre d'abord le langage que l'on souhaite g&#233;n&#233;rer avant de s'int&#233;resser au PHP. &lt;br class='autobr' /&gt;
Ce genre de programme (script) permet de g&#233;n&#233;rer dynamiquement une page web, en allant chercher le contenu ailleurs (saisie pr&#233;c&#233;dente utilisateur, lecture de fichier, ou plus couramment...base (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique17" rel="directory"&gt;Les pages dynamiques avec PHP/MySQL&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;span class='spip_document_92 spip_documents spip_documents_center'&gt;
&lt;img src='https://vader-fr.fr/local/cache-vignettes/L327xH248/php-logo-a1cad.png?1771673957' width='327' height='248' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;PHP est un langage interpr&#233;t&#233;, qui va &#234;tre ex&#233;cut&#233; par le serveur afin de g&#233;n&#233;rer du contenu &#224; envoyer au navigateur client (page web html, script javascript, r&#233;ponse XML, image...).&lt;/p&gt;
&lt;p&gt;Il est donc indispensable de conna&#238;tre d'abord le langage que l'on souhaite g&#233;n&#233;rer avant de s'int&#233;resser au PHP.&lt;/p&gt;
&lt;p&gt;Ce genre de programme (script) permet de g&#233;n&#233;rer dynamiquement une page web, en allant chercher le contenu ailleurs (saisie pr&#233;c&#233;dente utilisateur, lecture de fichier, ou plus couramment...base de donn&#233;e).&lt;/p&gt;
&lt;p&gt;Le PHP est situ&#233; dans un ou plusieurs fichiers .php sur le serveur. Ces fichiers &#233;tant &#034;par d&#233;faut&#034; interpr&#233;t&#233;s par le serveur, leur contenu n'est donc pas visible par un navigateur.&lt;/p&gt;
&lt;p&gt;Par exemple, le syst&#232;me de gestion de contenu SPIP, qui a g&#233;n&#233;r&#233; cette page, est bas&#233; sur un ensemble de scripts php allant chercher les donn&#233;es &#224; afficher dans une base de donn&#233;es.&lt;/p&gt;
&lt;p&gt;PHP est donc de fait tr&#232;s utilis&#233; sur le web 2.0 puis 3.0, rempla&#231;ant les pages html statiques qui sont fastidieuses &#224; maintenir et faire &#233;voluer.&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_93 spip_documents spip_documents_center'&gt;
&lt;img src='https://vader-fr.fr/local/cache-vignettes/L489xH253/mysql-533e1.png?1771673957' width='489' height='253' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;MySQL est une Base De Donn&#233;es, une structure permettant d'organiser, de hi&#233;rarchiser et de lier des donn&#233;es.&lt;/p&gt;
&lt;p&gt;Le plus souvent ces donn&#233;es sont sous forme de texte, lequel peut &#234;tre une date, un nombre, une cha&#238;ne de caract&#232;res ou un texte plus long....&lt;/p&gt;
&lt;p&gt;Les images et le contenu plus &#034;lourd&#034; sera lui stock&#233; sous forme de fichiers mais r&#233;f&#233;renc&#233; sous formes de liens dans la base.&lt;/p&gt;
&lt;p&gt;Une base est fa&#238;te de plusieurs tables.&lt;/p&gt;
&lt;p&gt;Une table poss&#232;de des colonnes (attributs ou champs) et des lignes (valeurs desdits attributs).&lt;/p&gt;
&lt;p&gt;Chaque ligne, afin d'&#234;tre unique, doit avoir un identifiant, via une ou plusieurs colonnes. Cela se nomme la cl&#233; primaire (Primary key).&lt;/p&gt;
&lt;p&gt;L'organisation de ces donn&#233;es permet d'effectuer des requ&#234;tes afin d'obtenir des lignes correspondant aux valeurs des champs des tables demand&#233;es.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ces deux logiciels sont inclus dans &lt;a href=&#034;http://vader-fr.fr/spip.php?article56&#034; target=&#034;_blank&#034;&gt;EasyphP&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
