Tracking Cookie (Bug création cookie)
Bonjour à tous,
Après plus d'une semaine de galère et de recherche sur le net (et sur ce forum), je me décide à vous exposer mon projet... et le soucis que je n'arrive guère à comprendre :(
Je travaille actuellement sur un petit outil de tracking pour de petites campagnes mail.
Le fonctionnement du script est des plus trivial pour le moment :
- Les liens de la créa mail pointent vers mon serveur qui récupère l'identifiant de l'annonceur et l'email qui a reçu ce dernier.
- Lors du clic, l'internaute est tout d'abord redirigé vers mon serveur, les informations sont stockés en BDD (pour les stats nombre de clicks) et le script "tente" (car c'est ici que ça coince) de créer un cookie sur le poste client avec pour information -> son email + identifiant de l'annonceur.
- Lorsque l'internaute remplit le formulaire, la page de confirmation contient un pixel de tracking qui appelle une page sur mon serveur avec l'identifiant de l'annonceur.
- Cette page teste si le poste client possède bien mon cookie et cas échéant récupère les infos et les stocke en BDD.
Voici grosso modo le fonctionnement actuel du script.
Ma page de création Cookie + Redirection page formulaire
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| $bdd=new PDO(); //connexion à ma BDD
// Fonction de création COOKIE
function initCookie($params){
foreach($params as $key=>$value){
setCookie($key,$value,time() + 30*24*3600, '/track/','.ndd.fr',FALSE,TRUE);
}
}
if(isset($_GET['i'])&&isset($_GET['email'])){ // On teste les variables GET
$params=array('annonceur'=>$_GET['i'],'email'=>$_GET['email']);
// Je teste si la campagne existe bien en BDD
$sql="SELECT c_id,c_lien FROM campagne WHERE c_id = ".$_GET['i'];
$mysql=$bdd->query($sql);
$result=$mysql->fetch(PDO::FETCH_OBJ);
// Si oui je fait mes traitements (créa cookie + redirection)
if($result==1){
$link=$result->c_lien;
// Création cookie
initCookie($params);
// Insertion BDD pour les stats clics
$sql="INSERT INTO clicks(ck_email,ck_date,ck_c_id) VALUES ('".$_GET['email']."','".date('Y-m-d G:i:s')."','".$_GET['i']."')";
$mysql=$bdd->query($sql);
// Redirection vers la page formulaire
header("Location: ".$link."");
exit();
}
} |
Suite à de nombreux tests, il apparaît que c'est lors de cette étape que mon processus bug... La création des cookies est en effet plus qu'aléatoire. Lors de mes tests ça ne pose aucun soucis, le cookie est bien crée et le processus fonctionne à chaque fois... Par contre, en production, il apparaît que le Cookie est crée 1 fois sur 10... Je n'arrive pas à localiser ce qui cloche :cry: Il peut-être utile de préciser que le suivi des clics est opérationnel, mes stats étant similaires aux reportings Emailvision ;)
Récupération Cookie pour stats formulaire rempli
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| // Connexion BDD
$bdd=new PDO();
// Fonction qui détruit les Cookies présents sur le poste Client
function destroyCookie($cookieTemp){
foreach($cookieTemp as $key=>$value){
setcookie($key,'',time() - 30*12*3600,'/track/','.ndd.fr',FALSE,TRUE);
unset($_COOKIE[$key]);
}
}
// Je teste si l'id de l'annonceur est bien renseigné
if(isset($_GET['trk_client_id'])&&!empty($_GET['trk_client_id'])){
// Je teste si l'id correspond bien à une campagne en base
$sql="SELECT c_id FROM campagne WHERE c_id = ".$_GET['trk_client_id'];
$mysql=$bdd->query($sql);
$result=$mysql->fetch(PDO::FETCH_OBJ);
if($result==1){
// Si oui je teste si les cookies existent bien et que l'id passé en GET correspond bien à l'id Annonceur du cookie client
if(isset($_COOKIE['email'])&&!empty($_COOKIE['email'])&&$_COOKIE['annonceur']==$_GET['trk_client_id']){
$sql="SELECT l_id FROM leads WHERE l_email='".$_COOKIE['email']."'";
$cookieTemp=array('email'=>$_COOKIE['email'],'annonceur'=>$_COOKIE['annonceur']);
$mysql=$bdd->query($sql);
$result=$mysql->fetch(PDO::FETCH_OBJ);
// Je teste si le client n'a pas déjà effectué d'inscription pour éviter les doublons
if($result==0){
// Si nouvel inscription j'enregistre les infos en BDD et j'appelle la fonction qui supprime les cookies
$sql="INSERT INTO leads(l_email,l_date,l_c_id) VALUES ('".$_COOKIE['email']."','".date('Y-m-d G:i:s')."','".$_GET['trk_client_id']."')";
$mysql=$bdd->query($sql);
if($mysql==TRUE){
destroyCookie($cookieTemp);
}
}
}
}
} |
Je teste si la campagne existe bien en BDD, si le cookie est présent et correspond bien à l'annonceur passé en GET par mon pixel de tracking. Cas échéant j'enregistre les données en BDD et je détruis les cookies...
Pixel de tracking
Code:
<img src="http://ndd.tld/lds.php?trk_client_id=9" height="0" width="0" />
Ce dernier se trouve dans le code de la page de confirmation qui fait suite à l'inscription.
Comme préciser précédemment, mes tests démontrent (ou pas :mrgreen:) que le problème pourrait se situer au niveau du premier script... Lors des tests sur hébergement lambda (OVH + O2Switch) le processus se déroule sans accroc mais coince lors de véritables routages tests... Je ne récupère qu'à peine 10% des inscriptions :calim2:
Je me tiens à votre disposition pour toute précision & cie :zoubi:
Merci à vous.
Cdt
Leptik