2008-12-29 5 views
0

Est-il possible de détecter si une page est ouverte dans 2 navigateurs différents?détecter l'onglet actuel

J'ai créé une petite application qui stocke des données dans $ _SESSION, et le problème est que lorsque plusieurs onglets sont ouverts, les vars de session sont écrasés (filtres de recherche dans un formulaire de recherche) et les onglets peuvent afficher mêmes résultats pour des recherches apparemment différentes.

Le navigateur principal utilisé pour cette application est IE, il a donc fallu un certain temps pour toucher ce problème et l'application a eu ..larger et plus difficile à modifier.

Jusqu'à ce que je fixe toutes les références à cette recherche, je voudrais faire un « quick fix & sale » et refuser d'ouvrir deux onglets avec la même page, ou afficher au moins un avertissement ..

modifier: @arjun: oui, je sais, mais je dois restaurer les filtres de recherche lorsque l'utilisateur retournera sur la page de recherche :) $ SESSION est donc la solution. En outre, les filtres sont envoyés par AJAX et il devient difficile de déboguer lorsque vous avez beaucoup de filtres (GET est de taille limitée, donc j'utilise POST)

@tomhaigh: thx..mais c'est ce que je suis essayer de faire maintenant, mais cela prendra un certain temps parce que cet onglet "chose" affecte l'ensemble de l'application, et je dois changer les filtres dans tous les modules ... je cherchais quelque chose de rapide & sale pour l'instant. Astuce: je ne veux pas utiliser time() et rand() car ces fonctions peuvent (et finiront par) générer des nombres dupliqués. Dans la nouvelle "réécriture" j'utilise microtime de PHP et Date.getTime() dans JS et concatène theese 2 pour générer un id vraiment unique. En outre, j'ai écrit une fonction pour analyser la SESSION de temps en temps et nettoyer les filtres stockés plus de 2 heures de sorte qu'il ne deviendra pas trop grand.

@Gortok: je sais ... mais a été conçu avec IE6 et la plupart des utilisateurs (quelque chose comme 90%) utilisent toujours IE6 en se connectant à cette application ... donc je n'ai jamais vu la nécessité de considérer plusieurs onglets ouverts.

Répondre

1

Eh bien, il s'agit d'un problème de conception qui devrait être réparé dès que possible. Un moyen rapide et sûr de gérer cela consiste à stocker l'adresse IP du client dans $ _SESSION ($ip=$_SERVER['REMOTE_ADDR'];) Ensuite, vérifiez et ne créez pas une nouvelle session ou affichez un avertissement si plusieurs demandes sont faites à partir de cette adresse. Cela entraînerait des problèmes pour les visiteurs qui se trouvent sur un réseau local partageant la même adresse IP. Je ne peux rien penser de plus ... rapide (ou sale)

0

Ne jamais refuser à un utilisateur l'utilisation de base.

0

Deux questions que je vois:

  1. Vous niez l'utilisateur la possibilité d'ouvrir la page Web dans plusieurs onglets - quelque chose qui est presque une exigence pour les applications web.
  2. Ce problème fait apparaître un problème de conception.

Vous pouvez envisager de changer votre variable $_SESSION à un singleton, et ne permet pas d'être écrasé par plusieurs vues.

+0

Il a déjà déclaré qu'il voulait une solution temporaire rapide et sale. De toute façon je ne peux pas comprendre comment le modèle singleton aide dans ce cas. Singleton $ _Session? Il n'y a pas d'application en PHP donc il ne peut pas y avoir de singleton non plus. Chaque objet meurt lorsque la réponse se termine. – Diadistis

6

Je vous recommande d'éviter l'utilisation de $ _SESSION pour stocker les filtres de recherche, et de les encoder dans la chaîne de requête de recherche (ie /search.php?filter1 = val & filter2 = val, etc). De cette façon, chaque fenêtre a une URL unique et évite d'écraser une autre fenêtre.

1

Je suis d'accord avec la réponse d'arjun mais si vous devez utiliser des sessions pour cela, vous pouvez créer un tableau contenant les informations pour chaque recherche dans la session PHP.

par exemple. chaque fois que le formulaire est soumis

$key = md5(rand(time(), 1)); 
if (!isset($_SESSION['search_filters'])) { 
    $_SESSION['search_filters'] = array(); 
} 

$filters = & $_SESSION['search_filters'][$key]; 

//store stuff 
$filters = array('something' => true); 

alors vous pouvez construire une URL comme results.php? key = $ key, puis récupérer les données par

$filters = &$_SESSION['search_filters'][$_GET['key']]; 
if (!isset($filters)) die('cannot find search'); 

//do stuff with data 
print_r($filters); 

Un problème que vous aurez est que la session Je devrais ajouter une autre approche possible

Questions connexes