Можно ли определить, открывается ли страница в двух разных браузерах?
Я создал небольшое приложение, которое хранит некоторые данные в $ _SESSION, и проблема в том, что при открытии нескольких вкладок сеансовые вары перезаписываются (фильтры поиска в форме поиска), и поэтому вкладки могут отображать те же результаты, что, очевидно, разные поиски.
Основным браузером, используемым для этого приложения, является IE, поэтому потребовалось некоторое время, чтобы поразить эту проблему, и приложение получило ..больше и сложнее изменить.
Пока я не исправлю все ссылки на этот поиск, я хотел бы сделать «быстрое и грязное исправление» и запретить открытие двух вкладок с одной и той же страницей или, по крайней мере, отобразить предупреждение.
edit: @arjun: да, я знаю, но мне нужно восстановить фильтры поиска, когда пользователь вернется на страницу поиска 🙂 так что SESSION – это способ пойти на это. Кроме того, фильтры отправляются AJAX, и его сложно отлаживать, когда у вас много фильтров (GET ограничен по размеру, поэтому я использую POST)
@tomhaigh: thx..but это то, что я пытаюсь сделать прямо сейчас, но это займет некоторое время, потому что эта вкладка «вещь» влияет на все приложение, и я должен менять фильтры во всех модулях … i теперь искал что-то быстрое и грязное. Совет. Я не хочу использовать time () и rand (), поскольку эти функции могут (и в конечном итоге) генерировать повторяющиеся числа. В новом «переписывании» я использую microtime из PHP и Date.getTime () в JS и объединяю эти 2, чтобы генерировать поистине уникальный идентификатор. Кроме того, я написал функцию для синтаксического анализа SESSION время от времени и очистки хранимых фильтров старше 2 часов, поэтому он не станет слишком большим.
@Gortok: я знаю … но он был разработан с учетом IE6, и большинство пользователей (что-то вроде 90%) все еще используют IE6 при входе в это приложение … поэтому я никогда не видел необходимости рассматривать несколько открытых вкладок.
Ну, это проблема дизайна, которая должна быть исправлена как можно скорее. Быстрый и -серьезно-грязный способ справиться с этим, но это будет хранить 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-адрес, например result.php? key = $ key, а затем получить данные по
$filters = &$_SESSION['search_filters'][$_GET['key']]; if (!isset($filters)) die('cannot find search'); //do stuff with data print_r($filters);
Проблема, с которой вы столкнетесь, заключается в том, что сессия будет становиться все больше и больше, поскольку пользователь выполняет больше запросов, опять же я бы пошел с ответом арджуна, но я думал, что добавлю еще один возможный подход
Никогда не отказывайте пользователю в простоте использования.
Два вопроса, которые я вижу:
Возможно, вам захочется рассмотреть возможность изменения переменной $_SESSION
в singleton и не допускать ее перезаписывания несколькими просмотрами страниц.