<?xml version="1.0" encoding="utf-8"?><rss version="2.0"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:cc="http://backend.userland.com/creativeCommonsRssModule"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    
	<channel>
		<title>Gastero Prod - Tags - PHP</title>
		<link>http://www.gasteroprod.com/../../../tags/php</link>
		<description></description>
		<image>
			<url>http://www.gasteroprod.com/design/images/button_gasteroprod.png</url>
			<width>80</width>
			<height>15</height>
			<title>Gastero Prod</title>
			<link>http://www.gasteroprod.com/</link>
		</image>
		<language>fr</language>
		<generator>SPIP 2.0.0 dev</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<ttl>60</ttl>
		<cc:license>http://creativecommons.org/licenses/by-nc-sa/1.0/</cc:license>
		
		<item>
			<title>session_start() et exec() ne font pas toujours bon m&#233;nage en PHP</title>
			<link>http://www.gasteroprod.com/../../../blog/session_start-et-exec-ne-font-pas-toujours-bon-menage-en-php.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p>SPIP utilise toujours son propre système de gestion de sessions applicatives alors que PHP les supporte depuis maintenant longtemps de façon satisfaisante. Ou pas...</p></div>
        	<div><p>Avec un SPIP 1.9.2c installé sur Windows Server 2003 SP2, avec Apache 2.2.6 et PHP 5.2.4, j&#8217;avais des plantages étranges sur la page de configuration avancée de SPIP et l&#8217;indexation ne marchait plus bien, certains articles passant au travers. Je n&#8217;avais pas ce soucis sur le même site déployé sur Linux ou Mac OS X.</p>

<p>Après bien des essais et lectures de code tant perso que de SPIP, il s&#8217;avère que PHP supporte mal l&#8217;usage simultané de sessions et de exec(). Le <a href="http://bugs.php.net/bug.php?id=22526" class="spip_out">bug #22526</a> a beau dater de 5 ans et être clos, le problème se pose encore, manifestement.</p>

<p>J&#8217;avais en fait un <code class='spip_code' dir='ltr'>session_start()</code> dans <code class='spip_code' dir='ltr'>mes_options.php</code> pour avoir une session PHP active dans toutes les pages. Du coup j&#8217;avais un plantage, tant des <code class='spip_code' dir='ltr'>exec()</code> de test de librairies graphiques dans la configuration avancée, que des <code class='spip_code' dir='ltr'>exec()</code> d&#8217;extraction de contenus des documents dans l&#8217;indexation.</p>

<p>De <a href="http://bugs.typo3.org/view.php?id=3731" class="spip_out">proche</a> en <a href="http://www.issociate.de/board/post/15903/PHP/Win,_exec()_und_ImageMagick/gs_Probleme.html" class="spip_out">proche</a>, j&#8217;ai découvert sur différents forums que le problème est bien d&#8217;actualité, et qu&#8217;heureusement une solution existe&nbsp;!</p>

<p>Il suffit de remplacer toutes les instructions telles que la suivante&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>exec(...);</code></div>
<p>Par ceci&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>session_write_close();<br />
exec(...);<br />
session_start();</code></div>
<p>Bien sûr, si le <code class='spip_code' dir='ltr'>exec()</code> en question se trouve après du code écrivant sur la sortie standard, il faudra utiliser les fonctions de <a href="http://fr.php.net/manual/fr/ref.outcontrol.php" class="spip_out">bufferisation de sortie</a>&nbsp;[<a href="http://www.gasteroprod.com/#nb1" name="nh1" id="nh1" class="spip_note" rel="footnote" title='[1] output buffering en anglais' >1</a>] pour éviter les <i>warning</i> dûs à l&#8217;envoi de cookie par <code class='spip_code' dir='ltr'>session_start()</code>.</p>

