PHP - 通过POST重定向和发送数据

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.

  • 那很奇怪cURL不是解决方案,因为我自己用它来完成这个.但我想你的解决方案也可以. (3认同)
  • 您可以使用 jQuery $.post 方法。在这种情况下,您可以选择留在本网站或提交后重定向。 (2认同)

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)


new*_*s87 9

另一种解决方案,如果您想避免卷曲调用并使浏览器像正常一样重定向并模仿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内容标头等.

  • 感谢您提供最干净的肮脏解决方案。 (3认同)

小智 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)

307http_response_code您可以用于带有提交POST值的重定向请求。

  • 谢谢。您的解决方案是最好的。 (2认同)

Mat*_*att 5

它将涉及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)


Edu*_*omo 5

/**
 * 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)