<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Mes articles</title>
    <description>Derniers articles</description>
    <link>https://www.sarramegna.fr/</link>
    <lastBuildDate>Sun, 08 Mar 2026 03:43:51 +0000</lastBuildDate>
    <item>
      <title><![CDATA[Script d'ajout d'un champ dans une table]]></title>
      <description><![CDATA[<p>La principale bonne pratique lors de la rédaction d'un script SQL d'installation ou de mise à jour d'une base de données est que celui-ci soit réexécutable à l'infini sans corrompre la base de données.</p>
<p>Parmi les erreurs à éviter il y a :
<ul>
    <li>Ajout de lignes à chaque exécution d'un script avec des INSERT</li>
    <li>Erreur lorsque qu'une table ou une procédure stockée doit être créée et qu'elle existe déjà</li>
    <li>Et j'en passe...</li>
</ul>
<p>Aujourd'hui je souhaitais donc partager une petite astuce lorsque vous avez besoin de modifier la structure d'une table en y ajoutant un champ supplémentaire. Si vous tenter d'éxécuter plusieurs fois le script suivant, vous aurez à partir de la seconde fois une belle erreur SQL.</p>
<pre><code class="sql">ALTER TABLE `matable` ADD `monchamp` INT(0) NOT NULL ;</code></pre>
<p>L'astuce est de créer une procédure stockée à la volée qui va se charger de vérifier si le champ n'existe pas et, le cas échéant, de le créer. Voici la formule magique.</p>
<pre><code class="sql">-- On supprime la procédure stockée si elle existe déjà, afin d'éviter les erreurs et l'obsolescence de celle-ci
DROP PROCEDURE IF EXISTS AddColumnIfNotExists;
DELIMITER $$

CREATE PROCEDURE AddColumnIfNotExists(IN dbName tinytext, IN tableName tinytext, IN fieldName tinytext, IN fieldDef text)
BEGIN
	-- On vérifie si le champ existe déjà pour la base de données et la table données
	IF NOT EXISTS (
		SELECT * 
		FROM INFORMATION_SCHEMA.COLUMNS
		WHERE column_name = fieldName
		AND table_name = tableName
		AND table_schema = dbName
	)
	THEN
		-- On ajoute le champ s'il n'existe pas déjà
		SET @ddl = CONCAT('ALTER TABLE `', dbName, '`.`', tableName, '` ADD `', fieldName, '` ', fieldDef, ';');
		PREPARE stmt FROM @ddl;
		EXECUTE stmt;
	END IF;
END $$

DELIMITER ;

-- On appelle la procédure stockée pour ajouter le champ à la table si nécessaire (Database() renvoie le nom de la base de données en cours)
CALL AddColumnIfNotExists(Database(), 'matable', 'monchamp', 'INT(0) NOT NULL');

-- On supprime la procédure stockée pour éviter qu'elle n'encombre la base de données pour rien
DROP PROCEDURE AddColumnIfNotExists;</code></pre>
<p>Voilà, c'est aussi simple que ça.</p>
]]></description>
      <link>https://www.sarramegna.fr/post/script-d-ajout-d-un-champ-dans-une-table</link>
      <pubDate>Mon, 07 Dec 2015 14:37:30 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Windows 10 empeche votre serveur web de fonctionner]]></title>
      <description><![CDATA[<p>Si comme moi, vous vous êtes confronté à un serveur web (apache dans mon cas) écoutant sur le port 80 qui ne veut pas se lancer suite à une migration vers Windows 10, vous êtes sûrement dans le même cas que moi. Mais ne vous inquiétez pas, il est facile de résoudre ce problème.</p>
<p>Dans un premier temps, lancer l'outil de test de Wampserver (dans l'icone de la barre de tâche : Apache &gt; Service &gt; Tester le Port 80) si vous utilisez cet environnement, ou éxecuter le script PHP suivant grâce à la commande :</p>
<pre><code class="shell">php -n -f testPort.php</code></pre>
<p>Fichier <strong>testPort.php</strong> :</p>
<pre><code class="php">&lt;?php
$fp = @fsockopen(&quot;127.0.0.1&quot;, 80, $errno, $errstr, 1);
   $out = &quot;GET / HTTP/1.1rn&quot;;
   $out .= &quot;Host: 127.0.0.1rn&quot;;
   $out .= &quot;Connection: Closernrn&quot;;
if ($fp)
{
    echo  'Your port 80 is actually used by :

';
   fwrite($fp, $out);
   while (!feof($fp))
   {
        $line = fgets($fp, 128);
        if (ereg('Server: ',$line))
        {

            echo $line;
            $gotInfo = 1;
        }

    }
    fclose($fp);
    if ($gotInfo != 1)
        echo 'Information not available (might be Skype).';
}
else
{
    echo 'Your port 80 is not actually used.';
}

echo '

Press Enter to exit...';
trim(fgets(STDIN));
?&gt; </code></pre>
<p>Si comme moi vous avez marqué :</p>
<pre><code class="plaintext">Your port 80 is actually used by :

Server: Microsoft-IIS/10.0

Press Enter to exit...</code></pre>
<p>Vous devrez aller désactiver le service qui se lance sûrement au démarrage de votre ordinateur.</p>
<p>Pour ce faire, lancer le gestionnaire des services (Exécuter &gt; services.msc), puis chercher &quot;Service de publication World Wide Web&quot; (&quot;World Wide Web Publishing Service&quot; pour les anglophones). Il devrait être défini en état &quot;En cours d'éxecution&quot; et type de démarrage &quot;Automatique&quot;.</p>
<p>Pour libérer le port 80, vous devrez passer le serveur en type de démarrage &quot;Manuel&quot; et en forçant l'arrêt du service (clic droit &gt; &quot;Arréter&quot;). Après cette opération, vous devriez pouvoir démarrer votre serveur Apache correctement.</p>
<p>Si vous avez des questions, n'hésitez pas à me les poser dans les commentaires.</p>]]></description>
      <link>https://www.sarramegna.fr/post/windows-10-empeche-votre-serveur-web-de-fonctionner</link>
      <pubDate>Mon, 24 Aug 2015 19:15:39 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Twitter sur votre site avec Zend_Service_Twitter et le protocole OAuth]]></title>
      <description><![CDATA[<p>Le but de ce post est, dans un premier temps, de découvrir comment intégrer une timeline Twitter avec Zend Framework sur son site web ainsi que de tweeter à partir de celui-ci. Encore une fois, Zend Framework vole à notre secours mais il y a quelques notions à assimiler avant de débuter.</p>
<p>Pour récupérer votre timeline, il est nécessaire de suivre 3 étapes : la mise en place de l'espace de travail, l'authentification avec OAuth, la connexion et la récupération de la timeline. Nous réaliserons cela sous la forme d'une classe dédiée afin que vous puissiez la réutiliser dans d'autres projets et évenuellement la compléter avec d'autres méthodes. Notre classe possèdera en attribut les différentes informations de connexion (elles pourraient être récupérer dans la base de données ou dans un fichier de configuration), un constructeur qui gérera la connexion, et une ou plusieurs méthodes gérant les différents appels à Twitter.</p>
<p>Mise en place de l'espace de travail</p>
<p>Tout d'abord, il vous faut un compte Twitter (j'espère que vous en avez déjà un). Voici le mien <a href="https://twitter.com/@SarramegnaG">@SarramegnaG</a>.</p>
<p>Ensuite il vous faut configurer un nom de domaine local car Twitter n'accepte pas les requêtes provenant de localhost ou 127.0.0.1. Pour ce faire, vous irez dans /etc/hosts pour les linuxiens ou C:\Windows\System32\drivers\etc\hosts pour les windowsiens et vous ajouterez la ligne suivant (avec le nom de domaine de votre choix) :</p>
<pre><code class="plaintext">127.0.0.1	monsiteweb.tld
127.0.0.1	www.monsiteweb.tld</code></pre>
<p>Vous pourrez ensuite accéder avec votre site local (accessible à l'adresse http://localhost/ ou http://127.0.0.1/) en tapant http://monsiteweb.tld dans votre navigateur.<br>
Si votre site se trouve dans un sous répertoire, vous voudrez peut-être jouer avec le VirtualHost pour aller taper directement dans le bon répertoire.</p>
<p>Troisième étape, il vous faut déclarer votre application web chez Twitter. Ce n'est pas obligatoire, mais c'est mieux. <br />
Rendez-vous à l'adresse <a href="https://dev.twitter.com/apps">https://dev.twitter.com/apps</a> et connectez-vous.<br />
Créez une nouvelle application et nommez la comme vous le désirez. Une fois valider, vous pourrez modifier l'accès en lecture/écriture si vous souhaitez pouvoir tweeter depuis votre site web. Vous pouvez maintenant générer votre jeton en cliquant dans l'onglet &quot;Détails&quot; et sur le bouton &quot;Créer mon jeton d'accès&quot; (&quot;Create my access token&quot;).</p>
<p>Authentification avec OAuth</p>
<p>Qu'est ce que OAuth ?</p>
<p><quote>OAuth est un protocole libre [...] qui permet l'authentification à une API sécurisée d'une façon simple et standard depuis son bureau ou une application web. Pour les développeurs d'une application accédant à une API, OAuth est une façon de publier et d'interagir avec des données protégées. Pour les développeurs fournissant une API, OAuth permet de donner accès aux données tout en protégeant le pseudonyme et le mot de passe des utilisateurs.</quote><br>
<a href="http://fr.wikipedia.org/wiki/OAuth">Source</a></p>
<p>En d'autres termes, OAuth sert à authentifier un utilisateur depuis votre site web en ne fournissant ni pseudonyme, ni mot de passe. Du coup votre site se retrouve avec un jeton d'accès qui autorise l'accès aux données du service concerné (Twitter ici). Il peut donc être facilement révoqué si vous le désirez.</p>
<p>Pour obtenir ce jeton, une série d'étapes se met en place : pour avoir accès à vos données, le site web va demander à Twitter un jeton non autorisé. Vous êtes ensuite redirigé vers Twitter pour confirmer ou non la demande de jeton (le lien se fera grâce au jeton non autorisé qui sera fourni dans l'url). Si vous confirmez, vous serez redirigé vers le site qui a fait la demande en fournissant (grâce à l'URL) le code de confirmation associé à ce jeton. Le site fait enfin une demande à Twitter avec le jeton fraichement approuvé et le code de confirmation afin de récupérer le jeton qui permettra au site de récupérer vos données de Twitter.</p>
<p><img src="/media/serveur-twitter.png" alt="Schéma des communications entre serveur et Twitter" /></p>
<p>En noir, les appels serveur à serveur. En rouge, les redirections de l'utilisateur.</p>
<p>Dans notre cas, nous ne gèrerons qu'un compte Twitter, celui associé à notre site web. On va donc pouvoir sauter les étapes de demande de jeton et de redirection de l'utilisateur. Ces informations nous sont données dans l'onglet &quot;OAuth tool&quot; de l'application que nous venons de créer sur Twitter aux rubriques &quot;Jeton d'accès&quot; (&quot;Access Token&quot;) et &quot;Jeton d'accès secret&quot; (&quot;Access token secret&quot;).</p>
<p>Le squelette de notre classe :</p>
<pre><code class="php">&lt;?php

class MyApp_Service_Twitter {

	public function __construct() {
	}
}</code></pre>
<p>Ajoutons-y les informations de notre compte :</p>
<pre><code class="php">&lt;?php

class MyApp_Service_Twitter {

    private $accountEmail = 'monadresse@email.com'; // Email du compte
    private $accessToken = '123456789-abcdefghijklmnopqrstuvwxyz0123456789abcd'; // Access token
    private $accessTokenSecret = 'abcdefghijklmnopqrstuvwxyz0123456789abcdefg'; // Access token secret

	public function __construct() {
	}
}</code></pre>
<p>La connexion à Twitter se fait en deux étapes. La création d'un jeton OAuth avec la classe Zend_Oauth_Token_Access puis la connexion au compte Twitter grâce à la classe Zend_Service_Twitter.</p>
<pre><code class="php">&lt;?php

class MyApp_Service_Twitter {

    private $accountEmail = 'monadresse@email.com'; // Email du compte
    private $accessToken = '123456789-abcdefghijklmnopqrstuvwxyz0123456789abcd'; // Access token
    private $accessTokenSecret = 'abcdefghijklmnopqrstuvwxyz0123456789abcdefg'; // Access token secret
    private $token = null;
    private $twitter = null;

	public function __construct() {
		// Création du jeton
	    $this-&gt;token = new Zend_Oauth_Token_Access();
	    $this-&gt;token-&gt;setToken($this-&gt;accessToken);
	    $this-&gt;token-&gt;setTokenSecret($this-&gt;accessTokenSecret);

		//Connexion au compte Twitter
	    $this-&gt;twitter = new Zend_Service_Twitter(array(
	        'username' =&gt; $this-&gt;accountEmail,
	        'accessToken' =&gt; $this-&gt;token
	    ));
	}
}</code></pre>
<p>A partir de là, l'appel aux méthodes de Zend_Service_Twitter est enfantin. Il suffit de créer autant de méthode à notre classe que nous souhaitons. Créons par exemple deux méthodes, une qui nous renverra notre timeline, et une autre qui nous permettra de tweeter sur notre compte par exemple.</p>
<pre><code class="php">&lt;?php

class MyApp_Service_Twitter {

    private $accountEmail = 'monadresse@email.com'; // Email du compte
    private $accessToken = '123456789-abcdefghijklmnopqrstuvwxyz0123456789abcd'; // Access token
    private $accessTokenSecret = 'abcdefghijklmnopqrstuvwxyz0123456789abcdefg'; // Access token secret
    private $token = null;
    private $twitter = null;

	public function __construct() {
		// Création du jeton
	    $this-&gt;token = new Zend_Oauth_Token_Access();
	    $this-&gt;token-&gt;setToken($this-&gt;accessToken);
	    $this-&gt;token-&gt;setTokenSecret($this-&gt;accessTokenSecret);

		//Connexion au compte Twitter
	    $this-&gt;twitter = new Zend_Service_Twitter(array(
	        'username' =&gt; $this-&gt;accountEmail,
	        'accessToken' =&gt; $this-&gt;token
	    ));
	}

	public function getMyTimeLine() {
		return $this-&gt;twitter-&gt;status-&gt;userTimeline(
			array('id' =&gt; 'SarramegnaG')
		);
	}

	public function postTweet($message) {
		return $this-&gt;twitter-&gt;status-&gt;update($message);
	}
}</code></pre>
<p>Il ne vous reste plus qu'à utiliser vos méthodes fraichement créées dans votre contrôleur par exemple.</p>
<pre><code class="php">&lt;?php

class TwitterController extends Zend_Controller_Action {

    public function indexAction() {
		$twitter = new MyApp_Service_Twitter();
		$this-&gt;view-&gt;timeline = $twitter-&gt;getMyTimeLine();
	}
}</code></pre>
<p>Voilà, j'espère que ce tutoriel vous aura aider et que vous avez pris autant de plaisir à le lire que moi à l'écrire.</p>]]></description>
      <link>https://www.sarramegna.fr/post/twitter-sur-votre-site-avec-zend-service-twitter-et-le-protocole-oauth</link>
      <pubDate>Wed, 30 May 2012 14:45:23 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduire avec Zend_Translate]]></title>
      <description><![CDATA[<p>Aujourd'hui, et après une longue absence de tutoriel (boulot oblige), je vous présente une nouvelle brique de Zend, celle de <strong>la traduction avec Zend_Translate</strong>.</p>
<p>Rien de plus simple ici, la mise en place de <em>la traduction s'organise en 4 parties</em> :</p>
<ol>
    <li>Choisir le format de stockage des traductions</li>
    <li>Paramétrer Zend_Translate dans le bootstrap</li>
    <li>Intégrer Zend_Translate à la vue</li>
    <li>Créer le(s) fichier(s) de traduction</li>
</ol>
<p><strong><span style="text-decoration:underline;">Partie 1 :</span></strong><br /></p>
<p>Le format de stockage, appelé aussi <strong>adaptateur</strong>, permet de stocker les traductions avec plusieurs avantages et inconvénients. Je ne ferai que citer les 3 principaux :</p>
<ul>
    <li><span style="text-decoration:underline;">Tableau (array) :</span> Utilise les tableaux PHP <br>
        Avantages et inconvénients : Petites pages ; l'utilisation la plus simple ; seulement pour les programmeurs</li>
    <li><span style="text-decoration:underline;">Csv :</span> Utilise les fichiers à séparation par virgule (*.csv/*.txt)<br />
        Avantages et inconvénients : Format simple de fichier texte ; rapide ; problèmes possibles avec les caractères Unicode</li>
    <li><span style="text-decoration:underline;">Gettext :</span> Utilise les fichiers binaires gettext (*.mo)<br />
        Avantages et inconvénients : Norme GNU pour Linux ; thread-safe (contrairement à gettext de PHP) ; besoin d'outils pour la traduction</li>
</ul>
<p>Nous allons ici prendre le cas de la traduction via un simple tableau PHP mais vous comprendrez qu'il est aussi très simple de mettre en œuvre une traduction avec les autres adaptateurs.</p>
<p><strong><span style="text-decoration:underline;">Partie 2 :</span></strong></p>
<p>Le constructeur de la classe Zend_Translate prend 4 paramètres :</p>
<ol>
    <li>Le type de l'adaptateur</li>
    <li>Le chemin vers le fichier ou le répertoire contenant les fichiers</li>
    <li>La langue</li>
    <li>Les options</li>
</ol>
<p>Voici le code concernant la configuration de l'object Zend_Translate :</p>
<pre><code class="php">$translate = new Zend_Translate(
	'array',
	APPLICATION_PATH . '/languages',
	'auto',
	array('scan' =&gt; Zend_Translate::LOCALE_DIRECTORY)
);</code></pre>
<p>On dit ici que :</p>
<ul>
    <li>le type de l'adaptateur est &quot;array&quot; (un tableau PHP)</li>
    <li>les fichiers de langues sont stockés dans le répertoire &quot;languages&quot; du répertoire Application</li>
    <li>la langue par défaut est la langue locale (ex : fr)</li>
    <li>les fichiers se nomment et se trouvent en fonction de la langue locale (ex : fr.php ou fr/monfichierdelangue.php)</li>
</ul>
<p>On peut définir la langue locale grâce à :</p>
<pre><code class="php">$translate-&gt;setLocale('fr');</code></pre>
<p>Et finalement, on l'ajout au registre pour une utilisation plus tard dans l'affichage de la page :</p>
<pre><code class="php">Zend_Registry::set('Zend_Translate', $translate);</code></pre>
<p>Voici le code complet :</p>
<pre><code class="php">&lt;?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

	public function _initTranslate() {
		$translate = new Zend_Translate('array', APPLICATION_PATH.'/languages', 'auto', array('scan' =&gt; Zend_Translate::LOCALE_DIRECTORY));
		$translate-&gt;setLocale('fr');
		Zend_Registry::set('Zend_Translate', $translate);
		return $translate;
	}
}</code></pre>
<p><strong><span style="text-decoration:underline;">Partie 3 :</span></strong></p>
<p>Le plus dur est fait ! Voici donc le code pour la vue :</p>
<pre><code class="php">&lt;?php echo $this-&gt;translate('I_LOVE_THIS_BLOG')?&gt;</code></pre>
<p>On fait donc appel à l'aide de vue Zend_View_Helper_Translate pour traduire un texte. Ici &quot;I_LOVE_THIS_BLOG&quot; est ce qu'on appelle une clé de traduction puisqu'elle sera la même pour toutes les langues. Il n'y a pas d'obligation de l'écrire en majuscule mais c'est une bonne habitude d'écrire les constantes des scripts PHP ainsi.</p>
<p><strong><span style="text-decoration:underline;">Partie 4 :</span></strong></p>
<p>Eh oui, on enchaine ! Rien de plus simple que de constituer maintenant les fichiers de traductions. On prend pour premier exemple le fichier de traductions fr.php :</p>
<pre><code class="php">&lt;?php
	return array(
		'I_LOVE_THIS_BLOG' =&gt; 'J\'adore ce blog !'
	);</code></pre>
<p>Pour ajouter une clé de traduction, il suffit d'ajouter une valeur au tableau avec :</p>
<ul>
    <li>en clé : la clé de traduction</li>
    <li>en valeur : le texte traduit dans la langue qui convient.</li>
</ul>
<p>Pour le fichier de traductions en.php, il conviendra de traduire le texte comme ceci :</p>
<pre><code class="php">&lt;?php
	return array(
		'I_LOVE_THIS_BLOG' =&gt; 'I love this blog !'
	);</code></pre>
<p><strong><span style="text-decoration:underline;">Conclusion :</span></strong></p>
<p>Voilà, c'est tout pour aujourd'hui, et comme vous avez été patient(e) et avez lu ce tutoriel jusqu'au bout, je vous donne un cadeau bonus pour gérer le changement de langue, le log des traductions inexistantes, et même <a href="http://framework.zend.com/svn/framework/standard/trunk/resources/languages/">un lien</a> vers des fichiers pour traduire vos erreurs de formulaires automatiquement.</p>
<p>Bootstrap.php</p>
<pre><code class="php">&lt;?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

	public function _initTranslate() {
		// On récupère la session de la langue
		$languageNamespace = new Zend_Session_Namespace('Language');
		$translate = new Zend_Translate('array', APPLICATION_PATH.'/languages', 'auto', array('scan' =&gt; Zend_Translate::LOCALE_DIRECTORY));
		// On définit la langue des traductions
		if ($translate-&gt;isAvailable($languageNamespace-&gt;country)) {
			$translate-&gt;setLocale($languageNamespace-&gt;country);
		} else {
			$translate-&gt;setLocale('fr');
		}

		// On stocke les traductions manquantes dans un fichier de log
		$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH.'/log/translate-not-found.log');
		$log = new Zend_Log($writer);
		$translate-&gt;setOptions(array(
			'log' 				=&gt; $log,
			'logMessage'      	=&gt; &quot;La clé de traduction '%message%' n'est pas connue en langue '%locale%'&quot;,
			'logUntranslated' 	=&gt; true,
			'route'				=&gt; array($translate-&gt;getLocale() =&gt; 'fr'),
		));

		Zend_Registry::set('Zend_Translate', $translate);

		Zend_Validate_Abstract::setDefaultTranslator($translate); // Pour gérer la traduction des erreurs de formulaires

		return $translate;
	}
}</code></pre>
<p>IndexController.php</p>
<pre><code class="php">&lt;?php

class IndexController extends Zend_Controller_Action {

	public function languageAction() {
		$this-&gt;_helper-&gt;layout()-&gt;disableLayout();
		$this-&gt;_helper-&gt;viewRenderer-&gt;setNoRender(true);

		$languageValue = $this-&gt;_request-&gt;getParam('country', 'fr');
		$languageNamespace = new Zend_Session_Namespace('Language');
		$languageNamespace-&gt;country = $languageValue;

		// On redirige vers la page précédente
		$this-&gt;_redirect($this-&gt;_request-&gt;getServer('HTTP_REFERER'));
	}
}</code></pre>]]></description>
      <link>https://www.sarramegna.fr/post/traduire-avec-zend-translate</link>
      <pubDate>Mon, 09 Jan 2012 11:19:05 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Ajout de slashes abusif]]></title>
      <description><![CDATA[<p>Vous vous en êtes peut-être déjà aperçu, mais lors de l'envoi d'un formulaire sur OVH, vous récupérez des caractères échappés sans que vous n'ayez rien demandé (ex : &quot;C\'est un test&quot; au lieu de &quot;C'est un test&quot;).</p>
<p>La faute à qui ? Il suffit de regarder du côté des <strong>magic_quotes</strong>.</p>
<p>Avec les versions de PHP précédant la version 5.3.0, vous obtiendrez très probablement ce genre de problème. En effet, le paramètre <strong>magic_quotes_gpc</strong> par défaut est à <strong>true</strong>. De ce fait, les paramètres passés par la méthode GET (mais aussi POST et les cookies) sont manipulés pour ajouter un slash devant le délimiteur de chaîne qu'est l'apostrophe, ce qui peut être embêtant lors de l'affichage.</p>
<p>Plusieurs solutions s'offrent donc à vous.</p>
<p>En php :</p>
<pre><code class="php">&lt;?php
// En remplaçant
echo &quot;Nom: &quot;.$_GET[&quot;nom&quot;];
// par
echo &quot;Nom: &quot;.stripSlashes($_GET[&quot;nom&quot;]);</code></pre>
<p>Mais ceci n'est pas très pratique car il faudrait faire beaucoup de cas par cas. Du coup on peut réaliser une petite manipulation au début de notre page comme ceci (proposée par la doc PHP) :</p>
<pre><code class="php">&lt;?php
if (get_magic_quotes_gpc()) {
	$process = array(&amp;$_GET, &amp;$_POST, &amp;$_COOKIE, &amp;$_REQUEST);
	while (list($key, $val) = each($process)) {
		foreach ($val as $k =&gt; $v) {
			unset($process[$key][$k]);
			if (is_array($v)) {
				$process[$key][stripslashes($k)] = $v;
				$process[] = &amp;$process[$key][stripslashes($k)];
			} else {
				$process[$key][stripslashes($k)] = stripslashes($v);
			}
		}
	}
	unset($process);
}</code></pre>
<p>Mais là encore, c'est pas top !</p>
<p>La fonction stripSlashes() (opération inverse de addSlashes()) permet de supprimer les slashes pratiques car ils évitaient  de faire appel à la fonction mysql_escape_string() (ou addSlashes()) avant insertion dans une base de données. En revanche, il est maintenant nécessaire de faire appel à stripSlashes() avant affichage. Ainsi, depuis la version 5.3.0, cette option n'est plus activée par défaut ce qui évite d'avoir les slashes d'échappement.<br />
Du coup, lorsque l'on écrit un script destiné à n'importe quelle version de PHP, il doit déterminer comment celui-ci est configuré ou forcer la configuration pour savoir s'il faut ou non ajouter des slashes.</p>
<p>La meilleure des solutions serait de désactiver les magic_quotes dans le php.ini.</p>
<pre><code class="ini">; Magic quotes

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of ').
magic_quotes_sybase = Off</code></pre>
<p>Mais tout le monde n'y a pas accès. Une autre solution (encore) est de configurer cela dans le fichier .htaccess :</p>
<pre><code class="plaintext">php_flag magic_quotes_gpc Off</code></pre>
<p>Le problème c'est que cette commande n'est pas exécutée sur OVH, mais heureusement, ils nous en fournissent une autre pour désactiver les magic_quotes (à mettre dans le fichier .htaccess) :</p>
<pre><code class="plaintext">SetEnv MAGIC_QUOTES 0</code></pre>
<p>Et le tour est joué.</p>]]></description>
      <link>https://www.sarramegna.fr/post/ajout-de-slashes-abusif</link>
      <pubDate>Thu, 13 Oct 2011 14:51:17 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Faire de l'URL Rewriting]]></title>
      <description><![CDATA[<p>Nouvel article (oui ! déjà !) qui, cette fois, traite de l'URL Rewriting avec Zend Framework.</p>
<p><span style="text-decoration:underline;">Pour la petite histoire, qu'est ce que l'URL rewriting ?</span></p>
<p>L’URL rewriting permet de réécrire des URL complexes de façon simplifiée et est notamment utilisé pour le référencement.</p>
<p>En effet, des liens plus simples facilitent le travail des robots d'indexation et évitent les erreurs de saisie des visiteurs (suppression des accents et autres caractère spéciaux). Elle permet aussi de sécuriser l'accès à ses pages en masquant les noms de variables passées dans l’URL.</p>
<p>On va donc voir comment mettre en place l'URL rewriting avec Zend Framework (ce qu'on pourrait aussi bien faire avec un .htaccess mais bon, Zend c'est cool) et ceci, en 3 parties : le bootstrap, la réécriture d'URL dans la vue et le fichier INI.</p>
<p><span style="text-decoration:underline;">Le bootstrap :</span></p>
<pre><code class="php">&lt;?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

	protected function _initRouter() {
		$front = $this-&gt;bootstrap('FrontController')-&gt;getResource('FrontController'); // On récupère le frontController
		$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'production'); // On récupère la config (avec les paramètres de routage)
		$routing = new Zend_Controller_Router_Rewrite(); // On instancie notre objet de routage
		$routing-&gt;addConfig($config, 'routes'); // On le configure
		$front-&gt;setRouter($routing); // Et on mélange le tout
	}
}</code></pre>
<p><span style="text-decoration:underline;">Plein la vue :</span></p>
<pre><code class="php">&lt;?php echo $this-&gt;url(array('id' =&gt; $idArticle, 'name' =&gt; $titreArticle), 'article', true); ?&gt;</code></pre>
<p>Pour afficher le lien, on passe en premier paramètre un tableau correspondant à nos variables (cf la dernière ligne du fichier INI), en second, le nom de la route, et en dernier on spécifie que les paramètres de la page en cours sont à ignorer.</p>
<p><span style="text-decoration:underline;">Le fichier INI :</span></p>
<pre><code class="plaintext">[production]
routes.article.type = &quot;Zend_Controller_Router_Route_Regex&quot; ;Le type de routage
routes.article.route = &quot;article/(\d+)-(\w+).html&quot; ;La regex qui correspond à l'URL à router
routes.article.defaults.controller = &quot;article&quot; ;Le contrôleur vers lequel on route l'URL
routes.article.defaults.action = &quot;voir&quot; ;L'action vers lequel on route l'URL
routes.article.map.1 = &quot;id&quot; ;Le nom du paramètre correspondant à la première paire de parenthèses
routes.article.map.2 = &quot;name&quot; ;Le nom du paramètre correspondant à la deuxième paire de parenthèses
routes.article.reverse =&quot;article/%d-%s&quot; ;Ce qui va nous permettre de faire l'opération inverse en donnant l'id de l'article ainsi que son nom
</code></pre>
<p>Le tour est joué.</p>
<p>Je précise deux points que je n'ai pas traité plus haut :</p>
<ol>
    <li>Pour éviter des conflits avec les autres appels de l'aide de vue &quot;url&quot;, il convient de passer la valeur <strong>'default'</strong> en second paramètre de celle-ci pour ne pas utiliser la route de la page en cours.</li>
    <li>Il convient aussi de supprimer les caractères du nom de l'article qui ne seraient pas compatibles avec la classe [A-Za-z_] (correspondant à \w)</li>
</ol>
<p>A bientôt !</p>]]></description>
      <link>https://www.sarramegna.fr/post/faire-de-l-url-rewriting</link>
      <pubDate>Thu, 06 Oct 2011 16:32:59 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Faire une jointure]]></title>
      <description><![CDATA[<p>Ceci est mon premier article, que d'émotions... Mais venons en aux choses sérieuses.</p>
<p>Lorsque vous avez cherché à faire des jointures entre vos tables, vous avez peut-être rencontré ce message d'erreur :</p>
<p><strong>Select query cannot join with another table </strong></p>
<p>Ceci est dû au fait que ZF ne permet pas de sélectionner des champs provenants d'autres tables que la table présente dans le FROM.</p>
<p><em>L'objet Zend_Db_Table_Select est destiné à sélectionner des données sur une table précise. Des jointures peuvent être faites, mais il n'est pas possible de sélectionner des colonnes ne faisant pas partie de la table sous jacente. Cependant, ceci aurait pu être utile dans certains cas, et l'objet Zend_Db_Table_Select possède une clause spéciale déverrouillant cette limitation. Passez la valeur false à sa méthode setIntegrityCheck. Il est alors possible de sélectionner des colonnes hors table. Attention toutefois, l'objet row/rowset résultant sera verrouillé. Impossible d'y appeler save(), delete() ou même d'affecter une valeur à certains de ses champs. Une exception sera systématiquement levée.</em></p>
<p>De ce fait, afin de contourner cette restriction, il convient d'appeler la méthode <strong>setIntegrityCheck()</strong> de la classe <strong>Zend_Db_Select</strong> comme ceci.</p>
<pre><code class="php">&lt;?php

class Application_Model_DbTable_Articles extends Zend_Db_Table_Abstract {
    protected $_name = 'articles';
    protected $_primary = 'idArticle';

    public function obtenirArticleEtCommentaires($idArticle) {
    	$select = $this-&gt;select()-&gt;setIntegrityCheck(false)
    				-&gt;from(array('a' =&gt; $this-&gt;_name), array('*'))
    				-&gt;joinLeft(array('c' =&gt; 'commentaires'), 'c.idArticle = a.idArticle', array('*'))
    				-&gt;joinLeft(array('u' =&gt; 'utilisateurs'), 'u.idUtilisateur = c.idUtilisateur', array('nomUtilisateur'))
    				-&gt;where('a.idArticle = ?', $idArticle);
    	return $this-&gt;fetchAll($select);
    }
}</code></pre>
<p>Rien de plus, rien de moins. Votre requête devrait maintenant correctement se lancer.</p>
<p>A bientôt !</p>]]></description>
      <link>https://www.sarramegna.fr/post/faire-une-jointure</link>
      <pubDate>Wed, 05 Oct 2011 16:26:58 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Bienvenue sur mon blog]]></title>
      <description><![CDATA[<p><span style="text-decoration:underline;">Ce blog est un blog technique</span> recensant diverses astuces que j'ai pu découvrir au long de ma carrière de <strong>développeur web</strong>.</p>
<p>Il me sert avant tout de bloc-note mais aussi à faire partager mes découvertes afin que vous trouviez rapidement une solution à vos problèmes si je les ai déjà rencontrés.</p>
<p>Je ferai en sorte de le tenir actualisé aussi souvent qu'une nouvelle découverte me le permettra.</p>
<p>Vous pourrez donc y consulter divers articles traitant d'autant de sujets que possible dans le domaine du développement web (HTML5, CSS3, jQuery, PHP, Zend, ...) mais aussi des nouvelles technologies.</p>
<p>Je suis ouvert à toutes questions ou suggestions par message en passant par <a href="/contact">cette page</a>.</p>
<p><em>Guillaume SARRAMEGNA</em></p>]]></description>
      <link>https://www.sarramegna.fr/post/bienvenue-sur-mon-blog</link>
      <pubDate>Fri, 30 Sep 2011 16:57:19 +0000</pubDate>
    </item>
  </channel>
</rss>
