<?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>Totalement Geek ! &#187; php</title>
	<atom:link href="http://totalement.geek.oupas.fr/article/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://totalement.geek.oupas.fr</link>
	<description>... ou pas.</description>
	<lastBuildDate>Thu, 02 Sep 2010 08:07:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Symfony: Mettre ses tables en UTF8 avec Doctrine (même les plugins)</title>
		<link>http://totalement.geek.oupas.fr/article/2009/06/29/symfony-mettre-ses-tables-en-utf8-avec-doctrine-meme-les-plugins</link>
		<comments>http://totalement.geek.oupas.fr/article/2009/06/29/symfony-mettre-ses-tables-en-utf8-avec-doctrine-meme-les-plugins#comments</comments>
		<pubDate>Mon, 29 Jun 2009 19:06:10 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://totalement.geek.oupas.fr/?p=184</guid>
		<description><![CDATA[Pour mettre ses tables en UTF8 avec Doctrine et le framewok Symfony, rien de plus simple. Tout en haut de votre(vos) schema.yml, ajoutez les lignes suivantes: options: collate: utf8_unicode_ci charset: utf8 Malheureusement, les fichiers schema.yml des plugins ne seront pas affecté car il faut que ce bout de code soit répété en haut de chaque [...]]]></description>
			<content:encoded><![CDATA[<p>Pour mettre ses tables en UTF8 avec Doctrine et le framewok Symfony, rien de plus simple.</p>
<p>Tout en haut de votre(vos) schema.yml, ajoutez les lignes suivantes:</p>
<pre>options:
  collate: utf8_unicode_ci
  charset: utf8</pre>
<p>Malheureusement, les fichiers schema.yml des plugins ne seront pas affecté car il faut que ce bout de code soit répété en haut de chaque schema.yml.</p>
<p>Heureusement, <a href="http://borreli.com/" target="_blank">[MA]Pascal</a> m'a donné une astuce de sioux qui permet de résoudre ce problème. Il suffit d'utiliser l'héritage des tables dans Doctrine. Par exemple, voici ce que ca donnerait pour le plugin sfDoctrineGuardPlugin:</p>
<pre>sfGuardGroupUtf8:
  inheritance:  { extends: sfGuardGroup, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardGroupPermissionUtf8:
  inheritance:  { extends: sfGuardGroupPermission, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardPermissionUtf8:
  inheritance:  { extends: sfGuardPermission, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardRememberKeyUtf8:
  inheritance:  { extends: sfGuardRememberKey, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardUserUtf8:
  inheritance:  { extends: sfGuardUser, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardUserGroupUtf8:
  inheritance:  { extends: sfGuardUserGroup, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardUserPermissionUtf8:
  inheritance:  { extends: sfGuardUserPermission, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }</pre>
<p><a href="http://borreli.com/" target="_blank">[MA]Pascal</a> me disait même qu'il étendait les fonctionnalités des plugins de cette façon, mais je ne sais pas dans quelle mesure on peut étendre une classe d'un plugin et espérer que cela fonctionne encore...</p>
<p>[MA]Pascal, si tu passes par là et si tu veux bien nous expliquer :p</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2009/06/29/symfony-mettre-ses-tables-en-utf8-avec-doctrine-meme-les-plugins/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Symfony: bench des ORM Propel et Doctrine</title>
		<link>http://totalement.geek.oupas.fr/article/2009/02/14/symfony-bench-des-orm-propel-et-doctrine</link>
		<comments>http://totalement.geek.oupas.fr/article/2009/02/14/symfony-bench-des-orm-propel-et-doctrine#comments</comments>
		<pubDate>Sat, 14 Feb 2009 14:01:30 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[planet libre]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://totalement.geek.oupas.fr/?p=150</guid>
		<description><![CDATA[Symfony, pour ceux qui ne connaissent pas encore, est un framework PHP puissant et français, développé par Sensio Labs. Contrairement à d'autres framework qui réinventent la roue, symfony s'appuie sur des librairies externes qui ont fait leur preuve. C'est précisément le cas pour l'ORM. Dans ses premières versions, symfony n'intégrait que Propel et le changement [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony, pour ceux qui ne connaissent pas encore, est un framework PHP puissant et français, développé par Sensio Labs.</p>
<p>Contrairement à d'autres framework qui réinventent la roue, symfony s'appuie sur des librairies externes qui ont fait leur preuve. C'est précisément le cas pour l'<a href="http://fr.wikipedia.org/wiki/Mapping_objet-relationnel" target="_blank">ORM</a>.</p>
<p>Dans ses premières versions, symfony n'intégrait que <a href="http://propel.phpdb.org/" target="_blank">Propel</a> et le changement d'ORM était relativement difficile, malgré l'existence d'un plugin <a href="http://www.doctrine-project.org/" target="_blank">Doctrine</a>, car certains outils du framework, notament l'Admin Generator, s'appuyait uniquement sur Propel.</p>
<p>Depuis la version 1.1, Propel est un plugin et ne fait plus parti du core de symfony. Depuis la version 1.2, l'Admin Generator peut utiliser indifféremment Propel ou Doctrine. C'est une très bonne nouvelle pour la communauté. Du coup, chaque développeur peut choisir l'ORM qui lui convient le mieux... mais aussi se poser la question fatidique "Quel est le meilleur ORM ?"</p>
<p>Cette question, je me la suis, moi-même posée.</p>
<p>Pour y répondre, il faut prendre en compte plusieurs points (liste non exhaustive et non ordonnée):</p>
<ul>
<li>la facilité d'apprentissage</li>
<li>la rapidité de développement</li>
<li>les capacités offertes par l'ORM (vs les besoins qu'on a)</li>
<li>la rapidité d'exécution</li>
</ul>
<p>Et c'est sur ce dernier point (pas forcément le plus important) que je suis me suis penché car j'ai lu à divers endroits que Doctrine était sacrément plus lent que Propel.</p>
<p>J'ai donc commencé à faire quelques benchmark. Ou plutôt une "plateforme" de benchmark qui n'attend que vous pour être complétée. En effet:</p>
<ul>
<li>étant débutant avec symfony, propel et doctrine, je ne peux garantir que tout soit bien optimisé, j'ai donc besoin de l'aide de demi-dieu de symfony et/ou propel et/ou doctrine</li>
<li>à plusieurs nous arriverons mieux à faire un benchmark suffisamment complet et représentatif du type de requête utilisé dans un site web.</li>
</ul>
<p>J'ai donc publié le code sur googlecode et l'accès au svn vous sera ouvert sur simple demande (mail/msn/gtalk de contact en haut à droite de ce blog).</p>
<p>url du projet: <a href="http://benchsymfonyorm.googlecode.com" target="_blank">http://benchsymfonyorm.googlecode.com</a></p>
<p>Le projet contient un répertoire pour chaque ORM avec, à l'intérieur, un projet symfony.</p>
<p>J'ai séparé chaque ORM dans un projet différent car l'utilisation de Propel et Doctrine pourrait fausser les résultats.</p>
<p>Les benchs sont tous dans des task afin que le serveur web n'influe pas sur les résultats.</p>
<p>Les remarques <strong>constructives</strong> sont évidemment les bienvenues. Les trolls velus totalement interdits et carrément supprimés des commentaires s'ils montrent le bout de leur nez.</p>
<p>Comme dit plus haut, je ne prétends pas avoir faire un système parfait et les améliorations sont donc les bienvenues... en fait, c'est un peu le but de ce projet :)</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2009/02/14/symfony-bench-des-orm-propel-et-doctrine/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Connexion persistente du client SOAP PHP à travers une session</title>
		<link>http://totalement.geek.oupas.fr/article/2008/02/15/connexion-persistente-du-client-soap-php-a-travers-une-session</link>
		<comments>http://totalement.geek.oupas.fr/article/2008/02/15/connexion-persistente-du-client-soap-php-a-travers-une-session#comments</comments>
		<pubDate>Fri, 15 Feb 2008 19:35:36 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://totalement.geek.oupas.fr/article/2008/02/15/connexion-persistente-du-client-soap-php-a-travers-une-session</guid>
		<description><![CDATA[Pour mon boulot, j'ai besoin de mettre un objet en session qui contient lui-même un objet SoapClient. le problème, c'est que sur la page suivante, la connexion au serveur SOAP est coupée. Il faut reconnecter le client à la main... c'est un peu casse pied. Du coup, j'ai étendu la classe SoapClient pour que ca [...]]]></description>
			<content:encoded><![CDATA[<p>Pour <a href="http://www.digitick.com" target="_blank">mon boulot</a>, j'ai besoin de mettre un objet en session qui contient lui-même un objet <a href="http://php.net/soap" target="_blank">SoapClient</a>. le problème, c'est que sur la page suivante, la connexion au serveur SOAP est coupée. Il faut reconnecter le client à la main... c'est un peu casse pied.</p>
<p>Du coup, j'ai étendu la classe SoapClient pour que ca se reconnecte automatiquement et ca donne:</p>
<pre class="php"><span style="color: #000000; font-weight: bold;">class</span> SoapClientSessionnable <span style="color: #000000; font-weight: bold;">extends</span> SoapClient <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #0000ff;">$wsdl</span>;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #0000ff;">$options</span>;
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$wsdl</span>, <span style="color: #0000ff;">$options</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">wsdl</span>     = <span style="color: #0000ff;">$wsdl</span>;
        <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">options</span>  = <span style="color: #0000ff;">$options</span>;
&nbsp;
        parent::__construct<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$wsdl</span>, <span style="color: #0000ff;">$options</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __wakeup<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0000ff;">$this</span>-&gt;__construct<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">wsdl</span>, <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">options</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>Bon, c'est un peu crade de rappeler le constructeur, mais je n'ai trouvé aucune méthode qui connecte le client SOAP... et puis ca a le mérite de fonctionner :)</p>
<p>Du coup, ca s'utilise de la même façon que le client SOAP de base:</p>
<pre class="php"><span style="color: #0000ff;">$client</span> = <span style="color: #000000; font-weight: bold;">new</span> SoapClientSessionnable<span style="color: #66cc66;">&#40;</span>
    <span style="color: #ff0000;">'http://host.com/path/to/wsdl'</span>,
    <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span>
        <span style="color: #808080; font-style: italic;">// Options</span>
        <span style="color: #ff0000;">'trace'</span>         =&gt; <span style="color: #cc66cc;">1</span>,
        <span style="color: #ff0000;">'soap_version'</span>  =&gt; SOAP_1_1,
        ....
    <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;</pre>
<p>Pensez quand même à mettre $client en session pour qu'il soit réutilisable dans la page suivante :)</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2008/02/15/connexion-persistente-du-client-soap-php-a-travers-une-session/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Envoyer des mails depuis PHP avec Ubuntu et esmtp !</title>
		<link>http://totalement.geek.oupas.fr/article/2007/11/27/envoyer-des-mails-depuis-php-avec-ubuntu-et-esmtp</link>
		<comments>http://totalement.geek.oupas.fr/article/2007/11/27/envoyer-des-mails-depuis-php-avec-ubuntu-et-esmtp#comments</comments>
		<pubDate>Tue, 27 Nov 2007 16:38:29 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[planet libre]]></category>
		<category><![CDATA[planet ubuntu-fr]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://totalement.geek.oupas.fr/article/2007/11/27/envoyer-des-mails-depuis-php-avec-ubuntu-et-esmtp</guid>
		<description><![CDATA[J'ai actuellement un projet de site web qui a besoin d'envoyer un mail... rien de bien extraordinaire en fait. Mais envoyer un mail depuis PHP sur une station Ubuntu est moins facile qu'il n'y parait. 1ère solution: installer Postfix ou Sendmail, 2 gros bazookas pour une petite mouche. 2ème solution: installer nullmailer ou installer esmtp. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://totalement.geek.oupas.fr/wp-content/uploads/2007/12/mail.jpg" alt="Mail" />J'ai actuellement un projet de site web qui a besoin d'envoyer un mail... rien de bien extraordinaire en fait. Mais envoyer un mail depuis PHP sur une station Ubuntu est moins facile qu'il n'y parait.</p>
<p>1ère solution: installer Postfix ou Sendmail, 2 gros bazookas pour une petite mouche.</p>
<p>2ème solution: <a href="http://www.thierryb.net/site/Nullmailer-envoyer-mails-PHP-Linux.html" target="_blank">installer nullmailer</a> ou installer <a href="http://esmtp.sourceforge.net/" target="_blank">esmtp</a>. Chez moi, <a href="http://untroubled.org/nullmailer/" target="_blank">nullmailer</a> ne marchant pas pour des raisons obscures et sombres, j'ai installé esmtp qui fonctionne à merveille.</p>
<p>Installation:<br />
<code>sudo apt-get install esmtp</code></p>
<p>Configuration:<br />
<code>sudo vim /etc/esmtprc</code></p>
<p>Il suffit d'indiquer un serveur smtp (celui de son FAI, par exemple), éventuellement un login/pass au besoin.</p>
<p>Pour l'utiliser avec gmail, en revanche, c'est un poil plus complexe, mais <a href="http://esmtp.sourceforge.net/manual.html#interfacing-with-particular-mail-servers" target="_blank">la documentation d'esmtp</a> est bien faite.</p>
<p>Enfin, pour terminer, il suffit de faire un lien symbolique de /usr/bin/sendmail vers esmtp comme suit pour que tout fonctionne parfaitement:<br />
<code>sudo ln -s /usr/bin/esmtp /usr/bin/sendmail</code></p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2007/11/27/envoyer-des-mails-depuis-php-avec-ubuntu-et-esmtp/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Frameworks PHP</title>
		<link>http://totalement.geek.oupas.fr/article/2007/05/22/frameworks-php</link>
		<comments>http://totalement.geek.oupas.fr/article/2007/05/22/frameworks-php#comments</comments>
		<pubDate>Tue, 22 May 2007 09:03:00 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[planet libre]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://tg.mattlab.info/?p=12</guid>
		<description><![CDATA[Moi qui ne jurais que sur le Zend Framework depuis sa toute première version beta, alors que la communauté française se créait petit à petit et, enfin, alors que la version finale ne va pas tarder à pointer le bout de son nez (la 0.9.3 est sorti il y a peu de temps), voilà que [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://totalement.geek.oupas.fr/wp-content/uploads/2007/12/php.gif" alt="php" />Moi qui ne jurais que sur le <a hreflang="en" href="http://framework.zend.com/">Zend Framework</a> depuis sa toute première version beta, alors que <a hreflang="fr" href="http://www.z-f.fr/">la communauté française</a> se créait petit à petit et, enfin, alors que la version finale ne va pas tarder à pointer le bout de son nez (la 0.9.3 est sorti il y a peu de temps), voilà que je m'intéresse aux autres framework php.  J'ai regardé un peu ce que je trouvais et qui répondait au doux nom de <em>framework php</em> et j'en ai trouvé plein. Voici les <em>principaux</em> par ordre alphabétique:</p>
<ul>
<li><a hreflang="en" href="http://cakephp.org/">CakePHP</a>, dont les numéros de version à rallonge sont une source de franche poilade pour tout mon boulot (la dernière version stable est la 1.1.15.5144). J'avais essayé, il y a quelques mois, de dompter la bête... sans succès.</li>
<li><a hreflang="en" href="http://codeigniter.com/">CodeIgniter</a>, comme CakePHP, j'avais essayé, sans succès, de comprendre ce framework.</li>
<li><a hreflang="fr" href="http://www.jelix.org/">Jelix</a>, lancé par Laurent Jouanneau, un framework français qui à l'air plutot interressant mais dont la documentation est pauvre et incomplète alors que la version 1.0 beta2.1 vient de sortir.</li>
<li><a hreflang="en" href="http://www.symfony-project.com/">Symfony</a>, développé par une société française... en anglais. la communauté est assez grande. Tout comme ses camarades CakePHP et CodeIgniter, impossible de comprendre quoi que ce soit à ce framework il y a quelques mois.</li>
<li><a hreflang="en" href="http://www.phpontrax.com/">PHP On Trax</a>, développé dans l'optique de faire un <a hreflang="en" href="http://www.rubyonrails.com/">Ruby On Rails</a> avec PHP.</li>
<li><a hreflang="en" href="http://seagull.phpkitchen.com/">Seagull</a>, non testé</li>
<li><a hreflang="en" href="http://framework.zend.com/">Zend Framework</a>, développé par <a hreflang="en" href="http://www.zend.com/">Zend</a>, <em>The PHP Company</em>.</li>
<li>Pleins d'autres...</li>
</ul>
<p>Je n'ai pas du tout testé Jelix à cause de sa documentation à trou. PHP On Trax non plus: je n'aime pas <acronym title="Ruby On Rails">RoR</acronym>, il y a peu de chance pour que PHP On Trax me plaise. Pas plus pour Seagull dont le nom ne m'attire pas (oui, je sais c'est pas une excuse valable... et pourtant). CakePHP, CodeIgniter et Symfony m'ont paru beaucoup trop obscurs, même leurs tutoriels <em>mon blog en 5 minutes</em> ne me convainquaient pas Quant à Zend Framework, je me suis plongé dedans aussitôt, j'ai aimé, j'ai développé des applications avec, y compris à mon boulot... et pourtant.</p>
<h3>Le gros défaut de Zend Framework</h3>
<p>Zend Framework est aux Framework PHP ce que PHP est aux langages de programmation. C'est simple, il y a une excellente documentation, une grande communauté et... on peut faire tout et n'importe quoi. De la même manière qu'on peut coder comme un porc ou comme un dieu avec PHP, on peut utiliser le <acronym title="Zend Framework">ZF</acronym> comme PEAR en utilisant des bibliothèques par ci, par là, on peut suivre ou non l'architecture proposée par Zend, on peut utiliser le concept <acronym title="Model View Controller">MVC</acronym> ou pas. Bref, le ZF est, tout comme PHP, beaucoup trop permissif pour un framework. Au final, on peut très vite se retrouver avec un site qui n'est pas du tout facile à maintenir, un comble pour un framework.</p>
<h3>Alors on utilise quoi?</h3>
<p>Je ne saurais rien imposer. Mais après moult tests et avec de l'acharnement, je pense avoir trouver mon bonheur avec Symfony. Le gros problème de Symfony, c'est son tutoriel de prise en main qui m'a fait fuir alors que le framework lui-même est une perle car, et ça se sent, il répond exactement à bon nombre de problématiques que l'on peut rencontrer dans des applications Web professionnelles. En lisant la <a hreflang="en" href="http://www.symfony-project.com/book/trunk">documentation de Symfony</a><sup>[<a id="rev-pnote-811-1" href="#pnote-811-1">1</a>]</sup> (je n'ai pas fini, j'en suis au chapitre 9), j'ai rencontré des solutions à des problèmes que l'on rencontre à mon boulot. ce qui n'était pas le cas avec ZF où il fallait au contraire créer tout un tas de plugins ou d'helpers.</p>
<h3>SF remplace ZF ?</h3>
<p>Oui. Je projette de migrer vers Symfony l'application que j'ai commencé sur ZF au boulot (sur mon temps libre, sinon mon patron va me tuer) Je compte aussi commencer la traduction en français du manuel de <acronym title="Symfony">SF</acronym>.</p>
<p class="footnotes">
<h4>Notes</h4>
<p>[<a id="pnote-811-1" href="#rev-pnote-811-1">1</a>] Que ceux qui disaient que je ne lisais pas l'anglais remarque bien que l'intégralité de ce manuel est en anglais et qu'il n'en existe pas de version française</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2007/05/22/frameworks-php/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>date(&#8216;d/m/Y&#8217;, strtotime(&#8217;0000-00-00&#8242;)) = ?</title>
		<link>http://totalement.geek.oupas.fr/article/2007/05/10/datedmy-strtotime0000-00-00</link>
		<comments>http://totalement.geek.oupas.fr/article/2007/05/10/datedmy-strtotime0000-00-00#comments</comments>
		<pubDate>Thu, 10 May 2007 23:22:00 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[planet libre]]></category>

		<guid isPermaLink="false">http://tg.mattlab.info/?p=8</guid>
		<description><![CDATA[Allez, allez! Petite énigme de fin de semaine! D'après vous, en PHP, que peut bien retourner date('d/m/Y', strtotime('0000-00-00')), hein ? Moi, au début, je pensais que ça allait me sortir EPOCH, donc quelque chose qui aurait dû ressembler à 01/01/1970. Que nenni! Cela affiche 30/11/1999. Ah... il a fallu chercher... et une fois trouvé, c'est [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://totalement.geek.oupas.fr/wp-content/uploads/2007/12/php.gif" alt="php" />Allez, allez! Petite énigme de fin de semaine!</p>
<p>D'après vous, en <a hreflang="en" href="http://www.php.net">PHP</a>, que peut bien retourner<br />
<code>date('d/m/Y', strtotime('0000-00-00'))</code>, hein ?</p>
<p>Moi, au début, je pensais que ça allait me sortir <a hreflang="fr" href="http://fr.wikipedia.org/wiki/Epoch">EPOCH</a>, donc quelque chose qui aurait dû ressembler à 01/01/1970.</p>
<p>Que nenni! Cela affiche 30/11/1999.</p>
<p>Ah... il a fallu chercher... et une fois trouvé, c'est tout à fait logique.</p>
<p>Cela part d'un <a hreflang="en" href="http://bugs.php.net/bug.php?id=30190">bug PHP</a><sup>[<a id="rev-pnote-795-1" href="#pnote-795-1">1</a>]</sup> du parser de PHP qui ne fait aucune différence entre l'année '0', '00', '000' ou '0000' et qu'il traduit inévitablement en l'an 2000. A partir de là, dans la gymnastique <em>microprocessoromentale</em> de PHP, il se passe les choses suivantes:</p>
<ul>
<li>0000-00-00 devient 2000-00-00</li>
<li>2000-00-00 n'existe pas, il prend le 00 du mois et décide donc que c'est le mois précédent: 1999-12-00<sup>[<a id="rev-pnote-795-2" href="#pnote-795-2">2</a>]</sup></li>
<li>1999-12-00 n'existe pas, il prend le 00 du jour et décide que c'est le jour précédent: 1999-11-30<sup>[<a id="rev-pnote-795-3" href="#pnote-795-3">3</a>]</sup></li>
</ul>
<p>Nous voila donc propulsé fin novembre 1999.</p>
<p><strong>Conclusion:</strong></p>
<ul>
<li>il vaut mieux avoir NULL plutôt que '0000-00-00' pour une date non utilisée</li>
<li>pour avoir rapidement la fin d'un mois, il suffit de se mettre au jour 00 du mois suivant. Exemple: si on veut le 31 aout 2010, il suffit d'avoir '2010-09-00', strtotime se chargera de revenir un jour en arrière.</li>
</ul>
<p class="footnotes">
<h4>Notes</h4>
<p>[<a id="pnote-795-1" href="#rev-pnote-795-1">1</a>] Contrairement à ce qui est écrit dans le rapport de bugs et ses commentaires, le bug existe toujours en PHP5</p>
<p>[<a id="pnote-795-2" href="#rev-pnote-795-2">2</a>] De la même manière, si vous aviez le mois 13, il passerait à janvier de l'année suivante</p>
<p>[<a id="pnote-795-3" href="#rev-pnote-795-3">3</a>] De la même manière, si vous aviez le 32 janvier, il passerait au 1er févier et si c'était le 40 janvier, vous arriveriez au 9 février.</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2007/05/10/datedmy-strtotime0000-00-00/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
