循环通过$ POST使$ SESSION等效

时间:2013-08-22 14:51:44

标签: php post foreach session-variables

这是循环API发送的$ POST数据并从中创建等效的$ SESSION名称/值对的正确方法吗?

foreach($_POST as $key=>$value)
{ $_SESSION['$key']=$value; }

更新:首先,感谢可靠的​​回复 - 我想我需要解释我正在努力解决的问题,以及为什么要考虑这个功能。 $ _POST响应来自支付处理器网关 - 问题是,由于付款表单/处理不在我们的域中,付款结果(已批准/已拒绝等)正通过$ POST传递给我们的服务器 - 当我们的PHP代码尝试处理响应数据时,它会在那里找到各种PHP结构(比如php包含'file.php')而不是我们的错误 - 我需要将$ POST数据移动到会话中然后将此人移回我们的域,以便文件/目录/资源树正确。我遇到了什么才有意义?

6 个答案:

答案 0 :(得分:5)

不要使用单引号:

foreach ($_POST as $key => $value) {
  $_SESSION[$key] = $value;
}

我建议您阅读Strings in PHP

注意:由于多种原因,这可能是不安全的 - 主要是通过密钥冲突注入。考虑我发布了登录的用户ID。

这可以通过封装来缓解:

$_SESSION['posted_data'] = $_POST;

答案 1 :(得分:1)

你不想把它们分开吗?

$_SESSION['response'] = $_POST;

答案 2 :(得分:1)

如果您确实希望按照您的说法进行操作,则可以使用类似

的内容
$_SESSION=array_merge($_SESSION,$_POST);

哪个可行,但可能是“坏事” - 有足够的空间来覆盖$_SESSION变量中已有的项目:

的index.php:

<form action="2.php" method="post">
<input type="text" name="hidden" value="hidden">
<button type="submit">Click</button>
</form>

2.PHP:

<?php
session_start();
session_unset();
$_SESSION['hidden']="existing";
$_SESSION=array_merge($_SESSION,$_POST);

echo '<pre>'.print_r($_SESSION,true).'</pre>';

最好是使用

$_SESSION['POST']=$_POST;

显然,在执行此操作之前,请执行您需要的任何数据检查

答案 3 :(得分:0)

根据您的使用方式忽略可能导致的安全问题,您可以使用:

$_SESSION = array_merge($_POST, $_SESSION);

这只会带来POST变量,它们在$ _SESSION中找不到密钥。如果您希望POST变量优先当然,请切换它们。

只是关于安全性的快速说明,如果您使用会话存储用户ID的很多人,如果我使用userid=1向您的脚本发送POST请求会发生什么?

我只是说,小心你正在做的事情。如果可能的话,你可以按照建议进行操作,并在$ _SESSION中使用唯一键,例如$_SESSION['post_vars'] = $_POST(如果你使用它来保存表单数据,可能是['form_data']通常为什么人们这样做。)

答案 4 :(得分:0)

您也可以使用array union operator

$_SESSION = $_POST + $_SESSION;

这会获取$_POST的值,并添加$_SESSION中未包含密钥的$_POST的值。

答案 5 :(得分:0)

由于POST是由支付网关进行的,因此会话将与其关联(并且很可能在第一次请求时丢失,因为可以假设它不会费心阅读会话cookie)。

您的客户端不会在会话中看到此数据。

如果您希望获得此数据,则需要以某种方式保留此数据,如果支付网关为您提供可利用的客户端信息。可能的解决方案是数据库,键/值存储......

或者,支付网关通常允许您指定在购买后将客户端浏览器重定向到的链接。从POST中获取参数,您可以将它们附加到重定向URL,以将它们作为GET参数传递回您的网站。