Выполнение PHP: определение, когда была нажата ссылка - PullRequest
1 голос
/ 12 сентября 2011

У меня есть небольшая дилемма с некоторым кодом PHP.На сайте, над которым я работаю, есть опция «Вернуться на предыдущую страницу», и я бы хотел, чтобы она работала так же, как кнопка назад браузера.На данный момент я использую переменную $ _SESSION, чтобы отслеживать текущую и предыдущую страницы.Я также «обновил» переменные, чтобы не допустить совпадения предыдущих и текущих страниц.

Так вот в чем проблема: с текущей реализацией, если я перейду кодна страница, скажите «register.php», а затем перейдите к «Forgot.php», предыдущая страница будет «register.php», что хорошо.Однако, если я нажму «Вернуться на предыдущую страницу», я снова окажусь на «register.php», где предыдущая страница была «Forgot.php», что теперь оставляет 2-страничный цикл с возвратом.

Я пытался реализовать SplQueue, чтобы помочь мне отслеживать переменные, и я пытался использовать функцию dequeue () в моих ссылках, чтобы последняя страница отображалась как ссылка.Проблема возникает, когда фактически вызывается dequeue, и вызывает исчезновение элемента, так что если я обновляю, элемент больше не находится в очереди, и ссылка изменяется.Я исправил это путем «проверки обновления» функции, которая вызывает для меня очередь, и она работает так, как я хотел бы.Проблема теперь в прямом соединении.Если я направляю себя на другую страницу, я не хочу, чтобы старые ссылки удаляли информацию из очереди.

Пример: я нахожусь на register.php, и моя предыдущая страница - "Forgot.php".Ссылка «Вернуться на предыдущую страницу» точно показывает, что «Forgot.php» - это страница, на которую он будет перенаправлен, но теперь ее больше нет в очереди, поэтому, если я перейду на другую страницу, произнесу «profile.php» и затем используюКнопка «Назад», чтобы вернуться к «register.php», больше не будет отображать «Forgot.php» в качестве страницы, на которую вы перейдете, если снова нажать «Вернуться на предыдущую страницу».

Итак,Я предполагаю, что мой вопрос действительно заключается в том, как заставить ссылку вызывать функцию PHP без фактического вызова этой функции, пока не будет нажата ссылка.Я пытался указать точку ссылки на функцию JavaScript, но функции JS обычно говорят мне, что моя очередь пуста, что совершенно неправильно.

В качестве примечания, страницы представляют собой смесь HTMLи PHP.HTML предоставляется мне, и я добавляю PHP, чтобы добавить функциональность к полям и получить данные из базы данных.У меня нет проблем с использованием PHP для отображения ссылок HTML, если мне нужно, и если это можно сделать в HTML с небольшим <?php someCode(); ?>, это тоже хорошо.

Я благодарю вас за ваше время, чтобы попробовать ипомогите мне.

РЕДАКТИРОВАТЬ:

Итак, чтобы попытаться немного уточнить, у меня есть структура, которая в настоящее время отслеживает страницы, на которых пользователь уже был, поскольку онипосетите их.Это создает мини историю страниц.Моя проблема в том, что у меня есть такой код:

<a href="somelink">Back To Previous Page</a>

И я не знаю, что такое "somelink", так как он будет меняться в зависимости от вашей истории.Я знаю, что могу сделать что-то вроде:

<a href="<?php someFunction() ?>">Back To Previous Page</a>

Если я сделаю что-нибудь подобное выше, функция будет выполняться при отображении страницы, поэтому затрудняется использование array_pop() или dequeue() но опять же PHP будет выполнен, как только отобразится страница.То, что я ищу, - это способ показать ссылку и затем удалить ее из истории, если и только если нажата ссылка «Вернуться на предыдущую страницу».На данный момент я храню массив в $_SESSION, как было предложено ниже, и, поскольку это массив, я могу показать последний элемент в массиве в качестве ссылки, поэтому единственная реальная проблема - найти способ удалитьэлементы из массива при нажатии на ссылку.

РЕДАКТИРОВАТЬ 2:

Я искал в Интернете и решил использовать JavaScript с AJAX для вызова файла PHP,Это позволяет нам onClick по ссылкам, которые у меня есть, чтобы я мог контролировать, когда я array_pop из моей переменной $_SESSION['links'].

Я не думаю, что мой AJAX на самом деле делает что-то печально, поэтомукод, который я использую ниже:

<script src="js/jquery-1.4.2.min.js" type="text/javascript">
function dequeue()
{
    $.ajax({
            type: "POST",
            url: "common.php",
            data: {action: "rem"},
            success: function(output) {
                  alert(output);
              }
        });
}
</script>

и PHP это

switch($_POST['action'])
{
case "rem":
    array_pop($_SESSION['links']);
    break;
default:
    if(isset($_SESSION['current']) && $_SESSION['current'] != $_SERVER['REQUEST_URI'])
    {
        array_push($_SESSION['links'], $_SESSION['current']);
    }

    $_SESSION['current'] = $_SERVER['REQUEST_URI'];
    break;
}

Насколько я могу судить, это позволит мне добавить ссылку на историю в переменную сеанса, если я не нажму на ссылку "Вернуться на предыдущую страницу", поскольку эта ссылка будет иметь код "rem".Я также немного подозрительно отношусь к $_SESSION['current'] = $_SERVER['REQUEST_URI']; и месту его размещения.

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

Вы можете хранить массив в сеансе и обрабатывать массив как стек (используйте array_push и array_pop соответственно). Когда пользователь нажимает что-то, кроме кнопки «Назад», поместите текущую страницу в стек. в противном случае, вытолкните это.

0 голосов
/ 12 сентября 2011

Я бы сделал это так, если бы мне пришлось:

$_SESSION["history"] = array();

И в заголовке каждой «запоминающейся» страницы:

if(in_array($this_page, $_SESSION["history"])) {
    unset($_SESSION["history"][array_search($this_page, $_SESSION["history"])]);
}
array_push($_SESSION["history"], $this_page);

Что это делает: «Если страница существует в истории, удалите ее, где бы она ни была, и поместите ее в качестве последней страницы истории. Если нет, просто поместите ее в качестве последней страницы истории». Таким образом, у вас не будет петель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...