<p>Bien que les sources qui relatent ce problème et sa solution datent un peu, je peux vous confirmer que modifier de cette façon le source des fichiers présents dans <code class='spip_code' dir='ltr'>ecrire/extract/*.php</code> résout bien le problème.</p>

<p>Finalement, les sessions de SPIP sont meilleures que celles de PHP, au moins sur ce point... <img alt=";-)" title=";-)" class="no_image_filtrer format_png" src="http://www.gasteroprod.com/plugins/choix/couteau_suisse/img/smileys/clin_d-oeil.png" width="19" height="19"/></p></div>
        	
        	<div class="info" style="border: 1px solid #333;"><p>[<a href="http://www.gasteroprod.com/#nh1" name="nb1" class="spip_note" title="Notes 1" rev="footnote">1</a>] <i>output buffering</i> en anglais</p></div>
        </div>
        ]]></description>
			<pubDate>Wed, 30 Jan 2008 14:34:24 +0100</pubDate>
			
				<category>oups</category>
			
				<category>SPIP</category>
			
				<category>PHP</category>
			
			<guid isPermaLink="true">../../../blog/session_start-et-exec-ne-font-pas-toujours-bon-menage-en-php.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/session_start-et-exec-ne-font-pas-toujours-bon-menage-en-php.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/session_start-et-exec-ne-font-pas-toujours-bon-ma-c-nage-en-php-639.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>Attention quand vient le succ&#232;s...</title>
			<link>http://www.gasteroprod.com/../../../blog/attention-quand-vient-le-succes.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p>Alors que je m&#8217;interroge sur un éventuel <a href="http://www.gasteroprod.com/blog/faut-il-que-j-abandonne-spip-pour-dotclear.html" class="spip_in">abandon de SPIP au profit de DotClear</a>, surtout avec <a href="http://www.dotclear.net/forum/viewtopic.php?id=19175" class="spip_out">la première beta de DotClear 2.0 enfin disponible</a>, je dois avouer que le <a href="http://www.dotclear.net/forum/viewtopic.php?id=19176" class="spip_out">modèle de mail à envoyer aux hébergeurs ne disposant pas de PHP5</a>&nbsp;[<a href="http://www.gasteroprod.com/#nb1-1" name="nh1-1" id="nh1-1" class="spip_note" rel="footnote" title='[1] Reproduit ici au cas o&#249; : Bonjour, Je constate avec surprise et regret (...)' >1</a>] proposé à ceux qui veulent adopter DotClear 2.0 me laisse rêveur...</p></div>
        	<div><p>Malheureusement, le forum dans lequel est proposé ce modèle n&#8217;est pas ouvert aux commentaires, donc je réagis ici, au risque de faire gonfler l&#8217;affaire plus que nécessaire...</p>

<p>Je comprends qu&#8217;il soit très confortable, quand on développe un logiciel, de s&#8217;appuyer uniquement sur le dernier cri des fonctionnalités d&#8217;une technologie.</p>

<p>Mais de là à exiger des hébergeurs qu&#8217;ils suivent le mouvement sous prétexte que le logiciel en question est populaire&nbsp;[<a href="http://www.gasteroprod.com/#nb1-2" name="nh1-2" id="nh1-2" class="spip_note" rel="footnote" title='[2] Support&#233; par Gandi notamment, qui y voit sans doute un bon moyen de se (...)' >2</a>], il me semble qu&#8217;on n&#8217;est pas loin de l&#8217;abus de position dominante.</p>

<p>C&#8217;est à chaque hébergeur de se faire sa propre idée en ce qui concerne la pertinence du passage à PHP5. Il ne suffit pas de dire que &#171;&nbsp;PHP5 est disponible depuis près de deux ans et que cette version est stable&nbsp;&#187;, même si c&#8217;est vrai, pour que ce passage devienne une &#171;&nbsp;évidence&nbsp;&#187; pour l&#8217;hébergeur&nbsp;!</p>

<p>Quelques points en vrac qui pourraient justifier mes propos&nbsp;:</p>

<ul class="spip"><li> * PHP4 est à priori plus stable que PHP5, puisqu&#8217;il y a plus d&#8217;historique et toujours une maintenance active&nbsp;[<a href="http://www.gasteroprod.com/#nb1-3" name="nh1-3" id="nh1-3" class="spip_note" rel="footnote" title='[3] Gr&#226;ce &#224; la pr&#233;sence encore aujourd&#39;hui d&#39;&#233;norm&#233;ment de plateformes qui (...)' >3</a>]. La stabilité de PHP5, même bonne, est donc toute relative.</li><li> * La plupart des projets logiciel libre ou développés en spécifique par tout un chacun sont clairement plus probablement faits en &mdash; et pour &mdash; PHP4, et ne fonctionnent pas &mdash; ou mal &mdash; en PHP5. Si l&#8217;hébergeur change de version, ce sont la plupart de ses clients qui risquent de changer de crèmerie, ce qu&#8217;aucune société commerciale n&#8217;est à priori prête à risquer.</li><li> * D&#8217;autres projets se permettent de tirer profit des nouveautés de PHP5 s&#8217;il est disponible, mais continuent à bien fonctionner sur PHP4.</li></ul>
<p>Je pense donc qu&#8217;il faut absolument&nbsp;:</p>

<ul class="spip"><li> * d&#8217;une part que DotClear 1 continue à vivre &mdash; longtemps s&#8217;il le faut&nbsp;[<a href="http://www.gasteroprod.com/#nb1-4" name="nh1-4" id="nh1-4" class="spip_note" rel="footnote" title='[4] PHP6 pointera le bout de son nez avant que tous les PHP4 soient (...)' >4</a>] &mdash; et soit mis à jour quand des bugs ou failles de sécurité sont identifiés</li><li> * d&#8217;autre part que les développeurs de logiciels libres qui visent le grand public soit toujours humbles, surtout quand leur communauté commence à grossir</li></ul>
<h3 class="spip">Ajout du 7 juillet</h3>
<p>Apparemment, <a href="http://callmepep.org/blog/2006/07/05/364-je-t-aime-moi-non-plus" class="spip_out">Free est maintenant compatible avec DotClear 2.0</a>&nbsp;[<a href="http://www.gasteroprod.com/#nb1-5" name="nh1-5" id="nh1-5" class="spip_note" rel="footnote" title='[5] Et il semblerait qu&#39;il ne soit pas le seul' >5</a>], ce qui est un élément à mon avis essentiel pour la propagation de cette nouvelle version.</p></div>
        	<div class="ps" style="font-style: italic;"><span style="font-weight: bolder;">PS :</span> <p>Je ne m&#8217;attaque pas à <a href="http://www.neokraft.net/" class="spip_out">Olivier Meunier</a> en personne, puisque cette proposition de lettre ne semble de toute façon pas être de lui, et DotClear ne fait finalement que l&#8217;exemple opportuniste d&#8217;un sujet qui me traine en tête depuis bien longtemps...</p></div>
        	<div class="info" style="border: 1px solid #333;"><p>[<a href="http://www.gasteroprod.com/#nh1-1" name="nb1-1" class="spip_note" title="Notes 1-1" rev="footnote">1</a>] Reproduit ici au cas où&nbsp;:</p>
<blockquote class="spip">
<p>
Bonjour,</p>

<p>Je constate avec surprise et regret que votre hébergement n&#8217;offre qu&#8217;une version ancienne de PHP et ne me permettra donc pas d&#8217;installer l&#8217;outil de blog que j&#8217;ai choisi.</p>

<p>En effet, DotClear nécessite PHP5 ainsi que les extensions iconv mbstring, simplexml et le support des fonctions OB [à adapter aux carences révélées par le test]. Ces prérequis sont loin de pouvoir être considérés comme extravagants si l&#8217;on tient compte du fait que PHP5 est disponible depuis près de deux ans et que cette version est stable.</p>

<p>Il me semble donc d&#8217;évidence que mettre à jour votre version de PHP fait partie de vos projets immédiats et j&#8217;aimerais connaître le délai dans lequel vous pensez le faire.</p>

<p>Vous remerciant par avance de l&#8217;attention que vous portez aux demandes de vos clients, je vous salue cordialement.</p>

<p>Amélie Poulain.</p>
</blockquote><p>[<a href="http://www.gasteroprod.com/#nh1-2" name="nb1-2" class="spip_note" title="Notes 1-2" rev="footnote">2</a>]  <a href="http://www.gandi.net/soutient/dotclear/" class="spip_out">Supporté par Gandi</a> notamment, qui y voit sans doute un bon moyen de <a href="http://www.lebardegandi.net/post/2006/06/23/GandiBlog-Beta" class="spip_out">se diversifier à moindre frais</a>... tant mieux pour DotClear tant que ce n&#8217;est qu&#8217;un soutient</p>

<p>[<a href="http://www.gasteroprod.com/#nh1-3" name="nb1-3" class="spip_note" title="Notes 1-3" rev="footnote">3</a>] Grâce à la présence encore aujourd&#8217;hui d&#8217;énormément de plateformes qui l&#8217;utilisent, soit dit au passage. Et là je me tire dans le pied, puisque s&#8217;il y avait moins de gens sur PHP4, il y en aurait sans doute plus sur PHP5, et sa stabilité serait encore meilleure... mais bon.</p>

<p>[<a href="http://www.gasteroprod.com/#nh1-4" name="nb1-4" class="spip_note" title="Notes 1-4" rev="footnote">4</a>] PHP6 pointera le bout de son nez avant que tous les PHP4 soient éradiqués, à n&#8217;en pas douter</p>

<p>[<a href="http://www.gasteroprod.com/#nh1-5" name="nb1-5" class="spip_note" title="Notes 1-5" rev="footnote">5</a>] Et il semblerait qu&#8217;il ne soit <a href="http://www.dotclear.net/forum/viewtopic.php?id=19282" class="spip_out">pas le seul</a></p></div>
        </div>
        ]]></description>
			<pubDate>Wed, 28 Jun 2006 16:05:27 +0100</pubDate>
			
				<category>PHP</category>
			
				<category>logiciel libre</category>
			
				<category>DotClear</category>
			
			<guid isPermaLink="true">../../../blog/attention-quand-vient-le-succes.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/attention-quand-vient-le-succes.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/attention-quand-vient-le-succa-s-578.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>Des Services Web REST encore plus simples qu'avec XML ?</title>
			<link>http://www.gasteroprod.com/../../../blog/des-services-web-rest-encore-plus-simples-qu-avec-xml.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p><i>Article initialement publié dans <a href="http://www.clever-age.com/veille/weblog/services-web-rest-encore-plus-simples-avec-xml-493.html" class="spip_out">le weblog de Clever Age</a>.</i></p>

<p>Si vous avez déjà manipulé les flux de syndication de Flickr, vous avez appelé des URL de la forme suivante&nbsp;:</p>

<ul class="spip"><li> * Flux RSS 2.0&nbsp;: <code class='spip_code' dir='ltr'>flickr.com/.../photos_public.gne?id=...&amp;format=rss_200</code> </li><li> * Flux Atom 0.3&nbsp;: <code class='spip_code' dir='ltr'>flickr.com/.../photos_public.gne?id=...&amp;format=atom_03</code></li></ul>
<p>Eh bien il est possible d&#8217;utiliser d&#8217;autres valeurs du paramètre &#171;&nbsp;format&nbsp;&#187; de l&#8217;URL pour obtenir les données non pas en RSS ou Atom, mais dans un format plus simple à manipuler sur votre plateforme.</p></div>
        	<div><p>Le premier exemple intéressant va dans le sens de la nouvelle <a href="http://developer.yahoo.com/common/phpserial.html" class="spip_out">version &#171;&nbsp;serialized php&nbsp;&#187;</a> de l&#8217;<a href="http://www.clever-age.com/veille/weblog/yahoo-ouvre-via-une-api-web-services-350.html" class="spip_out">API de Yahoo</a>&nbsp;:
<a href="http://flickr.com/services/feeds/photos_public.gne?id=38608514@N00&amp;format=php_serial" class="spip_out">php_serial</a></p>

<p>Mais vous pouvez tenter toute sorte de formats&nbsp;:</p>

<ul class="spip"><li> * <a href="http://flickr.com/services/feeds/photos_public.gne?id=38608514@N00&amp;format=php" class="spip_out">php</a></li><li> * <a href="http://flickr.com/services/feeds/photos_public.gne?id=38608514@N00&amp;format=yaml" class="spip_out">yaml</a></li><li> * <a href="http://flickr.com/services/feeds/photos_public.gne?id=38608514@N00&amp;format=sql" class="spip_out">sql</a></li><li> * <a href="http://flickr.com/services/feeds/photos_public.gne?id=38608514@N00&amp;format=json" class="spip_out">json</a></li><li> * <a href="http://flickr.com/services/feeds/photos_public.gne?id=38608514@N00&amp;format=rdf" class="spip_out">rdf</a></li></ul>
<p>Malheureusement, ce n&#8217;est valable que pour les flux de syndication, et pas encore pour l&#8217;<a href="http://www.flickr.com/services/" class="spip_out">API de Flickr</a>, mais cela ne saurait tarder, ils travaillent dessus.</p>

<p>Cela devrait à n&#8217;en pas douter <i>booster</i> la <a href="http://developer.yahoo.com/flickr/index.html" class="spip_out">création d&#8217;applications exploitant l&#8217;API Flickr</a>.</p>

<p>Alors que REST semble recevoir de plus en plus de suffrages face à la lourdeur et complexité de la constellation WS-* qui gravite autour de SOAP&nbsp;[<a href="http://www.gasteroprod.com/#nb2-1" name="nh2-1" id="nh2-1" class="spip_note" rel="footnote" title='[1] Voir notre &#233;tude sur les Web Services, dont nous allons prochainement (...)' >1</a>], voilà qui pourrait bien favoriser l&#8217;éclosion d&#8217;une nouvelle race de Web Services.</p>

<p>Il est en effet bien plus simple de générer un tableau Javascript à partir de contenu au format json que de parser du XML. Sans compter l&#8217;économie en bande passante et en temps de traitement, tant côté client que serveur.</p>

<p>Par contre, il manque deux choses pour que le modèle d&#8217;architecture REST soit respecté&nbsp;:</p>

<ul class="spip"><li> # le type de contenu devrait être correctement indiqué dans l&#8217;en-tête HTTP de la réponse du service web (Content-Type&nbsp;: xxx)</li><li> # et de même, le client devrait indiquer le format qu&#8217;il désire dans l&#8217;en-tête HTTP de sa requête et non dans une variable GET. </li></ul>
<p>L&#8217;identificateur du format désiré (json, xml, rdf, ...) est une méta-donnée de représentation et non pas une identification de la ressource (dans l&#8217;URL). Pour faire une analogie, on retrouve un peu ici le problème de séparation entre contenu et présentation des <a href="http://www.clever-age.com/veille/etudes-payantes/portails-gestion-contenu-etat-art-solutions-7.html" class="spip_out">outils de gestion de contenu Web</a>, la spécification HTTP prévoit une en-tête pour ça (Accept)&nbsp;[<a href="http://www.gasteroprod.com/#nb2-2" name="nh2-2" id="nh2-2" class="spip_note" rel="footnote" title='[2] Enfin, mais c&#39;est assez subjectif, cela fait des URLs plut&#244;t (...)' >2</a>].</p></div>
        	
        	<div class="info" style="border: 1px solid #333;"><p>[<a href="http://www.gasteroprod.com/#nh2-1" name="nb2-1" class="spip_note" title="Notes 2-1" rev="footnote">1</a>] Voir <a href="http://www.clever-age.com/veille/etudes-payantes/les-web-services-avenir-architectures-web-8.html" class="spip_out">notre étude sur les Web Services</a>, dont nous allons prochainement publier une mise à jour</p>

<p>[<a href="http://www.gasteroprod.com/#nh2-2" name="nb2-2" class="spip_note" title="Notes 2-2" rev="footnote">2</a>] Enfin, mais c&#8217;est assez subjectif, cela fait des URLs plutôt moches...</p></div>
        </div>
        ]]></description>
			<pubDate>Thu, 13 Apr 2006 10:55:09 +0100</pubDate>
			
				<category>Flickr</category>
			
				<category>PHP</category>
			
				<category>Clever Age</category>
			
				<category>RSS</category>
			
				<category>Web Services</category>
			
			<guid isPermaLink="true">../../../blog/des-services-web-rest-encore-plus-simples-qu-avec-xml.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/des-services-web-rest-encore-plus-simples-qu-avec-xml.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/des-services-web-rest-encore-plus-simples-qu-avec-xml-561.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>Citation de Sterling Hughes</title>
			<link>http://www.gasteroprod.com/../../../blog/citation-de-sterling-hughes.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p>I wouldn&#8217;t ride to work every day in a Formula 1 automobile. It has no air conditioning, poor safety features (important in Italy), and it looks down right uncomfortable. [...] Its about the tool that will get your job done, and make you the most comfortable for the least cost. This is where PHP shines.</p></div>
        	<div><p><a href="http://www.edwardbear.org/serendipity/archives/1178_NET_vs_PHP_again_and_again.html" class="spip_out">source</a></p></div>
        	
        	
        </div>
        ]]></description>
			<pubDate>Thu, 23 Jun 2005 09:50:09 +0100</pubDate>
			
				<category>d&#233;veloppement</category>
			
				<category>PHP</category>
			
				<category>citation</category>
			
			<guid isPermaLink="true">../../../blog/citation-de-sterling-hughes.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>en</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/citation-de-sterling-hughes.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/citation-de-sterling-hughes-481.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>IBM apporte son support &#224; PHP</title>
			<link>http://www.gasteroprod.com/../../../blog/ibm-apporte-son-support-a-php.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p><i>Article initialement publié dans <a href="http://www.clever-age.com/veille/weblog/ibm-apporte-son-support-php_348.html" class="spip_out">le weblog de Clever Age</a>.</i></p>

<p>Déjà bien présent dans le monde logiciel libre, mais essentiellement dans le monde Java avec <a href="http://www.eclipse.org/" class="spip_out">Eclipse</a> et de nombreux projets donnés à l&#8217;<a href="http://www.apache.org/" class="spip_out">Apache Software Foundation</a>, IBM apporte maintenant son soutient à <a href="http://www.php.net/" class="spip_out">PHP</a>, le plus grand concurrent libre de Java pour les sites et applications Web.</p></div>
        	<div><p><span class='spip_document_298 spip_documents spip_documents_right'  style='float:right; width:100px;'>
<img src='http://www.gasteroprod.com/IMG/png/logo_ibm.png' width="100" height="41" alt="" /></span>
IBM avait déjà expliqué dans un de ses fameux <a href="http://www.redbooks.ibm.com/" class="spip_out">Redbooks</a> <a href="http://publib-b.boulder.ibm.com/Redbooks.nsf/RedpieceAbstracts/redp3639.html" class="spip_out">comment mettre en oeuvre PHP sur un IBM eSeries</a>, mais c&#8217;est maintenant une vraie implication qui est <a href="http://home.businesswire.com/portal/site/google/index.jsp?ndmViewId=news_view&amp;newsId=20050225005185&amp;newsLang=en" class="spip_out">annoncée</a> par un partenariat avec <a href="http://www.gasteroprod.com/http:/www.zend.com" class="spip_out">Zend</a>&nbsp;[<a href="http://www.gasteroprod.com/#nb3-1" name="nh3-1" id="nh3-1" class="spip_note" rel="footnote" title='[1] Zend est la soci&#233;t&#233; fond&#233;e par Zeev Zuraski et Andi Gutmans, qui avaient (...)' >1</a>].</p>

<p>La concrétisation de ce partenariat est le produit <a href="http://www-306.ibm.com/software/data/info/zendcore/" class="spip_out">Zend Core for IBM</a>, qui est présenté comme une version particulière de PHP s&#8217;intégrant facilement avec les bases de données DB2 et Cloudscape, offrant un support natif de XML et des Web Services, et favorisant l&#8217;adoption d&#8217;architectures orientées services (SOA)&nbsp;[<a href="http://www.gasteroprod.com/#nb3-2" name="nh3-2" id="nh3-2" class="spip_note" rel="footnote" title='[2] Zend Core for IBM is a seamless out-of-the-box, easy to install and (...)' >2</a>].</p>

<p><span class='spip_document_299 spip_documents spip_documents_right'  style='float:right; width:100px;'>
<img src='http://www.gasteroprod.com/IMG/png/logo_zend.png' width="100" height="46" alt="" /></span>
Au delà de l&#8217;effet d&#8217;annonce&nbsp;[<a href="http://www.gasteroprod.com/#nb3-3" name="nh3-3" id="nh3-3" class="spip_note" rel="footnote" title='[3] Attendons de voir si IBM va vraiment renforcer le support des Web (...)' >3</a>], et alors que Sun peine toujours à réduire le ticket d&#8217;entrée de Java, voilà une nouvelle preuve de l&#8217;intérêt croissant du monde professionnel pour la plateforme PHP, après notamment l&#8217;annonce de partenariat entre Sun et Zend l&#8217;an dernier pour faire de PHP l&#8217;implémentation de référence de la <a href="http://www.jcp.org/en/jsr/detail?id=223" class="spip_out">JSR 223</a>, dont le but est de permettre d&#8217;utiliser un autre langage de <i>scripting</i> que les JSP.</p></div>
        	
        	<div class="info" style="border: 1px solid #333;"><p>[<a href="http://www.gasteroprod.com/#nh3-1" name="nb3-1" class="spip_note" title="Notes 3-1" rev="footnote">1</a>] Zend est la société fondée par Zeev Zuraski et Andi Gutmans, qui avaient pris la succession de Rasmus Leerdorf pour le développement de PHP dès sa version 3</p>

<p>[<a href="http://www.gasteroprod.com/#nh3-2" name="nb3-2" class="spip_note" title="Notes 3-2" rev="footnote">2</a>] <i>Zend Core for IBM is a seamless out-of-the-box, easy to install and supported PHP development and production environment. The product includes tight integration with DB2, the IBM Cloudscape database server, and native support for XML and Web Services, while also supporting increased adoption of Service Oriented Architectures (SOA). [...]</i></p>

<p>[<a href="http://www.gasteroprod.com/#nh3-3" name="nb3-3" class="spip_note" title="Notes 3-3" rev="footnote">3</a>] Attendons de voir si IBM va vraiment renforcer le support des Web Services SOAP dans PHP5, sans parler du <i>buzz</i> SOA ...</p></div>
        </div>
        ]]></description>
			<pubDate>Fri, 25 Feb 2005 17:08:26 +0100</pubDate>
			
				<category>PHP</category>
			
				<category>Clever Age</category>
			
				<category>IBM</category>
			
			<guid isPermaLink="true">../../../blog/ibm-apporte-son-support-a-php.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/ibm-apporte-son-support-a-php.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/ibm-apporte-son-support-a-php-463.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>Chronique d'une licence non annonc&#233;e</title>
			<link>http://www.gasteroprod.com/../../../blog/chronique-d-une-licence-non-annoncee.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p>La <a href="http://www.php.net/license/3_0.txt" class="spip_out">version 3 de la licence de PHP</a> est sortie. Vous ne le saviez pas&nbsp;? Normal, elle est un peu passée en douceur, sans faire de bruit.</p></div>
        	<div><h3 class="spip">Petite chronologie</h3>
<p>Le <strong>12 juin 2002</strong>, Stig Bakken, leader du développement de PHP pour sa version 4.3, <a href="http://cvs.php.net/diff.php/php4/LICENSE?login=2&amp;r1=1.17&amp;r2=1.18&amp;ty=h" class="spip_out">met à jour</a> la licence pour cette version. Le paragraphe 6 qui indiquait que le Zend Engine est inclu dans PHP est supprimé, et est remplacé par une simple mention de ce Zend Engine en fin de texte. Le numéro de licence passe du même coup de 2.02 à 3.0a1.</p>

<p>Le <strong>21 juillet 2002</strong>, Stig Bakken, toujours lui, intervient plusieurs fois sur la licence, principalement pour scinder en deux le paragraphe  3 qui parle à la fois du nom <i>PHP</i> et de l&#8217;usage qu&#8217;il en est fait pour nommer les logiciels développés en PHP. La séparation en deux paragraphe simplifie la compréhension de la seconde partie, qui devient donc le paragraphe 4 suivant&nbsp;:</p>

<p><i>Products derived from this software may not be called "PHP", nor may "PHP" appear in their name, without prior written permission from group@php.net.  You may indicate that your software works in conjunction with PHP by saying "Foo for PHP" instead of calling it "PHP Foo" or "phpfoo"</i></p>

<p>Soit en français&nbsp;:</p>

<p><i>Les produits dérivés de ce logiciel ne devraient pas être appelés "PHP", et "PHP" ne devrait pas apparaître dans leur nom, sans autorisation écrite préalable de group@php.net. Vous pouvez indiquer que votre logiciel fonctionne avec PHP en disant "Foo pour PHP" plutôt qu&#8217;en l&#8217;appelant "PHP Foo" ou "phpfoo".</i></p>

<p>Dans la foulée, Derick Rethans <a href="http://marc.theaimsgroup.com/?l=php-cvs&amp;m=102727165608460&amp;w=2" class="spip_out">demande</a> dans la mailing-list <a href="http://marc.theaimsgroup.com/?l=php-cvs&amp;r=1&amp;w=2" class="spip_out">php-cvs</a> si <a href="http://www.phpmyadmin.net/" class="spip_out">phpMyAdmin</a> et <a href="http://phpopentracker.de/" class="spip_out">phpOpenTracker</a> sont considérés comme des logiciels <i>dérivés</i> de PHP, selon le nouveau sens proposé par la licence.</p>

<p>Le <strong>5 août 2002</strong>, Sebastian Bergmann, créateur de phpOpenTracker, <a href="http://marc.theaimsgroup.com/?l=php-dev&amp;m=102858914124505&amp;w=2" class="spip_out">répond</a> en passant dans la mailing-list plus appropriée <a href="http://marc.theaimsgroup.com/?l=php-dev&amp;r=1&amp;w=2" class="spip_out">php-dev</a> qu&#8217;il est naturellement lui aussi intéressé, puisque directement concerné.</p>

<p>C&#8217;est alors que Rasmus Lerdorf, créateur de PHP que l&#8217;on ne présente plus, <a href="http://marc.theaimsgroup.com/?l=php-dev&amp;m=102859018225314&amp;w=2" class="spip_out">intervient</a>  pour préciser ce qu&#8217;il en pense et en a déjà dit à plusieurs reprises auparavant. En synthèse, les projets développés en PHP n&#8217;ont aucune raison d&#8217;avoir des noms comportant <i>PHP</i>, alors que cela n&#8217;est pratiqué dans aucune autre technologie.</p>

<p>Le <strong>4 septembre 2002</strong>, sans doute pour l&#8217;exemple, Rasmus Lerdorf <a href="http://www.advogato.org/person/rasmus/diary.html?start=69" class="spip_out">interpèle</a>   <a href="http://www.advogato.org/person/mglazer/" class="spip_out">Michael Glazer</a>, créateur du projet <a href="http://freshmeat.net/projects/phportal/" class="spip_out">PHPortal</a>, pour lui demander pourquoi le nom de son projet contient &#8217;php&#8217;.</p>

<p>Le <strong>6 septembre 2002</strong>, Rasmus, toujours lui, <a href="http://marc.theaimsgroup.com/?l=pear-dev&amp;m=103134676127239&amp;w=2" class="spip_out">annonce</a> dans la mailing-list <a href="http://marc.theaimsgroup.com/?l=pear-dev&amp;r=1&amp;w=2" class="spip_out">pear-dev</a> que suite à une discussion avec Richard M.&nbsp;Stallman, la <a href="http://www.gnu.org/licenses/license-list.html#GPLIncompatibleLicenses" class="spip_out">liste des licences logiciel libre non compatibles avec la GNU/GPL</a> a été mise à jour pour prendre en compte la nouvelle version de la licence PHP et ôter les réserves importantes qui étaient faites sur la pertinence de la version précédente.</p>

<h3 class="spip">A bin oui, mais alors ...</h3>
<p>Cette habitude de mettre <i>PHP</i> dans le nom des logiciels, très particulière en effet, a sans doute trouvé sa source dans phpMyAdmin, assurément le plus fameux des projets PHP.</p>

<p>C&#8217;est d&#8217;ailleurs exactement ce qui a conduit aux noms de <a href="http://www.phpheaven.net/phpmychat:home" class="spip_out">phpMyChat</a>, qui était initialement basé uniquement sur PHP et MySQL, mais aussi de <a href="http://www.phpheaven.net/phplang:home" class="spip_out">phpLang</a>, phpApp, phpXMLP et phpSyndication.</p>

<p>Pour les autres projets, cela n&#8217;aurait sans doute que peu d&#8217;impact, mais un changement de nom de phpMyChat est-il envisageable alors qu&#8217;il est depuis déjà pas mal de temps connu de miliers d&#8217;utilisateurs&nbsp;?</p>

<h3 class="spip">Bonus</h3>
<p>Toutes ses discussions auront aussi permis de <a href="http://marc.theaimsgroup.com/?l=php-cvs&amp;m=102738953806371&amp;w=2" class="spip_out">découvrir</a> grâce à Yasuo Ohgaki que <i>PHP</i> est une marque déposée en 1947 au Japon par l&#8217;éditeur <i>PHP Sougou Kennkyusho</i>.</p></div>
        	
        	
        </div>
        ]]></description>
			<pubDate>Fri, 20 Dec 2002 19:52:00 +0100</pubDate>
			
				<category>d&#233;veloppement</category>
			
				<category>PHP</category>
			
				<category>phpHeaven</category>
			
				<category>licence</category>
			
				<category>logiciel libre</category>
			
			<guid isPermaLink="true">../../../blog/chronique-d-une-licence-non-annoncee.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/chronique-d-une-licence-non-annoncee.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/chronique-d-une-licence-non-annonca-c-e-531.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>Guide du d&#233;butant pour PEAR DB</title>
			<link>http://www.gasteroprod.com/../../../blog/guide-du-debutant-pour-pear-db.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p>Traduction du tutoriel de <a href="mailto:cox@idecnet.com" class="spip_mailto">Tomas V. V. Cox</a> publié en anglais à l&#8217;adresse suivante&nbsp;: <a href="http://vulcanonet.com/soft/?pack=pear_tut" class="spip_url spip_out">http://vulcanonet.com/soft/?pack=pe...</a></p></div>
        	<div><h3 class="spip">Introduction (à écrire !)</h3>
<p>Ceci est un tutoriel sur l&#8217;utilisation de l&#8217;extension PEAR DB.</p>

<p>PEAR DB est un ensemble de classe proposant&nbsp;:</p>

<ul class="spip"><li> abstraction de bases de données</li><li> gestion avancée des erreurs</li><li> etc </li></ul>
<h3 class="spip">Obtenir et installer Pear</h3>
<p>Pour le moment, le projet PEAR est encore fortement en développement, donc le meilleur moyen de l&#8217;obtenir est depuis le CVS (la distribution de PEAR DB livrée avec PHP est obsolète, même celle avec PHP 4.0.6 !). Ensuite, la seule chose que vous avez à faire est d&#8217;ajouter le répertoire racine de PEAR au paramètre <i>include_path</i> de votre fichier <i>php.ini</i>. Vous pouvez aussi procéder comme ceci&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>ini_set('include_path', '/pear_base_dir');</code></div>
<p>Voici un exemple pas à pas&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>Placez-vous là où vous voulez que soient les sources de PEAR<br />
# cd /usr/local/lib<br />
Connectez-vous au CVS (utilisez &quot;phpfi&quot; comme mot de passe)<br />
# cvs -d :pserver:cvsread@cvs.php.net:/repository login<br />
Lancez la commande suivante pour récupérer tous les fichiers<br />
de PEAR. Vous pouvez également l'utiliser pour mettre à jour<br />
des fichiers déjà récupérés. D'autres options possibles sont<br />
&quot;today&quot;, &quot;last month&quot;, ...<br />
# cvs -d :pserver:cvsread@cvs.php.net:/repository export -D &quot;last week&quot; php4/pear<br />
Editez votre php.ini et ajoutez le répertoire /usr/local/lib/php4/pear<br />
à votre paramètre include_path. Si vous n'avez pas accès au<br />
fichier php.ini, vous pouvez utiliser<br />
ini_set('include_path', 'path_to_pear'); dans votre code.</code></div>
<p>La documentation complète du CVS PHP peut être trouvée <a href="http://cvs.php.net/" class="spip_out">ici</a>.</p>

<p>Notez que PEAR DB nécessite PHP > 4.0.4, mais d&#8217;autres packages  de PEAR comme le parser XML Parser ou le script <i>pear installer</i> nécessitent PHP >= 4.0.5.</p>

<p>Pour l&#8217;instant, ce guide couvre la dernière version CVS de PEAR DB, mais il peut être valide pour toute version récente.</p>

<h3 class="spip">Utilisation de PEAR DB</h3>
<p><strong>Se connecter et se déconnecter d&#8217;une base de données</strong></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// The pear base directory must be in your include_path<br />
require_once 'DB.php';<br />
$user = 'foo';<br />
$pass = 'bar';<br />
$host = 'localhost';<br />
$db_name = 'clients_db';<br />
// Data Source Name: This is the universal connection string<br />
$dsn = &quot;mysql://$user:$pass@$host/$db_name&quot;;<br />
// DB::connect will return a Pear DB object on success<br />
// or a Pear DB Error object on error<br />
// You can also set to TRUE the second param<br />
// if you want a persistent connection:<br />
// $db = DB::connect($dsn, true);<br />
$db = DB::connect($dsn);<br />
// With DB::isError you can diferentiate between an error or<br />
// a valid conection.<br />
if (DB::isError($db)) {<br />
 &nbsp;die ($db-&gt;getMessage());<br />
}<br />
....<br />
// You can disconnect from the database with:<br />
$db-&gt;disconnect();<br />
?&gt;</code></div>
<p>La chaine de connexion Data Source Name (paramètre <i>$dsn</i> dans l&#8217;exemple ci-dessus) peut avoir les formats autorisés suivants (copie directe de la méthode parseDSN de pear/DB.php)&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>* &nbsp;phptype: Database backend used in PHP (mysql, odbc etc.)<br />
* &nbsp;dbsyntax: Database used with regards to SQL syntax etc.<br />
* &nbsp;protocol: Communication protocol to use (tcp, unix etc.)<br />
* &nbsp;hostspec: Host specification (hostname[:port])<br />
* &nbsp;database: Database to use on the DBMS server<br />
* &nbsp;username: User name for login<br />
* &nbsp;password: Password for login<br />
*<br />
* The format of the supplied DSN is in its fullest form:<br />
*<br />
* &nbsp;phptype(dbsyntax)://username:password@protocol+hostspec/database<br />
*<br />
* Most variations are allowed:<br />
*<br />
* &nbsp;phptype://username:password@protocol+hostspec:110//usr/db_file.db<br />
* &nbsp;phptype://username:password@hostspec/database_name<br />
* &nbsp;phptype://username:password@hostspec<br />
* &nbsp;phptype://username@hostspec<br />
* &nbsp;phptype://hostspec/database<br />
* &nbsp;phptype://hostspec<br />
* &nbsp;phptype(dbsyntax)<br />
* &nbsp;phptype</code></div>
<p>Les bases de données actuellement supportées (partie <i>phptype</i> du DSN) sont&nbsp;:</p>

<table class="spip">
<tbody>
<tr class="row_even">
<td>mysql</td>
<td>MySQL</td></tr>
<tr class="row_odd">
<td>pgsql</td>
<td>PostgreSQL</td></tr>
<tr class="row_even">
<td>ibase</td>
<td>InterBase</td></tr>
<tr class="row_odd">
<td>msql</td>
<td>Mini SQL</td></tr>
<tr class="row_even">
<td>mssql</td>
<td>Microsoft SQL Server</td></tr>
<tr class="row_odd">
<td>oci8</td>
<td>Oracle 7/8/8i</td></tr>
<tr class="row_even">
<td>odbc</td>
<td>ODBC (Open Database Connectivity)</td></tr>
<tr class="row_odd">
<td>sybase</td>
<td>SyBase</td></tr>
<tr class="row_even">
<td>ifx</td>
<td>Informix</td></tr>
<tr class="row_odd">
<td>fbsql</td>
<td>FrontBase</td></tr>
</tbody>
</table>
<p>Notez que certaines fonctionnalités peuvent ne pas être supportées par tous les gestionnaires de bases de données. Référez-vous au document donnant le status des extensions PEAR DB situé dans <i>&lt;pear base dir>/DB/STATUS</i> pour avoir la liste détaillée.</p>

<p><strong>Effectuer une requête dans la base de données</strong></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// Once you have a valid DB object<br />
...<br />
$sql = &quot;select * from clients&quot;;<br />
// If the query is a &quot;SELECT&quot;, $db-&gt;query will return<br />
// a DB Result object on success.<br />
// Else it simply will return a DB_OK<br />
// On failure it will return a DB Error object.<br />
$result = $db-&gt;query($sql);<br />
// Always check that $result is not an error<br />
if (DB::isError($result)) {<br />
 &nbsp;die ($result-&gt;getMessage());<br />
}<br />
...<br />
?&gt;</code></div>
<p><strong>Récupérer les enregistrements résultant de la requête</strong></p>

<p><i> <strong>Fonctions fetch</strong> </i></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// Once you have a valid DB Result object<br />
...<br />
// Get each row of data on each iteration until<br />
// there is no more rows<br />
while ($row = $result-&gt;fetchRow()) {<br />
 &nbsp;$id = $row[0];<br />
}<br />
?&gt;</code></div>
<p>Plutôt que <i>fetchRow()</i> vous pouvez utiliser <i> <strong>fetchInto()</strong> </i> qui renseigne directement la valeur <i>$row</i>&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
while ($result-&gt;fetchInto($row)) {<br />
 &nbsp;$id = $row[0];<br />
}<br />
?&gt;</code></div>
<p><i> <strong>Sélectionner le format de l&#8217;enregistrement récupéré</strong> </i></p>

<p>Les modes de <i>fetch</i> supportés sont <i>DB_FETCHMODE_ORDERED</i> (par défaut), <i>DB_FETCHMODE_ASSOC</i> et <i>DB_FETCHMODE_OBJECT</i>.</p>

<p>Exemples de structures de données retournées par les méthodes <i>fetch</i>&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
$res = $db-&gt;query('select id, name, email from users');<br />
$row = $res-&gt;fetchRow($mode);<br />
//With $mode = DB_FETCHMODE_ORDERED<br />
//The default behavior is to return an ordered array.<br />
$row = array (<br />
 &nbsp;0 =&gt; &lt;column &quot;id&quot; data&gt;,<br />
 &nbsp;1 =&gt; &lt;column &quot;name&quot; data&gt;,<br />
 &nbsp;2 =&gt; &lt;column &quot;email&quot; data&gt;<br />
);<br />
$id = $row[0];<br />
//With $mode = DB_FETCHMODE_ASSOC<br />
//Returns an associative array with column names as array keys:<br />
$row = array (<br />
 &nbsp;'id' &nbsp; &nbsp;=&gt; &lt;column &quot;id&quot; data&gt;,<br />
 &nbsp;'name' &nbsp;=&gt; &lt;column &quot;name&quot; data&gt;,<br />
 &nbsp;'email' =&gt; &lt;column &quot;email&quot; data&gt;<br />
);<br />
$id = $row['id'];<br />
//With $mode = DB_FETCHMODE_OBJECT<br />
//Returns a DB_row object with column names as properties:<br />
$row = db_row Object<br />
(<br />
 &nbsp;[id] &nbsp; &nbsp;=&gt; &lt;column &quot;id&quot; data&gt;,<br />
 &nbsp;[name] &nbsp;=&gt; &lt;column &quot;name&quot; data&gt;,<br />
 &nbsp;[email] =&gt; &lt;column &quot;email&quot; data&gt;<br />
)<br />
$id = $row-&gt;id;<br />
?&gt;</code></div>
<p><i> <strong>Configurer le format des enregistrements retournés</strong> </i></p>

<p>Vous pouvez indiquer quel mode de retour utiliser aux méthodes <i>fetchRow()</i> et <i>fetchInto()</i> ou définir un mode par défaut pour l&#8217;instance de DB.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
// 1) Set the mode per call:<br />
while ($row = $result-&gt;fetchRow(DB_FETCHMODE_ASSOC)) {<br />
 &nbsp;[..]<br />
}<br />
while ($result-&gt;fetchInto($row, DB_FETCHMODE_ASSOC)) {<br />
 &nbsp;[..]<br />
}<br />
// 2) Set the mode for all calls:<br />
$db = DB::connect($dsn);<br />
// this will set a default fetchmode for this Pear DB instance<br />
// (for all queries)<br />
$db-&gt;setFetchMode(DB_FETCHMODE_ASSOC);<br />
$result = $db-&gt;query(...);<br />
while ($row = $result-&gt;fetchRow()) {<br />
 &nbsp;$id = $row['id'];<br />
}<br />
?&gt;</code></div>
<p><i> <strong>Récupérer les enregistrements par indice</strong> </i></p>

<p>Le système de <i>fetch</i> de PEAR DB supporte aussi un autre paramètre pour permettre de récupérer les enregistrement par leur indice numérique. Cela est particulièrement intéressant si vous souhaitez exploiter seulement une partie d&#8217;un ensemble de résultats (par exemple pour contruire des <a href="http://vulcanonet.com/soft/index.php?pack=pager" class="spip_out">listes paginées</a>), récupérer les enregistrements dans un ordre particulier, etc.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
// the row to start fetching<br />
$from = 50;<br />
// how many results per page<br />
$res_per_page = 10;<br />
// the last row to fetch for this page<br />
$to = $from + $res_per_page;<br />
foreach (range($from, $to) as $rownum) {<br />
 &nbsp;if (!$row = $res-&gt;fetchrow($fetchmode, $rownum)) {<br />
 &nbsp; &nbsp;break;<br />
 &nbsp;}<br />
 &nbsp;$id = $row[0];<br />
 &nbsp;....<br />
}<br />
?&gt;</code></div>
<p><i> <strong>Vider le résultat</strong> </i></p>

<p>Une fois que vous avez terminé d&#8217;utiliser le résultat, vous pouvez le vider avec la méthode <strong>free()</strong>&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
$result = $db-&gt;query('SELECT * FROM clients');<br />
while ($row = $result-&gt;fetchRow()) {<br />
 &nbsp;...<br />
}<br />
$result-&gt;free();<br />
?&gt;</code></div>
<p><strong>Récupération rapide de données</strong></p>

<p>PEAR DB fourni quelques méthodes particulières pour récupérer le résultat d&#8217;une requête sans avoir besoin d&#8217;utiliser <i>fetchRow()</i> pour le parcourir. Ce sont les méthodes <i>getOne</i>, <i>getRow</i>, <i>getCol</i>, <i>getAssoc</i> et <i>getAll</i>. Voici quelques exemples d&#8217;utilisation&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
require_once 'DB.php';<br />
$db = DB::connect('pgsql://postgres@unix+localhost/clients_db');<br />
// -----------------------------------------------------------<br />
// getOne retrieves the first result of the first column<br />
// from a query<br />
$numrows = $db-&gt;getOne('select count(id) from clients');<br />
// -----------------------------------------------------------<br />
// getRow will fetch the first row and return it as an array<br />
$sql = 'select name, address, phone from clients where id=1';<br />
if (is_array($row = $db-&gt;getRow($sql))) {<br />
 &nbsp;list($name, $address, $phone) = $row;<br />
}<br />
// -----------------------------------------------------------<br />
// getCol will return an array with the data of the<br />
// selected column. It accepts the column number to retrieve<br />
// as the second param.<br />
// The next sentence could return for example:<br />
// $all_client_names = array('Stig', 'Jon', 'Colin');<br />
$all_client_names = $db-&gt;getCol('select name from clients');<br />
// -----------------------------------------------------------<br />
// Other functions are: getAssoc() and getAll().<br />
// For the moment refer to their in-line documentation<br />
// at pear/DB/common.php<br />
// -----------------------------------------------------------<br />
?&gt;</code></div>
<p>La famille des méthodes <i>get*()</i> fait tout le "sale boulot" pour vous, c&#8217;est à dire&nbsp;: exécuter la requête, récupérer les données et vider le résultat. Notez que comme toutes les fonctions de PEAR DB, elles retourneront un object PEAR DB_error en cas d&#8217;erreur.</p>

<p><strong>Obtenir plus d&#8217;informations sur le résultat des requêtes (numRows, numCols, affectedRows, tableInfo)</strong></p>

<p>Avec PEAR DB vous avez plusieurs façons d&#8217;obtenir des informations intéressantes sur les résultats de requêtes. Ce sont&nbsp;:</p>

<ul class="spip"><li> <strong>numRows()</strong>&nbsp;: Donne le nombre total d&#8217;enregistrements retournés par une requête de type "SELECT".</li><li> <strong>numCols()</strong>&nbsp;: Donne le nombre total de colonnes retournées par une requête de type "SELECT".</li><li> <strong>affectedRows()</strong>&nbsp;: Donne le nombre d&#8217;enregistrements affectés par une requête de manipulation de données ("INSERT", "UPDATE" or "DELETE").</li><li> <strong>tableInfo()</strong>&nbsp;: Donne un tableau associatif contenant des informations sur les champs retournés par une requête de type "SELECT". </li></ul>
<p>Exemples d&#8217;utilisation&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
$db = DB::connect($dsn);<br />
$sql = 'select * from clients';<br />
$res = $db-&gt;query($sql);<br />
// Don't forget to check if the returned result from your<br />
// action is a Pear Error object. If you get a error message<br />
// like 'DB_error: database not capable', means that<br />
// your database backend doesn't support this action.<br />
//<br />
// Number of rows<br />
echo $res-&gt;numRows();<br />
// Number of cols<br />
echo $res-&gt;numCols();<br />
// Table Info<br />
print_r ($res-&gt;tableInfo());<br />
// Affected rows<br />
$sql = &quot;delete from clients&quot;;<br />
// remember that this statement won't return a result object<br />
$db-&gt;query($sql);<br />
echo 'I have deleted ' . $db-&gt;affectedRows() . 'clients';<br />
?&gt;</code></div>
<p><strong>Séquences</strong></p>

<p>Les séquences sont un moyen d&#8217;obtenir des IDs uniques pour les enregistrements. Si vous faites la majeure partie de votre travail avec par exemple MySQL, pensez aux séquences comme un autre moyen de gérer AUTO_INCREMENT. Cela est relativement simple, tout d&#8217;abord vous demandez un ID, puis vous insérez cette valeur dans le champ correspondant du nouvel enregistrement que vous êtes en train de créer. Vous pouvez avoir plus d&#8217;une séquence pour toutes vos tables, mais assurez-vous que vous utilisez toujours la même séquence pour une table particulière.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
// Get an ID (if the sequence doesn't exist, it will be created)<br />
$id = $db-&gt;nextID('mySequence');<br />
// Use the ID in your INSERT query<br />
$res = $db-&gt;query(&quot;INSERT INTO myTable (id,text) VALUES ($id,'foo')&quot;);<br />
...<br />
?&gt;</code></div>
<p><strong>Prepare &amp; Execute/ExcuteMultiple (pas encore écrit)</strong></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// UNTESTED CODE !!!<br />
//<br />
// Example inserting data<br />
$alldata = array(<br />
 &nbsp;array(1, 'one', 'en'),<br />
 &nbsp;array(2, 'two', 'to'),<br />
 &nbsp;array(3, 'three', 'tre'),<br />
 &nbsp;array(4, 'four', 'fire')<br />
);<br />
$sth = $dbh-&gt;prepare(&quot;INSERT INTO numbers VALUES(?,?,?)&quot;);<br />
foreach ($alldata as $row) {<br />
 &nbsp;$dbh-&gt;execute($sth, $row);<br />
}<br />
//Here's an example of a file placeholder:<br />
$myfile = &quot;/tmp/image.jpg&quot;;<br />
$sth = $dbh-&gt;prepare('INSERT INTO images (?, &amp;)');<br />
$dbh-&gt;execute($sth, array(&quot;this is me&quot;, $myfile));<br />
//After I commit a bugfix that I have on my laptop, you can use<br />
//parameter arrays in the getXxx methods too:<br />
$ver = $dbh-&gt;getOne(&quot;SELECT stableversion FROM packages WHERE name = ?&quot;,<br />
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;array($package));<br />
?&gt;</code></div>
<p><strong>autoCommit, commit and rollback (pas encore écrit)</strong></p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
//examples here<br />
?&gt;</code></div>
<h3 class="spip">Liste des méthodes disponibles</h3>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
/*<br />
* From the DB_(driver) objects<br />
*/<br />
// get the object with, ie:<br />
$db = DB::connect('mysql://user:pass@localhost/my_db');<br />
<br />
// Set options<br />
$db-&gt;setErrorHandling();<br />
$db-&gt;setFetchmode();<br />
// Information<br />
$db-&gt;affectedRows();<br />
$db-&gt;tableInfo();<br />
// Database manipulation<br />
$db-&gt;query();<br />
// Data fetch<br />
$db-&gt;nextId();<br />
$db-&gt;getOne();<br />
$db-&gt;getRow();<br />
$db-&gt;getCol();<br />
$db-&gt;getAssoc();<br />
$db-&gt;getAll();<br />
// Place holders and execute related<br />
$db-&gt;quote();<br />
$db-&gt;prepare();<br />
$db-&gt;execute();<br />
$db-&gt;executeMultiple();<br />
// Transactions<br />
$db-&gt;autoCommit();<br />
$db-&gt;commit();<br />
$db-&gt;rollback();<br />
// Disconnection<br />
$db-&gt;disconnect();<br />
<br />
/*<br />
* From DB_result objects<br />
*/<br />
// get the object with, ie:<br />
$res = $db-&gt;query('select * from foo');<br />
<br />
// Data fetch<br />
$res-&gt;fetchRow();<br />
$res-&gt;fetchInto();<br />
// Result Info<br />
$res-&gt;numCols();<br />
$res-&gt;numRows();<br />
$res-&gt;tableInfo();<br />
// Free<br />
$res-&gt;free();<br />
<br />
/*<br />
* From DB_error objects<br />
*/<br />
// get the object with, ie:<br />
$error = $db-&gt;query('select * from no_table');<br />
<br />
$error-&gt;getMessage();<br />
$error-&gt;getDebugInfo();<br />
$error-&gt;toString();<br />
?&gt;</code></div>
<h3 class="spip">Gestion des erreurs</h3>
<p><strong>Récupérer le message d&#8217;erreur d&#8217;une erreur PEAR DB</strong></p>

