Можно ли определить, открыта ли страница в 2 разных браузерах?
Я создал небольшое приложение, которое хранит некоторые данные в $ _SESSION, и проблема в том, что при открытии нескольких вкладок переменные сеанса перезаписываются (фильтры поиска в форме поиска), и поэтому вкладки могут отображать те же результаты для, по-видимому, разные поиски.
Основным браузером, используемым для этого приложения, является IE, поэтому потребовалось время, чтобы решить эту проблему, и приложение стало ... больше и труднее изменять.
Пока я не исправлю все ссылки на этот поиск, я хотел бы сделать «быстрое и грязное исправление» и запретить открывать две вкладки с одной и той же страницей или, по крайней мере, отобразить предупреждение ..
редактировать: @arjun: да, я знаю, но мне нужно восстановить фильтры поиска, когда пользователь вернется на страницу поиска :), поэтому $ SESSION - это способ сделать это. Кроме того, фильтры отправляются AJAX, и становится трудно отлаживать, когда у вас много фильтров (GET ограничен по размеру, поэтому я использую POST)
@tomhaigh: thx .. но это то, что я пытаюсь сделать прямо сейчас, но это займет некоторое время, потому что эта вкладка "вещь" влияет на все приложение, и мне нужно изменить фильтры во всех модулях ... i искал что-нибудь быстрое и грязное. Совет: я не хочу использовать time () и rand (), поскольку эти функции могут (и в конечном итоге будут) генерировать повторяющиеся числа. В новой «перезаписи» я использую microtime из PHP и Date.getTime () в JS и объединяю эти 2 для создания действительно уникального идентификатора. Кроме того, я написал функцию, которая время от времени анализирует СЕССИЮ и очищает сохраненные фильтры старше 2 часов, чтобы они не становились слишком большими.
@Gortok: я знаю ... но он был разработан с учетом IE6, и большинство пользователей (примерно 90%) все еще используют IE6 при входе в это приложение ... поэтому я никогда не видел необходимости рассматривать несколько открытых вкладок.






Никогда не отказывайте пользователю в простом использовании.
Я вижу две проблемы:
Возможно, вы захотите изменить свою переменную $_SESSION на одиночка и не позволять перезаписывать ее при просмотре нескольких страниц.
Что ж, это проблема дизайна, которую следует исправить как можно скорее. Быстрый и, конечно же, грязный способ справиться с этим - сохранить 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, но я подумал, что добавлю еще один возможный подход
Он уже заявил, что хочет быстрого и грязного временного решения. Во всяком случае, я не могу понять, как в этом случае помогает шаблон singleton. Синглтон $ _Session? На php нет приложения, поэтому не может быть и синглтона. Каждый объект умирает, когда заканчивается ответ.