Rob*_*cks 47 php forms scripting post
我有一个在线网关,需要提交隐藏字段的HTML表单.我需要通过没有任何HTML表单的PHP脚本来执行此操作(我有数据库中隐藏字段的数据)
为此,通过GET发送数据:
header('Location: http://www.provider.com/process.jsp?id=12345&name=John');
Run Code Online (Sandbox Code Playgroud)
并通过POST发送数据?
sym*_*ean 42
你不能用PHP做到这一点.
正如其他人所说,你可以使用cURL - 然后PHP代码成为客户端而不是浏览器.
如果你必须使用POST,那么唯一的方法是使用PHP生成填充的表单并使用window.onload挂钩调用javascript来提交表单.
C.
rez*_*ani 32
这是解决方法示例.
function redirect_post($url, array $data)
{
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function closethisasap() {
document.forms["redirectpost"].submit();
}
</script>
</head>
<body onload="closethisasap();">
<form name="redirectpost" method="post" action="<? echo $url; ?>">
<?php
if ( !is_null($data) ) {
foreach ($data as $k => $v) {
echo '<input type="hidden" name="' . $k . '" value="' . $v . '"> ';
}
}
?>
</form>
</body>
</html>
<?php
exit;
}
Run Code Online (Sandbox Code Playgroud)
另一种解决方案,如果您想避免卷曲调用并使浏览器像正常一样重定向并模仿POST调用:
保存帖子并进行临时重定向:
function post_redirect($url) {
$_SESSION['post_data'] = $_POST;
header('Location: ' . $url);
}
Run Code Online (Sandbox Code Playgroud)
然后总是检查会话变量post_data:
if (isset($_SESSION['post_data'])) {
$_POST = $_SESSION['post_data'];
$_SERVER['REQUEST_METHOD'] = 'POST';
unset($_SESSION['post_data']);
}
Run Code Online (Sandbox Code Playgroud)
将会有一些缺少的组件,例如apache_request_headers()将不会显示POST内容标头等.
小智 8
更好更简洁的解决方案是使用 $_SESSION:
使用会话:
$_SESSION['POST'] = $_POST;
Run Code Online (Sandbox Code Playgroud)
对于重定向标头请求,请使用:
header('Location: http://www.provider.com/process.jsp?id=12345&name=John', true, 307;)
Run Code Online (Sandbox Code Playgroud)
307是http_response_code您可以用于带有提交POST值的重定向请求。
它将涉及cURL PHP扩展。
$ch = curl_init('http://www.provider.com/process.jsp');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "id=12345&name=John");
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); // RETURN THE CONTENTS OF THE CALL
$resp = curl_exec($ch);
Run Code Online (Sandbox Code Playgroud)
/**
* Redirect with POST data.
*
* @param string $url URL.
* @param array $post_data POST data. Example: array('foo' => 'var', 'id' => 123)
* @param array $headers Optional. Extra headers to send.
*/
public function redirect_post($url, array $data, array $headers = null) {
$params = array(
'http' => array(
'method' => 'POST',
'content' => http_build_query($data)
)
);
if (!is_null($headers)) {
$params['http']['header'] = '';
foreach ($headers as $k => $v) {
$params['http']['header'] .= "$k: $v\n";
}
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if ($fp) {
echo @stream_get_contents($fp);
die();
} else {
// Error
throw new Exception("Error loading '$url', $php_errormsg");
}
}
Run Code Online (Sandbox Code Playgroud)