<p>Toutes les erreurs retournées par PEAR DB sont des objets PEAR Error. Voici un moyen de récupérer leurs informations&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
...<br />
$res = $db-&gt;query('select * from no_table');<br />
if (DB::isError($res)) {<br />
 &nbsp;// get the portable error string<br />
 &nbsp;echo $res-&gt;getMessage();<br />
}<br />
?&gt;</code></div>
<p><strong>Débuguer les erreurs PEAR DB</strong></p>

<p>PEAR DB utilise un système de messages d&#8217;erreur portable pour signaler les erreurs à l&#8217;utilisateur. Cela a beaucoup d&#8217;avantages comme proposer un moyen simple de les transposer en autres langages ou réaliser une action spécifique en cas d&#8217;erreur spécifique. Mais cela ne donne pas beaucoup d&#8217;informations au développeur sur ce qui est arrivé. Pour récupérer l&#8217;erreur réelle donnée par le gestionnaire de bases de données ainsi que la dernière requête effectuée, vous pouvez utiliser la méthode <i>getDebugInfo()</i>&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
$sql = 'select * from no_table';<br />
if (DB::isError($res = $db-&gt;query($sql))) {<br />
 &nbsp;// get the native backend error<br />
 &nbsp;// and the last query<br />
 &nbsp;echo $res-&gt;getDebugInfo();<br />
}<br />
?&gt;</code></div>
<p>Normalement quand une fonction PHP échoue, un message d&#8217;erreur est affiché. Dans PEAR ce fonctionnement a été désactivé. Mais peut-être aurez-vous parfois besoin de visualiser ces messages pour ôter des erreurs obscures de votre code. Cela peut être fait avec la fonction PHP set_error_handler qui est documentée dans le manuel PHP. Voici un exemple simple&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// what messages to report<br />
error_reporting (E_ALL ^ E_NOTICE);<br />
// this function will handle all reported errors<br />
function my_error_handler ($errno, $errstr, $errfile, $errline) {<br />
 &nbsp;echo &quot;In $errfile, line: $errlinen&lt;br&gt;$errstr&quot;;<br />
}<br />
set_error_handler ('my_error_handler');<br />
$db = DB::connect('pgsql://postgres@localhost/no_db');<br />
...<br />
?&gt;</code></div>
<p><strong>Exécuter autmatiquement des actions en cas d&#8217;erreur</strong></p>

