Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行PHP:检测何时单击了链接_Php_Html_Function_Queue_Hyperlink - Fatal编程技术网

执行PHP:检测何时单击了链接

执行PHP:检测何时单击了链接,php,html,function,queue,hyperlink,Php,Html,Function,Queue,Hyperlink,我对一些PHP代码有点进退两难。我正在使用的站点有一个“返回上一页”选项,我希望它的行为非常像浏览器的“后退”按钮。现在,我使用$会话变量来跟踪当前和以前的页面。我还对变量进行了“刷新验证”,这样我就不会在上一页和当前页都相同的情况下结束 问题是: 在当前的实现中,如果我转到一个页面,说“register.php”,然后转到“忘记了.php”,那么上一个页面将是“register.php”,这很好。但是,如果我单击“返回上一页”,我将返回到“register.php”,上一页是“forget.p

我对一些PHP代码有点进退两难。我正在使用的站点有一个“返回上一页”选项,我希望它的行为非常像浏览器的“后退”按钮。现在,我使用$会话变量来跟踪当前和以前的页面。我还对变量进行了“刷新验证”,这样我就不会在上一页和当前页都相同的情况下结束

问题是: 在当前的实现中,如果我转到一个页面,说“register.php”,然后转到“忘记了.php”,那么上一个页面将是“register.php”,这很好。但是,如果我单击“返回上一页”,我将返回到“register.php”,上一页是“forget.php”,这将使我返回时有一个2页的循环

我尝试实现SplQueue来帮助跟踪变量,并尝试在链接中使用dequeue()函数来获取显示为链接的最后一页。当实际调用dequeue时会出现问题,并导致元素消失,因此如果我刷新,元素将不再在队列中,并且链接将更改。我通过“刷新校对”功能修复了这一问题,该功能为我调用了出列,并且按照我的意愿工作。现在的问题是前向链接。如果我将自己指向另一个页面,我不希望旧链接指向出列信息

例: 我在register.php上,我的上一页是“forget.php”。“返回上一页”链接准确地显示了“忘记了.php”是它将指向的页面,但现在它不再在队列中,因此如果我转到另一个页面,说“profile.php”,然后使用“后退”按钮返回“register.php”,它将不再显示“忘记了.php”作为您点击“返回上一页”时将转到的页面再说一遍

所以,我想我的问题是,如何在点击链接之前,不调用PHP函数而调用链接调用PHP函数。我尝试过让链接指向JavaScript函数,但JS函数倾向于告诉我队列是空的,这是完全错误的

作为旁注,这些页面是HTML和PHP的混合体。HTML是提供给我的,我一直在添加PHP以向字段添加功能并从数据库获取数据。如果有必要的话,我可以使用PHP来回显HTML链接,如果它可以用一个小的
在HTML中完成,那也没问题

谢谢你抽出时间来帮助我

编辑:

因此,为了尝试澄清一下,我有一个结构,目前正在跟踪用户访问时已经访问过的页面。它创建页面的迷你历史记录。我的问题是我有这样的代码:

<a href="somelink">Back To Previous Page</a>
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”代码。我也有点怀疑
$\u会话['current']=$\u服务器['REQUEST\u URI']以及它应该放置的位置。

您可以在会话中存储数组,并将数组视为堆栈(相应地使用
array\u push
array\u pop
)。当用户点击“后退”按钮以外的内容时,将当前页面推到堆栈中。否则,请打开它。

如果必须的话,我会这样做:

$_SESSION["history"] = array();
在每个“可记忆”页面的页眉内:


它的作用是:“如果这一页存在于历史中,则将其从任何位置移除,并将其作为历史的最后一页。如果不存在,则将其作为历史的最后一页”。这样就不会有任何循环。

我不太明白这个问题,但标题很有趣。PHP只在点击链接时执行(或者你有一些JS代码启动一个请求,你也可以控制它)。@NullUserException是的,点击链接时会执行PHP,但我需要更多的方法来执行特定的函数并重定向到另一个页面。因此,一旦点击了一个链接,就转到该页面并执行一个特定的函数,该函数将用于每个链接。但是,下面的解决方案不需要执行函数。除非有其他方法来检测链接是否被点击,否则似乎仍然需要一个函数。使用堆栈存储浏览数据非常困难。所有当前浏览器都可以前进和后退,因此堆栈并不能将其完全剪切。@NullUserException我真的不需要担心前进,因为“返回上一页”是当前页面上的链接,其行为应该类似于浏览器的“后退”按钮,或者至少我希望这样work@LeleDumbo我会试试看,因为它似乎与本在下面发布的答案相同。很高兴知道我可以根据需要推送/弹出,并将其视为队列或stack@LeleDumbo我仍然有点不知所措,不知如何知道什么时候按下了后退按钮,这就是最初的问题所在。我在保存历史记录方面没有问题,以前我是用SplQueue来保存历史记录的,但我无法确定用户何时单击“返回上一页”链接。我对一些循环没有问题,只是历史记录不限于两个页面总是相互反弹。我基本上会创建一个浏览器的后退按钮,所以如果你去注册->忘记->注册->索引,我希望能够遵循这个路线。移动已经存在的页面会留下奇怪的空白。在我的示例中使用第二组代码可以让我回到“忘记”而不是之前的“寄存器”。我很感激你的意见,我一定会好好玩玩的。我希望我能让它工作,我看看这将如何工作,但我更希望找到一种方法,只确定用户何时单击了“返回上一页”链接,以便我知道何时不添加历史记录。
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;
}
$_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);