<?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>Awelty : société de création de site - Référencement - Amiens, Somme, Picardie &#187; php</title>
	<atom:link href="http://www.awelty.fr/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.awelty.fr</link>
	<description>Agence web à Amiens</description>
	<lastBuildDate>Wed, 28 Jul 2010 14:49:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>De l&#8217;intérêt de la POO</title>
		<link>http://www.awelty.fr/developpement-web/interet-de-la-poo/</link>
		<comments>http://www.awelty.fr/developpement-web/interet-de-la-poo/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 06:37:00 +0000</pubDate>
		<dc:creator>Nicolas</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.awelty.fr/v5/e-monsite/interet-de-la-poo/</guid>
		<description><![CDATA[Depuis la démocratisation de php5, il est possible d&#8217;appréhender les projets web d&#8217;un point de vue &#171;&#160;Objet&#160;&#187;. Certes, ça n&#8217;est pas une révolution, et cette approche était déjà permise, dans une moindre mesure, avec php4. Le but ici n&#8217;est pas de promouvoir la POO à tout prix, simplement d&#8217;expliquer pourquoi ça peut être utile et [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1054" class="wp-caption alignnone" style="width: 570px"><img class="size-full wp-image-1054" title="Programmation PHP Orientée Objet sous Eclipse" src="http://www.awelty.fr/wp-content/uploads/2009/07/poo.gif" alt="Programmation PHP Orientée Objet sous Eclipse" width="560" height="180" /><p class="wp-caption-text">Programmation PHP Orientée Objet sous Eclipse</p></div>
<p>Depuis la démocratisation de php5, il est possible d&#8217;appréhender les projets web d&#8217;un point de vue &laquo;&nbsp;Objet&nbsp;&raquo;. Certes, ça n&#8217;est pas une révolution, et cette approche était déjà permise, dans une moindre mesure, avec php4. Le but ici n&#8217;est pas de promouvoir la POO à tout prix, simplement d&#8217;expliquer pourquoi ça peut être utile et comment ça peut être fun.</p>
<p>D&#8217;abord, la POO (Programmation Orientée Objet), ça n&#8217;a pas de particularité technique. En effet, il s&#8217;agit plus d&#8217;une manière de concevoir que d&#8217;une façon de coder. A ce titre,  on pourrait envisager de &laquo;&nbsp;coder objet&nbsp;&raquo; avec presque n&#8217;importe quel langage, et inversement, utiliser un langage objet sans avoir besoin de l&#8217;exploiter comme tel.</p>
<p>La POO donc, ça consiste entre autres, à se représenter un programme, un script, une application, dans l&#8217;espace plutôt que dans le temps. Grosso-modo, il s&#8217;agit de penser en terme d&#8217;objets, capables d&#8217;interagir entre eux, et pas de lignes de codes qui s&#8217;enchaineraient les unes après les autres.</p>
<p>La POO, ça permet de donner un semblant de <del>vie</del> comportement à des entités de données, de variables, de valeurs&#8230; qu&#8217;on appellera du coup des objets. A l&#8217;instant où j&#8217;écris ce billet, j&#8217;ai à l&#8217;écran une zone de texte pour le titre, une autre pour le texte, et un bouton pour enregistrer. Je peux dès lors considérer qu&#8217;un billet est un objet, doté d&#8217;un titre, d&#8217;un texte, et capable de s&#8217;enregistrer lorsqu&#8217;on lui demandera de le faire.</p>
<p>Sans entrer dans les détails, cette vision des choses offre de nombreux avantages, au nombre desquels on peut citer:</p>
<ul>
<li>la POO encourage le travail collaboratif.</li>
<li>la POO simplifie la maintenance.</li>
<li>la POO accroît la stabilité.</li>
<li>la POO assouplit le code.</li>
<li>la POO rend le travail plus agréable.</li>
</ul>
<p>En contrepartie:</p>
<ul>
<li>la POO est chronophage.</li>
<li>la POO consomme des ressources.</li>
<li>la POO n&#8217;aime pas l&#8217;approximation.</li>
</ul>
<p>Cependant, chacun de ces points est discutable, et s&#8217;il faut retenir quelque chose à propos de la POO, c&#8217;est qu&#8217;elle n&#8217;apporte rien qu&#8217;on ne se donne pas la peine d&#8217;implémenter. A contrario, elle offre un cadre de travail efficace, et encourage la réflexion, en délestant le programmeur de fastidieuses tâches de codage.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.awelty.fr/developpement-web/interet-de-la-poo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programmation Orientée Objet avec PHP 5</title>
		<link>http://www.awelty.fr/developpement-web/programmation-orientee-objet-php-5/</link>
		<comments>http://www.awelty.fr/developpement-web/programmation-orientee-objet-php-5/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 09:02:00 +0000</pubDate>
		<dc:creator>Arnaud-K</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[Coconews.com]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://www.awelty.fr/v5/e-monsite/programmation-orientee-objet-php-5/</guid>
		<description><![CDATA[La dernière version de PHP (version 5 ) offre davantage de possibilités pour la Programmation Orientée Objet (POO). Connaissant déjà cette méthode de programmation (avec d&#8217;autres langages tels JAVA ou C++), j&#8217;ai eu envie de m&#8217;y plonger et de voir ce que peut apporter la POO à un langage de programmation web (php dans mon [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">La dernière version de PHP (version 5 ) offre <strong>davantage de possibilités pour la Programmation Orientée Objet</strong> (POO). Connaissant déjà cette méthode de programmation (avec d&#8217;autres langages tels JAVA ou C++), j&#8217;ai eu envie de m&#8217;y plonger et de voir ce que peut apporter la POO à un langage de programmation web (php dans mon cas). J&#8217;ai donc commencé à programmer quelques fonctionnalités en objet pour les 3 portails de Coconews  : <a href="http://guadeloupe.coconews.com">Guadeloupe</a>, <a href="http://martinique.coconews.com">Martinique</a> et <a href="http://guyane.coconews.com">Guyane</a>. J&#8217;ai utilisé la POO pour développer la zone privilège (bientôt en ligne) et le support par ticket.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-1215" title="poo" src="http://www.awelty.fr/wp-content/uploads/2009/04/poo.png" alt="poo" width="500" height="168" /></p>
<p style="text-align: justify;">La POO est, comme son nom l&#8217;indique, basée sur la notion d&#8217;objet. <strong>Un objet possède des attributs</strong> (repésentant l&#8217;état de l&#8217;objet) <strong>et des méthodes </strong>(représentant des opérations applicables à l&#8217;objet). Toute la façon d&#8217;imaginer, de penser le code est remis en question par rapport au php classique (dit &laquo;&nbsp;procédural&nbsp;&raquo;). Il faut un petit temps d&#8217;adaptation pour faire du code réellement en objet. La difficulté provient du fait que l&#8217;on a parfois du mal à imaginer certaines notions virtuelles sous forme d&#8217;objet.</p>
<p style="text-align: justify;">Ce qui est appelée &laquo;&nbsp;classe&nbsp;&raquo;, est tout ce qui définit un objet. Un objet est unique (on parle ici d&#8217;<strong>instance ou d&#8217;occurence de classe</strong>) mais deux objets peuvent être instanciés à partir de la même classe. Donc la première chose à faire en POO, c&#8217;est de créer une classe (après avoir analyser le problème et savoir ce que l&#8217;on veut faire exactement. Voici sommairement la syntaxe à respecter pour créer une première classe (contenu du fichier MaClasse.class.php) :</p>
<pre style="text-align: justify;">class MaClasse {
	private $id;
	private $attribut;
	public function __construct($id= null, $attribut= null)
	{
		if(!empty($id)) {
			$this-&gt;id = $id;
		}
		if(!empty($attribut)) {
			$this-&gt;attribut = $attribut;
		}
	}

	public function affiche()
	{
		echo "L'attribut vaut $this-&gt;attribut";
	}
}</pre>
<h4 style="color: #ff6f00; text-align: justify;">Quelques explications sur la classe créée ci-dessus :</h4>
<ul style="text-align: justify;">
<li>Une des premières règles de la POO est que le nom de la classe doit commencer par une majuscule. Après avoir indiqué le nom de la classe, on définit les attributs de cette classe (ici les attributs sont id et attribut. La première fonction (__construct) est appelé <strong>le constructeur de la classe</strong>. C&#8217;est grâce à cette fonction que l&#8217;on peut créer un objet de cette classe en faisant simplement &laquo;&nbsp;new()&nbsp;&raquo; (voir ci-après).</li>
</ul>
<ul style="text-align: justify;">
<li>La variable $this est une variable spécifique à la POO, elle permet d&#8217;indiquer que c&#8217;est cet objet qui est modifié. $this-&gt;id correspond à l&#8217;attribut id de l&#8217;objet sur lequel on travaille.</li>
</ul>
<ul style="text-align: justify;">
<li>La deuxième fonction (affiche) est une <strong>méthode de l&#8217;objet</strong>, ici c&#8217;est une méthode toute simple qui permet d&#8217;afficher, avec une phrase, la valeur de l&#8217;attribut nommé attribut.</li>
</ul>
<p style="text-align: justify;">Une fois la classe créée, il faut pouvoir s&#8217;en servir et créer des objets de cette classe :</p>
<pre style="text-align: justify;">include("MaClasse.class.php");$objet = new MaClasse(1, 10);$objet-&gt;affiche();</pre>
<p style="text-align: justify;">La première ligne permet d&#8217;inclure le fichier contenant la classe. La deuxième instruction permet de<strong> créer un nouvel objet grâce à l&#8217;appel au constructeur</strong> avec le mot &laquo;&nbsp;new&nbsp;&raquo;. Après cette ligne, on a donc un objet MaClasse (nommé &laquo;&nbsp;$objet&nbsp;&raquo;) dont les attributs id et attribut ont respectivement 1 et 10 comme valeur. Enfin la dernière ligne affiche : &laquo;&nbsp;<em>L&#8217;attribut vaut 10</em>&laquo;&nbsp;.</p>
<p style="text-align: justify;">Voici donc le nécessaire pour débuter avec la POO en PHP. Malgré le temps d&#8217;adapation à la philosophie de la POO, cette technique de programmation fait gagner du temps. En effet, on se trouve, à la fin, avec un code <strong>plus compréhensible</strong> (surtout sur des gros projets), <strong>plus facilement réutilisable</strong> et surtout <strong>plus facilement maintenable</strong>.</p>
<p style="text-align: justify;">Enfin, je mets quelques liens qui m&#8217;ont permis de débuter avec la Programmation Orientée Objet en PHP. Je préfère apprendre avec des exemples concrets, donc la plupart de ces liens vous en présenteront :</p>
<ul style="text-align: justify;">
<li><a href="http://www.apprendre-php.com/forums/topic-75-poo-une-calculatrice-comme-exercice-de-pratique.html">Exemple : calculatrice</a> (apprendre-php.com, forum)</li>
<li><a href="http://www.clubic.com/forum/programmation/classes-en-php-et-methode-d-utilisation-id457962-page1.html">Classe sur des comptes utilisateurs</a> (clubic.com, forum)</li>
<li><a hreflang="en" href="http://nettuts.com/php/how-to-create-an-object-oriented-blog-using-php/">Créer un blog en POO</a> (nettuts.com, tutoriel)</li>
<li><a hreflang="en" href="http://nettuts.com/tutorials/php/real-world-oop-with-php-and-mysql/">POO et MySQL</a> (nettuts.com, tutoriel)</li>
<li><a hreflang="en" href="http://classes.scriptsphp.org/article.PHP-5-et-les-exceptions">Gestion des exceptions en PHP5</a> (scriptsphp.org, blog)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.awelty.fr/developpement-web/programmation-orientee-objet-php-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[PHP] Mise en cache d&#8217;un tableau de données SQL</title>
		<link>http://www.awelty.fr/developpement-web/php-mise-en-cache-d-un-tableau-de-donnees-sql/</link>
		<comments>http://www.awelty.fr/developpement-web/php-mise-en-cache-d-un-tableau-de-donnees-sql/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 19:00:00 +0000</pubDate>
		<dc:creator>Tony Samson</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[cache php]]></category>
		<category><![CDATA[mise en cache]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serialize]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.awelty.fr/v5/e-monsite/php-mise-en-cache-d-un-tableau-de-donnees-sql/</guid>
		<description><![CDATA[Pour faire suite à mon billet sur l&#8217;optimisation PHP/SQL d&#8217;un site web, voici une méthode pour mettre en cache des données issues d&#8217;une requête SQL de type SELECT.
Php propose deux fonctions aussi puissantes qu&#8217;utiles (mais aussi méconnues) : serialize et unserialize.

Serialialize compresse (linéarise) un tableau Php
Unserialize le décompresse (ou délinéarise), tout simplement.

A partir de là, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Pour faire suite à mon billet sur l&#8217;<a href="/index.php?post/2008/04/09/Des-pistes-pour-optimiser-les-performances-dacces-dun-site-web">optimisation PHP/SQL d&#8217;un site web</a>, voici une méthode pour mettre en cache des données issues d&#8217;une requête SQL de type SELECT.</p>
<p>Php propose deux fonctions aussi puissantes qu&#8217;utiles (mais aussi méconnues) : serialize et unserialize.</p>
<ul>
<li><a href="http://fr.php.net/serialize">Serialialize</a> compresse (<em>linéarise</em>) un tableau Php</li>
<li><a href="http://fr.php.net/manual/fr/function.unserialize.php">Unserialize</a> le décompresse (ou <em>délinéarise</em>), tout simplement.</li>
</ul>
<p style="text-align: justify;"><strong>A partir de là, l&#8217;idée paraît s&#8217;imposer d&#8217;elle même : </strong>pour certaines requêtes qui sont énormément exécutées et/ou qui sont très lourdes (par exemple les données d&#8217;un membre utilisées sur toutes les pages d&#8217;un site), pourquoi ne pas mettre en cache le tableau issu d&#8217;un mysql_fetch_array() ? Ainsi, une fois que la requête a été exécuté on n&#8217;accède plus à la base de donnée, on récupère le tableau de données dans un fichier texte puis on le décompresse.</p>
<p>La première fonction permet, tout simplement, d&#8217;écrire dans un fichier (en le créant, le cas échéant) :</p>
<p><code>&lt;?<br />
function maj_fichier($file,$valeur)<br />
{<br />
$fp = fopen("$file","w+"); // ouverture du fichier en écriture (on le créé s'il n'existe pas)<br />
fputs($fp, $valeur); // on écrit dans le fichier<br />
fclose($fp);<br />
}<br />
?&gt;</code></p>
<p>La seconde &#8211; et c&#8217;est la fonction qui nous intéresse &#8211; est la fonction de mise en cache :</p>
<p>(pour l&#8217;utiliser vous aurez besoin de la fonction maj_fichier() ci-dessus et de la fonction requete_sql disponible sur <a href="/index.php?post/2008/07/23/4-fonctions-php-pour-effectuer-des-requetes-SQL">ce billet</a>)</p>
<p><code>&lt;?<br />
function MiseEnCache($nomFichier,$table,$where,$champs)<br />
{</code></p>
<p>if(file_exists($nomFichier)) // si les variables sont en cache<br />
{<br />
$requete = unserialize(lire_fichier($nomFichier)); // on utilise le fichier cache (unserialize = decompresser le tableau)<br />
}<br />
else // sinon on fait la requete sql<br />
{<br />
$requete = requete_sql($table, $champs, $where);<br />
maj_fichier($nomFichier, serialize($requete)); // on place le resultat du tableau dans un fichier (serialize = compresser le tableau)<br />
}</p>
<p>return $requete;<br />
}<br />
?&gt;</p>
<p>Exemple d&#8217;utilisation :</p>
<p><code>&lt;?<br />
$req_membre=MiseEnCache("/cache/membres/membre-".$id_membre.".txt","membres", "id='$id_membre'", "prenom,nom,date_inscription,login");</code></p>
<p>echo&nbsp;&raquo;Bienvenue &laquo;&nbsp;.$req_membre[prenom].&nbsp;&raquo; &laquo;&nbsp;.$req_membre[nom].&nbsp;&raquo; !&nbsp;&raquo;;<br />
?&gt;</p>
<p style="text-align: justify;">Cet exemple permet de pouvoir afficher sur toutes les pages le prénom et le nom du membre en effectuant la requête qu&#8217;une seule fois ! Malin n&#8217;est-ce pas ?</p>
<p style="text-align: justify;">Mais bien sur vous-vous dites : et si le membre modifie son nom, l&#8217;information sera erronée ?</p>
<p style="text-align: justify;">La réponse est simple : il suffit de supprimer le fichier texte lors de la modification des informations pour le régénérer avec les bonnes !!</p>
<p style="text-align: justify;">Il y a néanmoins une limitation à l&#8217;utilisation de ce procédé : ne l&#8217;utilisez pas pour des données sensibles (mot de passe, email, etc.) car un fichier texte est beaucoup plus facilement accessible pour un pirate qu&#8217;une base de données&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.awelty.fr/developpement-web/php-mise-en-cache-d-un-tableau-de-donnees-sql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[PHP/SQL] Géolocalisation et distance entre des villes</title>
		<link>http://www.awelty.fr/developpement-web/php/</link>
		<comments>http://www.awelty.fr/developpement-web/php/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 12:12:00 +0000</pubDate>
		<dc:creator>Tony Samson</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[api google map]]></category>
		<category><![CDATA[api yahoo map]]></category>
		<category><![CDATA[géolocalisation]]></category>
		<category><![CDATA[local]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[recherche de proximité]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.awelty.fr/v5/e-monsite/php/</guid>
		<description><![CDATA[<p><img style="margin: 0 auto; display: block;" alt="" src="../public/geolocalisation-proximite-php-sql.png" /></p> <p> J'ai besoin pour un développement spécifique mais aussi pour <a href="http://www.agendaculturel.fr/">Agenda Culturel</a> de pouvoir lister dans un script PHP les villes à proximité d'une ville donnée. Concrètement, cela signifie afficher les villes situées à l'intérieur d'un périmètre d'une distance de X kilomètres de la ville de référence.</p> <p>J'ai longuement cherché sur le web, et je n'ai trouvé que peu d'infos à ce sujet. Je vous livre ici le résultat de mes recherches et de mes multiples tests, de l'intégration des coordonnées de latitude/longitude à l'aide des API de géolocalisation google map et yahoo map jusqu'à la requête sql finale qui inclue la formule de calcul de distance à partir des coordonnées géolocalisées.</p>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">J&#8217;ai besoin pour un développement spécifique mais aussi pour <a href="http://www.agendaculturel.fr/">Agenda Culturel</a> de pouvoir lister dans un script PHP les villes à proximité d&#8217;une ville donnée. Concrètement, cela signifie afficher les villes situées à l&#8217;intérieur d&#8217;un périmètre d&#8217;une distance de X kilomètres de la ville de référence.</p>
<p style="text-align: justify;">J&#8217;ai longuement cherché sur le web, et je n&#8217;ai trouvé que peu d&#8217;infos à ce sujet. Je vous livre ici le résultat de mes recherches et de mes multiples tests, de l&#8217;intégration des coordonnées de latitude/longitude à l&#8217;aide des API de géolocalisation google map et yahoo map jusqu&#8217;à la requête sql finale qui inclue la formule de calcul de distance à partir des coordonnées géolocalisées.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-1559" title="geolocalisation-proximite-php-sql" src="http://www.awelty.fr/wp-content/uploads/2008/09/geolocalisation-proximite-php-sql.png" alt="geolocalisation-proximite-php-sql" width="500" height="278" /></p>
<p style="text-align: justify;">
<h3 style="text-align: justify;"><strong>Une base de donnée fiable des villes associées à leurs coordonnées de latitude/longitude</strong></h3>
<p style="text-align: justify;">En premier lieu, il s&#8217;agit d&#8217;avoir une base de données de villes. Il en existe de nombreuses sur le net, <a href="http://www.galichon.com/codesgeo/">celle-ci</a> intègre même les coordonnées de latitude et de longitude.</p>
<p style="text-align: justify;">Dans mon cas, je possédais déjà une base de données de villes françaises mais sans ces coordonnées. La meilleure méthode pour y intégrer la latitude et la longitude de chaque ville est d&#8217;utiliser l&#8217;API de <a href="http://developer.yahoo.com/maps/rest/V1/geocode.html">Yahoo</a> ou de <a href="http://code.google.com/apis/maps/documentation/services.html#Geocoding/">google</a>.</p>
<p style="text-align: justify;">Ces deux API permettent de récupérer un flux XML correspondant à la recherche (ex : <a href="http://local.yahooapis.com/MapsService/V1/geocode?city=amiens&amp;country=france&amp;out=xml&amp;appid=BlocCleverAge">Amiens, France</a>) contenant la latitude et la longitude.</p>
<p style="text-align: justify;">Par exemple, voici le résultat de la recherche de la ville d&#8217;<a href="http://www.amiens-annuaire.fr/">Amiens</a> avec l&#8217;API de Yahoo :</p>
<p style="text-align: justify;"><code>&lt;ResultSet xsi:schemaLocation="urn:yahoo:maps http://api.local.yahoo.com/MapsService/V1/GeocodeResponse.xsd"&gt;<br />
&lt;Result precision="zip"&gt;<br />
&lt;Latitude&gt;49.896309&lt;/Latitude&gt;<br />
&lt;Longitude&gt;2.279720&lt;/Longitude&gt;<br />
&lt;City&gt;80000 Amiens&lt;/City&gt;<br />
&lt;State&gt;France&lt;/State&gt;<br />
&lt;Country&gt;FR&lt;/Country&gt;<br />
&lt;/Result&gt;<br />
&lt;/ResultSet&gt;</code></p>
<p style="text-align: justify;">Il n&#8217;y a donc plus qu&#8217;à faire une boucle sql sur la table des villes en parsant le flux de yahoo ou google correspondant (en indiquant la ville, le code postal et le pays) et intégrer à l&#8217;enregistrement de la ville la latitude et la longitude. Un vrai jeu d&#8217;enfant avec <a href="http://fr.php.net/simplexml">simplexml</a> en php5 ! Cependant, même si ces API sont puissantes, il se peut que parfois la ville ne soit pas trouvée, que la ville retournée ne soit pas la bonne ou que plusieurs résultats soient retournés. Pour plus d&#8217;informations, et pour choisir entre les API de Yahoo et de Google, je vous invite à lire cet article sur <a href="http://www.clever-age.com/veille/blog/geolocalisation-google-vs.-yahoo.html">la géolocalisation via yahoo et google map</a> très bien fait et qui m&#8217;a bien aidé.</p>
<p style="text-align: justify;">Vous avez à présent une table contenant les villes associées à leurs coordonnées géographique de latitude et de longitude.</p>
<p style="text-align: justify;"><strong><br />
</strong></p>
<h3 style="text-align: justify;"><strong>Il ne reste plus qu&#8217;à exploiter cela dans une requête SQL et afficher le tout en PHP.</strong></h3>
<p style="text-align: justify;">J&#8217;ai d&#8217;abord tenté une conversion des données latitude/longitude en points de coordonnées lambert 2 étendue (norme française) grâce à la fonction geos2lambert() disponible sur <a href="http://code.google.com/p/geocodage/source/browse/trunk/include/geocoding.class.php?r=8">google code</a> mais son exploitation s&#8217;est révélé compliquée et imprécise (ou alors c&#8217;est moi qui suis vraiment nul en maths !).</p>
<p style="text-align: justify;">Je suis donc reparti sur les données de latitude/longitude. Grâce à une formule mathématique complexe trouvée sur le net je suis arrivé au résultat suivant.</p>
<p style="text-align: justify;">Je reçois en variable GET les coordonnées de ma ville de référence :</p>
<p style="text-align: justify;"><code>$latitude=$_GET[lat];<br />
$longitude=$_GET[lon];</code></p>
<p style="text-align: justify;">La fameuse formule utilisant les colonnes lat et lon de ma table sql et les données de latitude et longitude de ma ville de référence :</p>
<p style="text-align: justify;"><code>$formule="(6366*acos(cos(radians($latitude))*cos(radians(`lat`))*cos(radians(`lon`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lat`))))";</code></p>
<p style="text-align: justify;">Et la requête SQL prête à être exécutée :</p>
<p style="text-align: justify;"><code>$sql="SELECT ville,$formule AS dist FROM ville WHERE $formule&lt;='$_GET[distance]' ORDER by dist ASC";</code></p>
<ul style="text-align: justify;">
<li>le <em>SELECT $formule AS dist</em> permet de classer les villes de la plus proche à la plus éloignée avec <em>ORDER by dist ASC</em></li>
<li>le <em>WHERE $formule&lt;=&#8217;$_GET[distance]&#8216; </em> permet de définir un rayon en km (<em>$_GET[distance]</em>) à partir de la ville de référence</li>
</ul>
<p style="text-align: justify;">Je vous laisse coder l&#8217;éxécution de la requête sql et l&#8217;affichage des données en php, ce n&#8217;est pas vraiment le plus dur !</p>
<p style="text-align: justify;">Vous pouvez voir le résultat sur <a href="/immo80/dev/villesreq.php?distance=15&amp;lat=49.896309&amp;lon=2.27972">cette page</a>. La ville de référence est ici Amiens avec un périmètre de 15 km.</p>
<p style="text-align: justify;"><strong><br />
</strong></p>
<h3 style="text-align: justify;"><strong>En guise de conclusion&#8230;</strong></h3>
<p style="text-align: justify;">Il faut savoir que ce calcul et le résultat ne sont pas précis pour plusieurs raisons :</p>
<ul style="text-align: justify;">
<li>Le calcul ne tient pas compte de l&#8217;altitude, qui, dans certains endroits peut influer sur les distances</li>
<li>La formule a été simplifiée au maximum par souci de simplicité et d&#8217;efficacité.</li>
<li>La distance est &laquo;&nbsp;à vol d&#8217;oiseau&nbsp;&raquo; et non pas une distance routière</li>
<li>La localisation latitude/longitude d&#8217;une ville repose sur un point (généralement la mairie de la ville en question), donc la distance ne commence pas à la sortie de la ville mais du centre de la ville. Ainsi, par exemple, pour Paris cela ne sert à rien de vouloir localiser les villes à 5km&#8230;</li>
</ul>
<p style="text-align: justify;">Cependant, malgré l&#8217;imprécision cela fonctionne, car l&#8217;intérêt premier est d&#8217;afficher les villes proches et non de concurrencer google map ! Il convient juste de ne pas forcément afficher les distances en km qui sont souvent fausses (à quelques kilomètres près).</p>
<p style="text-align: justify;">L&#8217;utilisation de cette technique qui est finalement assez simple à mettre en place peut être très utile sur du web local afin d&#8217;élargir les recherches sur une ville aux villes à proximité (dans le cas où aucune réponse n&#8217;est disponible pour la ville concernée par exemple) ou proposer d&#8217;autres villes ou contenus (ou publicités géolocalisées !) à l&#8217;internautes en rapport avec sa requête.</p>
<p style="text-align: justify;"><strong>Si vous avez des questions sur la mise en place d&#8217;une recherche de proximité ou si cet article vous a aidé, n&#8217;hésitez pas, les commentaires sont fait pour ça !</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.awelty.fr/developpement-web/php/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>4 fonctions php pour effectuer des requêtes SQL</title>
		<link>http://www.awelty.fr/developpement-web/4-fonctions-php-pour-effectuer-des-requetes-sql/</link>
		<comments>http://www.awelty.fr/developpement-web/4-fonctions-php-pour-effectuer-des-requetes-sql/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 10:33:00 +0000</pubDate>
		<dc:creator>Tony Samson</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuces]]></category>
		<category><![CDATA[fonctions php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.awelty.fr/v5/e-monsite/4-fonctions-php-pour-effectuer-des-requetes-sql/</guid>
		<description><![CDATA[<p>Je vais essayer de donner régulièrement des astuces de programmation php/sql sur ce blog. Ainsi, je vais m'éfforcer de publier les fonctions php que j'utilise pour me faciliter le développement, des astuces d'<a href="../index.php?post/2008/04/09/Des-pistes-pour-optimiser-les-performances-dacces-dun-site-web">optimisation</a>, des méthodes de développement, etc.</p> <p>Pour inaugurer cette partie, je vous fournis 4 fonctions (+ 2 variantes) bien utiles pour faire des traitements SQL de base à savoir : SELECT, INSERT, UPDATE et DELETE.</p> <p>Ces fonctions sont finalement assez simples, mais ça fait gagner du temps. De plus, ce genre de fonction permet d'opérer des changements sur toutes les requêtes identiques très simplement (ex : en cas de changement de système de base de données).</p> <p><strong>Insérer un enregistrement :</strong></p> <p><code>function inserer_sql($table,$champs,$donnees)<br />{<br />$sql = "INSERT INTO $table ($champs) ";<br />$sql .= "VALUES ($donnees)";<br /><br />&#160;&#160;&#160; if(mysql_query($sql))<br />&#160;&#160;&#160; {<br />&#160;&#160;&#160; return true;<br />&#160;&#160;&#160; }<br />&#160;&#160;&#160; else<br />&#160;&#160;&#160; {<br />&#160;&#160;&#160; return false;<br />&#160;&#160;&#160; }<br />}</code></p> <p>Et pour l'utiliser, c'est tout aussi simple. Par exemple :</p> <p><code>if(inserer_sql("utilisateurs","email,nom,prenom",<br />"'$_POST[email]','$_POST[nom]','$_POST[prenom]'"))<br />echo"L'ajout a été effectué avec succès";<br />else echo"L'ajout a échoué";</code></p>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Je vais essayer de donner régulièrement des astuces de programmation php/sql sur ce blog. Ainsi, je vais m&#8217;efforcer de publier les fonctions php que j&#8217;utilise pour me faciliter le développement, des astuces d&#8217;<a href="http://www.awelty.fr/developpement-web/des-pistes-pour-optimiser-les-performances-dacces-dun-site-web/">optimisation</a>, des méthodes de développement, etc.</p>
<p style="text-align: justify;">Pour inaugurer cette partie, je vous fournis 4 fonctions (+ 2 variantes) bien utiles pour faire des traitements SQL de base à savoir : SELECT, INSERT, UPDATE et DELETE.</p>
<p style="text-align: justify;">Ces fonctions sont finalement assez simples, mais ça fait gagner du temps. De plus, ce genre de fonction permet d&#8217;opérer des changements sur toutes les requêtes identiques très simplement (ex : en cas de changement de système de base de données).</p>
<p style="text-align: justify;"><strong>Insérer un enregistrement :</strong></p>
<p style="text-align: justify;"><code>function inserer_sql($table,$champs,$donnees)<br />
{<br />
$sql = "INSERT INTO $table ($champs) ";<br />
$sql .= "VALUES ($donnees)";</code></p>
<p style="text-align: justify;">if(mysql_query($sql))<br />
{<br />
return true;<br />
}<br />
else<br />
{<br />
return false;<br />
}<br />
}</p>
<p style="text-align: justify;">Et pour l&#8217;utiliser, c&#8217;est tout aussi simple. Par exemple :</p>
<p style="text-align: justify;"><code>if(inserer_sql("utilisateurs","email,nom,prenom",<br />
"'$_POST[email]','$_POST[nom]','$_POST[prenom]'"))<br />
echo"L'ajout a été effectué avec succès";<br />
else echo"L'ajout a échoué";</code></p>
<p style="text-align: justify;">Ensuite, pour gagner du temps j&#8217;utilise une autre fonction qui n&#8217;a comme arguments que le nom de la table et la liste des champs à ajouter (sous forme de tableau). Cela suppose bien sur une correspondance des champs du formulaire (données POST) et des champs de la table :</p>
<p style="text-align: justify;"><code>function inserer_sql_array($table,$array)<br />
{<br />
$req="";<br />
$i=1;<br />
foreach($array as $k)<br />
{</code></p>
<p>if($i!=&#8217;1&#8242;) { $req.=&nbsp;&raquo;, &laquo;&nbsp;; $req2.=&nbsp;&raquo;, &laquo;&nbsp;; }</p>
<p>$req.=&nbsp;&raquo;$k&nbsp;&raquo;;<br />
$req2.=&nbsp;&raquo;&#8216;$_POST[$k]&#8216;&nbsp;&raquo;;<br />
$i++;<br />
}</p>
<p style="text-align: justify;">return inserer_sql($table,$req,$req2);<br />
}</p>
<p style="text-align: justify;">Il suffit de l&#8217;utiliser comme ceci :</p>
<p style="text-align: justify;"><code>if(inserer_sql_array("utilisateurs",array("email,nom,prenom"))<br />
echo"L'ajout a été effectué avec succès";<br />
else echo"L'ajout a échoué";</code></p>
<p style="text-align: justify;"><strong>Modification de données :</strong></p>
<p style="text-align: justify;">Sur le même principe que pour l&#8217;ajout j&#8217;ai cette fonction :</p>
<p style="text-align: justify;"><code>function maj_sql($table,$action,$where)<br />
{<br />
if($where=='') { $where=1; }</code></p>
<p style="text-align: justify;">$sql = &laquo;&nbsp;UPDATE $table SET $action &laquo;&nbsp;;<br />
$sql .= &laquo;&nbsp;WHERE $where&nbsp;&raquo;;</p>
<p style="text-align: justify;">if(mysql_query($sql))<br />
{<br />
return true;<br />
}<br />
else<br />
{<br />
return false;<br />
}<br />
}</p>
<p style="text-align: justify;">Dans cette fonction, il est permis de modifier tous les enregistrements d&#8217;une table (en laissant l&#8217;argument $where à vide). Mais, par mesure de sécurité, on peut désactiver cela en testant la variable $where au début et en renvoyant <strong>false</strong> si elle est vide.</p>
<p style="text-align: justify;">Pour utiliser cette fonction, il suffit de tester que la fonction renvoie bien <strong>true.</strong></p>
<p style="text-align: justify;">La variante de cette fonction qui génère la requête à partir d&#8217;un tableau array() :</p>
<p style="text-align: justify;"><code>function maj_sql_array($table,$array,$where)<br />
{<br />
$req="";<br />
$i=1;<br />
foreach($array as $k)<br />
{<br />
if($i!='1') $req.=", ";</code></p>
<p>$req.=&nbsp;&raquo;$k=&#8217;$_POST[$k]&#8216;&nbsp;&raquo;;<br />
$i++;<br />
}</p>
<p style="text-align: justify;">maj_sql($table,$req,$where);<br />
}</p>
<p style="text-align: justify;"><strong>Suppression de données :</strong></p>
<p style="text-align: justify;">Cette fonction permet de supprimer un ou plusieurs enregistrements dans une table en précisant uniquement la table et la condition à remplir. Cependant, par mesure de sécurité, il est impossible de ne pas préciser de condition (cela supprimerait tous les enregistrements de la table) :</p>
<p style="text-align: justify;"><code>function sup_sql($table,$where)<br />
{</code></p>
<p style="text-align: justify;">if($where==&nbsp;&raquo;) {<br />
return false;<br />
}<br />
else<br />
{<br />
$sql = &laquo;&nbsp;DELETE FROM $table &laquo;&nbsp;;<br />
$sql .= &laquo;&nbsp;WHERE $where&nbsp;&raquo;;</p>
<p style="text-align: justify;">if(mysql_query($sql))<br />
{<br />
return true;<br />
}<br />
else<br />
{<br />
return false;<br />
}<br />
}<br />
}</p>
<p style="text-align: justify;"><strong>Lire une ligne d&#8217;une table</strong> :</p>
<p style="text-align: justify;">Enfin, la dernière fonction permet d&#8217;extraire les données d&#8217;un enregistrement d&#8217;une table. C&#8217;est bien sûr en fait un simple SELECT mais comme pour les autres fonctions, cela permet de gagner du temps.</p>
<p style="text-align: justify;"><code>function requete_sql($table,$champs,$where)<br />
{<br />
// si $where est vide on lui attribue une valeur par défaut<br />
if($where=='') { $where=1; }</code></p>
<p style="text-align: justify;">// en cas de jointure on utilise le nom de la première table pour le tri par ID.<br />
$tab=explode(&laquo;&nbsp;,&nbsp;&raquo;,$table);</p>
<p style="text-align: justify;">$sql = &laquo;&nbsp;select $champs from $table where $where ORDER by $tab[0].id DESC LIMIT 1&#8243;;<br />
$p = mysql_query($sql)OR DIE(&laquo;&nbsp;Erreur sur la requete SELECT $champs FROM $table WHERE $where&nbsp;&raquo;);<br />
return mysql_fetch_array($p);<br />
}</p>
<p style="text-align: justify;">Le résultat de cette fonction est un tableau contenant les données précisées dans l&#8217;argument $champs. Exemple :</p>
<p style="text-align: justify;"><code>$requete=requete_sql("utilisateurs","nom,prenom,email","id='$_GET[user]'");<br />
echo"Bonjour ".$requete[prenom]." !";</code></p>
<p style="text-align: justify;">En bonus, voici la fonction qui permet de compter le nombre d&#8217;enregistrements dans une table pour une condition précise. Cette fonction effectue un mysql_numrows sur une requête SELECT. Les puristes préféreraient sans doûte un SELECT count(id), cependant, il me semble que ma méthode est moins lourde :</p>
<p style="text-align: justify;"><code>function compter_sql($table,$where)<br />
{<br />
if($where=='') { $where=1; }<br />
$sql = "select id from $table where $where";<br />
$p = mysql_query($sql)OR DIE("Erreur sur la requete SELECT id FROM $table WHERE $where");<br />
return mysql_numrows($p);<br />
}</code></p>
<p style="text-align: justify;">Cette fonction suppose que vous avez une colonne <strong>id</strong> dans votre table puisque le SELECT est effectué dessus. Pour l&#8217;utiliser, rien de plus simple :</p>
<p style="text-align: justify;"><code>$nb_utilisateurs_hommes = compter_sql("utilisateurs","sexe='H'");</code></p>
<p style="text-align: justify;"><strong>Conclusion :</strong></p>
<p style="text-align: justify;">Ces petites fonctions ne sont pas révolutionnaires en soit puisqu&#8217;elles reprennent les principes de base de SQL. Cependant, et ce n&#8217;est pas négligeable, elles permettent réellement de gagner du temps car elles sont plus rapides à écrire et plus faciles à retenir (je retiens mieux des noms de fonction en français qu&#8217;en anglais).</p>
<p style="text-align: justify;">Bien sûr, elles ne sont pas parfaites, il faudrait protéger les données à insérer ou à modifier par des htmlspecialchars() et addslashes(). Mais pour ça, c&#8217;est à vous de jouer, je ne vais pas vous prémacher tout le travail non plus !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.awelty.fr/developpement-web/4-fonctions-php-pour-effectuer-des-requetes-sql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Des pistes pour optimiser les performances d&#8217;accès d&#8217;un site web</title>
		<link>http://www.awelty.fr/developpement-web/des-pistes-pour-optimiser-les-performances-dacces-dun-site-web/</link>
		<comments>http://www.awelty.fr/developpement-web/des-pistes-pour-optimiser-les-performances-dacces-dun-site-web/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 12:19:00 +0000</pubDate>
		<dc:creator>Tony Samson</dc:creator>
				<category><![CDATA[Développement Web]]></category>
		<category><![CDATA[astuces]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.awelty.fr/v5/e-monsite/des-pistes-pour-optimiser-les-performances-dacces-dun-site-web/</guid>
		<description><![CDATA[Les difficultés rencontrées avec un site à fort trafic (E-monsite en est un bon exemple) sont compliquées à gérer. Il y a d&#8217;un côté la partie matérielle qui doit être suffisante, et d&#8217;un autre côté la partie développement qui doit être optimale. C&#8217;est ce second point que je vais aborder dans ce billet qui regroupe [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Les difficultés rencontrées avec un site à fort trafic (<a title="Creer un site Internet" href="http://www.e-monsite.com">E-monsite</a> en est un bon exemple) sont compliquées à gérer. Il y a d&#8217;un côté la partie matérielle qui doit être suffisante, et d&#8217;un autre côté la partie développement qui doit être optimale. C&#8217;est ce second point que je vais aborder dans ce billet qui regroupe toutes les techniques et astuces que j&#8217;utilise afin de soulager la charge du serveur.</p>
<ul style="text-align: justify;">
<li> Bien penser la structure de sa base de données avant le développement afin de réduire au maximum le nombre de requêtes SQL dans le développement (par exemple, ne pas hésiter à créer une colonne contenant le nombre de messages postés par un utilisateur &#8211; qui sera remis à jour à chaque message qu&#8217;il postera &#8211; plutôt que de faire un mysql_num_rows à chaque affichage de ce nombre).</li>
</ul>
<ul style="text-align: justify;">
<li>Mettre en cache tout ou une partie du contenu (stocker la page dans un fichier html et l&#8217;afficher s&#8217;il existe ou sinon affichage de la page php et génération du cache).</li>
</ul>
<ul style="text-align: justify;">
<li>Mettre en cache des variables avec les fonctions serialize et unserialize. Cela permet par exemple de mettre en cache le résultat d&#8217;un mysql_fetch_array assez lourd appelé sur chaque page (comme des variables sur l&#8217;utilisateur ou le contenu de menus&#8230;). J&#8217;y reviendrais plus en détail dans un prochain billet.</li>
</ul>
<ul style="text-align: justify;">
<li>Optimiser les requêtes SQL : utiliser les jointures (SELECT sur plusieurs table ayant des champs en communs) et ne pas faire de SELECT * (select sur tous les champs) mais lister les champs utilisés (SELECT id,login,nom FROM &#8230;).</li>
</ul>
<ul style="text-align: justify;">
<li>Mettre des index intelligents sur les tables SQL. Les index permettent un gain de temps d&#8217;accès énorme. Il faut les placer sur les colonnes utilisées dans la clause WHERE.</li>
</ul>
<ul style="text-align: justify;">
<li>Compresser vos pages web, fichiers CSS et javascripts à l&#8217;aide de la fonction gzip de php. Vous trouverez sur <a href="http://aciddrop.com/2008/01/21/boost-your-website-load-time-with-3-lines-of-code/">ce site</a> une classe complète pour compresser vos pages. Cela peut paraître idiot à l&#8217;heure du haut débit : il faut optimiser le poids des images car des images lourdes ralentissent malgré tout le chargement de la page.</li>
</ul>
<ul style="text-align: justify;">
<li>Vérifier qu&#8217;un script, notamment de régie publicitaire, ne ralentit pas l&#8217;affichage de la page. Cela arrive fréquemment et certaines régies sont championnes dans ce domaine !</li>
</ul>
<p style="text-align: justify;">
<p style="text-align: justify;">N&#8217;hésitez pas à compléter si j&#8217;ai oublié des choses <img src='http://www.awelty.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.awelty.fr/developpement-web/des-pistes-pour-optimiser-les-performances-dacces-dun-site-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