<p>Comme vous pouvez le voir, PEAR DB fait d&#8217;intenses vérifications et rapports d&#8217;erreurs, fonctionnalité qui oblige le développeur à toujours vérifier si le résultat de son action est ou non une erreur. PEAR DB prend aussi en charge cette tâche pénible, et propose un système très flexible pour automatiquement exécuter des actions en czas d&#8217;erreurs.</p>

<p>Les actions possibles sont&nbsp;:</p>

<ul class="spip"><li> Retourne l&#8217;objet erreur (PEAR_ERROR_RETURN). C&#8217;est l&#8217;action par défaut. </li><li> Imprime le message d&#8217;erreur (PEAR_ERROR_PRINT) </li><li> Imprime le message d&#8217;erreur et arrête l&#8217;exécution (PEAR_ERROR_DIE) </li><li> Utilise la fonction PHP <i>trigger_error()</i> pour lever une erreur PHP (PEAR_ERROR_TRIGGER) </li><li> Passe l&#8217;objet erreur à une fonction ou à une méthode d&#8217;objet (PEAR_ERROR_CALLBACK) </li></ul>
<p>Un exemple simple&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
require_once 'DB.php';<br />
// Set the default action to take on error<br />
PEAR::setErrorHandling(PEAR_ERROR_DIE);<br />
// From here you don't need to check errors any more<br />
$db = DB::connect('pgsql://postgres@localhost/my_database');<br />
$res = $db-&gt;query('select id from no_table');<br />
// at this point the execution is aborted and the error message is raisen<br />
...<br />
?&gt;</code></div>
<p>Un exemple plus complet&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// Define the app evironment (this is: what errors you want to output)<br />
define ('DEBUG_ENV', true);<br />
// This function will handle all errors<br />
function handle_pear_error ($error_obj) {<br />
 &nbsp;// Be verbose while developing the application<br />
 &nbsp;if (DEBUG_ENV) {<br />
 &nbsp; &nbsp;die ($error_obj-&gt;getMessage().&quot;n&quot;.$error_obj-&gt;getDebugInfo());<br />
&nbsp; &nbsp; &nbsp; &nbsp; // Dump a silly message if the site is in production<br />
 &nbsp;} else {<br />
 &nbsp; &nbsp;die ('Sorry you request can not be processed now. Try again later');<br />
 &nbsp;}<br />
}<br />
require_once 'DB.php';<br />
// On error, call the &quot;handle_pear_error&quot; function back<br />
// You can also use an object as pear error handler so:<br />
// setErrorHandling(PEAR_ERROR_CALLBACK, array($object,'method_name');<br />
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handle_pear_error');<br />
$db = DB::connect('pgsql://postgres@localhost/site_db');<br />
$res = $db-&gt;query('select id from no_table');<br />
// at this point the execution is aborted and the &quot;handle_pear_error&quot;<br />
// function is called with the error object as its first argument<br />
while ($row = $res-&gt;fetchRow()) {<br />
 &nbsp;...<br />
}<br />
...<br />
?&gt;</code></div>
<p>Référez-vous au <a href="http://www.php.net/manual/en/pear.reference.php" class="spip_out">manuel de référence de PEAR</a> pour obtenir la description détaillée des différentes actions possibles.</p>

