<?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>Développement Web Libre &#187; php</title>
	<atom:link href="http://www.sbnet.fr/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sbnet.fr</link>
	<description>xhtml, css, javascript, php et ruby</description>
	<lastBuildDate>Wed, 21 Jul 2010 11:57:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Associer un sous-domaine à une application symfony</title>
		<link>http://www.sbnet.fr/2010/07/02/associer-un-sous-domaine-a-une-application-symfony/</link>
		<comments>http://www.sbnet.fr/2010/07/02/associer-un-sous-domaine-a-une-application-symfony/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 08:35:29 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/?p=133</guid>
		<description><![CDATA[Coté serveur web
Il faut soit  créer des virtual host pour tous vos sous-domaine.
Soit créer un seul virtual host en utilisant des wildcards dans le ServerAlias, du coup tous les sous-domaines pourraient correspondre à une application, plus besoin de créer autant de virtual hosts que de sous-domaine. Il doit même être possible d&#8217;utiliser les wildcards dans [...]]]></description>
			<content:encoded><![CDATA[<h3>Coté serveur web</h3>
<p>Il faut soit  créer des virtual host pour tous vos sous-domaine.</p>
<p>Soit créer un seul virtual host en utilisant des wildcards dans le ServerAlias, du coup tous les sous-domaines pourraient correspondre à une application, plus besoin de créer autant de virtual hosts que de sous-domaine. Il doit même être possible d&#8217;utiliser les wildcards dans la déclaration du domaine dans le gestionnaire de dns.</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">ServerName domain.tld
ServerAlias *.domain.tld</pre></div>
<h3>Coté symfony</h3>
<p>Il faut renommer le fichier <em>web/index.php</em> en <em>web/frontend.php</em><br />
<em> </em>Puis re-créer le fichier <em>web/index.php </em>en y mettant le code qui permettra de choisir l&#8217;application<br />
en fonction du sous domaine.<br />
Voici un exemple, il suffit de modifier le <em>switch()</em> pour l&#8217;adapter à vos besoins :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw1">require_once</span><span class="br0">(</span><a href="http://www.php.net/dirname"><span class="kw3">dirname</span></a><span class="br0">(</span><span class="kw2">__FILE__</span><span class="br0">)</span>.<span class="st0">'/../config/ProjectConfiguration.class.php'</span><span class="br0">)</span>;
<span class="co1">// Trouve le sous-domaine</span>
<a href="http://www.php.net/list"><span class="kw3">list</span></a><span class="br0">(</span><span class="re0">$subdomain</span>, <span class="re0">$domain</span>, <span class="re0">$tld</span><span class="br0">)</span> = <a href="http://www.php.net/explode"><span class="kw3">explode</span></a><span class="br0">(</span><span class="st0">'.'</span>, <span class="re0">$_SERVER</span><span class="br0">[</span><span class="st0">'HTTP_HOST'</span><span class="br0">]</span><span class="br0">)</span>;
 
<span class="co1">// En deduit l'application</span>
<span class="kw1">switch</span><span class="br0">(</span><span class="re0">$subdomain</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw1">case</span> <span class="st0">&quot;documentation&quot;</span>:
        <span class="re0">$app</span> = <span class="st0">&quot;documentation&quot;</span>;
    <span class="kw1">break</span>;
 
    <span class="kw2">default</span>:
        <span class="re0">$app</span> = <span class="st0">&quot;frontend&quot;</span>;
    <span class="kw1">break</span>;
<span class="br0">}</span>
<span class="re0">$configuration</span> = ProjectConfiguration::<span class="me2">getApplicationConfiguration</span><span class="br0">(</span><span class="re0">$app</span>, <span class="st0">'prod'</span>, <span class="kw2">false</span><span class="br0">)</span>;
sfContext::<span class="me2">createInstance</span><span class="br0">(</span><span class="re0">$configuration</span><span class="br0">)</span>-&gt;dispatch<span class="br0">(</span><span class="br0">)</span>;</pre></div>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2010/07/02/associer-un-sous-domaine-a-une-application-symfony/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP fait du multitâche</title>
		<link>http://www.sbnet.fr/2010/02/26/php-fait-du-multitache/</link>
		<comments>http://www.sbnet.fr/2010/02/26/php-fait-du-multitache/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 15:30:52 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[multitache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2010/02/26/threads-et-php-multitache/</guid>
		<description><![CDATA[Pour les besoins d&#8217;un projet effectuant un grand nombre de tâches répétitives, j&#8217;ai dû mettre en place un système basé sur un script PHP lancé par cron à intervalles réguliers. Il n&#8217;y a aucune difficulté particulière à réaliser ceci, là où ça commence à être intéressant c&#8217;est à partir du moment où il a fallu [...]]]></description>
			<content:encoded><![CDATA[<p>Pour les besoins d&#8217;un projet effectuant un grand nombre de tâches répétitives, j&#8217;ai dû mettre en place un système basé sur un script PHP lancé par cron à intervalles réguliers. Il n&#8217;y a aucune difficulté particulière à réaliser ceci, là où ça commence à être intéressant c&#8217;est à partir du moment où il a fallu que ce script puisse lancer plusieurs tâches en même temps.</p>
<p>On a donc un script lancé à intervalles réguliers qui lui même va lancer et gérer un certain nombre, configurable, de tâches concurrente. Voici comment j&#8217;ai procédé.</p>
<p><span id="more-131"></span>Avant de continuer, il est bon de noter que j&#8217;ai effectué tous mes tests sur une machine fonctionnant sous linux, <strike>je n&#8217;ai aucune idée de la façon dont ça peu fonctionner sous windows, si jamais ça fonctionne sous windows</strike> les fonctions pcntl ne fonctionnent pas sous windows, donc pas de multitâche, avec cette méthode en tous cas, pour cette plateforme.</p>
<p>Un petit exemple vaut mieux que de longs discours :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw2">function</span> task<span class="br0">(</span><span class="re0">$msg</span><span class="br0">)</span>
<span class="br0">{</span>
    <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Task say $msg<span class="es0">\n</span>&quot;</span>;
<span class="br0">}</span>
 
<span class="re0">$t</span> = <span class="kw2">new</span> Task<span class="br0">(</span><span class="br0">)</span>;
<span class="re0">$t</span>-&gt;fork<span class="br0">(</span><span class="st0">'task'</span>, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">&quot;hello&quot;</span><span class="br0">)</span><span class="br0">)</span>;</pre></div>
<p>On peut sans problème lancer plusieurs tâches en créant plusieurs objets <em>Task</em>.</p>
<p>Et vérifier qu&#8217;une tâche est en cours avec la méthode <em>is_running()</em></p>
<p>Ici, pour l&#8217;exemple, on lance simplement une nouvelle tâche dont l&#8217;action principale sera d&#8217;afficher du texte, mais en général on à tendance à faire des tâches pour effectuer un traitement lourd ou long. Par exemple si on doit vérifier qu&#8217;une liste sites répondent correctement (disons 10 000 sites) sans utiliser de multitâche, si on a un timeout de 5 secondes et que 10% des sites sont hs, on perdra 5000 secondes à attendre. Par contre si on lance 100 tâches, potentiellement, on divises par 100 le temps d&#8217;attente.</p>
<p>Voici le code de cette classe</p>
<div style="overflow: auto; height: 300px;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw2">class</span> Task
<span class="br0">{</span>
    <span class="kw2">private</span> <span class="re0">$pid</span>;
    <span class="kw2">private</span> <span class="re0">$priority</span>=<span class="nu0">0</span>;
 
    protected <span class="re0">$children_pid</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span>;
 
    <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">if</span><span class="br0">(</span>!<a href="http://www.php.net/function_exists"><span class="kw3">function_exists</span></a><span class="br0">(</span><span class="st0">&quot;pcntl_fork&quot;</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception <span class="br0">(</span><span class="st0">&quot;Your system does not support pcntl (thread) functions&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
 
        <span class="co1">// Set the default signal handler</span>
        <span class="re0">$this</span>-&gt;add_signal<span class="br0">(</span>SIGTERM, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$this</span>, <span class="st0">&quot;signal_handler&quot;</span><span class="br0">)</span><span class="br0">)</span>;
        <span class="re0">$this</span>-&gt;add_signal<span class="br0">(</span>SIGINT, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$this</span>, <span class="st0">&quot;signal_handler&quot;</span><span class="br0">)</span><span class="br0">)</span>;
        <span class="re0">$this</span>-&gt;add_signal<span class="br0">(</span>SIGQUIT, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$this</span>, <span class="st0">&quot;signal_handler&quot;</span><span class="br0">)</span><span class="br0">)</span>;
    <span class="br0">}</span> 
 
    <span class="kw2">public</span> <span class="kw2">function</span> __destruct<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$this</span>-&gt;wait_children<span class="br0">(</span><span class="br0">)</span>;
    <span class="br0">}</span> 
 
    <span class="kw2">public</span> <span class="kw2">function</span> is_running<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$pid</span> = pcntl_waitpid<span class="br0">(</span><span class="re0">$this</span>-&gt;pid, <span class="re0">$status</span>, WNOHANG<span class="br0">)</span>;
        <span class="kw1">return</span><span class="br0">(</span><span class="re0">$pid</span> === <span class="nu0">0</span><span class="br0">)</span>;
    <span class="br0">}</span>  
 
    <span class="kw2">public</span> <span class="kw2">function</span> wait_children<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">foreach</span><span class="br0">(</span><span class="re0">$this</span>-&gt;children_pid <span class="kw1">as</span> <span class="re0">$child_pid</span><span class="br0">)</span>
        <span class="br0">{</span>
            pcntl_waitpid<span class="br0">(</span><span class="re0">$child_pid</span>, <span class="re0">$status</span><span class="br0">)</span>;
        <span class="br0">}</span>
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> fork<span class="br0">(</span><span class="re0">$name</span>, <span class="re0">$params</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$pid</span> = pcntl_fork<span class="br0">(</span><span class="br0">)</span>;
 
        <span class="kw1">if</span><span class="br0">(</span><span class="re0">$pid</span> === <span class="nu0">-1</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Unable to fork&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
        <span class="kw1">elseif</span><span class="br0">(</span><span class="re0">$pid</span> &gt; <span class="nu0">0</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="co1">// Parent</span>
            <span class="re0">$this</span>-&gt;children_pid<span class="br0">[</span><span class="br0">]</span> = <span class="re0">$pid</span>;
        <span class="br0">}</span>
        <span class="kw1">elseif</span><span class="br0">(</span><span class="re0">$pid</span> === <span class="nu0">0</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="co1">// Child</span>
            <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">(</span><span class="re0">$name</span>, <span class="re0">$params</span><span class="br0">)</span>;
            <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span>;
        <span class="br0">}</span>
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> add_signal<span class="br0">(</span><span class="re0">$signal</span>, <span class="re0">$function_name</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">if</span><span class="br0">(</span>!pcntl_signal<span class="br0">(</span><span class="re0">$signal</span>, <span class="re0">$function_name</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Can't add the signal&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> signal_handler<span class="br0">(</span><span class="re0">$signal</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">switch</span><span class="br0">(</span><span class="re0">$signal</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="kw2">default</span>:
            <span class="kw1">case</span> SIGTERM:
                <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span>;
            <span class="kw1">break</span>;
 
            <span class="kw1">case</span> SIGQUIT:
            <span class="kw1">case</span> SIGINT:
            <span class="kw1">case</span> SIGKILL:
                <a href="http://www.php.net/exit"><span class="kw3">exit</span></a><span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span>;
            <span class="kw1">break</span>;
        <span class="br0">}</span>
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> get_pid<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">return</span> <span class="re0">$this</span>-&gt;pid;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> set_priority<span class="br0">(</span><span class="re0">$priority</span>, <span class="re0">$process_identifier</span>=PRIO_PROCESS<span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">if</span><span class="br0">(</span>!<a href="http://www.php.net/is_int"><span class="kw3">is_int</span></a><span class="br0">(</span><span class="re0">$priority</span><span class="br0">)</span> || <span class="re0">$priority</span> &lt; <span class="nu0">-20</span> || <span class="re0">$priority</span> &gt; <span class="nu0">20</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Invalid priority&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
 
        <span class="kw1">if</span><span class="br0">(</span><span class="re0">$process_identifier</span> != PRIO_PROCESS || <span class="re0">$process_identifier</span> != PRIO_PGRP || <span class="re0">$process_identifier</span> != PRIO_USER<span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Invalid process identifier type&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
 
        <span class="kw1">if</span><span class="br0">(</span>!pcntl_setpriority<span class="br0">(</span><span class="re0">$priority</span>, <span class="re0">$this</span>-&gt;pid, <span class="re0">$process_identifier</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            throw <span class="kw2">new</span> Exception<span class="br0">(</span><span class="st0">&quot;Can't set the priority&quot;</span><span class="br0">)</span>;
        <span class="br0">}</span>
 
        <span class="re0">$this</span>-&gt;priority = <span class="re0">$priority</span>;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> get_priority<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">return</span> <span class="re0">$this</span>-&gt;priority;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> kill<span class="br0">(</span><span class="re0">$pid</span><span class="br0">)</span>
    <span class="br0">{</span>
        <a href="http://www.php.net/posix_kill"><span class="kw3">posix_kill</span></a><span class="br0">(</span>pid, SIGHUP<span class="br0">)</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2010/02/26/php-fait-du-multitache/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zero, c&#8217;est la tête à toto</title>
		<link>http://www.sbnet.fr/2010/02/04/zero-cest-la-tete-a-toto/</link>
		<comments>http://www.sbnet.fr/2010/02/04/zero-cest-la-tete-a-toto/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 16:13:45 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2010/02/04/zero-cest-la-tete-a-toto/</guid>
		<description><![CDATA[C&#8217;est pas moi qui le dit, c&#8217;est PHP.
La preuve :
var_dump(0 == &#34;toto&#34;);
Voir ça sur codepad
]]></description>
			<content:encoded><![CDATA[<p><a href="http://php.net/error_reporting" class="external text" title="http://php.net/error_reporting" rel="nofollow"></a>C&#8217;est pas moi qui le dit, c&#8217;est PHP.</p>
<p>La preuve :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">(</span><span class="nu0">0</span> == <span class="st0">&quot;toto&quot;</span><span class="br0">)</span>;</pre></div>
<p><a href="http://codepad.org/AIpJjxLa" title="php ça crain">Voir ça sur codepad</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2010/02/04/zero-cest-la-tete-a-toto/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Magento : ajouter et enlever des produits du panier</title>
		<link>http://www.sbnet.fr/2009/03/24/magento-ajouter-et-enlever-des-produits-du-panier/</link>
		<comments>http://www.sbnet.fr/2009/03/24/magento-ajouter-et-enlever-des-produits-du-panier/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 09:37:26 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2009/03/24/magento-ajouter-et-enlever-de-produits-du-panier/</guid>
		<description><![CDATA[Magento est un système de commerce électronique assez complexe à appréhender, il est bien mieux organisé que le vieillissant Oscommerce et peut être modifié à souhait grâce à une architecture bien pensée, basée sur Zend Framework mais qui demande quand même assez de temps pour s&#8217;y habituer. Je vous propose dans ce billet de voir [...]]]></description>
			<content:encoded><![CDATA[<p>Magento est un système de commerce électronique assez complexe à appréhender, il est bien mieux organisé que le vieillissant Oscommerce et peut être modifié à souhait grâce à une architecture bien pensée, basée sur Zend Framework mais qui demande quand même assez de temps pour s&#8217;y habituer. Je vous propose dans ce billet de voir comment faire pour ajouter et enlever des produits du panier de façon automatique.</p>
<p><span id="more-124"></span></p>
<h3>Ajouter un produit</h3>
<p>C&#8217;est le plus simple, il suffit de récupérer l&#8217;id du produit puis de tout simplement l&#8217;ajouter au panier</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re0">$id</span> = Mage::<span class="me2">getModel</span><span class="br0">(</span><span class="st0">'catalog/product'</span><span class="br0">)</span>-&gt;getIdBySku<span class="br0">(</span><span class="st0">&quot;product_sku&quot;</span><span class="br0">)</span>;
<span class="re0">$cart</span> = Mage::<span class="me2">getModel</span><span class="br0">(</span><span class="st0">&quot;checkout/cart&quot;</span><span class="br0">)</span>;
<span class="re0">$cart</span>-&gt;addProductsByIds<span class="br0">(</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$id</span><span class="br0">)</span><span class="br0">)</span>;
<span class="re0">$cart</span>-&gt;save<span class="br0">(</span><span class="br0">)</span>;</pre></div>
<h3>Enlever un produit</h3>
<p>C&#8217;est un peut plus compliqué, il faut parcourir tout le panier pour vérifier si l&#8217;id du produit à enlever est bien présent et le supprimer si c&#8217;est le cas</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re0">$cart</span> = Mage::<span class="me2">getModel</span><span class="br0">(</span><span class="st0">&quot;checkout/cart&quot;</span><span class="br0">)</span>;
<span class="re0">$id</span> = Mage::<span class="me2">getModel</span><span class="br0">(</span><span class="st0">'catalog/product'</span><span class="br0">)</span>-&gt;getIdBySku<span class="br0">(</span><span class="st0">&quot;product_sku&quot;</span><span class="br0">)</span>;
 
<span class="re0">$items</span> = <span class="re0">$cart</span>-&gt;getItems<span class="br0">(</span><span class="br0">)</span>;
<span class="kw1">foreach</span><span class="br0">(</span><span class="re0">$items</span> <span class="kw1">as</span> <span class="re0">$item</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="kw1">if</span><span class="br0">(</span><span class="re0">$item</span>-&gt;getProduct<span class="br0">(</span><span class="br0">)</span>-&gt;getId<span class="br0">(</span><span class="br0">)</span> == <span class="re0">$id</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$itemId</span> = <span class="re0">$item</span>-&gt;getItemId<span class="br0">(</span><span class="br0">)</span>;
        <span class="re0">$cart</span>-&gt;removeItem<span class="br0">(</span><span class="re0">$itemId</span><span class="br0">)</span>-&gt;save<span class="br0">(</span><span class="br0">)</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2009/03/24/magento-ajouter-et-enlever-des-produits-du-panier/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Installer XDebug avec PHP 5.3</title>
		<link>http://www.sbnet.fr/2008/10/07/installer-xdebug-avec-php-53/</link>
		<comments>http://www.sbnet.fr/2008/10/07/installer-xdebug-avec-php-53/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 08:30:41 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2008/10/07/installer-xdebug-avec-php-53/</guid>
		<description><![CDATA[PHP 5.3 à plein de nouvelles fonctionnalités à explorer, autant en profiter pour entrer dans le détail mettre en place un environnement de développement complet comprenant un profiler et un debugger.
Je pense que vous avez déjà installé PHP 5.3, sinon, cet article est pour vous.
Commencez par télécharger les sources de Xdebug sur le site officiel [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 5.3 à plein de nouvelles fonctionnalités à explorer, autant en profiter pour entrer dans le détail mettre en place un environnement de développement complet comprenant un profiler et un debugger.</p>
<p><span id="more-121"></span>Je pense que vous avez déjà installé PHP 5.3, sinon, <a href="http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/" title="installer php5 et php6 sur le même serveur">cet article</a> est pour vous.</p>
<p>Commencez par télécharger <a href="http://www.xdebug.org/link.php?url=xdebug203" title="sources de xdebug">les sources de Xdebug</a> sur le site officiel et décompactez les dans un répertoire, peut-importe où.</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">wget http://www.xdebug.org/link.php?<span class="re2">url=</span>xdebug203
tar -xvf xdebug<span class="nu0">-2.0</span><span class="nu0">.3</span>.tgz
<span class="kw3">cd</span> xdebug<span class="nu0">-2.0</span><span class="nu0">.3</span></pre></div>
<p>Un fois fait, il faut lancer phpize, attention, il faut lancer le bon phpize, celui de PHP 5.3, chez moi il est dans /usr/local/php5.3/bin</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">/usr/<span class="kw3">local</span>/php5<span class="nu0">.3</span>/bin/phpize</pre></div>
<p>Il ne reste plus qu&#8217;a compiler en indiquant bien quel php utiliser, comme avec phpize</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">./configure --enable-xdebug --with-php-<span class="re2">config=</span>/usr/<span class="kw3">local</span>/php53/bin/php-config
make
cp modules/xdebug.so /usr/<span class="kw3">local</span>/php53/xdebug.so</pre></div>
<p>On ajoute le module au fichier php.ini (chez moi il est dans /usr/local/php53/lib/php.ini) et c&#8217;est fini :</p>
<div style="overflow: auto;"><pre class="ini" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">zend_extension=<span class="st0">&quot;/usr/local/php53/xdebug.so&quot;</span></pre></div>
<p>La suite, notamment la configuration et l&#8217;utilisation du profiler et le <a href="http://www.jeanphi.fr/?post/2008/09/30/Debug-php-pas-a-pas-avec-XDebug-et-Vim" title="debug php pas à pas">debug php pas à pas</a>, est disponible sur le blog de <a href="http://www.jeanphi.fr">Jean-Phi</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2008/10/07/installer-xdebug-avec-php-53/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajoutez des évenements à vos objets</title>
		<link>http://www.sbnet.fr/2008/08/23/ajoutez-des-evenements-a-vos-objets/</link>
		<comments>http://www.sbnet.fr/2008/08/23/ajoutez-des-evenements-a-vos-objets/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 07:19:26 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[nano]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2008/08/23/ajoutez-des-evenements-a-vos-objets/</guid>
		<description><![CDATA[Pour les besoins de Nano, notre framework PHP, JP et moi avons réalisé un système de d&#8217;abonnement et de gestion d&#8217;évènements à des objets.

Nous avons créé deux classes, Observable et Observer. La première sera héritée par les objets que nous souhaitons rendre observables et la seconde contient la définition de l&#8217;objet qui appellera le les [...]]]></description>
			<content:encoded><![CDATA[<p>Pour les besoins de <a href="http://code.google.com/p/nanoframework/" title="nano framework php">Nano</a>, notre framework PHP, JP et moi avons réalisé un système de d&#8217;abonnement et de gestion d&#8217;évènements à des objets.</p>
<p><span id="more-119"></span></p>
<p>Nous avons créé deux classes, <em>Observable</em> et <em>Observer</em>. La première sera héritée par les objets que nous souhaitons rendre observables et la seconde contient la définition de l&#8217;objet qui appellera le les méthodes déclenchées par les évènements.</p>
<p>Voici le code de ces deux classes,  nous verrons après comment l&#8217;utilise.</p>
<h2>Observer</h2>
<div style="overflow: auto; height: 300px;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">final <span class="kw2">class</span> Observer
<span class="br0">{</span>
    protected <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="re0">$_instance</span>;
    protected <span class="re0">$_observed_events</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span>;
 
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> get_instance<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">if</span><span class="br0">(</span><a href="http://www.php.net/is_null"><span class="kw3">is_null</span></a><span class="br0">(</span>self::<span class="re0">$_instance</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="re0">$c</span>=<span class="kw2">__CLASS__</span>;
            self::<span class="re0">$_instance</span> = <span class="kw2">new</span> <span class="re0">$c</span>;
        <span class="br0">}</span>
        <span class="kw1">return</span> self::<span class="re0">$_instance</span>;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> observe<span class="br0">(</span><span class="re0">$observed_class</span>, <span class="re0">$event</span>, <span class="re0">$called_class</span>, <span class="re0">$called_method</span>, <span class="re0">$arguments</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$this</span>-&gt;_observed_events<span class="br0">[</span><span class="br0">]</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">'observed_class'</span> =&gt; <span class="re0">$observed_class</span>, <span class="st0">'event'</span> =&gt; <span class="re0">$event</span>, <span class="st0">'called_class'</span> =&gt; <span class="re0">$called_class</span>, <span class="st0">'called_method'</span> =&gt; <span class="re0">$called_method</span>,<span class="st0">'arguments'</span> =&gt; <span class="re0">$arguments</span><span class="br0">)</span>;
    <span class="br0">}</span>   
 
    <span class="kw2">public</span> <span class="kw2">function</span> call_back<span class="br0">(</span><span class="re0">$observed_class</span>, <span class="re0">$event</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$return_value</span>=<span class="kw2">true</span>;
        <span class="kw1">foreach</span> <span class="br0">(</span><span class="re0">$this</span>-&gt;_observed_events <span class="kw1">as</span> <span class="re0">$key</span> =&gt; <span class="re0">$value</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="kw1">if</span><span class="br0">(</span><span class="re0">$value</span><span class="br0">[</span><span class="st0">'observed_class'</span><span class="br0">]</span>==<span class="re0">$observed_class</span> &amp;&amp; <span class="re0">$value</span><span class="br0">[</span><span class="st0">'event'</span><span class="br0">]</span>==<span class="re0">$event</span><span class="br0">)</span>
            <span class="br0">{</span>
                <span class="re0">$return_value</span>&amp;=<a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">(</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$value</span><span class="br0">[</span><span class="st0">'called_class'</span><span class="br0">]</span>, <span class="re0">$value</span><span class="br0">[</span><span class="st0">'called_method'</span><span class="br0">]</span><span class="br0">)</span>, <span class="re0">$value</span><span class="br0">[</span><span class="st0">'arguments'</span><span class="br0">]</span><span class="br0">)</span>;
            <span class="br0">}</span>
        <span class="br0">}</span>
 
        <span class="kw1">return</span> <span class="re0">$return_value</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
<h2>Observable</h2>
<div style="overflow: auto; height: 300px;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw2">interface</span> iObservable
<span class="br0">{</span>
    <span class="kw2">public</span> <span class="kw2">function</span> __call<span class="br0">(</span><span class="re0">$method_name</span>, <span class="re0">$arguments</span><span class="br0">)</span>;
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> __callStatic<span class="br0">(</span><span class="re0">$method_name</span>, <span class="re0">$arguments</span><span class="br0">)</span>;
<span class="br0">}</span>
 
abstract <span class="kw2">class</span> Observable implements iObservable
<span class="br0">{</span>
    <span class="kw2">public</span> <span class="kw2">function</span> __call<span class="br0">(</span><span class="re0">$method_name</span>, <span class="re0">$arguments</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$ret</span> = <span class="kw2">false</span>;
        <span class="kw1">if</span><span class="br0">(</span>Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;call_back<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'before_'</span>.<span class="re0">$method_name</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="re0">$ret</span> = <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">(</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="re0">$this</span>, <span class="st0">'_'</span>.<span class="re0">$method_name</span><span class="br0">)</span>, <span class="re0">$arguments</span><span class="br0">)</span>;
        <span class="br0">}</span>
        Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;call_back<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'on_'</span>.<span class="re0">$method_name</span>, <span class="re0">$ret</span><span class="br0">)</span>;           
 
        <span class="kw1">return</span> <span class="re0">$ret</span>;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> __callStatic<span class="br0">(</span><span class="re0">$method_name</span>, <span class="re0">$arguments</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="re0">$ret</span> = <span class="kw2">false</span>;
        <span class="kw1">if</span><span class="br0">(</span>Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;call_back<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'before_'</span>.<span class="re0">$method_name</span><span class="br0">)</span><span class="br0">)</span>
        <span class="br0">{</span>
            <span class="re0">$ret</span> = <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">(</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'_'</span>.<span class="re0">$method_name</span><span class="br0">)</span>, <span class="re0">$arguments</span><span class="br0">)</span>;
        <span class="br0">}</span>
        Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;call_back<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="st0">'on_'</span>.<span class="re0">$method_name</span>, <span class="re0">$ret</span><span class="br0">)</span>;       
 
        <span class="kw1">return</span> <span class="re0">$ret</span>;
    <span class="br0">}</span>
    <span class="kw2">public</span> <span class="kw2">function</span> add_observer<span class="br0">(</span><span class="re0">$event</span>, <span class="re0">$called_class</span>, <span class="re0">$called_method</span>, <span class="re0">$arguments</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>
    <span class="br0">{</span>
        Observer::<span class="me2">get_instance</span><span class="br0">(</span><span class="br0">)</span>-&gt;observe<span class="br0">(</span><span class="kw2">__CLASS__</span>, <span class="re0">$event</span>, <span class="re0">$called_class</span>, <span class="re0">$called_method</span>, <span class="re0">$arguments</span>=<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
<h2>Utilisation</h2>
<p>Encore un peu de code pour illustrer tout ça, on commence par planter le décor avec nos deux classes.</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw2">class</span> ClassA <span class="kw2">extends</span> Observable
<span class="br0">{</span>
    <span class="kw2">public</span> <span class="kw2">function</span> _my_function_a<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">return</span><span class="br0">(</span><span class="st0">&quot;Je suis dans ClassA&quot;</span><span class="br0">)</span>;
    <span class="br0">}</span>
<span class="br0">}</span>
 
abstract <span class="kw2">class</span> CalledClass
<span class="br0">{</span>
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="re0">$value</span>;
 
    <span class="kw2">public</span> <a href="http://www.php.net/static"><span class="kw3">static</span></a> <span class="kw2">function</span> callback_function_a<span class="br0">(</span><span class="br0">)</span>
    <span class="br0">{</span>
        self::<span class="re0">$value</span> = <span class="st0">&quot;je suis dans CalledClass&quot;</span>;
        <span class="kw1">return</span> <span class="kw2">true</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
<p>Puis on place notre observer on on vérifie que tout c&#8217;est bien passé</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">ClassA::<span class="me2">add_observer</span><span class="br0">(</span><span class="st0">'on_my_function_a'</span>, <span class="st0">'CalledClass'</span>, <span class="st0">'callback_function_a'</span><span class="br0">)</span>;
 
<span class="re0">$this</span>-&gt;a = <span class="kw2">new</span> ClassA<span class="br0">(</span><span class="br0">)</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$this</span>-&gt;a-&gt;my_function_a<span class="br0">(</span><span class="br0">)</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> CalledClass::<span class="re0">$value</span>;</pre></div>
<p>Je vous laisse découvrir les petites subtilités du code que l&#8217;on n&#8217;a pas abordées ici, notamment dans les fonction magique.</p>
<p>Un indice :  le callback est automatiquement appelé (s&#8217;il existe bien sûr) pour les méthodes qui commencent par un underscore, sinon vous pouvez placer des<em> Observer::get_instance()-&gt;call_back(__CLASS__, $event);</em> dans votre code aux endroits stratégiques de votre méthode observée.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2008/08/23/ajoutez-des-evenements-a-vos-objets/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP5 et PHP6 sur le même serveur</title>
		<link>http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/</link>
		<comments>http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/#comments</comments>
		<pubDate>Mon, 07 Apr 2008 17:02:12 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/</guid>
		<description><![CDATA[Dans un article précédent, j&#8217;expliquais comment installer PHP6 en module module Apache. Maintenant je vais vous montrer comment installer PHP5 et PHP6 en même temps.

Pour que ça marche il faut installer PHP5 en module et PHP6 en CGI. Normalement PHP5 est déjà installé en module, si ce n&#8217;est pas le cas, allez voir la page [...]]]></description>
			<content:encoded><![CDATA[<p>Dans un <a href="http://www.sbnet.fr/2007/09/17/installer-php6-en-module-apache-sur-ubuntu/" title="php6 en module apache">article précédent</a>, j&#8217;expliquais comment installer PHP6 en module module Apache. Maintenant je vais vous montrer comment installer PHP5 et PHP6 en même temps.<br />
<span id="more-117"></span><br />
Pour que ça marche il faut installer PHP5 en module et PHP6 en CGI. Normalement PHP5 est déjà installé en module, si ce n&#8217;est pas le cas, allez voir la page du <a href="http://doc.ubuntu-fr.org/lamp" title="lamp ubuntu">wiki ubuntu</a> qui est très bien faite.</p>
<p>Maintenant il faut télécharger PHP6 et le compiler, allez voir le blog de Jean-Phi, il a fait <a href="http://www.jeanphi.fr/blog/show/stripped_title/how-to-installer-php6-sur-ubuntu-feisty" title="php6 en cgi">un billet qui détaille la procédure</a>.</p>
<p>Voila, il ne reste plus qu&#8217;a configurer Apache, j&#8217;ai eu besoin d&#8217;utiliser le module <em>Actions</em> qui n&#8217;était pas activé chez moi, pour l&#8217;activer, c&#8217;est très simple :</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">sudo a2enmod actions</pre></div>
<p>Passons à la configuration de votre virtual host, il suffit d&#8217;ajouter ce qui suit à un host :</p>
<div style="overflow: auto;"><pre class="xml" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">ScriptAlias /php6-cgi /usr/local/bin
Action php6-script  /php6-cgi/php-cgi
AddHandler php6-script .php</pre></div>
<p>Ce qui donne pour le virtual host complet :</p>
<div style="overflow: auto;"><pre class="xml" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="sc1">&lt;</span>VirtualHost *<span class="sc1">&gt;</span>
        ServerName www.monsite.com
 
        DocumentRoot /home/mon_site/www/
        ScriptAlias /php6-cgi /usr/local/bin
        Action php6-script  /php6-cgi/php-cgi
        AddHandler php6-script .php
 
        <span class="sc1">&lt;</span>directory<span class="sc1">&gt;</span>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        <span class="sc1">&lt;</span>/directory<span class="sc1">&gt;</span>
<span class="sc1">&lt;</span>VirtualHost<span class="sc1">&gt;</span></pre></div>
<p>Le chemin du <em>Scriptalias</em> (/usr/local/bin) doit correspondre au répertoire où est installé php-cgi, celui qui à été installé manuellement avec PHP6</p>
<p>Après, vous pouvez modifier le <em>AddHandler</em> comme vous le souhaitez, dans cet exemple, les fichiers .php sont considérés comme du PHP6 mais si vous voulez, vous pouvez faire en sorte que seuls les fichiers .php6 soient interprétés par PHP6 comme ça les fichiers .php continueront d&#8217;être considérés comme du PHP5 :</p>
<div style="overflow: auto;"><pre class="xml" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">ScriptAlias /php6-cgi /usr/local/bin
Action php6-script  /php6-cgi/php-cgi
AddHandler php6-script .php6</pre></div>
<p>Un simple <em>phpinfo();</em> devrait vous confirmer que votre configuration fonctionne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2008/04/07/php5-et-php6-sur-le-meme-serveur/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Installer PHP6 en module Apache sur Ubuntu</title>
		<link>http://www.sbnet.fr/2007/09/17/installer-php6-en-module-apache-sur-ubuntu/</link>
		<comments>http://www.sbnet.fr/2007/09/17/installer-php6-en-module-apache-sur-ubuntu/#comments</comments>
		<pubDate>Mon, 17 Sep 2007 20:36:51 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[PHP4 ne sera plus plus supporté d&#8217;ici un an laissant la place à PHP5 alors que la version 6 commence à montrer le bout de son nez. Voici comment installer cette derniere version sur un serveur Ubuntu pour effectuer quelques tests.

Un petit mot avant de commencer : vous pouvez consulter le billet de Jeanphi sur [...]]]></description>
			<content:encoded><![CDATA[<p>PHP4 ne sera plus plus supporté d&#8217;ici un an laissant la place à PHP5 alors que la version 6 commence à montrer le bout de son nez. Voici comment installer cette derniere version sur un serveur Ubuntu pour effectuer quelques tests.<br />
<span id="more-111"></span><br />
Un petit mot avant de commencer : vous pouvez consulter le billet de Jeanphi sur son <a href="http://www.jeanphi.fr/" hreflang="fr">blog</a> pour installer <a href="http://www.jeanphi.fr/blog/show/stripped_title/how-to-installer-php6-sur-ubuntu-feisty" hreflang="fr">PHP6 en commande en ligne</a></p>
<h3>Préquis</h3>
<ul>
<li>Un serveur linux sur une base débian, ubuntu&#8230; pour profiter d&#8217;apt-get</li>
<li>Un accès administrateur (au moins pouvoir faire des sudo)</li>
<li>Apache, testé sur un apache 2.2 mais la version n&#8217;a pas vraiment d&#8217;importance</li>
</ul>
<h3>Installation</h3>
<p>Comme nous allons compiler PHP nous aurons besoin des outils de compilation, si vous ne les avez pas déjà installés faites un <em>sudo apt-get install build-esssensials automake</em> pour installer gcc et tout son attirail.</p>
<p>Nous aurons aussi besoin de quelques bibliothèques :</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">sudo apt-get install apache2-prefork-dev
sudo apt-get install libicu36-dev
sudo apt-get install libxml-dev</pre></div>
<p>Vous pouvez choisir apache2-threaded-dev à la place da apache2-prefork-dev, ça devrait aussi marcher.</p>
<p>Maintemant occupons nous de PHP6 : téléchargez les sources sur <a href="http://snaps.php.net/" hreflang="en">snaps.php.net</a> et décompressez l&#8217;archive avec : <em>tar xvfz &lt;archive.tar.gz&gt;</em></p>
<p>Allez dans ce répertoire et lancez la compilation :</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">./configure --with-<span class="re2">apxs2=</span>/usr/bin/apxs2 --enable-soap
make
make <span class="kw3">test</span>
sudo make install</pre></div>
<p>Sous root créez le fichier /etc/apache2/php6.conf et placez y :</p>
<div style="overflow: auto;"><pre class="xml" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="sc1">&lt;</span>IfModule mod_php6.c<span class="sc1">&gt;</span>
  AddType application/x-httpd-php .php
  AddType application/x-httpd-php-source .phps
<span class="sc1">&lt;</span>/IfModule<span class="sc1">&gt;</span></pre></div>
<p>De même avec le fichier /etc/apache2/php6.load</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">LoadModule php6_module /usr/lib/apache2/modules/libphp6.so</pre></div>
<p>On initialise le module et on relance apache :</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">sudo a2enmod php6
sudo /etc/init.d/apache2 restart</pre></div>
<h3>Tests</h3>
<p>Si tout s&#8217;est bien passé, un simple phpinfo devrait confirmer que PHP6 est bien installé, pour aller un peu plu loin, testez les  <a href="http://www.jeanphi.fr/blog/show/stripped_title/php6-et-namespace/" hreflang="fr">namespaces</a>.</p>
<h3>Un petit bonus</h3>
<p>Voici deux petits scripts pour passer de PHP5 à PHP6 et inversement de façon simple :</p>
<p>Activer PHP6</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re3">#!/bin/bash</span>
sudo a2dismod php5
sudo a2enmod php6
sudo /etc/init.d/apache2 restart</pre></div>
<p>Activer PHP5</p>
<div style="overflow: auto;"><pre class="bash" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re3">#!/bin/bash</span>
sudo a2dismod php6
sudo a2enmod php5
sudo /etc/init.d/apache2 restart</pre></div>
<h3>La suite</h3>
<p>Si j&#8217;ai le temps, je me pencherai sur la configuration à mettre en place pour installe PHP6 et PHP5 conjointement sur le même serveur. Il faudra sûrement en installer un en module (PHP5) et l&#8217;autre en CGI (PHP6)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2007/09/17/installer-php6-en-module-apache-sur-ubuntu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Protéger ses scripts PHP</title>
		<link>http://www.sbnet.fr/2007/05/22/proteger-ses-scripts-php/</link>
		<comments>http://www.sbnet.fr/2007/05/22/proteger-ses-scripts-php/#comments</comments>
		<pubDate>Tue, 22 May 2007 14:58:22 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://ww.sbnet.fr/2007/05/22/proteger-ses-scripts-php/</guid>
		<description><![CDATA[Si vous développez des applications web en PHP vous avez sûrement déjà eu besoin de protéger vos scripts contre les modifications. Si vous ne voulez pas, par exemple, qu&#8217;un client utilise votre travail sur plusieurs sites alors que vous lui avez permis d&#8217;utiliser votre script que sur un seul site. Voici un moyen simple et [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous développez des applications web en PHP vous avez sûrement déjà eu besoin de protéger vos scripts contre les modifications. Si vous ne voulez pas, par exemple, qu&#8217;un client utilise votre travail sur plusieurs sites alors que vous lui avez permis d&#8217;utiliser votre script que sur un seul site. Voici un moyen simple et relativement efficace d&#8217;empêcher la copie sauvage. Sources et explications fournies :<br />
<span id="more-7"></span></p>
<h3>Encoder ses scripts</h3>
<p>L&#8217;encodage permet de rendre illisible le code source d&#8217;un script sans en changer son comportement, le script encodé continuera de s&#8217;exécuter comme avant.</p>
<p>Il y a tout de même une contrainte : votre script doit entièrement être en php, pas de mélange php + html dans le même fichier. Je n&#8217;ai pas non plus testé cette méthode en profondeur, il y a sûrement plein de cas où elle n&#8217;est pas applicable, n&#8217;hésitez pas à poster des commentaires à ce sujet.</p>
<h3>Fonctionnement de l&#8217;encodage</h3>
<p>Le principe est assez simple : On commence par lire entièrement le fichier à encoder et on enlève les balises <em>&lt;?php</em> et <em>?&gt;</em>, normalement il n&#8217;y en a que deux, une au début et une à la fin du fichier.</p>
<p>Ensuite on fait un simple encodage en base 64 du script, on <em>mélange</em> le tout en utilisant une table de correspondances et c&#8217;est tout.</p>
<p>Enfin presque, il ne nous reste plus qu&#8217;a ajouter le décodeur et à enregistrer le tout dans un autre fichier. Le décodeur fait l&#8217;opération inverse : il remet les données dans le bon ordre, applique un <em>base_64decode()</em> et lance le script grâce à un <em>eval()</em></p>
<p>Voila le code de l&#8217;encodeur, il vous affiche le script encodé à la fin dans un textarea pour pouvoir le <em>copier-coller</em> facilement.</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="re0">$nom_fichier</span> = <span class="st0">'mon_script_a_encoder.php'</span>;
<span class="re0">$fichier</span> = <a href="http://www.php.net/trim"><span class="kw3">trim</span></a><span class="br0">(</span><a href="http://www.php.net/file_get_contents"><span class="kw3">file_get_contents</span></a><span class="br0">(</span><span class="re0">$nom_fichier</span><span class="br0">)</span><span class="br0">)</span>;
<span class="re0">$fichier</span> = <a href="http://www.php.net/preg_replace"><span class="kw3">preg_replace</span></a><span class="br0">(</span><span class="st0">&quot;/^&lt;<span class="es0">\?</span>(php)?/&quot;</span>, <span class="st0">''</span>, <span class="re0">$fichier</span><span class="br0">)</span>;
<span class="re0">$fichier</span> = <a href="http://www.php.net/preg_replace"><span class="kw3">preg_replace</span></a><span class="br0">(</span><span class="st0">&quot;/<span class="es0">\?</span>&gt;$/&quot;</span>, <span class="st0">''</span>, <span class="re0">$fichier</span><span class="br0">)</span>;
 
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;h1&gt;Encodage&lt;/h1&gt;'</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;p&gt;Nom : '</span>.<span class="re0">$nom_fichier</span>.<span class="st0">'&lt;/p&gt;'</span>;
 
<span class="re0">$b64</span> = <a href="http://www.php.net/base64_encode"><span class="kw3">base64_encode</span></a><span class="br0">(</span><span class="re0">$fichier</span><span class="br0">)</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;p&gt;Base 64 : '</span>.<span class="re0">$b64</span>.<span class="st0">'&lt;/p&gt;'</span>;
 
<span class="re0">$tr</span> = <a href="http://www.php.net/strtr"><span class="kw3">strtr</span></a><span class="br0">(</span><span class="re0">$b64</span>, <span class="st0">&quot; kCV]4m.DNvM&gt;lstIKLBE6}ghf8[QAowPSR9ibX3cO{up=0anq27jF1eJx/UWGrzHT&lt;5yZYd&quot;</span>,<span class="st0">&quot;ACv.sfKXY{dEn58wjIBToFUtb9&gt;gL}=kqeZ0RuD[4lz Om&lt;12PyHSWJGp7MaiVQr/cN]h63x&quot;</span><span class="br0">)</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;p&gt;Translation : '</span>.<span class="re0">$tr</span>.<span class="st0">'&lt;/p&gt;'</span>;
 
<span class="re0">$enc</span>  = <span class="st0">&quot;<span class="es0">\$</span>__c='&quot;</span>.<span class="re0">$tr</span>.<span class="st0">&quot;';&quot;</span>;
<span class="re0">$enc</span> .= <span class="st0">&quot;<span class="es0">\$</span>__s=strtr(<span class="es0">\$</span>__c,<span class="es0">\&quot;</span>ACv.sfKXY{dEn58wjIBToFUtb9&gt;gL}=kqeZ0RuD[4lz Om&lt;12PyHSWJGp7MaiVQr/cN]h63x<span class="es0">\&quot;</span>,<span class="es0">\&quot;</span> kCV]4m.DNvM&gt;lstIKLBE6}ghf8[QAowPSR9ibX3cO{up=0anq27jF1eJx/UWGrzHT&lt;5yZYd<span class="es0">\&quot;</span>);&quot;</span>;
<span class="re0">$enc</span> .= <span class="st0">'$__d=strrev(&quot;edoced_46esab&quot;);eval(<span class="es0">\'</span>$__x=$__d(&quot;$__s&quot;);<span class="es0">\'</span>);eval($__x);'</span>;
 
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;h1&gt;Résultat&lt;/h1&gt;'</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;textarea cols=&quot;100&quot; rows=&quot;10&quot;&gt;'</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;?php '</span>.<span class="re0">$enc</span>.<span class="st0">' ?&gt;'</span>;
<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">'&lt;/textarea&gt;'</span>;</pre></div>
<h3>Le mot de la fin</h3>
<p>Vous avez vu que ce procédé est assez simple, il ne tiendra pas longtemps face à un <em>vrai</em> développeur mais devrait suffire dans la plupart des cas. Vous pouvez aussi vous amuser avec <a href="http://pobs.mywalhalla.net/" hreflang="en">pobs</a> pour obfusquer vos scripts ou si vous prévoyez une plus large diffusion vous devrez peut-être utiliser un encodeur plus évolué (bien plus) du genre de <a href="http://www.zend.com/products/zend_guard" hreflang="en">Zend Guard</a> ou <a href="http://www.ioncube.com/sa_encoder.php" hreflang="en">ionCube PHP encoder</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2007/05/22/proteger-ses-scripts-php/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Classe de gestion d&#8217;une base de données : l&#8217;utilisation</title>
		<link>http://www.sbnet.fr/2007/01/16/classe-de-gestion-d-une-base-de-donnees-l-utilisation/</link>
		<comments>http://www.sbnet.fr/2007/01/16/classe-de-gestion-d-une-base-de-donnees-l-utilisation/#comments</comments>
		<pubDate>Tue, 16 Jan 2007 10:51:49 +0000</pubDate>
		<dc:creator>Stéphane</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[nano]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans un précédent billet j&#8217;ai présenté l&#8217;architecture et la mise en place de ma classe d&#8217;accès à une base de données mySQL. Il est temps de voir comment utiliser cette classe, c&#8217;est le but de ce billet.

Comment accéder aux données
Sur le principe du CRUD (Create Read Update Delete), cette classe contient des méthodes permettant d&#8217;effectuer [...]]]></description>
			<content:encoded><![CDATA[<p>Dans un <a href="http://www.sbnet.fr/2006/12/23/une-classe-de-gestion-d-une-base-de-donnees-mysql-en-php-a-la-sauce-rails">précédent billet</a> j&#8217;ai présenté l&#8217;architecture et la mise en place de ma classe d&#8217;accès à une base de données mySQL. Il est temps de voir comment utiliser cette classe, c&#8217;est le but de ce billet.<br />
<span id="more-104"></span></p>
<h3>Comment accéder aux données</h3>
<p>Sur le principe du CRUD (Create Read Update Delete), cette classe contient des méthodes permettant d&#8217;effectuer les opérations de base.<br />
Pour illustrer les exemples, nous utiliserons une table auteurs associée à l&#8217;objet Auteurs dont une instance est dans la variable $auteurs. Toujours pour l&#8217;exemple, la table est structurée ainsi :</p>
<ul>
<li>un entier qui sert d&#8217;index : <em>id</em></li>
<li>une chaîne pour le nom : <em>nom</em></li>
</ul>
<h4>L&#8217;ajout de données</h4>
<p>Pour ajouter un champ dans un table, il faut utiliser la méthode <em>add</em>. Elle prend en paramètre une table contenant toutes les données à ajouter. Les clés de la table doivent correspondrent aux noms des champs. Exemple :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="coMULTI">/* On récupère les données issues du formulaire */</span>
<span class="re0">$auteur</span> = <span class="re0">$_POST</span><span class="br0">[</span><span class="st0">'auteur'</span><span class="br0">]</span>;if<span class="br0">(</span><span class="re0">$auteurs</span>-&gt;add<span class="br0">(</span><span class="re0">$auteur</span><span class="br0">)</span><span class="br0">)</span>
<span class="br0">{</span>
    <span class="coMULTI">/* L'auteur à été ajouté */</span>
<span class="br0">}</span></pre></div>
<p>associé au formulaire suivant :</p>
<div style="overflow: auto;"><pre id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;">&lt;form action=&quot;ajoute-auteur.html&quot; method=&quot;post&quot;&gt;
&lt;input name=&quot;auteur[nom]&quot; type=&quot;text&quot; /&gt;
&lt;input name=&quot;auteur_ajout&quot; value=&quot;Ajouter cet auteur&quot; type=&quot;submit&quot; /&gt;
&lt;/form&gt;</pre></div>
<p>Vous noterez que je n&#8217;ai rien mis pour le champ <em>id</em>, c&#8217;est parce que je le crée toujours en auto-incrément et c&#8217;est donc mySQL qui s&#8217;occupera d&#8217;y affecter une valeur lors de l&#8217;ajout. Cela s&#8217;applique aussi à tous les champs qui seraient définis avec une valeur par défaut : leur présence dans le tableau n&#8217;est pas obligatoire.</p>
<h4>La lecture</h4>
<p>Pour l&#8217;extraction de données j&#8217;ai créé trois fonctions :</p>
<ul>
<li>find_first()</li>
<li>find_by_id()</li>
<li>find_all()</li>
</ul>
<p><em>find_first()</em> et <em>find_all()</em> ont un seul paramètre : un tableau contenant la description de notre requête, la façon de construire ce tableau est assez simple : vous pouvez y mettre trois ordres : <em>conditions</em>, <em>order</em> et <em>limit</em>. Par exemple :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="coMULTI">/* Trouver les 10 premiers auteurs classés suivant leur nom */</span>
<span class="re0">$ressource_mysql</span> = <span class="re0">$auteurs</span>-&gt;find_all<span class="br0">(</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">'order'</span>=&gt;<span class="st0">'nom ASC'</span>, <span class="st0">'limit'</span>=&gt;<span class="nu0">10</span><span class="br0">)</span> <span class="br0">)</span>;
 
<span class="coMULTI">/* Trouver le premier auteur classé suivant le nom */</span>
<span class="re0">$tableau_de_retour</span> = <span class="re0">$auteurs</span>-&gt;find_first<span class="br0">(</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">'order'</span>=&gt;<span class="st0">'nom ASC'</span><span class="br0">)</span> <span class="br0">)</span>;
 
<span class="coMULTI">/* Trouver les 10 premiers auteurs classes dont le nom commence par 'bal' */</span>
<span class="re0">$ressource_mysql</span> = <span class="re0">$auteurs</span>-&gt;find_all<span class="br0">(</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">'conditions'</span>=&gt;<span class="st0">&quot;nom LIKE 'bal%'&quot;</span>, <span class="st0">'limit'</span>=&gt;<span class="nu0">10</span><span class="br0">)</span> <span class="br0">)</span>;
 
<span class="coMULTI">/* Trouver l'auteur qui a l'id 123 */</span>
<span class="re0">$tableau_de_retour</span> = <span class="re0">$auteurs</span>-&gt;find_by_id<span class="br0">(</span><span class="nu0">123</span><span class="br0">)</span>;</pre></div>
<h4>La mise à jour</h4>
<p>La façon de faire est exactement la même que pour l&#8217;ajout de données si ce n&#8217;est qu&#8217;il faut utiliser la fonction <em>update_attributes($id, $donnees)</em></p>
<ul>
<li><em>$id</em> est l&#8217;index du champ à mettre à jour.</li>
<li><em>$données</em> est le tableau contenant les données. Vous n&#8217;êtes pas obligé de mettre tous les champs présents dans la table, seul ceux qui sont dans le tableau sont mis à jour.</li>
</ul>
<p>Il existe aussi une fonction permettant de mettre à jour un seul champ : <em>update_attribute($id, $champ, $valeur)</em></p>
<h4>La suppression de données</h4>
<p>La aussi c&#8217;est très simple : la fonction <em>destroy($id)</em> permet de supprimer un enregistrement.</p>
<h3>Extensions</h3>
<p>Selon vos besoins et selon vos donnés, vous devrez ajouter des fonctionnalités à ces méthodes, par exemple : rechercher tous les <em>auteurs</em> selon leur <em>nom</em>. Ajoutez vos méthodes dans les fichiers correspondant à vos tables. Dans notre exemple vous pouvez créer une méthode <em>find_all_by_name()</em> dans le fichier auteurs.php</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw2">class</span> Auteurs <span class="kw2">extends</span> Database<span class="br0">{</span>
    <span class="kw2">function</span> __construct<span class="br0">(</span><span class="re0">$connexion</span>, <span class="re0">$table_name</span><span class="br0">)</span>
    <span class="br0">{</span>
        parent::__construct<span class="br0">(</span><span class="re0">$connexion</span>, <span class="re0">$table_name</span><span class="br0">)</span>;
    <span class="br0">}</span>
 
    <span class="kw2">public</span> <span class="kw2">function</span> find_all_by_name<span class="br0">(</span><span class="re0">$name</span><span class="br0">)</span>
    <span class="br0">{</span>
        <span class="kw1">return</span> <span class="re0">$this</span>-&gt;find_all<span class="br0">(</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">&quot;conditions&quot;</span>=&gt;<span class="st0">&quot;name = 'hobb'&quot;</span><span class="br0">)</span>;
    <span class="br0">}</span>
<span class="br0">}</span></pre></div>
<h3>Ce qu&#8217;il reste à faire</h3>
<p>Comme je l&#8217;ai déjà dit, le but de cette classe est juste de rendre service en gérant simplement des données, c&#8217;est pourquoi il n&#8217;y a pas d&#8217;abstraction au niveau de la gestion de la base de données même : On accède uniquement à une base mySQL. Il serait intéressant de <em>sortir</em> cette gestion de cette classe et de créer une autre couche permettant d&#8217;accéder à d&#8217;autres base de données comme PostgreSQL ou SQLite.</p>
<p><em>Si vous utilisez cette classe dans un de vos projets, vous pouvez m&#8217;envoyer l&#8217;adresse du site en question avec une petite description du projet afin d&#8217;être cité dans le billet des utilisateurs de cette classe.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2007/01/16/classe-de-gestion-d-une-base-de-donnees-l-utilisation/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
