在php中不使用表单和使用链接传递隐藏变量

在php中不使用表单和使用链接传递隐藏变量,php,parameter-passing,session-variables,Php,Parameter Passing,Session Variables,我想知道如何在php中不使用任何形式,通过使用链接,将一个(或两个)变量从一个页面传递到另一个页面 我知道会话是最好的选择,但如何在以下场景中实现它: 删除->process.php 添加->process.php(与上面相同的页面) 我想传递一个隐藏变量,告诉我点击了什么链接,从而调用了什么函数。是否存在不使用$\u获取和使用会话的情况 谢谢,在某些时候,您必须将一些数据传回服务器,以指示您要操作的项目,但之后您可以将其保留在会话中 例如,如果您从一个文章列表开始,而用户选择了一个,那么您必须

我想知道如何在php中不使用任何形式,通过使用链接,将一个(或两个)变量从一个页面传递到另一个页面

我知道会话是最好的选择,但如何在以下场景中实现它:

删除->process.php 添加->process.php(与上面相同的页面)

我想传递一个隐藏变量,告诉我点击了什么链接,从而调用了什么函数。是否存在不使用$\u获取和使用会话的情况


谢谢,

在某些时候,您必须将一些数据传回服务器,以指示您要操作的项目,但之后您可以将其保留在会话中

例如,如果您从一个文章列表开始,而用户选择了一个,那么您必须有一种方法来传达用户选择的文章。这通常是通过链接上的参数完成的,比如
article.php?id=5
。当此id值提交到服务器时,您可以将其添加到$\u会话中,并以这种方式跟踪它。然后,您可以决定使用存储在会话中的id进行编辑、删除等操作。当您的用户想要处理一篇新文章时,他们会单击带有新id参数的链接,然后您将该新id分配给会话


如果您担心安全性以及用户编辑或查看认证内容的权限,这是不够的-您需要检查用户是否有权在每个步骤中使用该内容执行操作。该接口请求查看文章,并且您的后端在提供内容之前验证是否允许用户这样做。界面请求删除文章,并且在完成之前,您的后端会验证这是否正常。

如果您希望使用隐藏变量,那么$\u GET不是解决方案。如果您仍然想使用$\u GET,我的建议是使用md5哈希传递变量

<a href="process.php?Action=<?php echo md5('Delete');?>">Delete Action</a>
<a href="process.php?Action=<?php echo md5('Add');?>">Add Action</a>

所有HTTP请求都是相互独立的。您可以访问的数据包括:

  • 通过URL传递的变量(
    $\u GET
  • 通过表单发布的变量(
    $\u POST
  • 饼干
  • 会话数据
  • 由于您反对使用
    $\u GET
    请求,并且两个链接都指向同一页面,因此您需要其他方法来确定单击了哪个链接。我建议使用表单,并通过隐藏的输入类型传递数据

    例如:

    <form action='process.php' method='post'>
       <input type='hidden' name='action' value='add' />
       <button onClick='submit();'>
          Add
       </button>
    </form>
    
    <form action='process.php' method='post'>
       <input type='hidden' name='action' value='delete' />
       <button onClick='submit();'>
          Delete
       </button>
    </form>
    
    <style type='text/css'>
    button {
       background:none!important;
       border:none; 
       padding:0!important;
       border-bottom:1px solid #444; 
       cursor: pointer;
    }
    </style>
    
    
    添加
    删除
    钮扣{
    背景:无!重要;
    边界:无;
    填充:0!重要;
    边框底部:1px实心#444;
    光标:指针;
    }
    
    process.php
    脚本中,然后对照
    $\u POST['action']
    检查它是否等于“添加”或“删除”。我添加的样式标签是我从SO user
    adardesign
    (*)中找到的关于如何将按钮设置为链接样式的内容

    编辑:要回答您关于是否可以使用会话来完成此任务的问题,我想说这是可能的,但可能不值得

    我可能永远不会决定走这条路,但你可以做的是有一个AJAX请求,当用户点击其中一个链接时会被触发。AJAX请求将调用一个PHP脚本,该脚本将会话设置为“添加”或“删除”。在
    success
    回调中,然后将用户重定向到process.php页面,在那里可以检查
    $\u会话
    变量的值。同样,这样做可能不值得,但这是可能的

    • CSS来源:

    我认为ajax是一种选择(我使用自己的库处理ajax请求,但我认为它们很容易理解,请随意询问代码),但您需要一个PHP文件来处理ajax请求:

    <script type='text/javascript'>
    function navigate(event){
       event.preventDefault();
       var action=this.innerHTML;
       var link=this.href;
       jx.post("controller.php", {action:action}, {onComplete:function(response){
          location.href=link;
       }});
    }
    </script>
    
    <a href="process.php" onclick='navigate(event)' action="add">Add</a>
    <a href="process.php" onclick='navigate(event)' action="delete">Delete</a>
    
    
    函数导航(事件){
    event.preventDefault();
    var action=this.innerHTML;
    var link=this.href;
    post(“controller.php”,{action:action},{onComplete:function(response){
    location.href=link;
    }});
    }
    
    PHP文件如下所示:

    <?php session_start();
    $_SESSION["action"] = $_POST["action"];
    ?>
    
    
    
    然后,当navigate函数重定向到process.php时,该链接已经存储在会话变量中


    Ayway,如果你解释这种行为的目的,我们可能会找到更好的解决方案。

    如果这是一个链接,你考虑过使用查询字符串变量吗?使用隐藏输入并通过
    POST
    传递它?最好使用表单(和“$\u POST”)并更改按钮中的链接。我喜欢这个想法。但是,我确实希望避免使用$\u GET!有什么解决办法吗?谢谢,我喜欢散列法。有没有可能不使用$\u GET方法?您可以使用$\u POST,但在这种情况下,您需要执行更多步骤。您需要让您的变量远离用户吗?也许我能为你找到更好的解决办法是的。我想去掉所有需要从用户那里传递的变量。我希望地址栏中没有显示任何内容。我建议您使用ajax和$\u POST,这样您就可以将变量发送到新页面,检查它,并随时向我寻求帮助:请接受我的建议。谢谢它在IE、Chrome和firefox上运行吗?希望如此!它在所有浏览器中都应该是好的。我现在在Mac电脑上,所以我不能测试IE,但我会对它充满信心。
    <?php session_start();
    $_SESSION["action"] = $_POST["action"];
    ?>