<p>Voici une idée pour créer un système étendu de gestion d&#8217;erreurs&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
error_reporting (E_ALL ^ E_NOTICE);<br />
// this function will handle all errors reported by PHP<br />
function php_error_handler ($errno, $errstr, $errfile, $errline) {<br />
 &nbsp;die (&quot;In $errfile, line: $errlinen&lt;br&gt;$errstr&quot;);<br />
}<br />
set_error_handler ('php_error_handler');<br />
// this function will catch errors generated by Pear,<br />
// transform it to PHP errors and trigger them to the php_error_handler<br />
function pear_error_handler ($err_obj) {<br />
 &nbsp;$error_string = $err_obj-&gt;getMessage() . '&lt;br&gt;' . $error_obj-&gt;getDebugInfo();<br />
 &nbsp;trigger_error ($error_string, E_USER_ERROR);<br />
}<br />
require 'DB.php';<br />
PEAR::setErrorHandling (PEAR_ERROR_CALLBACK, 'pear_error_handler');<br />
// force an error<br />
$db = DB::connect('pgsql://postgres@localhost/no_db');<br />
...<br />
?&gt;</code></div>
<h3 class="spip">Remerciements</h3>
<p>Remerciements particuliers à Stig pour avoir créé le merveilleux monde de PEAR, aux personnes qui m&#8217;aident à maintenir ce document et bien sûr aussi à l&#8217;ensemble de l&#8217;équipe PEAR pour son travail permanent dessus.</p></div>
        	
        	
        </div>
        ]]></description>
			<pubDate>Fri, 12 Oct 2001 18:58:00 +0100</pubDate>
			
				<category>d&#233;veloppement</category>
			
				<category>PHP</category>
			
				<category>PEAR</category>
			
			<guid isPermaLink="true">../../../blog/guide-du-debutant-pour-pear-db.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/guide-du-debutant-pour-pear-db.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/guide-du-da-c-butant-pour-pear-db-533.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>Une introduction &#224; PEAR</title>
			<link>http://www.gasteroprod.com/../../../blog/une-introduction-a-pear.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p>Traduction de l&#8217;article de <a href="http://www.onlamp.com/pub/au/98" class="spip_out">Joao Prado Maia</a> publié initialement le 24 mai 2001 sur <a href="http://www.onlamp.com/pub/a/php/2001/05/24/pear.html" class="spip_out">ONLamp.com</a>, de O&#8217;Reilly.</p></div>
        	<div><h3 class="spip">Qu&#8217;est-ce que PEAR&nbsp;? Et pourquoi devrais-je m&#8217;en préoccuper ?</h3>
