通过php中的链接传递不带表单的隐藏变量


passing hidden variable without form and by using link in php

我想知道如何在php中将一个(或多个)变量从一个页面传递到另一个页面,而不需要任何形式,并使用链接。

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

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

我想传递一个隐藏的变量,告诉我点击了什么链接,因此调用了什么函数。是否存在不使用$_GET和使用会话的情况?!

谢谢,

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

  1. 通过URL传递的变量($_GET
  2. 通过表单发布的变量($_POST
  3. Cookie
  4. 会话数据

由于您反对使用$_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']检查它是否等于"add"或"delete"。我添加的样式标签是我从SO用户adardesign(*)那里找到的关于如何将按钮样式化为链接的东西。

编辑:为了回答你是否可以使用会话来完成这一任务的问题,我想说这是可能的,但可能不值得。

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

  • CSS来源:如何使按钮看起来像一个链接

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

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

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

我认为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时,链接已经存储在会话变量中。

顺便说一句,如果你解释一下这种行为的目的,我们也许可以找到更好的解决方案。

如果要使用隐藏变量,那么$_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 */
}