<?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; nano</title>
	<atom:link href="http://www.sbnet.fr/tag/nano/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>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>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>
		<item>
		<title>Une classe de gestion d&#8217;une base de données mySQL en PHP à la sauce Rails</title>
		<link>http://www.sbnet.fr/2006/12/23/une-classe-de-gestion-d-une-base-de-donnees-mysql-en-php-a-la-sauce-rails/</link>
		<comments>http://www.sbnet.fr/2006/12/23/une-classe-de-gestion-d-une-base-de-donnees-mysql-en-php-a-la-sauce-rails/#comments</comments>
		<pubDate>Sat, 23 Dec 2006 11:24:32 +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[Ayant actuellement un projet en cours mettant en oeuvre une base de données mySQL avec PHP et n&#8217;ayant pas trouvé de classe d&#8217;abstraction qui me plait car souvent trop complète pour ce que j&#8217;ai à faire, j&#8217;ai décidé d&#8217;en créer une et de la distribuer sous licence libre. Je me suis inspiré d&#8217;ActiveRecord de Ruby [...]]]></description>
			<content:encoded><![CDATA[<p>Ayant actuellement un projet en cours mettant en oeuvre une base de données mySQL avec PHP et n&#8217;ayant pas trouvé de classe d&#8217;abstraction qui me plait car souvent trop complète pour ce que j&#8217;ai à faire, j&#8217;ai décidé d&#8217;en créer une et de la distribuer sous licence libre. Je me suis inspiré d&#8217;ActiveRecord de Ruby on Rails. C&#8217;est vraiment bien plus basique, on est loin d&#8217;avoir autant de possibilités qu&#8217;avec ActiveRecord mais d&#8217;un autre coté, c&#8217;est simple et ça fait juste ce dont j&#8217;ai besoin.<br />
<span id="more-101"></span></p>
<h3>De quelle configuration ai-je besoin ?</h3>
<p>Utilisant la programmation objet et la version 4 de PHP n&#8217;étant pas assez <em>complète</em> à ce niveau, j&#8217;ai réalisé du code en <a href="http://www.php.net/" hreflang="en">PHP 5</a> pour cette bibliothèque. Il vous faut aussi une base de données, ici j&#8217;utilise mySQL en accès direct par les fonctions de PHP, je n&#8217;ai pas utilisé de couche d&#8217;abstraction d&#8217;accès à la base mais rien ne vous empêche de le réaliser en utilisant <a href="http://fr3.php.net/manual/fr/ref.pdo.php" hreflang="fr">PDO</a> par exemple et de me faire parvenir votre réalisation pour la diffuser ici : Cette bibliothèque est sous licence libre <a href="http://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU" hreflang="fr">GPL</a>.</p>
<h3>Comment ça marche ? Un rapide aperçu.</h3>
<p>Le principe est des plus simples : j&#8217;ai créé une classe Database servant de parent à tous mes futurs objets en sachant que chaque objet sera associé à une table.</p>
<p>Commencez donc par la création de vos tables en respectant ces quelques règles :</p>
<ul>
<li>Bien que ce ne soit pas obligatoire, j&#8217;aime bien nommer mes tables en utilisant des mots qui décrivent bien leur contenu, sans majuscule et en séparant les mots par des tirets ( _ )</li>
<li>Les tables doivent avoir un champ &laquo;&nbsp;id&nbsp;&raquo; unique. Il peut être en autoincrement et il doit être un clé primaire.</li>
</ul>
<p>Puis créez un fichier php déclarant un objet (dérivé de Database) pour chacune de vos tables, sur ce modèle :</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> MaTable <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="br0">}</span></pre></div>
<h3>Comment la mettre en place</h3>
<p>Là encore rien n&#8217;est figé, il vous suffit d&#8217;inclure le fichier database.php à votre application et de créer autant d&#8217;objets que vous avez de tables :</p>
<div style="overflow: auto;"><pre class="php" id="geshi" style="color: #fff; border-left: 5px solid #900; background-color:#000;"><span class="kw1">include</span> <span class="st0">'database.php'</span>;
 
<span class="kw1">include</span> <span class="st0">'ma_table.php'</span>;<span class="re0">$connexion</span> = <a href="http://www.php.net/mysql_connect"><span class="kw3">mysql_connect</span></a><span class="br0">(</span>DB_SERVER, DB_USER, DB_PASSWORD<span class="br0">)</span>;
 
ma_table = <span class="kw2">new</span> MaTable<span class="br0">(</span><span class="re0">$connexion</span>, <span class="st0">'ma_table'</span><span class="br0">)</span>;</pre></div>
<p>Le constructeur de l&#8217;objet à besoin de deux paramètres : la connexion à la base de données et le nom de la table.</p>
<p>Pour simplifier tout ça, j&#8217;ai décidé de regrouper tous mes modèles (fichiers des objets correspondants aux tables, c&#8217;est le M de <a href="http://fr.wikipedia.org/wiki/Modèle-Vue-Contrôleur" hreflang="fr">MVC</a>) dans un seul répertoire et de créer une fonction d&#8217;initialisation (indépendante de la classe Database) qui s&#8217;occupe de créer les objets toute seule, cette fonction s&#8217;appelle <em>models_initialize</em> et elle prend en paramètre le chemin du répertoire où se trouvent les modèles. Cette fonction est disponible dans ce fichier : <a href="http://www.sbnet.fr/uploads/models.zip" title="models.zip">models.zip</a>. Vous devrez modifier son fonctionnement pour le faire correspondre à vos besoinsmais l&#8217;essentiel y est (parcours du répertoire et création des objets)</p>
<p>Il vous suffit donc de créer un répertoire <em>modeles</em> par exemple, d&#8217;y mettre tous vos fichiers modèles (ma_table.php dans notre exemple) et la fonction &laquo;&nbsp;models_initialize&nbsp;&raquo; s&#8217;occupera de créer les variables <strong>globales</strong> suivantes :</p>
<ul>
<li>$DBCon et $DBBase : variables de connexion à la base mySQL.</li>
<li>un objet pour chaque fichier nommé selon la convention que j&#8217;ai choisi : minuscules et tiret pour l&#8217;objet, majuscule de la première lettre de chaque mots sans espace pour le nom de la classe. Le nom de l&#8217;objet et de la table sont issus du nom du fichier alors faites attention de ne pas vous tromper en nommant vos fichiers.</li>
</ul>
<p>N&#8217;hésitez pas à regarder le code source de cette fonction, il est dans le fichier database.php. C&#8217;est ici que vous devrez apporter vos modifications si vous n&#8217;utilisez pas la même convention de nommage que moi.</p>
<h3>Téléchargement et fin de la première partie</h3>
<p>Vous pouvez télécharger le fichier database :  <a href="http://www.sbnet.fr/uploads/database.zip" title="Sources Database">Sources Database</a>. Je vous rappelle qu&#8217;il est sous licence libre <a href="http://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_GNU" hreflang="fr">GPL</a>. Important : Maintenant, Database est intégrée au <a href="http://wiki.nano-framework.com">framework PHP Nano</a> vous y trouverez une version bien plus récente mais aussi très différent du point de vue du fonctionnement.</p>
<p>La suite à la rentrée, je vous décrirai la façon d&#8217;utiliser les objets créés dans cette première partie. En attendant, passez de bonnes fêtes, et si vous le voulez, vous pouvez jeter un oeil aux méthodes de la classe Database j&#8217;ai essayé de les documenter au mieux&#8230;</p>
<p>La suite est disponible dans <a href="http://www.sbnet.fr/2007/01/16/classe-de-gestion-d-une-base-de-donnees-l-utilisation">ce billet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sbnet.fr/2006/12/23/une-classe-de-gestion-d-une-base-de-donnees-mysql-en-php-a-la-sauce-rails/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
