определить текущую вкладку - PullRequest
0 голосов
/ 29 декабря 2008

Можно ли определить, открыта ли страница в 2 разных браузерах?

Я создал небольшое приложение, которое хранит некоторые данные в $ _SESSION, и проблема в том, что при открытии нескольких вкладок переменные сессии перезаписываются (поисковые фильтры в форме поиска), поэтому вкладки могут отображаться одинаково. результаты для явно разных поисков.

Основным браузером, используемым для этого приложения, является IE, поэтому для решения этой проблемы потребовалось некоторое время, и приложение стало больше и сложнее модифицировать.

Пока я не исправлю все ссылки на этот поиск, я бы хотел сделать "быстрое и грязное исправление" и запретить открывать две вкладки с одной и той же страницей или хотя бы отображать предупреждение.

редактирование: @arjun: да, я знаю, но мне нужно восстановить фильтры поиска, когда пользователь вернется на страницу поиска :), так что $ SESSION - путь для этого. Кроме того, фильтры отправляются AJAX, и отладку сложно, когда у вас много фильтров (размер GET ограничен, поэтому я использую POST)

@ tomhaigh: спасибо ... но это то, что я пытаюсь сделать прямо сейчас, но это займет некоторое время, потому что эта «вещь» на вкладке влияет на все приложение, и мне нужно изменить фильтры во всех модулях. .. я искал что-то быстрое и грязное сейчас. Совет: я не хочу использовать time () и rand (), поскольку эти функции могут (и в конечном итоге будут генерировать) повторяющиеся числа. В новом «rewrite» я использую microtime из PHP и Date.getTime () в JS и объединяю theese 2 для создания действительно уникального идентификатора. Кроме того, я написал функцию для периодического разбора СЕССИИ и очистки сохраненных фильтров старше 2 часов, чтобы они не становились слишком большими.

@ Горток: я знаю ... но он был разработан с учетом IE6, и большинство пользователей (что-то вроде 90%) все еще используют IE6 при входе в это приложение ... поэтому я никогда не видел необходимости рассматривать несколько открытых вкладки.

Ответы [ 5 ]

6 голосов
/ 29 декабря 2008

Я бы рекомендовал избегать использования $ _SESSION для хранения поисковых фильтров и вместо этого кодировать их в строке поискового запроса (т.е. /search.php?filter1=val&filter2=val и т. Д.). Таким образом, каждое окно имеет уникальный URL-адрес и не допускает загромождения другого окна.

1 голос
/ 29 декабря 2008

Я согласен с ответом arjun, но если вам нужно использовать сеансы для этого, вы можете создать массив, содержащий информацию для каждого поиска в сеансе PHP.

например. каждый раз, когда форма отправляется

$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 );

тогда вы можете создать URL-адрес, такой как results.php? Key = $ key, а затем получить данные с помощью

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

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

Проблема, с которой вы столкнетесь, состоит в том, что сессия будет увеличиваться и увеличиваться по мере того, как пользователь будет выполнять больше поисков, я снова отвечу на вопрос Арджуна, но я думал, что добавлю еще один возможный подход

1 голос
/ 29 декабря 2008

Ну, это проблема дизайна, которая должна быть решена как можно скорее. Быстрый и, конечно же, грязный способ справиться с этим - сохранить IP-адрес клиента в $ _SESSION ($ip=$_SERVER['REMOTE_ADDR'];). Затем проверьте и не создавайте новый сеанс или не выводите предупреждение, если с этого адреса делается несколько запросов. Это может вызвать проблемы у посетителей из локальной сети с одним и тем же IP-адресом. Я не могу думать больше ничего .. быстро (или грязно)

0 голосов
/ 29 декабря 2008

Я вижу два вопроса:

  1. Вы лишаете пользователя возможности открывать веб-страницу в нескольких вкладках, что является почти обязательным требованием для веб-приложений.
  2. Эта проблема поднимает проблему дизайна.

Возможно, вы захотите изменить переменную $_SESSION на singleton и не допускать ее перезаписи несколькими просмотрами страниц.

0 голосов
/ 29 декабря 2008

Никогда не отказывайте пользователю в простоте использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...