Я хочу определить, обновляется ли браузер или нет с помощью PHP, и если браузер обновляется, какой именно код PHP должен выполняться.
Согласился с Гамбо. Если на самом деле ваша цель - избежать побочных эффектов от запросов POST, вам, вероятно, следует перенаправить с помощью GET на новую страницу.






Если вы имеете в виду, что хотите различать, когда пользователь впервые заходит на страницу, и когда он перезагружает страницу, проверьте реферер. На php это: $ _SERVER ["HTTP_REFERER"]. Посмотрите, совпадает ли оно со страницей, на которой работает ваш скрипт. Может случиться так, что клиент не предоставляет эту информацию, в этом случае вы можете установить cookie или переменную сеанса, чтобы отслеживать, какая страница была последней запрошенной.
<?php
session_start();
if (!isset($_SESSION["visits"]))
$_SESSION["visits"] = 0;
$_SESSION["visits"] = $_SESSION["visits"] + 1;
if ($_SESSION["visits"] > 1)
{
echo "You hit the refresh button!";
}
else
{
echo "This is my site";
}
// To clear out the visits session var:
// unset($_SESSION["visits"]);
?>
Это, конечно, не гарантирует, что они нажмут кнопку обновления. Они могли вернуться на эту страницу, например, по одной из внутренних ссылок вашего сайта.
Голосование против. Это позволит обнаружить только несколько посещений сайта. Каждая перезагрузка или переход к другому URL-адресу, имеющему этот скрипт, будет увеличивать счетчик. Это бесполезно для определения перезагрузки страницы.
Если страница была обновлена, можно ожидать, что два следующих друг за другом запроса будут для одного и того же URL-адреса (путь, имя файла, строка запроса) и одного и того же содержимого формы (если есть) (данные POST). Это может быть довольно много данных, поэтому лучше всего их хешировать. Так ...
<?php
session_start();
//The second parameter on print_r returns the result to a variable rather than displaying it
$RequestSignature = md5($_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'].print_r($_POST, true));
if ($_SESSION['LastRequest'] == $RequestSignature)
{
echo 'This is a refresh.';
}
else
{
echo 'This is a new request.';
$_SESSION['LastRequest'] = $RequestSignature;
}
В ситуации AJAX вам нужно быть осторожным с тем, в какие файлы вы помещаете этот код, чтобы не обновлять подпись LastRequest для скриптов, которые были вызваны асинхронно.
@naveen, что, если у пользователя открыто несколько вкладок на вашем веб-сайте, он отправляет форму на первой вкладке, отправляет что-то еще на другую вкладку, закрывает эту вкладку, а затем нажимает кнопку «Обновить» на первой вкладке? последний запрос может не всегда работать.
Если кто-то обновит страницу, будет отправлен тот же запрос, что и предыдущий. Поэтому вам следует проверить, совпадает ли текущий запрос с предыдущим. Это можно сделать следующим образом:
session_start();
$pageRefreshed = false;
if (isset($_SESSION['LAST_REQUEST']) && $_SERVER['REQUEST_URI'] === $_SESSION['LAST_REQUEST']['REQUEST_URI']) {
if (isset($_SERVER['HTTP_REFERER'])) {
// check if the last request’s referrer is the same as the current
$pageRefreshed = $_SERVER['HTTP_REFERER'] === $_SESSION['LAST_REQUEST']['HTTP_REFERER'];
} else {
// check if the last request didn’t have a referrer either
$pageRefreshed = $_SERVER['HTTP_REFERER'] === null;
}
}
// set current request as "last request"
$_SERVER['LAST_REQUEST'] = array(
'REQUEST_URI' => $_SERVER['REQUEST_URI'],
'HTTP_REFERER' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null
);
Я не тестировал, но должно работать.
Чтобы предотвратить дублирование обработки формы, когда пользователь нажимает кнопку обновления или возврата в браузере, необходимо использовать переменную сеанса идентификатора экземпляра страницы и ввод скрытой формы, содержащий эту переменную. если они не совпадают, значит, пользователь обновил страницу, и вам не следует повторно обрабатывать форму. для получения дополнительной информации см .:
https://www.spotlesswebdesign.com/blog.php?id=11
другой метод - отправить запросы формы на полностью отдельную страницу, а затем использовать заголовок для перенаправления серверной части обратно на исходную страницу после обработки запроса. Таким образом, кнопки «Назад» и «Обновить» ни на что не повлияют, поскольку страница обработки формы никогда не загружается на стороне клиента.
Когда пользователь нажимает кнопку обновления, браузер включает дополнительный заголовок, который появляется в массиве $ _SERVER.
Проверьте кнопку обновления, используя следующее:
$refreshButtonPressed = isset($_SERVER['HTTP_CACHE_CONTROL']) &&
$_SERVER['HTTP_CACHE_CONTROL'] === 'max-age=0';
в PHP> = 5.2.0 можно использовать filter_input(INPUT_SERVER, 'HTTP_CACHE_CONTROL') === 'max-age=0' для ясного кода
Если вы хотите, чтобы этот запрос с побочными эффектами (как правило, POST-запросы) можно было отправлять несколько раз, вы должны указать это в своем вопросе. Потому что здесь будет использоваться другой подход, нежели ответы, использованные до сих пор.