Никто не ответил на этот вопрос несколько дней назад, поэтому я попытаюсь объяснить его по-другому. Это мешает мне работать над моим проектом.
В PHP вы можете хранить сообщения обратной связи в $ _SESSION, такие как $ _SESSION [‘login’] = «failed», которые могут быть возвращены пользователю после перенаправления. Это так называемые флеш-сообщения. Проблема в том, что PHP не знает, какое флэш-сообщение принадлежит какому-либо браузеру TAB. Вот пример:
Второе изображение теперь обрабатывается формой, но оно содержит ошибку и получает флэш-сообщение «ошибка: файл слишком большой», и перенаправление также продолжается на website.com/UploadPhoto.
Что происходит сейчас, так это то, что вторая картинка, которая была загружена после первой, перенаправляется первой с сообщением: Успех! Он похитил первое сообщение, потому что оно было перенаправлено раньше. Затем, после 10 секунд рекламы, случай с изображением 1 перенаправляется с сообщением «файл слишком большой», потому что он поступил позже.
Как вы можете предотвратить это?
Я действительно надеюсь, что кто-то может дать мне некоторое представление, потому что я застрял в своем проекте из-за этого
Когда браузер выполняет запрос к определенному URL, он отправляет все файлы cookie, которые соответствуют домену и пути. Неважно, в каком окне или вкладке вы находитесь, это поведение всегда одинаково.
Есть несколько решений вашей проблемы:
На мой взгляд, самый простой способ, потому что есть много хороших библиотек javascript для управления загрузкой файлов через запросы XHR (ajax). Один мне нравится Загрузка файла jQuery.
В этом случае вам не понадобятся флэш-сообщения, вы можете просто поместить всю необходимую информацию в ответ на запрос XHR.
Йенс-Андре Кох дал хороший ответ о том, как это работает.
Если вам нужна полная поддержка отдельных сеансов для каждого окна / вкладки, вы не можете полагаться на то, что идентификатор сеанса хранится в файле cookie. Это, однако, будет означать, что пользователь должен войти в каждое окно / вкладку. Я объясню, как это работает подробно:
Вы должны получить суть сейчас: каждый URL, возвращаемый сервером, должен содержать идентификатор сеанса. Вы больше не полагаетесь на идентификатор сеанса в файле cookie (фактически целесообразно отключить отправку файла cookie, содержащего идентификатор сеанса в PHP).
Я также очень четко говорил о запросах / ответах, чтобы лучше показать, как на самом деле работает протокол http.
Ваши flash-сообщения не имеют представления, когда и по какой причине они должны показываться.
Когда загрузка изображения завершится, вы можете показать флэш-сообщение в зависимости от идентификатора изображения.
Чтобы получить сообщение типа «Успех: изображение 1 из вкладки A загружено», необходимо добавить в сеанс дополнительные данные, например идентификатор изображения и, возможно, состояние процесса загрузки. Если вам действительно нужен идентификатор вкладки, добавьте его тоже.
$_SESSION['flashmessages']['image_uploads'][$id]['state'] = "uploading";
$_SESSION['flashmessages']['image_uploads'][$id]['state'] = "finished";
if(array_key_exists('image_uploads', $_SESSION['flashmessages']) === true)
{
foreach($_SESSION['flashmessages']['image_uploads'] as $image => $values) {
if($values['state'] === 'finished') {
// output flashmessage
echo 'Success: Image ' . $image . ' was uploaded.';
// unset this flashmessage
unset($_SESSION['flashmessages']['image_uploads'][$id]);
}
}
}