<p>Le projet PEAR (NDT&nbsp;: PHP Extension and Application Repository) a été lancé par Stig S. Bakken pour créer un outil similaire au CPAN de Perl. Son but principal est de devenir un entrepôt pour des extensions et scripts PHP. Le but le plus ambitieux du projet est de tenter de définir des standards qui puisse aider les développeurs à écrire du code portable et réutilisable.</p>

<p>De la documentation sur le projet commence à apparaître sur Internet, en concéquence certainement de sa popularité grandissante. Une documentation de départ peut déjà être trouvée dans le <a href="http://www.php.net/manual/fr/pear.php" class="spip_out">manuel officiel de PHP</a> et sera augmentée.</p>

<p>PEAR est encore particulièrement en travaux, notamment le "PEAR installer" et le <a href="http://pear.php.net/" class="spip_out">site dédié</a>, et il devrait beaucoup croître dans les mois à venir. Il y a de nombreuses discussions sur la mailing-list des développeurs de PHP à propos de l&#8217;usage de PEAR dans les versions futures pour gérer le nombre croissant d&#8217;extensions C et aussi de l&#8217;usage du "PEAR installer" comme interface pour que les utilisateurs téléchargent et installent des extensions PHP.</p>

<p>Tout cela sans mentionner la librairie de scripts PHP de PEAR, qui est souvent considéré comme une des plus propre et bien conçues disponible actuellement pour PHP. L&#8217;un de ses composants les plus populaires est PEAR&nbsp;::DB, la librairie d&#8217;abstraction de base de données créée pour ce projet. Bakken travaille même au portage des classes et fonctions principales en une extension C pour rendre le composant aussi rapide que possible.</p>

