Pb de comportement de code php

Petit nouveau ! | 7 Messages

23 janv. 2012, 10:43

Bonjour à tous.

J'ai un problème de comportement de mon code php sur un site perso.

Voilà ce que faisait mon code.

déclaration de démarrage de session dans chaque page au tout début de mon code.
une fonction include ensuite pour intégrer un bout de code en php qui renseigne une base de données pour savoir qui vient et quelles pages sont visitées.
Une ligne de la base de données est créée et mise à jour tant que l'utilisateur est sur la même session !

Mon problème :
Depuis l'intégration d'un script google analytique dans mes pages, plusieurs lignes sont créées dans ma base de données bien que je sois toujours dans ma session, (je le sais car j'ai un accès protégé par mot de passe sur une partie de mon site et lorsque ma session est valide, je n'ai pas besoin de rentrer mon mot de passe à chaque fois) ?

je nage, avez-vous une idée ? Merci pour votre aide !

je post mon bout de code php pour ma base de données.

<?php
session_start();

function get_ip(){
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];}
elseif(isset($_SERVER['HTTP_CLIENT_IP'])){
$ip = $_SERVER['HTTP_CLIENT_IP'];}
else{ $ip = $_SERVER['REMOTE_ADDR'];}
return $ip;}

//$serveur = mysql_connect("ip","user","mdp");
$serveur = mysql_connect("bases.sql","user","mdp");
if (!$serveur)
{
die('Non connecté : ' . mysql_error());
}
$dbstat = mysql_select_db('nom base', $serveur);
if (!$dbstat)
{
die ('Impossible d\'utiliser la base : ' . mysql_error());
}






if(!isset($_SESSION['parcours']))
{
$_SESSION['time'] = time();
$_SESSION['parcours']= $_SERVER['REQUEST_URI'];
$parcours=$_SESSION['parcours'];
$time=$_SESSION['time'];
$ip=get_ip();

$sql = "INSERT INTO nomtable (referer,time,parcours,sessid,ipclient)";
$sql .= "VALUES ('".$_SERVER['HTTP_REFERER']."','$time','$parcours','".session_id()."','$ip')";


}
else
{
$_SESSION['parcours'].= ';'.$_SERVER['REQUEST_URI'];
$_SESSION['time'].= ';'.time();
$parcours=$_SESSION['parcours'];
$time=$_SESSION['time'];
$ip=get_ip();
$sql = "UPDATE nomtable SET parcours='$parcours',time='$time',ipclient='$ip'";
$sql .= "WHERE sessid='".session_id()."'";
}

mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());


?>

ViPHP
xTG
ViPHP | 7331 Messages

23 janv. 2012, 11:04

Enregistres l'ip des sessions.
Tu verras de suite si c'est le même poste.
Je parierai pour un bot de Google qui vient plus souvent grâce à ton nouveau script.

Eléphant du PHP | 418 Messages

23 janv. 2012, 11:27

Tu dois pas avoir tord, j'ai un soucis avec google Bot qui marque son pseudo, pour un script qui récupère le nom d'une personne ayant fait un don sur mon site.

Perso, je sais pas comment les bots navigue sur un site, et comment il arrivent à être identifier comme utilisateur "" dans ta bdd, mais au pire, essaye de t'en servir pour indiquer que google visite ta page, un peu comme phpbb ^^

Voila, perso j'en sais pas plus, et je ne sais pas comment contré les bots, mais tant que je sais que c un bot c pas dérangeant.

Cordialement

Petit nouveau ! | 7 Messages

23 janv. 2012, 11:53

Comme vous pouvez le voir, l'ip est déjà enregistrée...
mon soucis se situe dans la première partie du code... le test de la variable globale 'parcours'.

elle existe bien car la session est démarée, mais le programme semble l'avoir oublié !
je me retrouve donc dans ma table avec 2 lignes ou plus avec la même IP et le même id de session, ce qui ne devrait pas être le cas.
Le numéro d'id de session devrait être unique dans ma table.

Une autre idée pour apporter une modification à mon code ?

ViPHP
xTG
ViPHP | 7331 Messages

23 janv. 2012, 12:35

