Posted by admin on mar 12, 2010 in
My life
Les landing pages sont de plus en plus utilisées pour optimiser la transformation sur nos applications web. Peut être vous-même dans vos projets vous avez été amenés à en créer ? Ou alors peut être que vous envisagiez cette solution ? Dans les deux situations ce billet peut vous être utile. Comme vous le savez de nombreux experts se sont prononcés sur le sujet. Afin d’avoir une vue d’ensemble des critères impactant favorablement la transformation de vos pages d’atterrissage, j’ai souhaité créer cette check-list. Je vous invite donc à la parcourir et à la compléter par un commentaire.
Les directives à suivre :
- Devancez les attentes des utilisateurs et apportez leur conseils et soutien dans la prise de décision : Apportez une réponse claire à tout point de vue aux besoins exprimés par votre cible.
- Gardez bien en tête votre objectif premier : L’utilisateur à exprimé un besoin en cliquant sur votre annonce, orientez le vers sa solution et ne proposez rien à l’écran de l’utilisateur qui puisse le dérouter vers un nouvel objectif.
- La confiance est synonyme de résultats alors tenez vos promesses.
Les étapes essentielles avant de partir dans la conception :
- Analysez les comportements de l’utilisateur et pensez à respecter les standards d’usage.
- Etudiez la concurrence : analysez le design et les flux de navigation.
Définissez une stratégie pour vos landing pages :
- Segmentez votre catalogue produits pour vos campagnes : Tout élément cité (marques, produits, services, etc.) dans vos annonces peu importe le support (moteurs, supports e-publicité, programme d’affiliation, etc.) doivent être présents sur votre landing page. Ce sont des points de confiance à gagner ou à perdre si vous ne suivez pas ce conseil.
- Créez des pages dédiées à vos produits les plus populaires : Il apparait nécessaire d’apporter un soin particulier aux produits les plus recherchés. Les pages dédiées prendront en compte les attentes spécifiques liées à ces produits.
Les contenus : Un outil au service de la transformation
\\ Pensez vos contenus :
- Créez de la proximité : Adressez vous à l’utilisateur en utilisant le vous, le vôtre, etc.
- Veillez à ce que la réponse au besoin exprimé par le clic de l’utilisateur (call to action) soit présente dans votre titre de page.
- Vendez votre campagne dès les premières phrases : Cela passe à travers le titre et l’accroche (Un paragraphe de 15 à 30 mots incitatifs).
- Renforcez votre crédibilité : Mettez en avant des témoignages, des parutions presse, vos partenaires, le service client. Toutes ces élément impacts positivement la confiance et la respectabilité.
- Permettez leur de comparer : Les acheteurs recherchent du prix alors proposez leur un comparatif entre différents fournisseurs.
- Faites preuve de transparence : Tenez vous aux faits, énoncez les caractéristiques et fonctionnalités de vos produits.
- Apportez des justifications : Pourquoi acheter tel produit plutôt qu’un autre ? Des réponses concrètes aux questions que peuvent se poser les utilisateurs et qui pourraient se révéler être des freins à l’action si vous ne faites pas en sorte de les désamorcer tout de suite.
\\ Facilitez la lecture et mettez en avant vos avantages :
- Des listes à puces pour énoncer les bénéfices produits : Gardez à l’esprit que vos utilisateurs doivent assimiler un maximum de contenus en quelques secondes.
- Utilisez des caractères gras pour renforcer les messages clés.
- Les paragraphes ne doivent pas dépasser trois lignes : Une idée par paragraphe. Le volume d’informations est fonction de la complexité du produit ou du service proposé.
\\ Les erreurs à éviter :
- Faites attention à l’orthographe et à la grammaire : elles impactent directement la confiance et la respectabilité de votre site.
- Veillez à ne pas trop offrir de portes de sorties : insérer un lien vers une source extérieure uniquement si cela apparait utile et nécessaire.
Les contenus ne sont pas vos seules armes pour développer votre taux de conversion :
Posted by admin on mar 12, 2010 in
My life
Vous êtes naze en landing page, vous ne savez même pas ce que c’est ? Pas grave, vous allez rapidement devenir un expert. En collaboration avec Fred de Conseils Marketing, nous vous vous proposons la cette partie 1, dans laquelle on voit point par point comment il faut réfléchir avant d’agir.
Une landing pages ou page d’atterrissage, est une page d’entrée de votre site, sachant que les internautes ne vont pas forcément arriver par la page d’accueil. L’internaute peut venir d’une campagne pub, d’un lien de référencement naturel, d’un email, d’un lien donné via un autre support (presse, radio, brochure, etc.).
Dans le cadre d’une campagne Adwords, la landing page est particulièrement importante (Ma landing page lave plus blanc).
En effet, la qualité de votre page d’atterrissage et donc de vos annonces est évaluée par Google à l’aune de critères tels que le temps de chargement de la page, le nombre de liens sur la page, la pertinence des informations fournies, etc.
En optimisant cette page avec un peu de bon sens, vous améliorerez votre campagne sans augmenter votre budget Adwords.
OBJECTIFS
Où vais-je ? Dans quel état j’erre ? Ou comment définir vos indicateurs de performance (ndrl : même si vos résultats sont mauvais, on appelle ça « performance » parce que ça sonne mieux que « indicateurs de nullité »)
Il s’agit de déterminer le plus précisément possible les objectifs de cette page, les quantifier et ensuite les hiérarchiser. Plus facile à dire qu’à faire, mais ce sera votre ligne directrice tout au cours du projet ; et d’autre part, lorsque vous testerez et retesterez encore, vous pourrez mesurer l’évolution et savoir où vous en êtes. Les indicateurs clés choisis en général sont :
- le taux de rebond: c’est-à-dire le pourcentage des internautes qui sont venus sur votre page et qui sont repartis aussitôt car ce qu’il ont trouvé sur votre page ne correspondait pas à ce qu’ils cherchaient. Techniquement c’est lorsque l’internaute clique de suite vers un lien externe de votre page, ferme l’onglet ou le navigateur internet, tape une nouvelle URL, ou fait « Précédent »…
- le taux de conversion : c’est le pourcentage de visiteurs ayant réalisé l’action que vous souhaitez qu’ils fassent (ex: acheter le produit, souscrire à une newsletter, remplir un formulaire…). Le taux de conversion oscille entre 2% et 20%, selon le contexte. Ce sont des chiffres très génériques, tout dépend de la spécificité de votre marché, mais au moins, ça vous donne un ordre de grandeur.
- la durée et le nombre/la fréquence de visites : La durée de visite vous donne une idée de l’intérêt porté à votre contenu). Le nombre de visiteurs uniques (nombre de visiteurs venus un ou plusieurs fois mais comptés seulement une seule fois) et le nombre de visites globale et la fréquence de visite vous permettront de mieux comprendre les habitudes de vos internautes. Par exemple, si vous faîtes une offre valable une fois par personne, il faut que le taux de nouveaux visiteurs soit faible… sinon cela veut dire que vous payez à nouveau pour une personne qui connaît déjà votre offre.
- le CTR sur Google (Clic Through Rate) c’est le taux de clic de votre annonce, c’est-à-dire le rapport entre le nombre de clic divisé par le nombre de fois que votre publicité a été affichée (impressions). Bien entendu plus ce nombre est important, plus cela veut dire que votre annonce est pertinente (ciblage et texte). Un taux moyen se situe autour de 2-3 % et les meilleurs taux atteignent 20%.
On néglige souvent cette partie qui nécessite de se creuser la tête, et qui en plus prend beaucoup de temps, mais c’est la base. Gardez bien en tête de trouver les quelques 3 ou 4 indicateurs clés utiles et pertinents dans toute la masse de données chiffrées que vous pouvez trouver. Fixez les objectifs à atteindre pour chaque chiffre clé et déterminez les priorités.
LA CIBLE
Le plus sur moyen de manquer votre cible, c’est de ne pas en avoir. Le plus sûr moyen de ne pas avoir de chance, c’est de ne pas en avoir (proverbe chinois)
Qui souhaitez-vous attirer ? Quelles sont leurs motivations ? Que recherchent-ils ? Fréquence de visite ? Quel vocabulaire utilisent-ils ?
Peut-être qu’il vous faudra segmenter vos cibles et créer une landing page spécifique en fonction de chaque cible. Par exemple, pour cette pub Carling, l’argument vendeur « Fait avec 100% d’orge britannique » est un contre-argument. Capitaine qui est aussi un spécialiste en bières, ne me contredira pas si je dis que la Carling est comme du pipi de chat à qui on aurait fait boire de l’eau gazeuse.
LE CONTEXTE
La solidité d’un système se mesure à la résistance de son maillon le plus faible (Laurence Boccolini)
La page d’atterrissage est souvent pensée comme UNE page alors qu’il s’agit d’un maillon.
Pour en faire un maillon fort, il faut prendre en compte d’où l’internaute arrive et ce qui se passe quand il repart de la landing page. Vient-il d’un moteur de recherche après avoir cliqué sur un lien naturel ou un lien sponsorisé ? Vient-il d’un email ? D’un support papier ? Que dit le message en amont, quelle est la promesse faite à l’internaute ?
Vous avez bien en tête le souvenir désagréable d’une promesse alléchante qui vous a fait cliquer, et vous vous êtes ensuite retrouvé sur une page qui n’avait plus rien à voir avec le message. Grosse déception !
En plus de cet enchaînement, il vous faut lister les facteurs externes qui ont un impact. Par exemple :
- Quelles sont les heures / jours / lieux de connexion ? Est-ce que les internautes se connectent en semaine ou le week-end, est-ce une connexion mobile ou internet ? Est-ce qu’ils sont au travail ou chez eux ?
- Est-ce qu’il y a un impact saisonnier ou un événement marquant (salon, soldes, réaction de la concurrence, vacances, fêtes) ?
- Contraintes techniques (type de navigateur, résolution, système d’exploitation, contrôle parental, plugs-in, vitesses de connexion, etc.)
ça vous permet de bien poser le contexte, de ne pas se focaliser uniquement sur VOTRE landing page, mais sur l’enchaînement effectué par l’internaute.
Ça vous paraît inutile ? Laborieux ? Ces trois paramètres, objectifs, cible et contexte sont intimement liés. Il suffit par exemple que l’on soit en période de soldes (contexte) ou que les internautes aient moins de budget (cible) ou que ce soit un mois avec beaucoup de jours fériés et de ponts (contexte), pour que votre projet prenne une tournure différente.
Par exemple, l’objectif de conversion sera peut-être moins ambitieux sur une cible de personnes âgées qui se connectent de chez elles après le feuilleton télé que sur une cible de professionnels qui se connectent sur le lieu de travail pendant les horaires de bureau, et pourtant vous leur vendez le même produit, des collants verts fluo (Mince ! Capitaine, j’ai révélé ton deuxième boulot à notre lectorat).
Maintenant il vous reste à briefer votre agence et à préparer les tests sur votre page.
Posted by admin on fév 15, 2010 in
Javascript
Pour une raison quelconque, vous souhaitez simuler un click sur un lien, sur l’evenement onmouseover par exemple… en voici la solution:
le parametre “element” est la string de l’id a cliquer
function click_me(element)
{
try
{//pour ie
document.getElementById(element).click();
}catch(e)
{//pour ff
var evt = document.createEvent(“MouseEvents”); // créer un évennement souris
evt.initMouseEvent(“click”, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); // intiailser l’évennement déja crée par un click
var cb = document.getElementById(element); // pointe sur l’élement
cb.dispatchEvent(evt); // envoyer l’évennement vers l’élement
}
}
C’est pas super propre, mais ca marche parfaitement que ce soit sur ie ou sur ff (ou chrome ou opéra..)
Posted by admin on août 19, 2009 in
Javascript
Voici un petit script developpé suite à une question sur le forum.
Il s’agit d’une petite animation pour enregistrer un vote de 1 à 5 étoiles
html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=windows-1252″>
<title>StarRating</title>
<script type=‘text/javascript’>
var done=false
var pic = new Array();
pic[0]=new Image();
pic[0].src=”star1.gif”;
pic[1]=new Image();
pic[1].src=”star2.gif”;
var bareme = new Array(“peu “,”passablement “,”moyennement”,”presque”,”")
function rate(level){
if (done){return false;}
for(i=1;i<6;i++){ document.getElementById(‘_’+i).src=(level<i)?pic[0].src:pic[1].src;
document.getElementById(‘vote’).innerHTML=“Votre vote : “+level+” étoile(s) “+bareme[level-1]+” satisfaisant”
}
}
function zero(){
for(i=1;i<6;i++){ document.getElementById(‘_’+i).src=pic[0].src;
done=false;
document.getElementById(‘vote’).innerHTML=“Votre vote : 0 étoile(s)”
}
}
function valider(){
done=true;
document.getElementById(‘vote’).innerHTML+=‘ VALIDÉ’
}
</script>
</head>
<body>
Clickez sur l’étoile de votre choix pour valider le vote:<br /><br />
<img src=“star1.gif” id=‘_1′ onclick=“valider()” onmouseover=“rate(1)” /><img src=“star1.gif” id=‘_2′ onclick=“valider()” onmouseover=“rate(2)” /><img src=“star1.gif” id=‘_3′ onclick=“valider()” onmouseover=“rate(3)” /><img src=“star1.gif” id=‘_4′ onclick=“valider()” onmouseover=“rate(4)” /><img src=“star1.gif” id=‘_5′ onclick=“valider()” onmouseover=“rate(5)” />
<br /><br/>
<div id=“vote”>Votre vote : 0 étoile(s) </div><br /><br/>
<input type=“button” onclick=“zero();” value=“reset”/>
</body>
</html>
Posted by admin on août 19, 2009 in
Cake Php
Source : http://bakery.cakephp.org/articles/view/recaptcha-component-helper-for-cakephp
This is an easy to use component and helper set for you to get reCAPTCHA(including mailhide) running on your website now. If you don’t know what reCAPTCHA is please head to http://recaptcha.net/ now to find out! Please note this code is largely derived off of the library provided for reCAPTCHA – it’s just repurposed for ease of use in CakePHP.
Create the following files:
Download code app/controllers/components/recaptcha.php
app/views/helpers/recaptcha.php
code for app/controllers/components/recaptcha.php
Component Class:
<?php
class RecaptchaComponent extends Object {
var $publickey = “”;
var $privatekey= “”;
var $is_valid = false;
var $error = “”;
function startup(&$controller){
Configure::write(“Recaptcha.apiServer”,“http://api.recaptcha.net”);
Configure::write(“Recaptcha.apiSecureServer”,“https://api-secure.recaptcha.net”);
Configure::write(“Recaptcha.verifyServer”,“api-verify.recaptcha.net”);
Configure::write(“Recaptcha.pubKey”, $this->publickey);
Configure::write(“Recaptcha.privateKey”, $this->privatekey);
$this->controller =& $controller;
$this->controller->helpers[] = “Recaptcha”;
}
function valid($form){
if (isset($form['recaptcha_challenge_field']) && isset($form['recaptcha_response_field'])){
if($this->recaptcha_check_answer(
$this->privatekey,
$_SERVER["REMOTE_ADDR"],
$form['recaptcha_challenge_field'],
$form['recaptcha_response_field']
) == 0)
return false; if (
$this->is_valid$this->is_valid
)
return true;
}
return false;
}
/**
* Calls an HTTP POST function to verify if the user’s guess was correct
* @param string $privkey
* @param string $remoteip
* @param string $challenge
* @param string $response
* @param array $extra_params an array of extra variables to post to the server
* @return ReCaptchaResponse
*/
function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()){
if ($privkey == null || $privkey == ”){
die (“To use reCAPTCHA you must get an API key from <a href=’http://recaptcha.net/api/getkey’>http://recaptcha.net/api/getkey</a>”);
}
if ($remoteip == null || $remoteip == ”){
die (“For security reasons, you must pass the remote ip to reCAPTCHA”);
}
//discard spam submissions
if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) {
$this->is_valid = false;
$this->error = ‘incorrect-captcha-sol’;
return 0;
}
$response = $this->_recaptcha_http_post(Configure::read(‘Recaptcha.verifyServer’), “/verify”$response = $this->_recaptcha_http_post(Configure::read(‘Recaptcha.verifyServer’), “/verify”
,
array (
‘privatekey’ => $privkey,
‘remoteip’ => $remoteip,
‘challenge’ => $challenge,
‘response’ => $response
) + $extra_params
);
$answers = explode (“\n”, $response [1]);
if (trim ($answers [0]) == ‘true’) {
$this->is_valid = true;
return 1;
}else{
$this->is_valid = false;
$this->error = $answers [1];
return 0;
}
}
/**
* Submits an HTTP POST to a reCAPTCHA server
* @param string $host
* @param string $path
* @param array $data
* @param int port
* @return array response
*/
function _recaptcha_http_post($host, $path, $data, $port = 80) {
$req = $this->_recaptcha_qsencode ($data$req = $this->_recaptcha_qsencode ($data
);
$http_request = “POST $path HTTP/1.0\r\n”$http_request = “POST $path HTTP/1.0\r\n”
;
$http_request .= “Host: $host\r\n”;
$http_request .= “Content-Type: application/x-www-form-urlencoded;\r\n”;
$http_request .= “Content-Length: ” . strlen($req) . “\r\n”;
$http_request .= “User-Agent: reCAPTCHA/PHP\r\n”;
$http_request .= “\r\n”;
$http_request .= $req;
$response = ”$response = ”
;
if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
die (‘Could not open socket’);
}
fwrite($fs, $http_requestfwrite($fs, $http_request
); while ( !
feof($fsfeof($fs
) )
$response .= fgets($fs, 1160); // One TCP-IP packet
fclose($fs);
$response = explode(“\r\n\r\n”, $response, 2); return
$response$response
;
}
/**
* Encodes the given data into a query string format
* @param $data - array of string elements to be encoded
* @return string - encoded request
*/
function _recaptcha_qsencode ($data) {
$req = “”;
foreach ( $data as $key => $value )
$req .= $key . ‘=’ . urlencode( stripslashes($value) ) . ‘&’;
// Cut the last ’&’
$req=substr($req,0,strlen($req)-1);
return $req;
}
}
?>
code for app/views/helpers/recaptcha.php
Helper Class:
Download code <?php
class RecaptchaHelper extends AppHelper {
var $helpers = array('form');
function display_form($output_method = 'return', $error = null, $use_ssl = false){
$data = $this->__form(Configure::read("Recaptcha.pubKey"),$error,$use_ssl);
if($output_method == "echo")
echo $data;
else
return $data;
}
function hide_mail($email = '',$output_method = 'return'){
$data = $this->recaptcha_mailhide_html(Configure::read('Recaptcha.pubKey'), Configure::read('Recaptcha.privateKey'), $email);
if($output_method == "echo")
echo $data;
else
return $data;
}
/**
* Gets the challenge HTML (javascript and non-javascript version).
* This is called from the browser, and the resulting reCAPTCHA HTML widget
* is embedded within the HTML form it was called from.
* @param string $pubkey A public key for reCAPTCHA
* @param string $error The error given by reCAPTCHA (optional, default is null)
* @param boolean $use_ssl Should the request be made over ssl? (optional, default is false)
* @return string - The HTML to be embedded in the user's form.
*/
function __form($pubkey, $error = null, $use_ssl = false){
if ($pubkey == null || $pubkey == '') {
die ("To use reCAPTCHA you must get an API key from <a href='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</a>");
}
if ($use_ssl) {
$server = Configure::read('Recaptcha.apiSecureServer');
} else {
$server = Configure::read('Recaptcha.apiServer');
}
$errorpart = "";
if ($error) {
$errorpart = "&error=" . $error;
}
return '<script type="text/javascript" src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script>
<noscript>
<iframe src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
<input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
<input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
</noscript>';
}/* Mailhide related code */
function _recaptcha_aes_encrypt($val,$ky) {
if (! function_exists ("mcrypt_encrypt")) {
die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed.");
}
$mode=MCRYPT_MODE_CBC;
$enc=MCRYPT_RIJNDAEL_128;
$val=$this->_recaptcha_aes_pad($val);
return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
}
function _recaptcha_mailhide_urlbase64 ($x) {
return strtr(base64_encode ($x), '+/', '-_');
}
/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */
function recaptcha_mailhide_url($pubkey, $privkey, $email) {
if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) {
die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
"you can do so at <a href='http://mailhide.recaptcha.net/apikey'>http://mailhide.recaptcha.net/apikey</a>");
}
$ky = pack('H*', $privkey);
$cryptmail = $this->_recaptcha_aes_encrypt ($email, $ky);
return "http://mailhide.recaptcha.net/d?k=" . $pubkey . "&c=" . $this->_recaptcha_mailhide_urlbase64 ($cryptmail);
}
/**
* gets the parts of the email to expose to the user.
* eg, given johndoe@example,com return ["john", "example.com"].
* the email is then displayed as john...@example.com
*/
function _recaptcha_mailhide_email_parts ($email) {
$arr = preg_split("/@/", $email );
if (strlen ($arr[0]) <= 4) {
$arr[0] = substr ($arr[0], 0, 1);
} else if (strlen ($arr[0]) <= 6) {
$arr[0] = substr ($arr[0], 0, 3);
} else {
$arr[0] = substr ($arr[0], 0, 4);
}
return $arr;
}
/**
* Gets html to display an email address given a public an private key.
* to get a key, go to:
*
* http://mailhide.recaptcha.net/apikey
*/
function recaptcha_mailhide_html($pubkey, $privkey, $email) {
$emailparts = $this->_recaptcha_mailhide_email_parts ($email);
$url = $this->recaptcha_mailhide_url ($pubkey, $privkey, $email);
return htmlentities($emailparts[0]) . "<a href='" . htmlentities ($url) .
"' onclick=\"window.open('" . htmlentities ($url) . "', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;\" title=\"Reveal this e-mail address\">...</a>@" . htmlentities ($emailparts [1]);
}
?>
To use the reCAPTCHA system load the component
}
Controller Class:
Download code <?php
var $components = array('Recaptcha');
?>
After you save the component and helper and initiate them, set your public & private keys in “beforeFilter” of your controller to the ones you received when you signed up on the reCAPTCHA website.
Controller Class:
Download code <?php
function beforeFilter(){
$this->Recaptcha->publickey = "";
$this->Recaptcha->privatekey = "";
}
?>
in the view, the helper can be used to verify form submissions or hide your e-mail addresses (NOTE: mcrypt is required for this.)
Controller Class:
Download code <?php
//create the reCAPTCHA form.
$recaptcha->display_form('echo')//hide an e-mail address
$recaptcha->hide_mail("someuser@somdomain.tld",'echo');
?>
in the controller to verify a form submission using reCAPTCHA do the following.
Controller Class:
Download code <?php
if(
Posted by admin on août 19, 2009 in
Javascript
source : http://www.editeurjavascript.com/scripts/scripts_formulaires_3_690.php
Code :
Entre <HEAD> et </HEAD> :
<style type=”text/css”>
#weak, #medium
{
border-right:solid 1px #DEDEDE;
}
#sm
{
margin:0px;
padding:0px;
height:14px;
font-family:Tahoma, Arial, sans-serif;
font-size:9px;
}
#sm ul
{
border:0px;
margin:0px;
padding:0px;
list-style-type:none;
text-align:center;
}
#sm ul li
{
display:block;
float:left;
text-align:center;
padding:0px 0px 0px 0px;
margin:0px;
height:14px;
}
.nrm
{
width:84px;
color:#adadad;
text-align:center;
padding:2px;
background-color:#F1F1F1;
display:block;
vertical-align:middle;
}
.red
{
width:84px;
color:#FFFFFF;
text-align:center;
padding:2px;
background-color:#FF6F6F;
display:block;
vertical-align:middle;
}
.yellow
{
width:84px;
color:#FFFFFF;
text-align:center;
padding:2px;
background-color:#FDB14D;
display:block;
vertical-align:middle;
}
.green
{
width:84px;
color:#FFFFFF;
text-align:center;
padding:2px;
background-color:#A0DA54;
display:block;
vertical-align:middle;
}
</style>
<script type=”text/javascript”>
function evalPwd(s)
{
var cmpx = 0;
if (s.length >= 6)
{
cmpx++;
if (s.search(“[A-Z]“) != -1)
{
cmpx++;
}
if (s.search(“[0-9]“) != -1)
{
cmpx++;
}
if (s.length >= 8 || s.search(“[\x20-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]“) != -1)
{
cmpx++;
}
}
if (cmpx == 0)
{
document.getElementById(“weak”).className = “nrm”;
document.getElementById(“medium”).className = “nrm”;
document.getElementById(“strong”).className = “nrm”;
}
else if (cmpx == 1)
{
document.getElementById(“weak”).className = “red”;
document.getElementById(“medium”).className = “nrm”;
document.getElementById(“strong”).className = “nrm”;
}
else if (cmpx == 2)
{
document.getElementById(“weak”).className = “yellow”;
document.getElementById(“medium”).className = “yellow”;
document.getElementById(“strong”).className = “nrm”;
}
else
{
document.getElementById(“weak”).className = “green”;
document.getElementById(“medium”).className = “green”;
document.getElementById(“strong”).className = “green”;
}
}
</script>
Entre <BODY> et </BODY> :
<form>
<input type=”text” size=”24″ onkeyup=”evalPwd(this.value);” /><br /><div id=”sm”><ul><li id=”weak” class=”nrm”>Faible</li><li id=”medium” class=”nrm”>Moyen</li><li id=”strong” class=”nrm”>Fort</li></ul></div>
</form><noscript><a href=”http://www.editeurjavascript.com/”>ajax</a></noscript>
Posted by admin on août 19, 2009 in
Php
source : http://blog.arnaud-k.fr/2009/developpement-web/cat-php/api-geolocalisation-dadresse-ip-avec-iplocationtools/
J’avais un peu étudié les différentes solutions d’API de géolocalisation d’adresse IP il y a quelques temps. J’étais sur cette solution tout simple : iplocationtools.
Iplocationtools est une API que l’on peut appeler directement en PHP (voir le code ci-dessous). Cela crée un fichier XML contenant toutes les infos nécessaires à la géolocalisation (pays, region, ville, latitude et longitude principalement). Il ne reste plus qu’à le parser.
Code à intégrer pour appeler l’API :
function locateIp($ip){
$d = file_get_contents("http://www.iplocationtools.com/ip_query.php?ip=$ip&output=xml"); // on charge l'api
if (!$d)
return false; // Failed to open connection
$answer = new SimpleXMLElement($d);
if ($answer->Status != 'OK')
return false; // Invalid status code
$country_code = $answer->CountryCode;
$country_name = $answer->CountryName;
$region_name = $answer->RegionName;
$city = $answer->City;
$zippostalcode = $answer->ZipPostalCode;
$latitude = $answer->Latitude;
$longitude = $answer->Longitude;
//Return the data as an array
return array('latitude' => $latitude, 'longitude' => $longitude, 'zippostalcode' => $zippostalcode, 'city' => $city, 'region_name' => $region_name, 'country_name' => $country_name, 'country_code' => $country_code, 'ip' => $ip);
}
Posted by admin on août 19, 2009 in
Php
<?
if (eregi(‘msie’, $HTTP_USER_AGENT) && !eregi(‘opera’, $HTTP_USER_AGENT))
{
// Internet Explorer
$navigateur=“Internet Explorer”;
}
elseif (eregi(‘opera’, $HTTP_USER_AGENT))
{
// Opera
$navigateur=“Opera”;
}
elseif (eregi(‘Mozilla/4.’, $HTTP_USER_AGENT))
{
// Netscape 4.x
$navigateur=“Netscape 4.x”;
}
elseif (eregi(‘Mozilla/5.0′, $HTTP_USER_AGENT) && !eregi(‘Konqueror’, $HTTP_USER_AGENT))
{
// Netscape 6
$navigateur=“Netscape 6.x”;
}
else
{
// Autres navigateurs
$navigateur=“Navigateur inconnu”;
}
echo $navigateur;
?>
Posted by admin on août 19, 2009 in
Cake Php
source : http://bakery.cakephp.org/articles/view/parsing-xml-files-with-cakephp
Simple tutorial for parsing xml files quickly using the core XML class of cakephp.
After spending one whole evening, I found out CakePHP has its own XML class for handling xml files. In the meantime, i tried SimplePie (for RSS only, not XML), SimpleXML, and XMLize. But still they werent of any great help compared to cakephp’s core XML class (and some Sets).
How to parse it then?
First of all, you need to import the XML class in your controller class using App::import(). Here is the controller class parsing a particular xml file and printing out (like print_r) the returned array.
Controller Class:
<?php
class ParseController extends AppController {
var $name = "Parse";
var $uses = array('MyModel'
);
function xml() {
// import XML class
App::import('Xml'
);
// your XML file's location
$file = "my_xml_file.xml"
;
// now parse it
$parsed_xml =& new XML($file);
$parsed_xml = Set::reverse($parsed_xml);
// this is what i call magic
// see the returned array
debug($parsed_xml
);
}
}
?>
Posted by admin on fév 24, 2009 in
Mysql
Voici une technique rapide pour supprimer les doublons dans une table tout en évitant de faire un script php..
Création de la table
Pour l’exemple je vous propose de créer une table ‘membre’ simple :
CREATE TABLE membre (
id int(10) NOT NULL AUTO_INCREMENT,
nom varchar(30),
prenom varchar(30),
age int(3),
datecreation timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
Nous admettrons que l’unicité est basée sur la composition du nom et prénom, c’est à dire que deux personnes physiquement différentes ne peuvent avoir le même couple de nom+prénom (ce qui dans la réalité n’est bien sûr pas valable).
Insertion de champs avec un doublon
Insérons 4 champs, les deux premiers étant identiques (doublons) :
INSERT INTO membre (nom,prenom,age) values ('durand','marc',34);
INSERT INTO membre (nom,prenom,age) values ('durand','marc',34);
INSERT INTO membre (nom,prenom,age) values ('hurni','michael',22);
INSERT INTO membre (nom,prenom,age) values ('morin','luc',52);
Vérifions que les champs soient bien présents dans la base :
SELECT * FROM membre;
+----+--------+---------+------+---------------------+
| id | nom | prenom | age | datecreation |
+----+--------+---------+------+---------------------+
| 1 | durand | marc | 34 | 2008-11-21 20:16:57 |
| 2 | durand | marc | 34 | 2008-11-21 20:16:57 |
| 3 | hurni | michael | 22 | 2008-11-21 20:16:57 |
| 4 | morin | luc | 52 | 2008-11-21 20:16:57 |
+----+--------+---------+------+---------------------+
Nous observons que Marc Durand est bien en double dans la base de données, il y a donc un
doublon (en admettant qu’il n’y ait qu’un seul Marc Durand sur terre).
Création d’un index d’unicité
Cet index va permettre de supprimer les enregistrements comportant certains champs identiques,
nom et prénom pour mon cas :
ALTER IGNORE TABLE membre ADD UNIQUE INDEX(nom,prenom);
Query OK, 4 rows affected (0.46 sec)
Records: 4 Duplicates: 1 Warnings: 0
MySQL nous indique qu’un doublon a été supprimé (duplicate).
Interrogation de la table
Vérifions que le deuxième ‘Marc Durand’ n’est plus dans la table :
select * from membre;
+----+--------+---------+------+---------------------+
| id | nom | prenom | age | datecreation |
+----+--------+---------+------+---------------------+
| 1 | durand | marc | 34 | 2008-11-21 20:16:57 |
| 3 | hurni | michael | 22 | 2008-11-21 20:16:57 |
| 4 | morin | luc | 52 | 2008-11-21 20:16:57 |
+----+--------+---------+------+---------------------+
3 rows in set (0.00 sec)
L’enregistrement ayant pour identifiant ‘2′ a bien été supprimé.
Suppression de l’index
Si vous ne souhaitez pas préserver cet d’unicité, bien qu’il interdise les doublons à
l’insertion, vous pouvez le supprimer :
ALTER TABLE membre DROP INDEX nom; Query OK, 3 rows affected (0.38 sec) Records: 3 Duplicates: 0 Warnings: 0
Vérification de la structure en ligne de commande :
[code]desc membre;
+————–+————-+——+—–+——————-+—————-+
| Field | Type | Null | Key | Default | Extra |
+————–+————-+——+—–+——————-+—————-+
| id | int(10) | NO | PRI | NULL | auto_increment |
| nom | varchar(30) | YES | MUL | NULL | |
| prenom | varchar(30) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
| datecreation | timestamp | NO | | CURRENT_TIMESTAMP | |
+————–+————-+——+—–+——————-+—————-+
5 rows in set (0.07 sec)[/code]
Conclusion
Il existe plusieurs techniques de suppression des doublons MySQL,
les plus mauvaises étant celles préconisant l’usage d’un langage tiers (php, bash, etc.)
basées sur un parcours en boucle de la table car trop consommatrices en ressources.
Sachez qu’il est bien plus rentable d’utiliser les fonctions natives du moteur SQL,
quitte à faire fonctionner un tant soit peu ses méninges et consulter la documentation
MySQL (ou autre moteur SQL suivant celui utilisé
). Cette solution étant rapide et fiable,
j’espère que vous en aurez l’utilité.