【问题标题】:passing hidden variable without form and by using link in php通过在 php 中使用链接来传递不带表单的隐藏变量
【发布时间】:2014-09-08 17:00:27
【问题描述】:

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

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

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

我想传递一个隐藏变量,告诉我点击了哪个链接以及调用什么函数。反正有没有使用 $_GET 和使用会话?!

谢谢,

【问题讨论】:

  • 如果这是一个链接,您是否考虑过使用查询字符串变量?
  • 使用隐藏输入并通过POST 传递它也许?
  • 最好使用表单(和'$_POST')并更改按钮中的链接。

标签: php parameter-passing session-variables


【解决方案1】:

所有 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'] 是否等于“添加”或“删除”。我添加的样式标签是我从 SO 用户 adardesign (*) 那里找到的,内容是关于如何将按钮设置为像链接一样的样式。

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

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

【讨论】:

  • 喜欢这个主意。谢谢。它适用于 IE、Chrome 和 firefox 吗?希望是这样!
  • 应该在所有浏览器中都很好。我现在在 Mac 上,所以我无法测试 IE,但我会相信它。
【解决方案2】:

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

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

如果您担心安全性以及用户编辑或查看某些内容的权限,这还不够 - 您需要检查用户是否有权在每个步骤中对该内容执行操作。界面请求查看文章,您的后端在提供内容之前验证是否允许用户这样做。界面请求删除文章,后台确认没问题后才删除。

【讨论】:

  • 我喜欢这个主意。但是我确实想避免使用 $_GET!有什么解决办法吗?
【解决方案3】:

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

好吧,如果你解释了这种行为的目的,我们也许可以找到更好的解决方案。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 谢谢,我喜欢哈希方法。有没有可能不使用 $_GET 方法?
    • 你可以使用 $_POST 但在这种情况下你需要做更多的步骤..你需要让你的变量远离用户吗?也许我可以为您找到更好的解决方案
    • 是的。我想从用户那里拿走所有需要传递的变量。我不喜欢在地址栏中显示任何内容。
    • 我建议您使用 ajax 和 $_POST,这样您就可以将变量发送到新页面,检查它并随时向我寻求帮助:D
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    相关资源
    最近更新 更多