<p>Ce nouveau projet deviendra sûrement l&#8217;un des aspects les plus importants de PHP dans le futur, autorisant les développeurs à partager du code en utilisant le site de PEAR et en donnant aux utilisateurs l&#8217;opportunité de télécharger et installer des extensions et scripts PHP.</p>

<h3 class="spip">Comment puis-je débuter avec PEAR ?</h3>
<p>Comme mentionner précédemment, PEAR continue à évoluer et à s&#8217;améliorer. Cependant, un certain nombre de composants sont maintenant utilisables. Le plus populaire est PEAR&nbsp;::DB, qui permet au développeur d&#8217;écrire du code qui puisse être utilisé avec différents gestionnaires de bases de données. Par exemple, un développeur pourrait écrire un script qui insèrerait un enregistrement dans une table, et il fonctionnerait avec MySQL, PostgreSQL et Oracle.</p>

<p>Ainsi, l&#8217;exemple ci-dessous pourrait être utiliser avec tous les types de gestionnaires de bases de données (NDT&nbsp;: voir l&#8217;erratum en fin de page)&nbsp;:</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>&lt;?php<br />
// Include the appropriate PEAR classes<br />
require_once(&quot;DB.php&quot;);<br />
<br />
$dsn = array(<br />
 'phptype' &nbsp;=&gt; 'mysql',<br />
 'hostspec' =&gt; 'localhost',<br />
 'database' =&gt; 'test_db',<br />
 'username' =&gt; 'test_user',<br />
 'password' =&gt; 'test_password'<br />
);<br />
$dbh = DB::connect($dsn);<br />
<br />
$stmt = &quot;SELECT id, name FROM examples ORDER BY id&quot;;<br />
$result = $dbh-&gt;simpleQuery($stmt, DB_FETCHMODE_ASSOC);<br />
if ($dbh-&gt;numRows($result) &gt; 0) {<br />
 $data = (object) $dbh-&gt;fetchRow($result, DB_FETCHMODE_ASSOC);<br />
 echo &quot;id &nbsp; =&gt; $data-&gt;id&lt;br&gt;n&quot;;<br />
 echo &quot;name =&gt; $data-&gt;name&lt;br&gt;n&quot;;<br />
}<br />
?&gt;</code></div>
<p>C&#8217;était juste un très simple exemple pour montrer à quoi ressemblerait le code avec une librairie d&#8217;abstraction comme PEAR&nbsp;::DB.</p>

<p>Un nouveau chapitre a été récemment ajouté au manuel de PHP, mais il est encore incertain si ce manuel contiendra la documentation complète de tous les composants de PEAR, ou si un nouveau manuel sera créé uniquement pour les composants de PEAR.</p>

<h3 class="spip">Procédures d&#8217;installation</h3>
<p>Installer PEAR est en fait très simple, et je vais expliquer comment installer la dernière version du CVS de PEAR, qui change si rapidement.</p>

<p>Note&nbsp;: Le mécanisme interne de gestion de l&#8217;entrepôt changera probablement dans le futur. Pour l&#8217;instant, les composants et librairies sont stockés dans le même arbre CVS que PHP, ce qui pose des problèmes pour gérer à la fois les entrepôts et développeurs de PHP et de PEAR. Dans un futur proche, il est prévisible que PEAR sera détaché dans son propre module. Ce module existe, mais la plupart des composants sont encore dans l&#8217;ancien.</p>

<h3 class="spip">Installer PEAR à partir du CVS</h3>
<p>Si vous n&#8217;avez jamais entendu parler de CVS, jetez un oeil à sa <a href="http://www.cvshome.org/" class="spip_out">documentation</a>. Ce n&#8217;est pas une technologie difficile d&#8217;usage, mais s&#8217;y accoutumer prend du temps.</p>

<p>En supposant que vous avez le client CVS standard installé sur votre machine, vous devrez suivre ces étapes&nbsp;:</p>

<p>1. Ouvrez une fenêtre de terminal (rxvt, xterm, ou autre)</p>

<p>2. Tapez les commandes suivantes&nbsp;:</p>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>cvs -z3 -d :pserver:cvsread@cvs.php.net:/repository login<br />
Password: [Entrez 'phpfi' comme mot de passe ici]<br />
cvs -z3 -d :pserver:cvsread@cvs.php.net:/repository co php4<br />
[Cela va créer un nouveau répertoire 'php4']<br />
cd php4<br />
cvs -z3 -d :pserver:cvsread@cvs.zend.com:/repository login<br />
Password: [Entrez 'zend' comme mot de passe ici]<br />
cvs -z3 -d :pserver:cvsread@cvs.zend.com:/repository co Zend TSRM<br />
[Cela va créer deux nouveaux répertoire dans 'php4', 'Zend' et 'TSRM']<br />
./buildconf</code></div>
<p>Voilà. Lancer buildconf devrait créer le script configure standard qui peut être utilisé pour définir vos paramètres pour PHP. Pour une installation normale, PEAR devrait être automatiquement installé dans /usr/local/lib/php, mais vous pouvez installer les fichiers manuellement en allant dans &#8217;php4/pear&#8217; et en lançant make install-su en tant que superuser.</p>

<p>Ensuite, vous devriez ajouter le répertoire racine de PEAR à l&#8217;include_path de votre fichier php.ini. Le chemin par défaut devrait être /usr/local/lib/php, mais cela peut être ailleurs si vous avez effectué des modification manuelles de vos paramètres de configuration.</p>

<h3 class="spip">Débuter avec PEAR</h3>
<p>Les composants de PEAR vont de l&#8217;abstraction de base de données à la gestion de cache, ce qui fait de PEAR plus qu&#8217;une simple librairie, c&#8217;est un nouveau standard pour écrire du code PHP portable et propre. L&#8217;une des plus importantes choses à faire pour un débutant avec PEAR est de lire les <a href="http://www.php.net/manual/fr/pear.standards.php" class="spip_out">styles de codage PEAR</a> qui sont publiés dans le manuel de PHP.</p>

<p>Je donnerais quelques conseil pour commencer à travailler avec PEAR&nbsp;::DB, car c&#8217;est un des composant de PEAR les plus populaires. Vous pouvez trouver des exemples et de l&#8217;aide pour utiliser PEAR&nbsp;::DB en suivant ces étapes&nbsp;:</p>

<ul class="spip"><li> Cherchez des réponses à vos question sur <a href="http://marc.theaimsgroup.com/" class="spip_out">MARC</a>, dans <a href="http://marc.theaimsgroup.com/?l=pear-dev" class="spip_out">pear-dev</a> ou <a href="http://marc.theaimsgroup.com/?l=pear-general" class="spip_out">pear-general</a>. </li><li> Lisez les scripts de tests unitaires fournis avec le code source de PEAR. L&#8217;emplacement de ces scripts peut être trouvé dans le répertoire où se trouve votre image CVS de PHP. Dans mon cas, c&#8217;est /home/jpm/php4/pear/DB/tests/. </li><li> Parcourez l&#8217;excellent <a href="http://vulcanonet.com/soft/?pack=pear_tut" class="spip_out">tutoriel PEAR&nbsp;::DB</a> de Tomas V. V. Cox. 
J&#8217;espère que cet article a jeté un peu de lumière sur le mystérieux PEAR, et qu&#8217;il vous a fourni des informations utiles sur l&#8217;un des développements les plus prometteurs de la communauté PHP. </li></ul>
<p>Amusez-vous&nbsp;!</p>

