这是循环API发送的$ POST数据并从中创建等效的$ SESSION名称/值对的正确方法吗?
foreach($_POST as $key=>$value)
{ $_SESSION['$key']=$value; }
更新:首先,感谢可靠的回复 - 我想我需要解释我正在努力解决的问题,以及为什么要考虑这个功能。 $ _POST响应来自支付处理器网关 - 问题是,由于付款表单/处理不在我们的域中,付款结果(已批准/已拒绝等)正通过$ POST传递给我们的服务器 - 当我们的PHP代码尝试处理响应数据时,它会在那里找到各种PHP结构(比如php包含'file.php')而不是我们的错误 - 我需要将$ POST数据移动到会话中然后将此人移回我们的域,以便文件/目录/资源树正确。我遇到了什么才有意义?
答案 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参数传递回您的网站。