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

时间:2010-06-15 12:31:56

标签: php forms post scripting

我有一个在线网关,需要使用隐藏字段提交HTML表单。我需要通过没有任何HTML表单的PHP脚本来实现这一点(我有数据库中隐藏字段的数据)

要通过GET发送数据:

header('Location: http://www.provider.com/process.jsp?id=12345&name=John');

要通过POST发送数据吗?

13 个答案:

答案 0 :(得分:41)

使用PHP无法做到这一点。

正如其他人所说,你可以使用cURL - 但是PHP代码变成了客户端而不是浏览器。

如果你必须使用POST,那么唯一的方法是使用PHP生成填充的表单并使用window.onload挂钩调用javascript来提交表单。

下进行。

答案 1 :(得分:31)

这是解决方法示例。

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;
}

答案 2 :(得分:9)

另一种解决方案,如果您想避免卷曲调用并让浏览器像正常一样重定向并模仿POST调用:

保存帖子并进行临时重定向:

function post_redirect($url) {
    $_SESSION['post_data'] = $_POST;
    header('Location: ' . $url);
}

然后始终检查会话变量post_data

if (isset($_SESSION['post_data'])) {
    $_POST = $_SESSION['post_data'];
    $_SERVER['REQUEST_METHOD'] = 'POST';
    unset($_SESSION['post_data']);
}

会有一些缺失的组件,例如apache_request_headers()不会显示POST内容标题等。

答案 3 :(得分:4)

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

答案 4 :(得分:4)

我找到了一个更好,更整洁的解决方案,所以我认为我应该分享它:

使用会话:

$_SESSION['POST'] = $_POST;

并且对于重定向标头请求,您应该使用:

header('Location: http://www.provider.com/process.jsp?id=12345&name=John', true, 307;)

307是您可以用于提交htttp_response_code值的重定向请求的POST

答案 5 :(得分:3)

/**
 * 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");
    }
}

答案 6 :(得分:1)

使用curl。谷歌“卷曲php帖子”,你会发现:http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html

请注意,您还可以将一个数组用于CURLOPT_POSTFIELDS选项。来自php.net docs:

  

要在HTTP“POST”操作中发布的完整数据。要发布文件,请在文件前加上@并使用完整路径。这可以作为urlencoded字符串传递,如'para1 = val1&amp; para2 = val2&amp; ...',或者作为一个数组,字段名称作为键,字段数据作为值。如果value是数组,则Content-Type标头将设置为multipart / form-data。

答案 7 :(得分:1)

您必须使用fsockopen打开到该站点的套接字并模拟HTTP-Post-Request。 Google会向您展示如何模拟请求的许多代码段。

答案 8 :(得分:1)

或者,在重定向之前设置会话变量并在目标网址中测试它可以解决这个问题。

答案 9 :(得分:0)

我担心你需要CURL来执行这项任务。这里有一个简单的方法:http://davidwalsh.name/execute-http-post-php-curl

希望有所帮助

答案 10 :(得分:0)

我使用以下代码捕获从form.php提交的POST数据,然后将其连接到URL以将其发送回表单以进行验证更正。像魅力一样工作,实际上将POST数据转换为GET数据。

foreach($_POST as $key => $value) {
   $urlArray[] =  $key."=".$value;  
}
$urlString = implode("&", $urlArray);

echo "Please <a href='form.php?".$urlString."'>go back</a>";

答案 11 :(得分:0)

旧帖子,但这是我处理它的方式。使用newms87的方法:

if($action == "redemption")
{
    if($redemptionId != "")
    {
        $results = json_decode($rewards->redeemPoints($redemptionId));

        if($results->success == true)
        {
            $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml?a=redemptionComplete';
            // put results in session and redirect back to same page passing an action paraameter
            $_SESSION['post_data'] = json_encode($results);
            header("Location:" . $redirectLocation);
            exit();
        }
    }
}
elseif($action == "redemptionComplete")
{
    // if data is in session pull it and unset it.
    if(isset($_SESSION['post_data']))
    {
        $results = json_decode($_SESSION['post_data']);
        unset($_SESSION['post_data']);
    }
    // if you got here, you completed the redemption and reloaded the confirmation page. So redirect back to rewards.phtml page.
    else
    {
        $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml';
        header("Location:" . $redirectLocation);
    }
}

答案 12 :(得分:0)

完美运作的解决方法:

在源页面中,开始打开会话并分配尽可能多的值。 然后使用“标题”进行重定位:

<!DOCTYPE html>
<html>
   <head>
       <?php
           session_start();
           $_SESSION['val1'] = val1;
           ...
           $_SESSION['valn'] = valn;
           header('Location: http//Page-to-redirect-to');
       ?>
   </head>
</html>

然后,在目标网页中:

<!DOCTYPE html>
<?php
    session_start();
?>
<html>
    ...
    <body>
        <?php
            if (isset($_SESSION['val1']) && ... && isset($_SESSION['valn'])) {
                YOUR CODE HERE based on $_SESSION['val1']...$_SESSION['valn'] values
            }
        ?>
    </body>
</html>

不需要Javascript或JQuery .. 祝你好运!