Определить текущую вкладку

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

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
1 747
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Я вижу две проблемы:

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

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

Он уже заявил, что хочет быстрого и грязного временного решения. Во всяком случае, я не могу понять, как в этом случае помогает шаблон singleton. Синглтон $ _Session? На php нет приложения, поэтому не может быть и синглтона. Каждый объект умирает, когда заканчивается ответ.

Diadistis 29.12.2008 04:52
Ответ принят как подходящий

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

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

Я согласен с ответом 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);

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

Другие вопросы по теме