<p><i><a href="http://www.onlamp.com/pub/au/98" class="spip_out">Joao Prado Maia</a> est développeur Web à San Francisco. Il a plus de quatre ans d&#8217;expérience en développement d&#8217;applications web et aime apprendre de nouvelles technologies et de nouveaux langages de développement.</i></p></div>
        	
        	
        </div>
        ]]></description>
			<pubDate>Thu, 24 May 2001 18:56:00 +0100</pubDate>
			
				<category>d&#233;veloppement</category>
			
				<category>PHP</category>
			
				<category>PEAR</category>
			
			<guid isPermaLink="true">../../../blog/une-introduction-a-pear.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/une-introduction-a-pear.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/une-introduction-a-pear-532.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>Le Journal du Net pr&#233;sente phpMyChat !</title>
			<link>http://www.gasteroprod.com/../../../blog/le-journal-du-net-presente-phpmychat.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	
        	<div><h3 class="spip">phpMyChat&nbsp;: le chat en open source</h3>
<dl class='spip_document_325 spip_documents spip_documents_right'  style='float:right;'>
<dt><a href="http://www.gasteroprod.com/IMG/png/jdnet_phpmychat.png" title='PNG - 197.4 ko' type="image/png"><img src='http://www.gasteroprod.com/local/cache-vignettes/L154xH400/jdnet_phpmychat-5a022.png' width='154' height='400' alt='PNG - 197.4 ko' /></a></dt>
<dt class='spip_doc_titre' style='width:154px;'><strong>L&#8217;article dans le JdNet</strong></dt>
</dl>
<p>Il est possible de confier la mise en place d&#8217;un service de chat à un prestataire, mais il est aussi possible de le faire soi même, de nombreuses applications disponibles sur le net le permettant. C&#8217;est par exemple le cas de <a href="http://www.phpheaven.net/phpmychat:home" class="spip_out">phpMyChat</a>, une application <a href="http://www.php.net/" class="spip_out">PHP</a> développée en open source par Nicolas Hoizey (qui travaille par ailleurs pour la web agency <a href="http://www.sqli.fr/" class="spip_out">SQLI</a>), et Loïc Chapeaux, ainsi que de nombreux contributeurs disséminés de par le monde. Ainsi, l&#8217;application est disponible en 32 langues. Elle est actuellement utilisée par de nombreux sites, comme par exemple <a href="http://www.gasteroprod.com/" class="spip_out">Gastero Prod</a>. Des prestataires de services l&#8217;utilisent aussi pour mettre en place des solutions de chat pour leurs clients. En effet, cette application étant open source, il est possible de l&#8217;adapter à des besoins particuliers.</p>

<h3 class="spip">Une solution fonctionnelle rapidement</h3>
<p>Selon Nicolas Hoizey, créateur de la solution, "si l&#8217;on dispose d&#8217;une plate-forme avec Apache, PHP et MySQL, le chat est opérationnel en 5 minutes". Il est ainsi possible de l&#8217;installer rapidement chez la plupart des hébergeurs en colocation, et même chez des hébergeurs gratuits comme <a href="http://www.free.fr/" class="spip_out">Free</a>. L&#8217;application est paramétrable, notamment à l&#8217;aide d&#8217;une feuille de style CSS, ce qui permet de l&#8217;adpater à une charte graphique précise. Les bases de données MySQL, PostGreSQL sont supportées, ainsi que celles qui sont accessibles en ODBC. La connexion à la plate-forme s&#8217;effectue par le biais d&#8217;une simple page HTML contenant des frames invisibles rafraîchies périodiquement et assurant l&#8217;affichage des nouveaux messages. Une telle solution technique permet notamment un maximum de compatibilité et une utilisation derrière un firewall.</p>

<h3 class="spip">Les avantages du développement collaboratif</h3>
<p>Les utilisateurs du chat peuvent, avec cette solution, créer leur propre salon. Des fonctions de modération sont aussi incluses. Il est ainsi possible de définir une liste de mots qui seront automatiquement remplacés par des caractères déterminés. Il est aussi possible d&#8217;exclure des utilisateurs abusifs. Par contre, il est impossible d&#8217;être alerté de l&#8217;utilisation de certains mots, mais cette fonction peut facilement être implémentée. Une liste de diffusion regroupe en effet plusieurs centaines d&#8217;utilisateurs de PHPMyChat, ce qui permet aux développeurs de coller à leurs attentes. Au programme des prochaines évolutions&nbsp;: l&#8217;intégration de l&#8217;identification à une identification générale, une couche d&#8217;abstraction pour les bases de données, et un renforcement de la sécurité.</p>

<p><a href="http://solutions.journaldunet.com/contact/redaction.shtml" class="spip_out">Ludovic Blin</a>, JdNet.</p></div>
        	<div class="ps" style="font-style: italic;"><span style="font-weight: bolder;">PS :</span> <p>L&#8217;article original est disponible à l&#8217;adresse suivante&nbsp;:</p>

<p><a href="http://solutions.journaldunet.com/0102/010221phpmychat.shtml" class="spip_url spip_out">http://solutions.journaldunet.com/0...</a></p></div>
        	
        </div>
        ]]></description>
			<pubDate>Wed, 21 Feb 2001 20:05:00 +0100</pubDate>
			
				<category>d&#233;veloppement</category>
			
				<category>PHP</category>
			
				<category>phpHeaven</category>
			
				<category>logiciel libre</category>
			
			<guid isPermaLink="true">../../../blog/le-journal-du-net-presente-phpmychat.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/le-journal-du-net-presente-phpmychat.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/le-journal-du-net-pra-c-sente-phpmychat-534.rss</wfw:commentRss>
		</item>
		
		<item>
			<title>phpMyChat copieusement cit&#233; en exemple dans le magazine allemand PC Online</title>
			<link>http://www.gasteroprod.com/../../../blog/phpmychat-copieusement-cite-en-exemple-dans-le-magazine-allemand-pc-online.html</link>
			<description><![CDATA[
        <div id="contentbox">
        	<div class="chapo" style="font-weight: bolder;"><p>Dans ce numéro de PC Online&nbsp;[<a href="http://www.gasteroprod.com/#nb4-1" name="nh4-1" id="nh4-1" class="spip_note" rel="footnote" title='[1] Qui contrairement &#224; ce que semble indiquer son nom est un magazine (...)' >1</a>], journal allemand, Michael Loy propose un article de 3 pages à propos de la réalisation de chat en PHP, et prend phpMyChat en exemple, avec de nombreuses copies d&#8217;écran.</p></div>
        	<div><dl class='spip_document_326 spip_documents spip_documents_center' >
<dt><a href="http://www.gasteroprod.com/IMG/jpg/pconline_cover.jpg" title='JPEG - 217.7 ko' type="image/jpeg"><img src='http://www.gasteroprod.com/local/cache-vignettes/L290xH400/pconline_cover-008c9.jpg' width='290' height='400' alt='JPEG - 217.7 ko' /></a></dt>
<dt class='spip_doc_titre' style='width:290px;'><strong>La couverture du magazine</strong></dt>
</dl>
<dl class='spip_document_327 spip_documents spip_documents_center' >
<dt><a href="http://www.gasteroprod.com/IMG/jpg/pconline_page1.jpg" title='JPEG - 259.8 ko' type="image/jpeg"><img src='http://www.gasteroprod.com/local/cache-vignettes/L279xH400/pconline_page1-372fb.jpg' width='279' height='400' alt='JPEG - 259.8 ko' /></a></dt>
<dt class='spip_doc_titre' style='width:279px;'><strong>Première page de l&#8217;article</strong></dt>
</dl>
<dl class='spip_document_328 spip_documents spip_documents_center' >
<dt><a href="http://www.gasteroprod.com/IMG/jpg/pconline_page2.jpg" title='JPEG - 264 ko' type="image/jpeg"><img src='http://www.gasteroprod.com/local/cache-vignettes/L285xH400/pconline_page2-07f04.jpg' width='285' height='400' alt='JPEG - 264 ko' /></a></dt>
<dt class='spip_doc_titre' style='width:285px;'><strong>Seconde page de l&#8217;article</strong></dt>
</dl>
<dl class='spip_document_329 spip_documents spip_documents_center' >
<dt><a href="http://www.gasteroprod.com/IMG/jpg/pconline_page3.jpg" title='JPEG - 314.8 ko' type="image/jpeg"><img src='http://www.gasteroprod.com/local/cache-vignettes/L273xH400/pconline_page3-eb8d7.jpg' width='273' height='400' alt='JPEG - 314.8 ko' /></a></dt>
<dt class='spip_doc_titre' style='width:273px;'><strong>Troisième page de l&#8217;article</strong></dt>
</dl></div>
        	
        	<div class="info" style="border: 1px solid #333;"><p>[<a href="http://www.gasteroprod.com/#nh4-1" name="nb4-1" class="spip_note" title="Notes 4-1" rev="footnote">1</a>] Qui contrairement à ce que semble indiquer son nom est un magazine papier &#171;&nbsp;traditionnel&nbsp;&#187;</p></div>
        </div>
        ]]></description>
			<pubDate>Mon, 01 Jan 2001 20:13:00 +0100</pubDate>
			
				<category>PHP</category>
			
				<category>phpHeaven</category>
			
			<guid isPermaLink="true">../../../blog/phpmychat-copieusement-cite-en-exemple-dans-le-magazine-allemand-pc-online.html</guid>
			<dc:creator>Nicolas Hoizey</dc:creator>
  		<dc:format>text/html</dc:format>
			<dc:language>fr</dc:language>
			<comments>http://www.gasteroprod.com/../../../blog/phpmychat-copieusement-cite-en-exemple-dans-le-magazine-allemand-pc-online.html#commentaires</comments>
			<wfw:commentRss>http://www.gasteroprod.com/rss/commentaires/phpmychat-copieusement-cita-c-en-exemple-dans-le-magazine-allemand-pc-online-535.rss</wfw:commentRss>
		</item>
		
	</channel>
    
</rss>