Je ne vois pas dans ton script ce qui pourrait clocher.
Mais tu pourras régler le problème en ajoutant une clé primaire dans ta table.

Petit nouveau ! | 7 Messages

23 janv. 2012, 13:30

Merci de ta réponse xTG.

pour ce qui est de la clé primaire, elle existe déjà dans un champs mais pas sur le champs id de session.

je ne comprend pas pourquoi ce test de variable 'parcours' ne fonctionne pas.

je ne devrais créer un nouvel enregistrement que si elle n'existe pas.

Autre question :

comment tester si dans ma table il existe un enregistrement avec ip et idsession ?
ainsi si l'enregistrement existe, je ne crée pas mais complète ledit enregistrement


Sans titre 2.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Philou77 le 23 janv. 2012, 16:58, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

23 janv. 2012, 14:07

Oui c'est bien visible, et au passage c'est un utilisateur tout ce qu'il y a de commun et non un bot Google d'après l'IP.
La 5eme colonne c'est bien la colonne time ? Car il parait bizarre d'y voir deux temps concaténé dedans.

Petit nouveau ! | 7 Messages

23 janv. 2012, 15:10

oui, c'est bien une colonne time concaténée..j'enregistre le parcours et l'heure dans mes colonnes..
l'origine de la navigation aussi.
mais je ne comprends pas pourquoi mon test ne fonctionne plus et me crée donc plusieurs lignes.
je suis prêt à changer mon code mais aimerai avoir une idée.

je ne suis pas le créateur de ce code (j'ai trouvé un exemple sur le net) et pas particulièrement calé en php.

Petit nouveau ! | 7 Messages

23 janv. 2012, 18:51

RE bonjour,

J'ai peut être identifié mon problème..

Le code php étant dans une feuille externe, j'ai supprimé le Session_start(); qui était dedans (après avoir lu le tuto des paniers sur le forum) !

Cela semble fonctionner correctement. je vous dirai cela dans les jours qui suivent.

Petit nouveau ! | 7 Messages

24 janv. 2012, 09:57

Re bonjour,

Mon code me cause toujours les mêmes problèmes...

J'ai remplacé le test de la variable parcours par un test sur une autre variable globale (qui contenait l'ip qui n'est jamais vide) mais c'est toujours pareil.

je souhaiterais donc effectuer un test sur la base pour savoir si un enregistrement existe avec l'ip et l'id de session.
si le test est vrai alors je complète l'enregistrement, si le test est faux alors je crée l'enregistrement.

Par contre je ne sais pas l'écrire, pourriez vous me donner un coup de main.

Merci

ViPHP
xTG
ViPHP | 7331 Messages

24 janv. 2012, 10:08

Si tu ne sais pas écrire un code interrogeant une base de données je te recommande de lire des cours :
http://phpdebutant.org/article62.php (plus le reste des articles à droite)

Car le script que tu as récupéré n'est pas complet.
Il ne vide jamais la table, donc tu vas arriver à des résultats aberrant après quelques mois car de vielles sessions seront réutilisées et complétées alors que ce sont des nouvelles.

Petit nouveau ! | 7 Messages

24 janv. 2012, 17:16

je ne comprend toujours pas.

D'après le code, je ne devrait créer un nouvel enregistrement que si la session est nouvelle !

C'est exactement ce que je veux.
Pouvoir voir le parcours dans le site, la date et l'heure, l'ip, et le referer de l'utilisateur connecté afin de statisques.

Ma table n'a donc pas besoin d'être vidée..si ce n'est manuellement.
Je ne savais pas que les numéro d'id de session pouvait être récurrents.
Je n'ai pas de bouton pour me déloguer...donc détruire la session n'est pas possible.

Ceci dit mon code se comporte d'une manière bizarre dans le sens ou il considère que la session est nouvelle alors qu'elle ne l'est pas !
Et ceci depuis l'implémentation d'un script pour google analytique (dans les pages ou j'en ai besoin).

Donc je me suis trompé quelque part mais je ne voie pas où.
Ma demande dans le post précédent n'est qu'un paliatif au problème, mais j'aimerais plutôt identifier le problème.

Help (au secours) !