传递隐藏变量没有形式和使用PHP中的链接

时间:2014-09-08 17:00:28

标签: php parameter-passing session-variables

我想知道如何在没有任何形式和使用链接的情况下将一个(或几个)变量从一个页面传递到另一个页面。

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

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

我想传递一个隐藏变量,它告诉我点击了什么链接,从而调用了什么函数。无论如何不使用$ _GET并使用会话?!

谢谢,

4 个答案:

答案 0 :(得分:2)

所有HTTP请求彼此独立。您有权访问的数据包括:

  1. 通过网址($_GET
  2. 传递的变量
  3. 通过表单($_POST
  4. 发布的变量
  5. 缓存
  6. 会话数据
  7. 由于您反对使用$_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>
    

    process.php脚本中,您将检查$_POST['action']以查看它是否等于“添加”或“删除”。我添加的样式标记是我从SO用户adardesign(*)中找到的关于如何设置按钮样式的链接。

    编辑:要回答你关于是否可以使用会话来实现这一目标的问题,我会说这是可能的,但可能不值得。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我认为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>

PHP文件是这样的:

<?php session_start();
$_SESSION["action"] = $_POST["action"];
?>

然后,当导航功能重定向到process.php时,您已经将链接存储在会话变量中。

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

答案 3 :(得分:-1)

如果你使用隐藏变量,那么$ _GET不是解决方案。我建议如果您仍然想使用$ _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>

使用md5,您可以确定您的变量在某些方面至少为您的用户加密。

如何采取行动?

$action = $_GET['Action'];
if(md5('Delete')==$action){
/* Delete action */
}elseif(md5('Add')==$action){
/* Add action */
}