<?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>Programmation | Magazine Jeux</title>
	<atom:link href="https://www.magazine-jeux.com/category/developpement/programmation/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.magazine-jeux.com</link>
	<description>Le magazine des jeux en ligne</description>
	<lastBuildDate>Mon, 22 Mar 2010 07:15:34 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.8</generator>
	<item>
		<title>Les redirections en PHP</title>
		<link>https://www.magazine-jeux.com/les-redirections-en-php/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 22 Mar 2010 07:15:34 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/les-redirections-en-php/</guid>

					<description><![CDATA[Les redirections en PHP permettent de ne pas afficher n&#8217;importe quoi à l&#8217;utilisateur. Par exemple, lorsqu&#8217;il recherche une fiche d&#8217;un jeu sur un annuaire et que cette fiche n&#8217;existe pas / plus. Il y a quelques règles à respecter pour ne pas tomber dans certains pièges. Nous allons voir ça tout de suite. Redirection simple [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Les redirections en PHP permettent de ne pas afficher n&rsquo;importe quoi à l&rsquo;utilisateur. Par exemple, lorsqu&rsquo;il recherche une fiche d&rsquo;un jeu sur un annuaire et que cette fiche n&rsquo;existe pas / plus.</p>
<p>Il y a quelques règles à respecter pour ne pas tomber dans certains pièges. Nous allons voir ça tout de suite.</p>
<h2>Redirection simple</h2>
<p>La redirection la plus simple consiste à faire la chose suivante : </p>
<p><code><br />
header("Location: fichier_destination.php");<br />
</code></p>
<p>Cette ligne dans votre fichier PHP vous conduira vers le fichier « fichier_destination.php ».<br />
<br />Attention a ne pas envoyer au navigateur quoique ce soit avant cette ligne sinon, la redirection ne fonctionnera pas.</p>
<h2>Redirection 301</h2>
<p>Mais, dans l&rsquo;exemple d&rsquo;un annuaire où une fiche de jeu n&rsquo;existe pas / plus, il est préférable de faire une redirection de type 301. Voilà comment s&rsquo;y prendre : </p>
<p><code><br />
header("Status: 301 Moved Permanently", false, 301);<br />
header("Location: fichier_destination.php");<br />
</code></p>
<p>Et là, Google saura que la page n&rsquo;existe plus et qu&rsquo;il ne faut pas la référencer.</p>
<h2>Piège à éviter</h2>
<p>Juste un petit jeu pour finir. A votre avis, à la fin du code suivant, il y aura quoi dans le fichier « dummy.txt » ?<br />
<br />Soit il y aura « premier passage », soit « second passage ».</p>
<p><code><br />
$file = "dummy.txt";<br />
$a = "premier passage";<br />
file_put_contents($file, $a);<br />
header("Location: test.php");<br />
$a = "second passage";<br />
file_put_contents($file, $a);<br />
echo "ok";<br />
</code></p>
<p>Disons-le tout de suite, vous ne verrez pas inscrire « ok » sur votre écran.</p>
<p>Par contre, dans le fichier, il y aura « second passage ».<br />
<br />Oui, une redirection n&#8217;empêche pas la continuité du code !</p>
<p>Erreur de débutant dirons certains. Erreur tout simplement.</p>
<p>La solution, mettre une fin après la redirection : </p>
<p><code><br />
header("Location: test.php");<br />
exit();<br />
</code></p>
<p>Et là, vous avez une jolie redirection et pas de problèmes.</p>
<p>L&rsquo;idéal étant de faire une fonction avec possibilité de faire une redirection 301. Ça permet de mettre un test avant chaque redirection également. Utile pour débugger.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Include ou require ?</title>
		<link>https://www.magazine-jeux.com/include-ou-require/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 14 Aug 2006 05:34:00 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/include-ou-require/</guid>

					<description><![CDATA[Vous venez de terminer votre site et il est beau, très beau. Il contient à peu près 30 pages et vous en avez sué pour en arriver là. Et puis, un ami passe par là et vous fait remarquer, très gentiment, qu&#8217;il n&#8217;y a pas de « contact » dans le menu de vos pages. Bon, vous [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Vous venez de terminer votre site et il est beau, très beau. Il contient à peu près 30 pages et vous en avez sué pour en arriver là.<br />
<br />Et puis, un ami passe par là et vous fait remarquer, très gentiment, qu&rsquo;il n&rsquo;y a pas de « contact » dans le menu de vos pages.<br />
<br />Bon, vous piquez une crise à l&rsquo;idée de refaire les 30 pages juste parce que vous avez oublié une ligne dans le menu. La crise passée et quelques heures plus tard, ce même ami vous fait remarquer que votre menu n&rsquo;est pas franchement joli et que ce serait mieux de tenter le coup avec une autre couleur&#8230; Et là, il hésite sur la couleur. Mais vous non ! Ce sera ma main dans la figure et puis c&rsquo;est tout !</p>
<p>Bon, avant d&rsquo;en arriver là, il serait bon de mettre en place ces fameux fichiers inclus.<br />
<br />En effet, un site internet est un objet éphémère, qui bouge, qui vie et qui change donc régulièrement. Si vous ne concevez pas vos pages avec un minimum de méthode, vous ne vous en sortirez pas. Alors, avant de lancer votre main sur la figure de votre ami, placez vos menus dans un fichier inclus.</p>
<h2>include</h2>
<p>Cette commande Php est simple à utiliser : </p>
<p><code><br />
<?php
include "mon_fichier.php";
?><br />
</code></p>
<p>Ce morceau de code permet tout simplement de placer (d&rsquo;inclure) le fichier « mon_fichier.php » à la place de cette ligne.<br />
<br />Imaginons que votre menu soit le suivant : </p>
<p><code><br />
Fichier : menu.php</p>
<ul>
<li><a href="index.php">Sommaire</a></li>
<li><a href="forum.php">Forum</a></li>
<ul>
</code></p>
<p>Vous pouvez placer dans le fichier d&rsquo;index  la ligne suivante en lieu et place du menu : </p>
<p><code><br />
<?php
include "menu.php";
?><br />
</code></p>
<p>Et ceci sur toutes les pages de votre site où doit s&rsquo;afficher votre menu.<br />
<br />Maintenant, si votre ami passe par là et vous propose une petite modification, vous pouvez lui dire « ok, dans 10 secondes, elle est faite ». Et vous n&rsquo;avez qu&rsquo;à modifier le fichier « menu.php ».</p>
<h2>Quelques règles tout de même</h2>
<p>Vous pouvez très bien placer du php dans le fichier inclus. Vous pouvez, par exemple, définir que le menu en cours n&rsquo;est pas cliquable.</p>
<p>Il est de bon goût d&rsquo;inclure un fichier de configuration au début de toutes vos pages Php. Ce fichier contient les paramètres de votre site, mais peu aussi contenir des fonctions que vous utilisez régulièrement. Vous pouvez aussi inclure 2 fichiers, l&rsquo;un pour la configuration et l&rsquo;autre pour les fonctions.</p>
<p>N&rsquo;hésitez pas à nommer vos fichiers avec l&rsquo;extension « .inc.php » afin de les reconnaître plus facilement. Il est bon également de les placer dans un dossier. Moins il y aura de fichiers à la racine de votre site et plus votre site sera simple à maintenir, sans compter que cela déchargera aussi votre serveur.</p>
<p>Ne tentez pas le diable en essayant d&rsquo;inclure un fichier dont le nom est indiqué par une variable : </p>
<p><code><br />
<?php
include $fichier;
?><br />
</code></p>
<p>C&rsquo;est une piste que les pirates aiment bien. On ne va pas rentrer dans les détails, mais sachez que c&rsquo;est une porte ouverte. Si toutefois vous tenez absolument à faire un include avec une variable, vérifiez et revérifier avec des tests que la page que vous allez charger soit bien une page à vous, se trouvant sur votre serveur.</p>
<h2>Et require alors ?</h2>
<p>Php nous propose une autre fonction pour inclure un fichier : <strong>require</strong> </p>
<p>Avec require, un fichier ne sera inclus qu&rsquo;une seule fois dans un autre. Par exemple, dans une boucle, un fichier include sera inclus autant de fois que la boucle tournera alors qu&rsquo;une fichier chargé avec require ne sera chargé que la première fois.</p>
<p>require fonctionne de la même façon que include d&rsquo;un point de vue syntaxique.</p>
<h2>Mon site en morceau</h2>
<p>Si vous souhaitez maintenir un site très facilement, faites en sorte de regrouper tous ce qui peut être regrouper et de les inclure dans vos pages à l&rsquo;aide de require ou include.<br />
<br />Par exemple, les entêtes des pages html peuvent être mis dans un fichier « entete.php ».</p>
<h2>Un peu plus loin</h2>
<p>Il est tout à fait possible d&rsquo;appeler un fichier distant et de lui passer des paramètres.<br />
<br />L&rsquo;appel suivant fonctionne très bien : </p>
<p><code><br />
<?php
include "http://www.mon-domaine.fr/mon_fichier.php?toto=1&#038;titi=2;"
?><br />
</code></p>
<p>Par contre, pour un fichier en local, ce n&rsquo;est pas pareil. L&rsquo;appel suivant ne fonctionnera pas : </p>
<p><code><br />
<?php
//--- ceci n'est pas correct
include "mon-fichier.php?toto=1&#038;titi=2";
?><br />
</code></p>
<p>En effet, il faut faire comme cela : </p>
<p><code><br />
<?php
//----- ceci est correct
$toto = 1;
$titi = 2;
include "mon-fichier.php";
?><br />
</code></p>
<p>Tout simplement.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Génération de nombres aléatoires</title>
		<link>https://www.magazine-jeux.com/generation-de-nombres-aleatoires/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 07 Aug 2006 05:17:00 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/generation-de-nombres-aleatoires/</guid>

					<description><![CDATA[Pour commencer, parcequ&#8217;il faut bien commncer un jour et par quelque chose, une machine ne sortira jamais réellement un nombre aléatoire au sens propre du terme. Les nombres générés par un programme sont en fait issus d&#8217;une suite mathématique. Une méthode de calcul Pour exemple simple, nous avons la méthode de Von Neumann qui consiste [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Pour commencer, parcequ&rsquo;il faut bien commncer un jour et par quelque chose, une machine ne sortira jamais réellement un nombre aléatoire au sens propre du terme. Les nombres générés par un programme sont en fait issus d&rsquo;une suite mathématique. </p>
<h2>Une méthode de calcul</h2>
<p>Pour exemple simple, nous avons la méthode de Von Neumann qui consiste à prendre un nombre que l&rsquo;on élève au carré puis, à prendre les chiffres du milieu comme résultat. Ce résultat est utilisé pour le prochain nombre et ainsi de suite.</p>
<p>Un exemple avec de vrais chiffres histoire de comprendre un peu mieux :</p>
<p><code><br />
On commence avec le nombre suivant : 123<br />
Elevé au carré : 123² = 15129<br />
Donc, nous prenons les chiffres du milieu : 512 (c'est le premier résultat)<br />
Et c'est reparti :<br />
 512² = 262144<br />
Donc, nous avons comme résultat : 6214<br />
</code></p>
<p>Au passage, on constate que cette méthode utilise le résultat en terme de chaîne de caractères et non en nombre. Bref&#8230;</p>
<p>Il existe évidement beaucoup de méthodes.</p>
<h2>La graine</h2>
<p>Le nombre de départ est appelé <strong>la graine</strong>. C&rsquo;est lui qui va déterminer la suite logique de nombres pseudos aléatoires. Il va donc de soit que ce nombre doit être lui-même aléatoire. Mais là, nous tournons en rond.</p>
<p>Pour sélectionner une graine de « qualité », nous prenons généralement le temps écoulé depuis l&rsquo;allumage de l&rsquo;ordinateur.</p>
<h2>Et en Php ?</h2>
<p>Pour faire simple et aller droit au but qui vous interresse, voici les fonctions vous permettant de générer des nombres aléatoires à partir du Php : </p>
<p><code><br />
// Initialisation du générateur<br />
srand((float) microtime()*1000000);</p>
<p>// Génération d'un nombre compris entre 1 et 6<br />
$resultat = rand(1, 6) ;<br />
</code></p>
<p>Il s&#8217;emblerait d&rsquo;après la documentation du Php que cette fonction (rand) soit un peu lente. Il existe donc une fonction qui serait plus « rapide » et, en tout cas, meilleure en terme de résultats.</p>
<p><code><br />
// Initialisation du générateur<br />
mt_srand((float) microtime()*1000000);</p>
<p>// Génération d'un nombre compris entre 1 et 6<br />
$resultat = mt_rand(1, 6) ;<br />
</code></p>
<p>La seule différence est <strong>mt_</strong> devant les fonctions.<br />
<br />Bon, d&rsquo;accord, ce serait plus rapide. Alors testons !</p>
<h2>Les tests</h2>
<p>Nous avons donc effectuer une boucle de 1 million de générations et regardé en moyenne le temps écoulé :</p>
<p><strong>rand</strong> : 1058 ms<br />
<br /><strong>mt_rand</strong> : 1058 ms</p>
<p>Difficile de dire que l&rsquo;une est plus rapide que l&rsquo;autre. Les tests ont été fait sur des serveurs Windows et Linux en Php 4 et 5, avec des valeurs de recherche comprises entre 1 et 6 puis, entre 1 et 6000. Nous retrouvons toujours les mêmes valeurs.</p>
<p>Les suites générées sont très certainement plus « aléatoires » avec la fonction mt_rand. Il est également fort possible que la fonction <em>rand</em> ait été reprogrammée.</p>
<h2>Une utilisation particulière</h2>
<p>L&rsquo;aléatoire n&rsquo;étant pas vraiment aléatoire, il est possible d&rsquo;utiliser cette possibilité pour effectuer des calculs en fonction d&rsquo;évènements extérieurs comme par exemple en fonction du jour du mois.</p>
<p>Voici une boucle qui affiche 10 valeurs aléatoires, 5 fois de suite : </p>
<p><code><br />
for($j=1;$j<=5;$j++) <em><br />
srand((float) microtime()*1000000);<br />
	for($i=1;$i<=10;$i++) <em><br />
		// Génération d'un nombre compris entre 1 et 6<br />
		$resultat = rand(1, 60000) ;<br />
		echo $resultat.":";<br />
	</em><br />
	echo "<br />";<br />
</em><br />
</code></p>
<p>Voici le résulat (un des résultats en fait) :</p>
<p><code><br />
9299:40472:54969:40395:10961:445:15792:18826:33600:26864:<br />
8548:28017:19267:13263:10386:37151:28547:23509:51014:14292:<br />
31035:3183:15109:46568:35950:32619:2386:43602:1372:17407:<br />
51805:55513:38735:27750:52002:5818:55749:41044:4739:2881:<br />
59050:23083:5448:9808:332:16542:31280:9302:53996:19728:<br />
</code></p>
<p>Voici la même boucle, mais en remplaçant l&rsquo;initialisation du générateur par la ligne suivante : </p>
<p><code><br />
srand(date("j"));<br />
</code></p>
<p>Le générateur est donc initialisé avec le jour du mois.<br />
<br />Nous avons le résultat suivant : </p>
<p><code><br />
49653:63:12516:11456:26208:58327:22059:35442:49521:53193:<br />
49653:63:12516:11456:26208:58327:22059:35442:49521:53193:<br />
49653:63:12516:11456:26208:58327:22059:35442:49521:53193:<br />
49653:63:12516:11456:26208:58327:22059:35442:49521:53193:<br />
49653:63:12516:11456:26208:58327:22059:35442:49521:53193:<br />
</code></p>
<p>Vous aurez donc pour un même jour les mêmes résultats.<br />
<br />Ce système peut-être utilisé lorsque vous souhaitez afficher une information aléatoire chaque jour par exemple, mais que cette information soit la même toute la journée.</p>
<p>A vous de compliquez un peu le système pour trouver d&rsquo;autres utilisations pertinentes.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les sessions en PHP</title>
		<link>https://www.magazine-jeux.com/les-sessions-en-php/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 03 Jul 2006 05:10:00 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/les-sessions-en-php/</guid>

					<description><![CDATA[Introduit à partir de la version 4 du PHP, vous devez donc avoir la version 4.1.0 au moins afin de faire fonctionner correctement les exemples de cet article. Normalement, tout les hébergeurs ont au moins cette version. Le principe Les sessions permettent de conserver des informations côté serveur et de les utiliser ensuite à chaque [&#8230;]]]></description>
										<content:encoded><![CDATA[<p class="post_excerpt">Introduit à partir de la version 4 du PHP, vous devez donc avoir la version 4.1.0 au moins afin de faire fonctionner correctement les exemples de cet article. Normalement, tout les hébergeurs ont au moins cette version.</p>
<p><span id="more-120"></span></p>
<h2>Le principe</h2>
<p>Les sessions permettent de conserver des informations côté serveur et de les utiliser ensuite à chaque fois qu&rsquo;une page dynamique est créée. Ces informations sont propres à l&rsquo;utilisateur. C&rsquo;est-à-dire que chaque utilisateur dispose d&rsquo;une session pouvant contenir plusieurs informations.</p>
<p>Contrairement aux cookies qui sont stockés côté client, les sessions sont stockées côté serveur. Evidement cela implique une sécurité accrue, mais en contre partie, cela demande d&rsquo;avoir un peu plus la main sur les paramètres du serveur.</p>
<p>La durée de vie d&rsquo;une session est définie au niveau serveur. Cette valeur peut-être consultée en utilisant la fonction phpinfo() puis, en consultant la ligne <strong>session.cache_expire</strong>.<br />
<br />Cette valeur est modifiable dans le fichier de configuration.</p>
<h2>Création d&rsquo;une session</h2>
<p>Allez, c&rsquo;est parti, voici le code permettant de démarrer une session : </p>
<p><code><br />
<?php 
session_start();
?><br />
</code></p>
<p>Vous devez démarrer toutes vos pages dynamiques par cette commande. Elle est obligatoire sauf si la directive <strong>session.auto_start</strong> est à ON.</p>
<p>Les sessions sont alors sauvegardées dans un dossier. Vous pouvez consulter le nom de ce dossier en regardant la directive <strong>session.save_path</strong> dans le résultat d&rsquo;un phpinfo().</p>
<p>Vous pouvez obtenir l&rsquo;identifiant d&rsquo;une session par la commande <strong>session_id()</strong>.<br />
<br />Dans certains cas, notamment si votre jeu se trouve dans un sous domaine avec d&rsquo;autres jeux, il est conseillé de nommer vous-même les sessions en utilisant la commande <strong>session_name()</strong> :</p>
<p><code><br />
<?php 
session_name('MonJeu');
session_start();
?><br />
</code></p>
<h2>Enregistrement d&rsquo;informations dans la session</h2>
<p>La session est crée, il faut maintenant enregistrer des informations dedans : </p>
<p><code><br />
$_SESSION['s_Pseudo'] = $Pseudo;<br />
</code></p>
<p>Cette ligne permet d&rsquo;enregistrer dans une variable de session le contenu de la variable $Pseudo.</p>
<p>Vous pouvez évidement enregistrer plusieurs informations : </p>
<p><code><br />
$_SESSION['s_Pseudo'] = $Pseudo;<br />
$_SESSION['s_Identifiant'] = $Id;<br />
$_SESSION['s_Age'] = $Age;<br />
</code></p>
<p>Essayez de nommer vos variables de session d&rsquo;une façon logique. Ici, nous utilisons <strong>s_</strong> devant le nom de la variable. Ceci afin d&rsquo;éviter de les mélanger avec d&rsquo;autres variables suivant la configuration de votre serveur.</p>
<h2>Lecture des informations d&rsquo;une session</h2>
<p>Vous voilà donc avec une session et pleins d&rsquo;informations dedans. Voyons comment relire les variables :</p>
<p><code><br />
$Pseudo = $_SESSION['s_Pseudo'];<br />
</code></p>
<p>Tout simplement en faisant l&rsquo;inverse que pour l&rsquo;enregistrement.</p>
<h2>Effacement et suppression des sessions</h2>
<p>Pour effacer une variable de session, vous pouvez utiliser la commande classique <strong>unset()</strong> :<br />
<code><br />
unset($_SESSION['s_Pseudo']);<br />
if(isset($_SESSION['s_Pseudo'])) <em><br />
	echo "erreur lors de la suppression.";<br />
</em>else <em><br />
	echo "La variable a bien été supprimée.";<br />
</em><br />
</code><br />
Pour enfin supprimer complètement une session (utile pour proposer au joueur de se déconnecter par exemple) : </p>
<p><code><br />
session_destroy();<br />
</code></p>
<p>N&rsquo;oubliez pas de placer en haut de chaque page la commande de création de votre session.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Le fichier .htaccess (2)</title>
		<link>https://www.magazine-jeux.com/le-fichier-htaccess-2/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 17 Apr 2006 04:23:00 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/le-fichier-htaccess-2/</guid>

					<description><![CDATA[Ce simple petit fichier texte qu&#8217;est le .htaccess permet néanmoins beaucoup de choses dont une qui est très certainement la plus utilisée : l&#8217;URL rewriting. URL Rewriting Sous ce terme un peu barbare se cache une possibilité très simple, mais très puissante : la réécriture « à la volée » des URL. Pour faire simple, lorsque vous [&#8230;]]]></description>
										<content:encoded><![CDATA[<p class="post_excerpt">Ce simple petit fichier texte qu&rsquo;est le .htaccess permet néanmoins beaucoup de choses dont une qui est très certainement la plus utilisée : l&rsquo;URL rewriting.</p>
<p><span id="more-98"></span></p>
<h2>URL Rewriting</h2>
<p>Sous ce terme un peu barbare se cache une possibilité très simple, mais très puissante : la réécriture « à la volée » des URL.</p>
<p>Pour faire simple, lorsque vous avez une base de données avec, par exemple, des prénoms et que vous souhaitez que vos pages contiennent dans leur adresse les prénoms en question, la réécriture d&rsquo;URL vous permettra de la faire sans trop de difficulté.</p>
<p>Prenons un exemple concret :<br />
<br />Vos URLs sont actuellement de cette forme :</p>
<p><code><br />
http://www.monsite.com/fiche-prenom.php?id=12<br />
</code></p>
<p>Vous souhaitez changer cela et avoir des URLs plus simple de la forme : </p>
<p><code><br />
http://www.monsite.com/fiche-12.htm<br />
</code></p>
<p>Comment faire cela à l&rsquo;aide du fichier .htaccess ? Voici le fichier .htaccess correspondant : </p>
<p><code><br />
RewriteEngine on<br />
RewriteRule ^fiche-([0-9]+)\.htm$  fiche-prenom.php?id=$1  [L]<br />
</code></p>
<p>La première instruction est indispensable et permet d&rsquo;indiquer au serveur que la mise en place de la réécriture des URLs à la volée.</p>
<p>La seconde instruction indique comment si prendre : </p>
<p><strong>RewriteRule</strong> : c&rsquo;est un mot clef : il introduit une règle de réécriture.<br />
<br /><strong>^fiche-([0-9]+)\.htm$</strong> : la première partie de la règle. C&rsquo;est la chaîne qui va être cherchée par le module pour être remplacée par la seconde partie de la règle. Le caractère <strong>^</strong> indique le début de la ligne et le caractère <strong>$</strong> indique la fin.<br />
<br /><strong>fiche-prenom.php?id=$1</strong> : seconde partie de la règle. C&rsquo;est ce qui va remplacer la première partie. Les caractères <strong>$1</strong> indique un paramètre. Ici, c&rsquo;est le premier paramètre qui était indiqué entre parenthèse dans la première partie.<br />
<br /><strong>[L]</strong> : indique que cette règle est la dernière (c&rsquo;est un flag) à appliquer dans ce cas (L = Last).</p>
<p>La première partie de la règle est composée d&rsquo;expressions régulières. Ici, nous avons <strong>([0-9]+)</strong> qui correspond à des chiffres de 0 à 9 répétés n fois.<br />
<br />Donc, la première partie de la règle va rechercher des chaînes de caractères qui correspondent par exemple à :<br />
&#8211; fiche-12.htm<br />
&#8211; ou : fiche-123.htm<br />
&#8211; mais pas : fiche-a12.htm</p>
<p>Voici quelques expressions régulières à connaître : </p>
<table>
<tbody>
<tr class='row_even'>
<td>expressions</td>
<td>signification</td>
</tr>
<tr class='row_odd'>
<td>.</td>
<td>remplace n&rsquo;importe quel caractère</td>
</tr>
<tr class='row_even'>
<td>[0-9]</td>
<td>un chiffre de 0 à 9</td>
</tr>
<tr class='row_odd'>
<td>[a-z]</td>
<td>un caractère de a à z en minuscule</td>
</tr>
<tr class='row_even'>
<td>[^abcd]</td>
<td>tout caractère sauf l&rsquo;un de cette liste</td>
</tr>
<tr class='row_odd'>
<td>[abcd]</td>
<td>l&rsquo;un des caractères de cette liste (soit a, b, c ou d)</td>
</tr>
<tr class='row_even'>
<td>+</td>
<td>une ou plus occurence(s) de l&rsquo;expression qui précède</td>
</tr>
<tr class='row_odd'>
<td>*</td>
<td>aucune ou plus occurence(s) de l&rsquo;expression qui précède</td>
</tr>
<tr class='row_even'>
<td>\</td>
<td>permet d&rsquo;échapper un caractère. Par exemple, pour utiliser le « . » : \.</td>
</tr>
</tbody>
</table>
<p>Il y en a d&rsquo;autres plus ou moins complexes que vous pouvez trouver ici : <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule">http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule</a></p>
<h2>Pour aller plus loin</h2>
<p>C&rsquo;est bien beau tout ça, mais si au lieu d&rsquo;avoir une URL du genre : fiche-12.htm, on avait fiche-jean.htm ce serait tout de même un peu mieux, non ?!<br />
<br />Il y a deux solutions pour résoudre ce problème. Une très simple et une autre un peu moins.</p>
<p>La solution la plus simple consiste a rajouter au sein de l&rsquo;URL le numéro de la fiche en plus du prénom et de ne pas tenir compte du prénom : fiche-jean-12.htm</p>
<p><code><br />
RewriteEngine on<br />
RewriteRule ^fiche-[.]*-([0-9]+)\.htm$  fiche-prenom.php?id=$1  [L]<br />
</code></p>
<p>Qu&rsquo;importe le prénom qui se trouve dans l&rsquo;URL, c&rsquo;est le numéro de la fiche qui est pris en compte.<br />
<br />Les deux URL suivante donneront la même fiche :</p>
<p>     http://www.monsite.com/fiche-jean-12.htm<br />
<br />http://www.monsite.com/fiche-bernard-12.htm</p>
<p>La seconde solution consiste à placer dans la base de données la chaîne qui sera utilisée dans l&rsquo;URL. Cette chaîne doit être unique afin de pouvoir effectuer des recherches dans la base évidement. Si vous avez plusieurs Jean dans la base, il faudra, par exemple, ajouter un numéro à la fin ou une lettre.</p>
<p><code><br />
RewriteEngine on<br />
RewriteRule ^fiche-([.]+)\.htm$  fiche-prenom.php?id=$1  [L]<br />
</code></p>
<p>Il vous est possible également de cumuler les règles :</p>
<p><code><br />
RewriteEngine on<br />
RewriteRule ^fiche-[.]*-([0-9]+)\.htm$  fiche-prenom.php?id=$1  [L]<br />
RewriteRule ^agenda-[.]*-([0-9]+)\.htm$  agenda.php?id=$1  [L]<br />
</code></p>
<p>Vous pouvez également avoir plusieurs paramètres : </p>
<p><code><br />
RewriteEngine on<br />
RewriteRule ^fiche-([0-9]+)-([0-9]+)\.htm$  fiche-prenom.php?id=$1&page=$2  [L]<br />
</code></p>
<p>Au passage, pour les pages d&rsquo;erreurs, vous pouvez également définir une ligne dans votre fichier .htaccess au début de ce fichier : </p>
<p><code><br />
ErrorDocument  404  /erreur-404.php<br />
</code></p>
<p>Si un visiteur demande une page qui n&rsquo;existe pas, il tombera alors sur la page nommée « erreur-404.php ».</p>
<p>Il existe encore beaucoup de possibilités pour ce petit fichier .htaccess que nous verront dans un prochain article.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Envoi d&#8217;un mail texte ou HTML en Php</title>
		<link>https://www.magazine-jeux.com/envoi-dun-mail-texte-ou-html-en-php/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 27 Mar 2006 05:00:00 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/envoi-dun-mail-texte-ou-html-en-php/</guid>

					<description><![CDATA[Simple d&#8217;envoyer un mail en Php, mais avez-vous tenté d&#8217;envoyer un mail en HTML ?! La fonction mail() du php est très prisée des webmasters de jeux par internet et c&#8217;est bien compréhensible. Alors voyons ensemble comment envoyer un mail à l&#8217;aide de Php. Un mail simple Voici le code pour envoyer un mail simple, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p class="post_excerpt">Simple d&rsquo;envoyer un mail en Php, mais avez-vous tenté d&rsquo;envoyer un mail en HTML ?!</p>
<p><span id="more-87"></span><br />
La fonction <strong>mail()</strong> du php est très prisée des webmasters de jeux par internet et c&rsquo;est bien compréhensible.<br />
<br />Alors voyons ensemble comment envoyer un mail à l&rsquo;aide de Php.</p>
<h2>Un mail simple</h2>
<p>Voici le code pour envoyer un mail simple, au format texte, à l&rsquo;aide du Php : </p>
<p><code></p>
<p>$TexteMail = "Bonjour, \n";<br />
$TexteMail .= "Vous recevez ce mail car vous avez de la chance !\n";</p>
<p>$To = "destinataire@domaine.com";<br />
$From = "expediteur@domaine.com";<br />
$Reply = "expediteur@domaine.com";</p>
<p>$Sujet = "Le sujet de mon mail";</p>
<p>$Entete="From:".$From."\r\nReply-To:".$Reply;</p>
<p>mail($To, $Sujet, $TexteEmail, $Entete);<br />
</code></p>
<p>La variable <strong>$TexteMail</strong> contient donc le texte de votre email avec des retours à la ligne à chaque fin de ligne (\n).</p>
<p><strong>$To</strong> : contient l&#8217;email de la personne à qui l&rsquo;on envoie ce mail. Si vous désirez faire des envoies multiples en Bcc (Blind Carbon Copy, aucun destinataire ne verra les autres adresses), placez simplement les autres adresses à la suite avec des virgules :</p>
<p><code><br />
$To = "dest1@domaine.com, dest2@domaine.com, dest3@domaine.com";<br />
</code></p>
<p><strong>$From</strong> : contiendra l&rsquo;adresse de l&rsquo;expéditeur.</p>
<p><strong>$Reply</strong> : l&rsquo;adresse de réponse.</p>
<p><strong>$Sujet</strong> : le sujet de votre mail.</p>
<p><strong>$Entete</strong> : contiendra donc les variables précédentes. Nous verron plus loin qu&rsquo;il est possible d&rsquo;ajouter des informations ici.</p>
<p><strong>Un mail en HTML</strong></p>
<p>Tout de même plus sympathique de recevoir un mail personnalisé avec de zolies images, non ?!<br />
<br />Vous allez voir que ce n&rsquo;est pas vraiment plus compliqué pourvu que l&rsquo;on respecte quelques règles.</p>
<p><code><br />
$TexteMail = "<html><body>";<br />
$TexteMail .= "</p>
<p><strong>Bonjour,</strong>\n";<br />
$TexteMail .= "Vous recevez ce mail car vous avez de la chance !</p>
<p>\n";<br />
$TexteMail .= "</body></html>";</p>
<p>$To = "destinataire@domaine.com";<br />
$From = "expediteur@domaine.com";<br />
$Reply = "expediteur@domaine.com";</p>
<p>$Sujet = "Le sujet de mon mail";</p>
<p>$Entete="Content-type:text/html\nFrom:".$From."\r\nReply-To:".$Reply;</p>
<p>mail($To, $Sujet, $TexteEmail, $Entete);<br />
</code></p>
<p>Nous voilà avec un mail au format HTML. La variable <strong>$Entete</strong> contient une information de plus : le format du mail.</p>
<p>A vous de faire de jolis mails en retenant ces quelques règles fondamentales :<br />
&#8211; les images ou les liens doivent être en absolus : ne mettez pas « /images/monimage.gif », mais « http://www.mondomaine.com/images/monimage.gif »<br />
&#8211; oubliez les feuilles de style et placez les styles directement dans les balises.<br />
&#8211; ne faites pas de mail trop lourd, il ne seraient pas appréciés et vous risquez d&rsquo;abuser de votre bande passante.</p>
<p><strong>Un mail en texte et en HTML</strong></p>
<p>Bon, pour ceux qui veulent faire encore mieux en mettant les deux formats dans le même mail, voici la solution : </p>
<p><code><br />
function SendMail($Dest, $Sujet, $MesText, $MesHTML , $From, $Reply) <em><br />
	$Codage = "_NextPart_".md5(uniqid(rand())); </p>
<p>	$Entete = "Reply-to: ".$Reply."\n";<br />
	$Entete .= "From:".$From."\n";<br />
	$Entete .= "Date: ".date("l j F Y, G:i")."\n";<br />
	$Entete .= "MIME-Version: 1.0\n";<br />
	$Entete .= "Content-Type: multipart/alternative;\n";<br />
	$Entete .= " boundary=\"----=".$Codage."\"\n\n"; </p>
<p>	//--- Message au format Text<br />
	$Texte = "This is a multi-part message in MIME format.\n";<br />
	$Texte .= "Ceci est un message est au format MIME.\n";<br />
	$Texte .= "------=".$Codage."\n";<br />
	$Texte .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";<br />
	$Texte .= "Content-Transfer-Encoding: 8bit\n\n";<br />
	$Texte .= $MesText."\n\n"; </p>
<p>	//--- Message au format HTML<br />
	$HTML = "------=".$Codage."\n";<br />
	$HTML .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";<br />
	$HTML .= "Content-Transfer-Encoding: 8bit\n\n";<br />
	$HTML .= $MesHTML."\n\n\n------=".$Codage."\n";</p>
<p>	return mail($Dest, $Sujet, $Texte.$HTML, $Entete);<br />
</em><br />
</code></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Optimisation du code (2)</title>
		<link>https://www.magazine-jeux.com/optimisation-du-code-2/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 20 Mar 2006 06:00:00 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/optimisation-du-code-2/</guid>

					<description><![CDATA[Commençons simplement par un choix entre IF et SWITCH. Cela arrive souvent que l&#8217;on ait à se poser la question. Alors que choisissez-vous lorsque vous en avez le choix ? Voici les résultats pour une structure de contrôle de type IF : for($i=0;$i]]></description>
										<content:encoded><![CDATA[<p>Commençons simplement par un choix entre IF et SWITCH. Cela arrive souvent que l&rsquo;on ait à se poser la question. Alors que choisissez-vous lorsque vous en avez le choix ?</p>
<p>Voici les résultats pour une structure de contrôle de type IF :</p>
<p><code><br />
for($i=0;$i<500000;$i++) <em><br />
	if($i==1) <em><br />
		$a = "1 ";<br />
	</em>else if($i==2) <em><br />
		$a = "2 ";<br />
	</em>else if($i==3) <em><br />
		$a = "3 ";<br />
	</em><br />
</em><br />
</code></p>
<p><strong>Temps moyen : 0.295 s</strong></p>
<p>On fait la même chose avec un SWITCH :</p>
<p><code><br />
for($i=0;$i<500000;$i++) <em><br />
	switch($i) <em><br />
		case 1:<br />
			$a = "1 ";<br />
			break;<br />
		case 2:<br />
			$a = "2 ";<br />
			break;<br />
		case 3:<br />
			$a = "3 ";<br />
			break;<br />
		default:<br />
			$a = "0";<br />
			break;<br />
	</em><br />
</em><br />
</code></p>
<p><strong>Temps moyen : 0.290 s</strong></p>
<p>Le Switch, dans ce cas, est un petit peu plus rapide, mais de trois fois rien. Le choix peu donc se porter plus sur une méthode de programmation que sur un choix objectif de la vitesse.</p>
<p>Mais rajoutons une valeur par défaut à notre test : </p>
<p><code><br />
for($i=0;$i<500000;$i++) <em><br />
	if($i==1) <em><br />
		$a = "1 ";<br />
	</em>else if($i==2) <em><br />
		$a = "2 ";<br />
	</em>else if($i==3) <em><br />
		$a = "3 ";<br />
	</em>else<em><br />
		$a = "0";<br />
	</em><br />
</em><br />
</code></p>
<p><strong>Temps moyen : 0.390 s</strong></p>
<p>Et la même chose pour le SWITCH :</p>
<p><code><br />
for($i=0;$i<500000;$i++) <em><br />
	switch($i) <em><br />
		case 1:<br />
			$a = "1 ";<br />
			break;<br />
		case 2:<br />
			$a = "2 ";<br />
			break;<br />
		case 3:<br />
			$a = "3 ";<br />
			break;<br />
		default:<br />
			$a = "0";<br />
			break;<br />
	</em><br />
</em><br />
</code></p>
<p><strong>Temps moyen : 0.415 s</strong></p>
<p>Dans ce cas de figure, le IF est plus rapide que le SWITCH. Il est vrai que l&rsquo;instruction <em>default:</em> est exécuté pas mal de fois dans cet exemple. A vous donc de choisir le plus interressant en fonction de vos besoins.</p>
<p>Il serait interressant de voir également l&rsquo;opérateur conditionnel ternaire <strong>?:</strong> et sa rapidité, apparente, par rapport à un IF « standard ».<br />
<br />Beaucoup de jeunes développeurs apprécient cet opérateur pour son côté « obscur » : il donne au code un caractère personnel, et donne l&rsquo;impression d&rsquo;être plus rapide.<br />
<br />Mais il contribue également à rendre le code moins lisible, moins instinctif.</p>
<p>Alors qu&rsquo;en est-il ?</p>
<p><code><br />
for($i=0;$i<500000;$i++) <em><br />
	if($i<10000) <em><br />
		$a = "1 ";<br />
	</em>else<em><br />
		$a = "0";<br />
	</em><br />
</em><br />
</code></p>
<p><strong>Temps moyen : 0.255 s</strong></p>
<p>Voyons maintenant l&rsquo;opérateur conditionnel ternaire : </p>
<p><code><br />
for($i=0;$i<500000;$i++) <em><br />
	$i<10000  ? $a = "1 ": $a = "0";
</em><br />
</code></p>
<p><strong>Temps moyen : 0.354 s</strong></p>
<p>Il est plus lent ! Et oui, les apparences sont parfois trompeuses.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Constantes magique du PHP</title>
		<link>https://www.magazine-jeux.com/constantes-magique-du-php/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 13 Mar 2006 06:00:00 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/constantes-magique-du-php/</guid>

					<description><![CDATA[Voici quelques constantes Php qui ne sont pas très utilisées car très certainement méconnues et pourtant si pratique comme vous allez le voir. Commençons par cette-ci : __LINE__ : indique la ligne courante dans le fichier. Cette constante (variable pourtant&#8230;) peu s&#8217;avérer très utile lors du debuggage de vos applications. Le numéro de ligne correspond [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Voici quelques constantes Php qui ne sont pas très utilisées car très certainement méconnues et pourtant si pratique comme vous allez le voir.</p>
<p>Commençons par cette-ci :<br />
<br /><strong>__LINE__</strong> : indique la ligne courante dans le fichier.</p>
<p><code><br />
<? // voici un fichier exemple
echo ">Voici la ligne N°:".__LINE__;<br />
// devrait afficher 2<br />
?><br />
</code></p>
<p>Cette constante (variable pourtant&#8230;) peu s&rsquo;avérer très utile lors du debuggage de vos applications.<br />
<br />Le numéro de ligne correspond bien au numéro dans le fichier. Dans l&rsquo;exemple ci-dessus, en admettant que le fichier soit inclus dans un autre à la ligne 10, le résultat restera le même, c&rsquo;est à dire 2.</p>
<p><strong>__FILE__</strong> : Le chemin complet et le nom du fichier courant.</p>
<p>Au passage, les chemins d&rsquo;accès sous Windows sont avec des « \ » alors que sous Linux c&rsquo;est « / ». C&rsquo;est toujours bon de le savoir si vous souhaitez réaliser des applications compatibles pouvant s&rsquo;installer indépendamment de la plateforme, ou tout simplement si vous développez chez vous sous un système Windows et que le serveur de production est sous Linux.<br />
<br />Vous avez, depuis la version 4.0.6 de Php une constante <strong>DIRECTORY_SEPARATOR</strong> qui vous indique justement le séparateur utilisé. N&rsquo;hésitez donc pas à l&rsquo;utiliser.</p>
<p><strong>__FUNCTION__</strong> : le nom de de la fonction (à partir de Php 4.3.0)</p>
<p><code><br />
<?
function test1() <em><br />
	echo "> : ".__FUNCTION__;<br />
</em><br />
test1();<br />
?><br />
</code></p>
<p>Cet exemple affichera simplement <em>> : test1</em>.<br />
<br />Si vous affichez le contenu de cette constante alors que vous n&rsquo;êtes pas dans une fonction, vous n&rsquo;aurez rien.<br />
<br />Si vous vous trouvez dans une classe, ça ne change rien. Il faudra utiliser une autre constante pour connaître le nom de la classe courante.</p>
<p><strong>__CLASS__</strong> : le nom de la classe courante (à partir de Php 4.3.0)</p>
<p><code><br />
<?
class MaClasse <em><br />
	var $dummy;<br />
	function test() <em><br />
		echo "> : ".__CLASS__;<br />
	</em><br />
</em><br />
$a = new MaClasse();<br />
$a->test();<br />
?><br />
</code></p>
<p>Cet exemple affichera <em>> : MaClasse</em>.</p>
<p><strong>__METHOD__</strong> : le nom de la méthode courante (à partir de Php 5.0.0)</p>
<p>En reprenant l&rsquo;exemple précédent, on aura <em>> : MaClasse::test</em>.</p>
<p>Petite précision :</p>
<p><code><br />
<?
echo "> : __FILE__";<br />
?><br />
</code></p>
<p>Affichera <em>> : __FILE__</em>.</p>
<p>Il faut, en effet, concaténer la chaîne de caractères pour afficher ces constantes : </p>
<p><code><br />
<?
echo "> : ".__FILE__;<br />
?><br />
</code></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Optimisation : les boucles</title>
		<link>https://www.magazine-jeux.com/optimisation-les-boucles/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 20 Feb 2006 06:00:00 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/optimisation-les-boucles/</guid>

					<description><![CDATA[Savez-vous si une boucle FOR est plus rapide qu&#8217;une boucle WHILE ?! On s&#8217;est posé la question et nous avons fait des tests, voici les résultats ! Dans les exemples qui vont suivre, chaque boucle a été codée sur la même machine et les tests ont été réalisé un millier de fois pour obtenir une [&#8230;]]]></description>
										<content:encoded><![CDATA[<p class="post_excerpt">Savez-vous si une boucle FOR est plus rapide qu&rsquo;une boucle WHILE ?! On s&rsquo;est posé la question et nous avons fait des tests, voici les résultats !</p>
<p><span id="more-80"></span><br />
Dans les exemples qui vont suivre, chaque boucle a été codée sur la même machine et les tests ont été réalisé un millier de fois pour obtenir une moyenne.</p>
<p>Une boucle de test calibrée nous permet de valider ou non un test (cas ou la machine subirait une quelconque lenteur).</p>
<h2>Boucles FOR contre Boucle WHILE</h2>
<p>Lorsque l&rsquo;on a le choix entre boucle <em>for</em> ou <em>while</em>, il est interressant de voir si le choix a réellement un impact sur la vitesse d&rsquo;exécution du code.</p>
<p><code><br />
for($i=0;$i<500000;$i++) <em><br />
	$p = $p + 1;<br />
</em><br />
</code></p>
<p><strong>Temps moyen : 0.140 s</strong></p>
<p><code><br />
$i = 0;<br />
while($i<500000) <em><br />
	$p = $p + 1;<br />
	$i++;<br />
</em><br />
</code></p>
<p><strong>Temps moyen : 0.138 s</strong></p>
<p>Pas de différence notable donc.<br />
<br />Si vous avez le choix, tout est question de goût au final. Notez tout de même un point important lorsque vous programmez une boucle : le test de fin doit porter, si possible, non pas sur une égalité, mais plutôt sur un test de dépassement. Question de sécurité. Il est donc préférable d&rsquo;écrire <em>$i<500000</em> que <em>$i==500000</em>.</p>
<p>Continuons un peu pour pousser les tests plus loin. Nous allons changer juste le principe d&rsquo;incrémentation de notre boucle :</p>
<p><code><br />
for($i=0;$i<500000;++$i) <em><br />
	$p = $p + 1;<br />
</em><br />
</code></p>
<p><strong>Temps moyen : 0.128 s</strong></p>
<p>Il y a une différence ! Qu&rsquo;est-ce que l&rsquo;on a changé ? Juste l&rsquo;incrémentation du compteur. Le compteur est désormais en « Pré-incrémentation » (devant) au lieu de la « Post-incrémentation » (après).<br />
<br />En effet, la pré-incrémentation est plus rapide. Bon, faut pas crier victoire, le gain est très légé, voir innexploitable. Mais si toutefois vous avez de longs, très longs calculs à faire, vous aurez une petite solution d&rsquo;optimisation.</p>
<p>Voyons avec la boucle while maintenant :</p>
<p><code><br />
$i = 0;<br />
while($i<500000) <em><br />
	$p = $p + 1;<br />
	++$i;<br />
</em><br />
</code></p>
<p><strong>Temps moyen : 0.121 s</strong></p>
<p>On gagne encore un peu en temps d&rsquo;exécution.</p>
<p>Au passage, le fait de rajouter des commentaires dans la boucle ne change rien. Que ce soit des commentaires classique « // » ou des commentaires de type C « /*  */ ».</p>
<p>Nous continuerons ces tests de vitesse dans de prochains articles avec, notamment, des tests effectués sur des bases de données.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Le fichier .htaccess</title>
		<link>https://www.magazine-jeux.com/le-fichier-htaccess/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 30 Jan 2006 06:10:00 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/le-fichier-htaccess/</guid>

					<description><![CDATA[Sauf indication contraire, vos pages sont accessibles depuis internet et tout le monde peu les voir. Si vous réalisez un album de famille avec quelques photos personnelles, mieux vaut les protéger avant de les mettres sur votre site internet. Google aura vite fait de les indexer et de les rendre accessible sur son moteur (http://www.google.fr/advanced_image_search?hl=fr). [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Sauf indication contraire, vos pages sont accessibles depuis internet et tout le monde peu les voir. Si vous réalisez un album de famille avec quelques photos personnelles, mieux vaut les protéger avant de les mettres sur votre site internet. Google aura vite fait de les indexer et de les rendre accessible sur son moteur (<a href="http://www.google.fr/advanced_image_search?hl=fr">http://www.google.fr/advanced_image_search?hl=fr</a>).</p>
<p>Une façon simple de sécuriser un dossier est d&rsquo;utiliser un fichier .htaccess</p>
<h2>Authentification par mot de passe</h2>
<p>La première chose à faire sera de constituer une base de données, qui est en fait un simple fichier texte, et qui va contenir les identifiants et mots de passe pour chaque utilisateur.</p>
<p>Vous pouvez créer ces identifiants et mots de passe à l&rsquo;aide de notre générateur : <a href="http://www.magazine-jeux.com/outils-generateur-password.php">http://www.magazine-jeux.com/outils-generateur-password.php</a></p>
<p>Vous indiquez simplement l&rsquo;identifiant (Userid) et son mot de passe et vous cliquez sur « submit ». Le générateur vous renvoie une ligne avec votre identifiant, 2 points « : » et le mot de passe codé.</p>
<p>Par exemple, en choisissant « test » et le mot de passe « salut », vous aurez la ligne suivante : test:36gmBrB8PPTqM</p>
<p>Vous créez donc un fichier que vous nommez « .htpasswd » dans lequel vous placez la ligne que vous venez de générer. Petite astuce sous Windows qui a un peu de mal avec des noms de fichier vide : donnez un nom quelconque et renommez le après l&rsquo;avoir rempli.</p>
<p>Votre fichier contient donc :</p>
<p><code>test:36gmBrB8PPTqM</code></p>
<p>Vous pouvez rajouter autant de lignes que vous le souhaitez.</p>
<p>Si vous souhaitez ajouter par programmation les lignes dans ce fichier, vous pouvez utiliser la fonction « crypt » du php pour créer le mot de passe :</p>
<p><code><br />
<?
	$Password='salut';
	$Ligne="test:".crypt(trim($Password), CRYPT_STD_DES);
	$Fichier=fopen(".htpasswd","a+");
	fputs($Fichier,$Ligne);
	fclose($Fichier);
?><br />
</code></p>
<p>Il ne reste donc plus qu&rsquo;à créer le fichier .htaccess qui indiquera les droits et l&#8217;emplacement du fichier .htpasswd sur le serveur.</p>
<p><code><br />
AuthName message<br />
AuthUserFile /chemin_complet/www/monsite/.htpasswd<br />
AuthGroupFile /dev/null<br />
AuthType Basic</p>
<limit GET POST>
require valid-user<br />
</Limit><br />
</code></p>
<p>Donc, juste après <em>AuthName</em> vous trouverez le message que vous souhaitez afficher dans la boîte de dialogue qui s&rsquo;affichera pour demander l&rsquo;identifiant et le mot de passe.<br />
<br /><em>AuthUserFile</em> indique l&#8217;emplacement du fichier .htpasswd (que vous pouvez nommer autrement).<br />
<br /><em>AuthGroupFile</em> vous permet de définir l&#8217;emplacement du fichier groupe. En effet, il vous est possible de définir des groupes, ce qui peu s&rsquo;avérer très pratique lorsque vous êtes plusieurs à travailler sur un projet.</p>
<p>Exemple de fichier de groupe :</p>
<p><code><br />
administrateur: prelude marcel<br />
utilisateurs: paul jean laurent<br />
</code></p>
<p>Dans ce cas, vous indiquerez dans la ligne <em>require</em> un nom de groupe :</p>
<p><code>
<limit GET POST>
require group administrateur
</limit>
</code></p>
<p>Vous pouvez également spécifier une protection pour certains fichiers uniquement. Pour cela, placez votre code dans la directive <em>Files</em> en indiquant les fichiers concernés :</p>
<p><code><br />
<Files fichier1.htm fichier2.htm fichier3.htm></p>
<p>AuthUserFile / ...<br />
...</p>
<p></Files><br />
</code></p>
<p>Une petite précision importante avant de finir : le fichier .htpasswd pourrait être lu par n&rsquo;importe qui puis, décrypté assez rapidement à l&rsquo;aide d&rsquo;un programme tel que « John the Ripper ».<br />
<br />La méthode la plus simple consiste à placer le fichier .htpasswd dans un nouveau dossier lui-même protégé par un nouveau fichier .htaccess placé dans ce même dossier et contenant les lignes suivantes :</p>
<p><code><br />
AuthGroupFile /dev/null<br />
AuthName "Acces restreint"<br />
AuthType Basic</p>
<p>deny from all<br />
</code></p>
<p>Nous verrons d&rsquo;autres utilisations du fichier .htaccess dans de prochains articles.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
