<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Réflexe</title>
	<atom:link href="http://blog.reflexe-internet.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.reflexe-internet.com</link>
	<description>Développement Internet et technologies web</description>
	<lastBuildDate>Sat, 25 Jun 2011 09:53:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Valider un SIRET ou un SIREN</title>
		<link>http://blog.reflexe-internet.com/2011/03/23/valider-un-siret-ou-un-siren/</link>
		<comments>http://blog.reflexe-internet.com/2011/03/23/valider-un-siret-ou-un-siren/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 15:25:29 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[algorithmes]]></category>

		<guid isPermaLink="false">http://blog.reflexe-internet.com/?p=354</guid>
		<description><![CDATA[Les SIRET et SIREN incluent un dispositif de somme de contrôle qui permet d&#8217;en vérifier l&#8217;exactitude de manière algorithmique. Il existe un grand nombre d&#8217;exemples d&#8217;implémentations qui ne fonctionnent que pour le SIRET ou le SIREN. Les explications qui suivent &#8230; <a href="http://blog.reflexe-internet.com/2011/03/23/valider-un-siret-ou-un-siren/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Les SIRET et SIREN incluent un dispositif de somme de contrôle qui permet d&#8217;en vérifier l&#8217;exactitude de manière algorithmique. Il existe un grand nombre d&#8217;exemples d&#8217;implémentations qui ne fonctionnent que pour le SIRET ou le SIREN.</p>
<p><span id="more-354"></span>Les explications qui suivent s&#8217;appliquent à la vérification de la validité d&#8217;un SIREN ou d&#8217;un SIRET.</p>
<p>Les données en entrée :<br />
un numéro SIREN : 8 chiffres + 1 chiffre faisant office de somme de contrôle = 9 chiffres<br />
un numéro SIRET : 13 chiffres + 1 chiffre faisant office de somme de contrôle = 14 chiffres</p>
<p>La définition tirée de Wikipedia (reformulée) :<br />
Pour chaque caractère de la chaîne à contrôler, on détermine la position en partant de la fin (<strong>important</strong>).<br />
Si la position est impaire on multiplie par 1, si la position est paire par 2.<br />
On concatène toutes ces sommes.<br />
Pour terminer, on additionne 1 à 1 tous les chiffres de la chaine obtenue,<br />
la somme doit être un multiple de 10.</p>
<p>L&#8217;exemple d&#8217;implémentation suivant diffère un peu de la définition puisque la somme de contrôle est directement calculée pendant le parcours de la chaîne.</p>
<p>Implémentation testée sur une base de plus de 1000 SIREN + SIRET avec 44 erreurs de contrôle sur des identifiants SIREN / SIRET visiblement faux.</p>
<pre class="brush: php; title: ;">

static function controleLuhn($val){
   $val        = preg_replace('/[^0-9]/', '', $val);
   $len        = strlen($val);
   $sum        = 0;
   for($i = 0; $i &lt; $len; $i++){
      $indice        = ($len - $i); // donne l'indice en partant de la fin indice de 1 à n
      /*
      $indice impaire :  $indice%2 =&gt; 1, 2 - 1 = 1,
      $indice paire : $indice%2 =&gt; 0, 2 - 0 =  2
      */
      $tmp         = (2 - ($indice%2)) * $val[$i];
      // si nb à 2 chiffres, somme des 2 chiffres 11 =&gt; 2, 12 =&gt; 3
      if($tmp &gt;= 10) $tmp -= 9;
      $sum       += $tmp;
   }
   return (($sum%10) == 0);
}
</pre>
<h2>Les ressources sur Internet à ce sujet</h2>
<p>La plupart des exemples trouvés sur l&#8217;Internet ne prennent pas en compte le fait qu&#8217;on considère le rang à partir de la fin ce qui n&#8217;a aucun impact pour le calcul de la somme de contrôle sur le SIREN qui a 9 chiffre (les positions sont paires ou impaires de la même manière qu&#8217;on prenne la position dans un sens ou dans l&#8217;autre).</p>
<p>L&#8217;<a href="http://fr.wikipedia.org/wiki/SIREN">article sur le SIREN</a> sur Wikipedia. La définition est juste si on lit bien &laquo;&nbsp;de rang impair <strong>à partir de la droite</strong>&laquo;&nbsp;.</p>
<p>L&#8217;<a href="http://fr.wikipedia.org/wiki/Syst%C3%A8me_d%E2%80%99identification_du_r%C3%A9pertoire_des_%C3%A9tablissements">article sur le SIRET </a>sur Wikipedia.</p>
<p>Le même sujet traité sur le site de l&#8217;INSEE qui propose une <a href="http://xml.insee.fr/schema/siret.html#frg_siren_att">implémentation XSLT de l&#8217;algorithme de Luhn</a> malheureusement pas adaptée à ce cas précis puisqu&#8217;elle détecte une erreur de contrôle sur tous les SIREN de la même base de test.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2011/03/23/valider-un-siret-ou-un-siren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les nouveaux éléments HTML5</title>
		<link>http://blog.reflexe-internet.com/2011/01/17/les-nouveaux-elements-html5/</link>
		<comments>http://blog.reflexe-internet.com/2011/01/17/les-nouveaux-elements-html5/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 08:53:22 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.reflexe-internet.com/?p=272</guid>
		<description><![CDATA[HTML5 propose un ensemble de nouveaux éléments. La spécification HTML5 fait évoluer le standard en offrant de nouvelles possibilités de balisage sémantique ainsi que des éléments orientés application riche. Section Le W3C spécifie l&#8217;élément section comme permettant de définir une &#8230; <a href="http://blog.reflexe-internet.com/2011/01/17/les-nouveaux-elements-html5/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>HTML5 propose un ensemble de nouveaux éléments. La spécification HTML5 fait évoluer le standard en offrant de nouvelles possibilités de balisage sémantique ainsi que des éléments orientés application riche.<br />
<span id="more-272"></span></p>
<h2>Section</h2>
<p>Le W3C spécifie l&#8217;élément section comme permettant de définir une zone dans un document. Il permet de grouper des éléments de manière thématique. L&#8217;élément section n&#8217;a pas vocation à structurer le document à des fin de présentation.</p>
<pre class="brush: xml; title: ;">
&lt;section&gt;
    &lt;h1&gt;Qui sommes-nous&lt;/h1&gt;
    &lt;p&gt;texte de présentation&lt;/p&gt;
&lt;/section&gt;

&lt;section&gt;
    &lt;h1&gt;Les news&lt;/h1&gt;
    &lt;p&gt;Nous serons présents au salon du bricolage en octobre&lt;/p&gt;
&lt;/section&gt;
</pre>
<h2>Nav</h2>
<p>L&#8217;élément <em>nav </em>permet de délimiter une section dont le rôle est de fournir des liens de navigation.</p>
<pre class="brush: xml; title: ;">
&lt;nav id=&quot;top-nav&quot;&gt;
    &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;/a-propos/&quot;&gt;A propos&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/services/&quot;&gt;Nos services&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;/contact/&quot;&gt;Nous contacter&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/nav&gt;
</pre>
<h2>Header</h2>
<p>L&#8217;élément header contient les information d&#8217;en-tête d&#8217;une section.</p>
<pre class="brush: xml; title: ;">
&lt;section&gt;
&lt;header&gt;
    &lt;h1&gt;Les nouveaux éléments HTML5&lt;/h1&gt;
    &lt;p&gt;Présentation de leur utilisation pour
un balisage sémantique.&lt;/p&gt;
&lt;header&gt;
&lt;/section&gt;
</pre>
<h2>Footer</h2>
<p>L&#8217;élément footer définit le pied d&#8217;une section.</p>
<pre class="brush: xml; title: ;">
&lt;section&gt;
...
&lt;footer&gt;
&lt;p&gt;Site réalisé avec WordPress&lt;/p&gt;
&lt;/footer&gt;
&lt;/section&gt;
</pre>
<h2>Article</h2>
<p>L&#8217;élément article est un type de section spécifique. Selon la spécification, l&#8217;article est une composition d&#8217;éléments destiné à être distribué ou réutilisé de manière indépendante (par exemple dans un flux de syndication). Cela peut par exemple être un post de forum, un article de magazine, un post de blog, etc.</p>
<pre class="brush: xml; title: ;">
&lt;article&gt;
    &lt;header&gt;
        &lt;h1&gt;Les nouveaux éléments HTML5&lt;/h1&gt;
    &lt;/header&gt;
    &lt;p&gt;Voici &lt;/p&gt;
    &lt;footer&gt;
      Article publié dans WordPress sous licence CC
    &lt;/footer&gt;
&lt;/article&gt;
</pre>
<h2>Aside</h2>
<p>L&#8217;élément aside permet de contenir des informations liées au contenu principal mais n&#8217;en faisant pas partie. Utilisé dans un article, aside propose un conteneur lié à celui-ci. En dehors, le contenu de l&#8217;élément aside est lié au site.</p>
<p>La spécification dit que le contenu de l&#8217;élément aside est &laquo;&nbsp;tangentially related to the content arround the aside element&nbsp;&raquo;.  Donc &laquo;&nbsp;qui touche à la périphérie&nbsp;&raquo; du contenu autour.  Il semble donc que des informations telles qu&#8217;un glossaire, un encart de biographie ou une définition soient des éléments qui peuvent trouver leur place dans un élément aside.</p>
<pre class="brush: xml; title: ;">
&lt;article&gt;
    &lt;header&gt;
       &lt;h1&gt;Les nouveaux éléments HTML5&lt;/h1&gt;
    &lt;/header&gt;
    &lt;p&gt;Voici &lt;/p&gt;
    &lt;aside&gt;
        &lt;h1&gt;A lire aussi :&lt;/h1&gt;
        &lt;p&gt;&lt;a href=&quot;...&quot;&gt;Faut-il passer à HTML5 ?&lt;/a&gt;&lt;/p&gt;
    &lt;/aside&gt;
    &lt;footer&gt;
        Article publié dans WordPress sous licence CC
    &lt;/footer&gt;
&lt;/article&gt;
</pre>
<h2>Hgroup</h2>
<p>Hgroup permet de grouper des éléments de H1 à H6 et s&#8217;utilise par exemple pour définir un sous-titre d&#8217;article, une baseline, etc.</p>
<pre class="brush: xml; title: ;">
&lt;hgroup&gt;
    &lt;h1&gt;Les nouveaux éléments HTML5&lt;/h2&gt;
    &lt;h2&gt;Une optique résolument sémantique&lt;/h2&gt;
&lt;/hgroup&gt;
</pre>
<h2>Time</h2>
<p>L&#8217;élément date indique une date. l&#8217;attribut datetime permet de fournir une date lisible par une machine. L&#8217;élément time représente :</p>
<ul>
<li>Une heure dans un format 24 heures</li>
<li>Une date correspondant au calendrier grégorien accompagnée optionnellement d&#8217;une heure et d&#8217;une indication du décalage correspondant à la zone géographique.</li>
</ul>
<pre class="brush: xml; title: ;">
    &lt;time datetime=&quot;2011-01-04&quot;&gt;4 janvier 2011&lt;/time&gt;
    &lt;time datetime=&quot;2011-01-04T00:17:11&quot;&gt;4 janvier 2011 à 0:17&lt;/time&gt;
    &lt;time datetime=&quot;2011-01-04T00:17:11+01:00&quot;&gt;4 janvier 2011 à 0:17&lt;/time&gt;
</pre>
<p>Le dernier exemple indique le décalage par rapport à l&#8217;heure GMT (+01:00 soit 1 heure).  A noter que le décalage de l&#8217;heure Paris par rapport à l&#8217;heure GMT n&#8217;est pas constant à cause du changement d&#8217;heure été / hiver.</p>
<h2>Mark</h2>
<p>L&#8217;élément <em>mark </em>est utilisé pour mettre en exergue une partie de texte qui selon la spécification n&#8217;avait peut être pas été considérée comme importante par l&#8217;auteur original du texte lors de son écriture mais se trouve maintenant faire l&#8217;objet d&#8217;un examen particulier.</p>
<pre class="brush: xml; title: ;">
&lt;p&gt;&lt;mark&gt;Le HTML sémantique est une manière d'écrire le HTML qui met
l'accent sur le sens de l'information encodée plutôt que sur sa
présentation.&lt;/mark&gt; Le HTML a pris en compte l'aspect sémantique
dès les premiers stades de sa conception, mais a aussi prévu des
éléments de présentation tels que ...&lt;/p&gt;
</pre>
<h2>Video</h2>
<p>Jusqu&#8217;à ce jour il n&#8217;existe aucune méthode standard pour intégrer le la vidéo dans un document HTML, on fait systématiquement appel à des plugins (Flash, Quicktime, etc.). Cette situation pose de nombreux problèmes de compatibilité. Le tag video vise à fournir une méthode unique pour l&#8217;intégration de vidéos. Il subsiste un problème majeur : les grands acteurs de l&#8217;industrie ne parviennent toujours pas à se mettre d&#8217;accord sur les codecs qui devraient être supportés par les navigateurs. Le premier pas est fait, il sera un jour possible d&#8217;intégrer une vidéo en une ligne de code sans se poser plus de questions.</p>
<p>Lire un article sur <a href="http://en.wikipedia.org/wiki/HTML5_video">l&#8217;intégration vidéo en HTML5 sur wikipedia (en)</a>.</p>
<pre class="brush: xml; title: ;">
&lt;video src=&quot;video.webm&quot; poster=&quot;video.jpg&quot; controls=&quot;controls&quot;&gt;
Texte qui s'affiche si le navigateur
ne prend pas en charge l'élément.&lt;/video&gt;
</pre>
<h2>Audio</h2>
<p>Les considérations relatives à l&#8217;audio sont identiques à celles qui concernent l&#8217;élément video.</p>
<pre class="brush: xml; title: ;">
&lt;audio src=&quot;audio.ogg&quot; controls=&quot;controls&quot;&gt;
Texte qui s'affiche si le navigateur
ne prend pas en charge l'élément.
&lt;/audio&gt;
</pre>
<h2>Canvas</h2>
<p>L&#8217;élément <em>canvas </em>fournit une API qui permet de dessiner et d&#8217;analyser l&#8217;image présente dans cet élément. Le code d&#8217;intégration de cette balise ne présente pas d&#8217;intérêt, tout réside dans l&#8217;API qui permet de manipuler cette image en javascript.</p>
<p>Pour une démonstration de canvas, consulter la <a href="http://www.google.com/events/io/2010/sessions/developing-with-html5.html">vidéo Google</a> (en) qui présente un éditeur d&#8217;images réalisé en HTML5 qui utilise cet élément.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2011/01/17/les-nouveaux-elements-html5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Faut-il passer à HTML5 ?</title>
		<link>http://blog.reflexe-internet.com/2011/01/04/faut-il-passer-a-html5/</link>
		<comments>http://blog.reflexe-internet.com/2011/01/04/faut-il-passer-a-html5/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 11:20:02 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.reflexe-internet.com/?p=256</guid>
		<description><![CDATA[Adopter une nouvelle version d&#8217;un langage est toujours un effort. Effort plus ou moins justifié par les nouvelles fonctionnalités offertes. HTML5 définit un ensemble de fonctionnalités très attendues. Sémantique HTML5 propose un ensemble de nouveaux tags qui permettent une structuration &#8230; <a href="http://blog.reflexe-internet.com/2011/01/04/faut-il-passer-a-html5/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Adopter une nouvelle version d&#8217;un langage est toujours un effort. Effort plus ou moins justifié par les nouvelles fonctionnalités offertes. HTML5 définit un ensemble de fonctionnalités très attendues.</p>
<p><span id="more-256"></span><strong>Sémantique</strong></p>
<p>HTML5 propose un ensemble de <em>nouveaux tags</em> qui permettent une structuration sémantique des contenus : nav, header, footer, section, article, aside. Chacun des nouveau tags définis permet d&#8217;indiquer dans le code le rôle / sens du contenu à l&#8217;intérieur du document.</p>
<p>Un des avantages évidents de cette évolution est l&#8217;amélioration considérable des possibilités d&#8217;analyse d&#8217;un document par une machine. Les crawlers des moteurs de recherche seront en mesure de mieux comprendre le contenu des documents.</p>
<p>Lire un <a href="http://www.alsacreations.com/article/lire/750-HTML5-nouveautes.html">aperçu de ces nouveaux éléments sur Alsacréation</a>.</p>
<p>HTML5 défini un ensemble de nouvelles valeurs pour l&#8217;<em>attribut rel d&#8217;un lien</em> (link ou a). Cette attribut vise à décrire la nature de la relation entre la page source et la page cible du lien. En savoir <a href="http://diveintohtml5.org/semantics.html#link">plus sur l&#8217;attribut rel</a>, ou une <a href="http://www.w3schools.com/html5/att_a_rel.asp">définition plus concise de l&#8217;attribut rel sur w3schools</a>. Nouveaux <a href="http://wiki.whatwg.org/wiki/RelExtensions">attributs rel proposés sur whatwg</a>.</p>
<p><strong>Stockage sur le poste client<br />
</strong></p>
<p><em>Local storage (Stockage local) ou session storage</em>, permet de stocker des informations sur le poste de l&#8217;utilisateur.</p>
<p>Une API <em>Web SQL Database</em> permet la manipulation d&#8217;une base de données locale stockée sur le poste du client.</p>
<p><strong>Interactions</strong></p>
<p>Le <em>drag and drop</em> (glisser déposer) est spécifié dans HTML5 et permet une mise en place simple.</p>
<p><strong>Multimedia</strong></p>
<p>Les nouveau tags audio et vidéo permettent l&#8217;intégration de contenus audio / vidéo sans passer par des plugins spécifiques (lecteur flash ou Quicktime par exemple). Reste un problème important d&#8217;homogénéité du support des différents codecs par les navigateurs. Une <a href="http://www.craftymind.com/factory/html5video/CanvasVideo.html">démonstration de vidéo qui explose</a> réalisée à partir des tags video et canvas.</p>
<p>L&#8217;API <em>Canvas </em>fourni au développeur les outils pour dessiner en 2D et 3D dans le navigateur et interagir avec l&#8217;image.</p>
<p><strong>Communication</strong></p>
<p>Les <em>Worker threads </em>permettent l&#8217;exécutions de tâches de fonds en javascript pendant (récupérer des données avec XML HTTP Request &#8211; Ajax par exemple). L&#8217;exécution des Worker threads est conçue pour que les tâches qu&#8217;ils exécutent ne viennent pas bloquer le fonctionnement de l&#8217;application. Un <a href="https://developer.mozilla.org/En/Using_web_workers">article sur l&#8217;utilisation des Worker threads sur mozilla.org</a>.</p>
<p>Les <em>notifications </em>constituent un moyen d&#8217;envoyer un message depuis le serveur vers le client.</p>
<p>Les <em>web sockets</em> offrent la possibilité d&#8217;établir une communication bi-directionnelle entre le client et le serveur. Dans une situation telle que l&#8217;affichage d&#8217;un graphique qui doit être mis à jour en temps réel, l&#8217;utilisation des web sockets constitue une alternative intéressante aux rechargements de page. Lire un <a href="http://soa.sys-con.com/node/1315473">article sur les web sockets</a>. Un <a href="http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/">exemple d&#8217;utilisation des web sockets </a>(non testé &#8211; anglais).</p>
<p>L&#8217;<em>API de géolocalisation</em> permet de récupérer la position géographique de l&#8217;Internaute.  Il existe différentes manière de déterminer la position d&#8217;un internaute : adresse IP, connexion à un antenne du réseau téléphonique sans fil, position par rapport à un satellite (GPS ou autre), etc. En fonction de la technologie disponible sur la plateforme de l&#8217;internaute la position déterminée sera plus ou moins précise.</p>
<p><strong>Formulaires</strong></p>
<p>Un ensemble de nouveaux types de <em>contrôles de formulaire</em> permettront (dès qu&#8217;ils seront pris en charge par les navigateurs) de créer des formulaires plus riches en utilisant les fonctionnalités natives du navigateur. Lire la p<a href="http://diveintohtml5.org/detect.html#input-types">résentation de ces nouveaux contrôles de formulaires</a>.</p>
<p><strong>Une prise en charge partielle</strong></p>
<p>HTML5 est actuellement à l&#8217;état de work in progress ce qui signifie 2 choses :</p>
<ul>
<li>il n&#8217;est que partiellement supporté par un nombre limité de navigateurs</li>
<li>les spécifications peuvent changer avant leur publication définitive</li>
</ul>
<p>En attendant un support large de ces nouvelles fonctionnalités, des solutions de fallback sont nécessaires.</p>
<p>Pour vous faire une idée de la prise en charge des fonctionnalités HTML5 dans les différents navigateurs, <a href="http://html5demos.com/">démos HTML5</a>.</p>
<p><strong>Aperçu des possibilités</strong></p>
<ul>
<li>Vidéo de démonstration <a href="http://www.google.com/events/io/2010/sessions/developing-with-html5.html">des nombreuses possibilités de HTML5  sur Google IO</a>, à partir de Chromabrush une application de dessin développée en HTML5 pour l&#8217;occasion.</li>
<li>Démonstration <a href="http://www.whatwg.org/demos/2008-sept/">vidéo des nouvelles fonctionnalités HTML5 sur whatwg.org</a>.</li>
</ul>
<p><strong>En conclusion, pourquoi il faut passer à HTML5<br />
</strong></p>
<p>HTML5 fourni un ensemble de fonctionnalités de <em>marquage sémantique</em> utiles pour l&#8217;interopérabilité et applicable en particulier au  référencement.</p>
<p>HTML5 selon un certain nombre d&#8217;intervenants (cf. vidéo Google ci-dessus) promet de <em>combler le fossé entre les applications web et desktop</em>.</p>
<p>HTML5 rend obsolètes un certain nombre de plugins et librairies (lecteurs vidéo, composants d&#8217;interface javascript, etc.). HTML5 rattrape le retard pris par le standard par rapport aux besoins actuels.</p>
<p>Il est indispensable de passer à HTML5 maintenant pour ses possibilités nombreuses et  intéressantes. Utiliser HTML5 maintenant favorisera une adoption large et rapide du standard par les éditeurs de navigateurs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2011/01/04/faut-il-passer-a-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tri sur les tableaux en PHP</title>
		<link>http://blog.reflexe-internet.com/2010/12/17/tri-sur-les-tableaux-en-php/</link>
		<comments>http://blog.reflexe-internet.com/2010/12/17/tri-sur-les-tableaux-en-php/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 20:28:26 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.reflexe-internet.com/?p=240</guid>
		<description><![CDATA[Réaliser des tris en particulier sur des tableaux est une opération courante. Un ensemble de fonctions natives en PHP permettent de le réaliser simplement. Tri basique avec sort La fonction sort trie d&#8217;un tableau à une seule dimension dans l&#8217;ordre &#8230; <a href="http://blog.reflexe-internet.com/2010/12/17/tri-sur-les-tableaux-en-php/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Réaliser des tris en particulier sur des tableaux est une opération courante. Un ensemble de fonctions natives en PHP permettent de le réaliser simplement.</p>
<p><span id="more-240"></span><strong>Tri basique avec sort</strong></p>
<p>La fonction <a href="http://www.php.net/manual/fr/function.sort.php">sort</a> trie d&#8217;un tableau à une seule dimension dans l&#8217;ordre ascendant des éléments du tableau.</p>
<pre class="brush: php; title: ;">
$tableau = array('concombre', 'pomme', 'banane');
sort($tableau);
/* le nouveau tableau */
array (
    0 =&gt; 'banane',
    1 =&gt; 'concombre',
    2 =&gt; 'pomme',
)
</pre>
<p>Sort est sensible à la casse. Il est déconseillé de mélanger les types de données. La fonction sort ne réalise un tri sur des caractère ASCII. <a href="http://www.phpwact.org/php/i18n/utf-8#array_extension">Elle ne prend pas spécifiquement en charge l&#8217;UTF8</a>. Sort ne fait rien de très sophistiqué, pour faire des tri un peu plus évolué, la fonction usort permet de mettre en place une fonction de comparaison sur mesure.</p>
<p>La fonction, <a href="http://www.php.net/manual/fr/function.rsort.php">rsort </a>réalise un <strong>tri dans l&#8217;ordre inverse</strong>.</p>
<p>A noter qu&#8217;un second paramètre <strong>rsort</strong> ( array <tt>&amp;$array</tt> [, int <tt>$sort_flags</tt> = SORT_REGULAR   ] ) permet de préciser le comportement du tri, voir la documentation de la fonction <a href="http://www.php.net/manual/fr/function.sort.php">sort</a>. La manière dont la fonction compare les éléments est très importante.</p>
<p><strong>Tri d&#8217;un tableau à 2 dimensions avec usort<br />
</strong></p>
<p>Il arrive souvent d&#8217;avoir à trier des tableau d&#8217;une structure similaire à ce qui suit :</p>
<pre class="brush: php; title: ;">
$tableau = array(
 array('id'=&gt;1, 'text'=&gt;'concombre'),
 array('id'=&gt;2, 'text'=&gt;'pomme'),
 array('id'=&gt;3, 'text'=&gt;'banane')
 );
</pre>
<p>C&#8217;est le type de tableau qu&#8217;on va récupérer après un fetchAll sur un objet Zend_Db et un ensemble d&#8217;autres couches d&#8217;abstraction de base de données. La fonction php <a href="http://www.php.net/manual/fr/function.usort.php">usort</a> permet de réaliser un tri en faisant appel à une fonction de comparaison.  Dans l&#8217;exemple qui suit la fonction &laquo;&nbsp;cmp&nbsp;&raquo; réalise la comparaison. La seule chose qui reste à faire c&#8217;est de réaliser le code qui permet de comparer le type de données présent dans la colonne sur laquelle on souhaite trier (chaîne sensible ou pas à la casse, tri naturel sur de l&#8217;UTF-8, entier, date sous différents formats, etc.).</p>
<pre class="brush: php; title: ;">
function cmp($a, $b){
    return strcmp($a['text'], $b['text']);
}
usort($tableau, 'cmp');
</pre>
<p><strong>Exemple de tri d&#8217;un tableau par date</strong></p>
<pre class="brush: php; title: ;">
$tableau = array(
    array('id'=&gt;1, 'date'=&gt;'01/02/2011', 'libelle'=&gt;'...'),
    array('id'=&gt;2, 'date'=&gt;'01/01/2010', 'libelle'=&gt;'...'),
    array('id'=&gt;3, 'date'=&gt;'01/05/2010', 'libelle'=&gt;'...')
);

function cmp($a, $b){
    /*
        converti la date en entier aaaammjj
        suppose qu'on est certain d'avoir une date au bon format
     */
    $da    = preg_replace('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/', '$3$2$1', $a['date']);
    $db    = preg_replace('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/', '$3$2$1', $b['date']);
    return ($da == $db ? 0 : ($da &gt; $db ? 1 : -1));
}
usort($tableau, 'cmp');
echo '&lt;pre&gt;'.var_export($tableau, true).'&lt;/pre&gt;';
</pre>
<p>La <a href="http://www.php.net/manual/fr/function.usort.php">documentation de usort</a> fourni un exemple (exemple N°3) qui permet de créer une méthode objet qui permettrait en l&#8217;adaptant un peu de fournir une fonction de tri par colonne générique.</p>
<p>La documentation des <a href="http://www.php.net/manual/fr/array.sorting.php">fonctions de tri de tableaux sur php.net</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2010/12/17/tri-sur-les-tableaux-en-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La mauvaise e-reputation</title>
		<link>http://blog.reflexe-internet.com/2010/12/15/la-mauvaise-e-reputation/</link>
		<comments>http://blog.reflexe-internet.com/2010/12/15/la-mauvaise-e-reputation/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 19:32:44 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.reflexe-internet.com/?p=226</guid>
		<description><![CDATA[L&#8217;Internet est il devenu une espèce de big brother qui se faufile à notre insu pour nous voler puis étaler au grand jour nos secrets les mieux gardés ? Les problématiques liées au respect de la vie privée sur l&#8217;Interne, &#8230; <a href="http://blog.reflexe-internet.com/2010/12/15/la-mauvaise-e-reputation/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>L&#8217;Internet est il devenu une espèce de big brother qui se faufile à notre insu pour nous voler puis étaler au grand jour nos secrets les mieux gardés ? Les problématiques liées au respect de la vie privée sur l&#8217;Interne, à la divulgation d&#8217;informations confidentielles et bien d&#8217;autres sont au cœur de nos angoisses numériques du moment.</p>
<p><span id="more-226"></span>L&#8217;internet est un lieu d&#8217;échange quotidien pour un grand nombre de personnes dont la paroles ne dépassait auparavant que rarement le cercle de la discussion entre amis. Les blogs, forums et réseaux sociaux permettent d&#8217;échanger avec l&#8217;autre. Chacun a la parole et s&#8217;expose à ses semblables et de manière plus ou moins consciente au monde entier. Un grand nombre de problématiques ont émergé ces derniers mois montrant les effets indésirables de ce grand forum public.</p>
<p>Certains ont découvert que le réseau avait une mémoire et qu&#8217;une parole (ou une photo) déplacée pouvait avoir des répercutions bien longtemps après.  On a alors parlé d&#8217;un &laquo;&nbsp;<a href="http://www.rue89.com/explicateur/2009/11/11/le-droit-a-loubli-numerique-un-casse-tete-jurididique">droit à l&#8217;oubli numérique</a>&nbsp;&raquo; sous forme d&#8217;un appel au législateur qui viendrai user de son autorité pour effacer nos faux pas. Personne n&#8217;y croit vraiment  étant donné la quantité de problèmes juridiques et techniques à surmonter pour mettre en œuvre cette idée. Le web a cette caractéristique qu&#8217;une information publiée échappe totalement a son auteur. Elle peut être recopiée et mise à disposition en n&#8217;importe quel autre point du monde immédiatement. Sauf à placer un policier derrière chaque serveur Web, il devient alors impossible d&#8217;empêcher sa propagation.</p>
<p>Pragmatiques, les entreprises proposent des service de gestion de réputation numérique. Grossièrement, ça consiste à faire de la veille (vérifier sur Google ce qui sort lorsque vous tapez votre nom) et à compenser des résultats compromettants en publiant vous même des informations plus flatteuses. Le PDG de Google, Eric Schmidt <a href="http://www.slate.fr/lien/26215/google-changer-nom">tranche lui la question de manière radicale</a> en souhaitant que nous puissions changer de nom pour échapper à une identité dont le reflet sur le Web nous semble insupportable.</p>
<p>Notre souhait que le législateur limite la mémoire du Web lors de la publication de propos diffamatoires ou de documents personnels acquis de manière frauduleuse est légitime. Quelque soit la légitimité de cette attente, elle sera difficile à satisfaire avec les moyens techniques actuels. La publication d&#8217;un contenu sur le web a toujours pour origine l&#8217;action d&#8217;un individu. Et c&#8217;est le poids de cette action qu&#8217;il faut ré-évaluer, les documents Web, écrits ou pas restent.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2010/12/15/la-mauvaise-e-reputation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ergonomie web, pour des sites web efficaces</title>
		<link>http://blog.reflexe-internet.com/2010/12/14/linternaute-ne-doit-pas-faire-derreur/</link>
		<comments>http://blog.reflexe-internet.com/2010/12/14/linternaute-ne-doit-pas-faire-derreur/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 12:16:34 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[bouquins]]></category>

		<guid isPermaLink="false">http://blog.reflexe-internet.com/?p=216</guid>
		<description><![CDATA[L&#8217;ergonomie est un sujet central dans la conception d&#8217;un site Internet (ou d&#8217;un Intranet, d&#8217;une application de gestion, etc.). Le livre &#171;&#160;Ergonomie web, pour des sites web efficaces&#160;&#187;  présente de manière très convaincante les enjeux et la démarche de prise &#8230; <a href="http://blog.reflexe-internet.com/2010/12/14/linternaute-ne-doit-pas-faire-derreur/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.reflexe-internet.com/wp-content/uploads/2010/12/ergo_web.jpg"><img class="alignleft size-medium wp-image-221" title="ergo_web" src="http://blog.reflexe-internet.com/wp-content/uploads/2010/12/ergo_web-258x300.jpg" alt="Couverture Ergonomie Web" width="206" height="240" /></a>L&#8217;ergonomie est un sujet central dans la conception d&#8217;un site Internet (ou d&#8217;un Intranet, d&#8217;une application de gestion, etc.). Le livre &laquo;&nbsp;Ergonomie web, pour des sites web efficaces&nbsp;&raquo;  présente de manière très convaincante les enjeux et la démarche de prise en compte de l&#8217;ergonomie dans la conception d&#8217;un site Internet.</p>
<p><span id="more-216"></span></p>
<p>L&#8217;ergonomie, c&#8217;est important. Chaque concepteur, développeur ou rédacteur en est convaincu et fais de son mieux pour rendre les sites sur lesquels il intervient &laquo;&nbsp;simples à utiliser&nbsp;&raquo;. Si l&#8217;ergonomie n&#8217;est pas une discipline nouvelle, nombreux sont les concepteurs qui n&#8217;ont jamais réellement été formés ou même sensibilisés à ce sujet.</p>
<p>Dans son livre, Amélie Boucher rappelle les principes ergonomiques qui touchent a la conception de logiciels. Les références théoriques sont expliquées de manière simple et confrontées à des exemples concrets.</p>
<p>Un grand nombre d&#8217;images d&#8217;écrans de sites illustrent des exemples de défauts ergonomiques. Les solutions proposées sont clairement expliquées et argumentées.</p>
<p>Ce livre est riche en informations, et propose des solutions directement applicables.</p>
<p>Pour plus d&#8217;informations, <a href="http://www.ergonomie-sites-web.com/">le site du livre</a> publié aux <a href="www.eyrolles.com">éditions Eyrolles</a> et disponible sur leur site.</p>
<p>Vous avez lu ce livre et l&#8217;avez trouvé intéressant (ou pas), vous pouvez laisser un commentaire.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2010/12/14/linternaute-ne-doit-pas-faire-derreur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Totalement autodidacte, il parait que c&#8217;est la meilleur école</title>
		<link>http://blog.reflexe-internet.com/2008/10/20/totalement-autodidacte-il-parait-que-cest-la-meilleur-ecole/</link>
		<comments>http://blog.reflexe-internet.com/2008/10/20/totalement-autodidacte-il-parait-que-cest-la-meilleur-ecole/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 21:17:10 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[grrr]]></category>

		<guid isPermaLink="false">http://reflexe-blog2/?p=98</guid>
		<description><![CDATA[Je viens de lire cette phrase sur le blog d&#8217;un &#171;&#160;développeur web&#160;&#187;. En général, ce genre d&#8217;assertion rassure les autodidactes et fait bondir les informaticiens (je suppose). Soyons clair, je n&#8217;ai rien contre les autodidactes. Je pense même qu&#8217;on peut &#8230; <a href="http://blog.reflexe-internet.com/2008/10/20/totalement-autodidacte-il-parait-que-cest-la-meilleur-ecole/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je viens de lire cette phrase sur le blog d&#8217;un &laquo;&nbsp;développeur web&nbsp;&raquo;. En général, ce genre d&#8217;assertion rassure les autodidactes et fait bondir les informaticiens (je suppose).<span id="more-98"></span></p>
<p>Soyons clair, je n&#8217;ai rien contre les autodidactes. Je pense même qu&#8217;on peut être totalement autodidacte sur un sujet et plus compétent que d&#8217;autres qui ont appris  sur les bancs de l&#8217;université. A ce détail prêt que quand on apprend un sujet par soi même (ou pas) on peut avoir tendance à totalement ignorer certains aspects qui ne paraissent pas immédiatement utiles.</p>
<p>A titre d&#8217;illustration, tout ce qui se rapporte à la réalisation d&#8217;un modèle relationnel qui tient debout (conception du schéma d&#8217;une base de données) est un sujet qui intéresse peu un nombre impressionnant de développeurs (autodidactes ou pas). Il y a souvent plusieurs manières de faire. Ce qui permet rapidement de sauter le pas et de s&#8217;imaginer qu&#8217;il n&#8217;y a pas de règles. Hors il existe des règles (cf. <a href="http://laurent-audibert.developpez.com/Cours-BD/html/Cours-BD016.html">normalisation</a>) et s&#8217;il existe souvent plusieurs manières toutes aussi valables de concevoir un schéma, il en existe aussi de très mauvaises.</p>
<p>Des erreurs de conceptions peuvent conduire aux problèmes suivants :</p>
<ul>
<li> bugs insolubles</li>
<li>problèmes de performances</li>
<li>difficulté voire impossibilité à faire évoluer le logiciel</li>
<li>difficulté à extraire une information pourtant présente dans la base de données</li>
</ul>
<p>La conception d&#8217;un système informatique quel qu&#8217;il soit ne se fait pas au doigt mouillé. Un autodidacte peut facilement être plus à l&#8217;aise qu&#8217;un analyste programmeur de formation pour mettre en place un site avec 3 ou 4 formulaires. En revanche dès qu&#8217;un petit peu de complexité apparaît, il n&#8217;y a aucun doute que toute l&#8217;intuition du monde ne sert plus à rien.</p>
<p>Pour conclure, je me suis déjà retrouvé dans des situations où la conception était réalisée par des non informaticiens qui en plus possédaient l&#8217;ascendant hiérarchique. Dans ce genre de configuration, on a tendance a emmener les développeurs vers l&#8217;insoluble. Plus ça va, plus c&#8217;est insoluble et plus les développeur passent pour des incapables. Les autodidactes sont aussi bon que les développeurs de métier le jour où ils connaissent les même choses. Avoir conscience de ses limites permet d&#8217;apprendre et d&#8217;avancer, être fier de son ignorance ne permet que de se rassurer à bon compte.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2008/10/20/totalement-autodidacte-il-parait-que-cest-la-meilleur-ecole/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web service PHP avec sessions</title>
		<link>http://blog.reflexe-internet.com/2008/03/10/web-service-php-avec-sessions/</link>
		<comments>http://blog.reflexe-internet.com/2008/03/10/web-service-php-avec-sessions/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 19:29:32 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[service web]]></category>

		<guid isPermaLink="false">http://reflexe-blog2/?p=103</guid>
		<description><![CDATA[Il est parfois nécessaire lors de l&#8217;appel d&#8217;un web service de mémoriser des données envoyées lors d&#8217;un précédent appel. Le web service sera &#171;&#160;statefull&#160;&#187;. Il faut signaler que le fait de gérer les sessions dans un web service porte préjudice &#8230; <a href="http://blog.reflexe-internet.com/2008/03/10/web-service-php-avec-sessions/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Il est parfois nécessaire lors de l&#8217;appel d&#8217;un web service de mémoriser des données envoyées lors d&#8217;un précédent appel. Le web service sera &laquo;&nbsp;statefull&nbsp;&raquo;.<br />
<span id="more-103"></span><br />
Il faut signaler que le fait de gérer les sessions dans un web service porte préjudice aux performances. En effet si le serveur qui propose le service web doit gérer les sessions cela limitera forcément la montée en charge.</p>
<p>A noter que la méthode &laquo;&nbsp;setPersistence&nbsp;&raquo; de Soap permet de conserver les infos entre 2 appels mais uniquement si ces 2 appels ont lieu dans le même script.</p>
<p>Pour conserver l&#8217;état entre 2 appels à un web service, il faut d&#8217;abord mettre en place une gestion des session coté client.<br />
On transmet ensuite l&#8217;identifiant de session au serveur : $obj_soapclient-&gt;__setCookie(&#8216;session_id&#8217;, session_id()).</p>
<p>Dans le script qui gère le serveur, on récupère l&#8217;identifiant de session fourni par le client et on démarre une session avec cet identifiant.</p>
<p>Les valeurs des variables membres de la classe à laquelle on accède par l&#8217;intermédiaire du web service seront conservée entre 2 appels.</p>
<p><strong>Le code coté serveur :</strong></p>
<pre><code>
// instanciez le service web de manière classique
$server    = new SoapServer($wsdl, $soap_options);
/* récupère les information d'identification de la session fournies par le client */
if (isset($_COOKIE['session_id'])) {
session_name('nom_session');
session_id('serv'.$_COOKIE['session_id']);
// démarre une session avec les infos fournies par le client
session_start();
}
$server-&gt;setClass('...'); // ici le nom de la classe que vous exposez
$server-&gt;setPersistence(SOAP_PERSISTENCE_SESSION);
$server-&gt;handle();
</code>
</pre>
<p><strong>Le code coté client</strong></p>
<pre><code>
// démarre une session
session_start()

// instanciez un client Soap de manière classique
$wsdl    = 'http://...';
$obj_soapclient  = new SoapClient($wsdl, $soap_options);
// envoyez au client l'identifiant de session
$obj_soapclient-&gt;__setCookie('session_id', session_id());

// utiliser le web service ...
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2008/03/10/web-service-php-avec-sessions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Synchroniser le schéma de 2 bases</title>
		<link>http://blog.reflexe-internet.com/2008/03/10/synchroniser-le-schema-de-2-bases/</link>
		<comments>http://blog.reflexe-internet.com/2008/03/10/synchroniser-le-schema-de-2-bases/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 10:47:25 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://reflexe-blog2/?p=105</guid>
		<description><![CDATA[Lors qu&#8217;on met en production une mise à jour d&#8217;un projet, il y a de fortes chances que le schéma de la base ait évolué. On a alors 2 solutions pour mettre à jour le schéma de la base de &#8230; <a href="http://blog.reflexe-internet.com/2008/03/10/synchroniser-le-schema-de-2-bases/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Lors qu&#8217;on met en production une mise à jour d&#8217;un projet, il y a de fortes chances que le schéma de la base ait évolué. On a alors 2 solutions pour mettre à jour le schéma de la base de production : noter les modifications réalisées sur un Post It ou utiliser un logiciel qui génère le script de mise à jour.</p>
<p><span id="more-105"></span>Depuis la publication de ce post, j&#8217;ai trouvé un nouvel outil qui réalise la même tâche. Il s&#8217;agit de <a href="http://www.webyog.com">SQLyog</a>. La version que j&#8217;utilise est un peu ancienne et fonctionnait déjà très bien.</p>
<p>Il existe un grand nombre de logiciels qui permettent de comparer 2 schéma et de générer le script d&#8217;évolution. La plupart sont lents, un grand nombre sont très buggués. <a href="http://www.sqlmanager.net/en/products/mysql/dbcomparer">EMS DB Comparer for MySQL</a> est le logiciel que j&#8217;ai trouvé le plus fonctionnel. Attention tout de même, il arrive de temps en temps qu&#8217;il introduise à tort un index &laquo;&nbsp;UNIQUE&nbsp;&raquo; à tort. Dans tous les cas, il faut relire le script et l&#8217;exécuter ligne à ligne ce qui est de toute manière bien plus rapide que de refaire les modifications dans PHP MyAdmin.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2008/03/10/synchroniser-le-schema-de-2-bases/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MYSQL Cursor (Exemples de curseurs)</title>
		<link>http://blog.reflexe-internet.com/2008/02/20/mysql-cursor-exemples-de-curseurs/</link>
		<comments>http://blog.reflexe-internet.com/2008/02/20/mysql-cursor-exemples-de-curseurs/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 12:38:51 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://reflexe-blog2/?p=107</guid>
		<description><![CDATA[Les curseurs permettent dans une procédure stockée de récupérer un résultat en SQL qu&#8217;il s&#8217;agisse d&#8217;une valeur ou d&#8217;un jeu d&#8217;enregistrements. Le post qui suit donne quelques explications et exemples de manipulation des curseurs dans MySQL. Le premier exemple montre &#8230; <a href="http://blog.reflexe-internet.com/2008/02/20/mysql-cursor-exemples-de-curseurs/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Les curseurs permettent dans une procédure stockée de récupérer un résultat en SQL qu&#8217;il s&#8217;agisse d&#8217;une valeur ou d&#8217;un jeu d&#8217;enregistrements. Le post qui suit donne quelques explications et exemples de manipulation des curseurs dans MySQL.<br />
<span id="more-107"></span><br />
Le premier exemple montre comment récupérer le résultat d&#8217;une requête SQL dans une variable à l&#8217;intérieur d&#8217;une procédure MySQL :</p>
<pre><code>
# ... déclaration de la procédure
# déclare une variable pour stocker le résultat
DECLARE i_num_cmd INTEGER;
# déclare un curseur pour récupérer le résultat
# (pour rappel toutes les déclarations doivent se situer en début de procédure)
DECLARE c_num_cmd CURSOR FOR
SELECT COUNT(*)
FROM orders
WHERE customers_id=in_id_personne;

# ouvre le curseur et place le résultat dans la variable i_num_cmd
OPEN c_num_cmd;
# place le résultat dans la variable i_num_cmd
FETCH c_num_cmd INTO i_num_cmd;
CLOSE c_num_cmd;
# ... fin de la procédure
</code>
</pre>
<p>Une situation courante, on souhaite récupérer dans une requête qui nécessite un ensemble de vérifications sur de multiples tables ou un calcul un peu alambiqué.</p>
<p>Un petit exemple très simpliste et inutile puisque la fonction qui suit permet de récupérer le nom d&#8217;un client dont on a passé en paramètre l&#8217;identifiant.</p>
<pre><code>
delimiter//
CREATE FUNCTION get_customer_name(in_id_personne INTEGER)
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
DECLARE done INT DEFAULT 0;
# déclare les variables qui vont accueillir les données retournées par la requête
DECLARE i_customer_id INTEGER;
DECLARE s_customer_name VARCHAR(255);
# déclare le curseur
DECLARE ccustomers CURSOR FOR SELECT customers_id, customers_firstname
FROM customers;
# déclare un handler pour détecter la fin du jeu d'enregistrements
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

# ouvre le curseur
OPEN ccustomers;
REPEAT
FETCH ccustomers INTO i_customer_id, s_customer_name;
IF i_customer_id = in_id_personne THEN
RETURN s_customer_name;
END IF;
UNTIL done END REPEAT;
END
//</code>
</pre>
<p>Les curseurs peuvent être très utiles lors de traitements qui nécessite un développement procédural.</p>
<p>Attention tout de même, utiliser une fonction qui fait appel à des curseurs dans un sélect peut clarifier le code du sélect mais aura tendance à consommer beaucoup de ressources. L&#8217;exemple qui précède est bien sûr totalement absurde.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.reflexe-internet.com/2008/02/20/mysql-cursor-exemples-de-curseurs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

