Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-通过POST重定向和发送数据_Php_Forms_Post_Scripting - Fatal编程技术网

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

PHP-通过POST重定向和发送数据,php,forms,post,scripting,Php,Forms,Post,Scripting,我有一个在线网关,它要求提交一个带有隐藏字段的HTML表单。我需要通过一个没有任何HTML表单的PHP脚本来实现这一点(我有数据库中隐藏字段的数据) 要通过GET发送数据,请执行以下操作: header('Location: http://www.provider.com/process.jsp?id=12345&name=John'); 要通过POST发送数据,请使用curl。谷歌搜索“curlphppost”,你会发现这个: 请注意,还可以为CURLOPT_POSTFIELDS选项

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

要通过GET发送数据,请执行以下操作:

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

要通过POST发送数据,请使用curl。谷歌搜索“curlphppost”,你会发现这个:

请注意,还可以为CURLOPT_POSTFIELDS选项使用数组。从php.net文档:

要在HTTP“post”操作中发布的完整数据。若要发布文件,请在文件名前加@并使用完整路径。这可以作为urlencoded字符串(如“para1=val1¶2=val2&…”)传递,也可以作为以字段名为键、字段数据为值的数组传递。如果值是数组,则内容类型标头将设置为多部分/表单数据


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

恐怕你需要卷发来完成那项任务。这是一个非常简单的方法:


希望这对你有所帮助,你不能用PHP来做这件事

正如其他人所说,您可以使用cURL,但是PHP代码将成为客户机而不是浏览器

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


C.

您必须使用打开一个到站点的套接字,并模拟HTTP Post请求。
Google将向您展示许多如何模拟请求的代码片段。

这是解决方案示例

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;
}
函数重定向\u post($url,数组$data)
{
?>
函数closethisaap(){
document.forms[“redirectpost”].submit();
}

我使用以下代码捕获从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>";
foreach($\u发布为$key=>$value){
$URLARY[]=$key.“=”$value;
}
$urlString=内爆(&,$URLARY);
回应“请”;

如果您希望避免curl调用,让浏览器像正常一样重定向并模拟POST调用,另一种解决方案是:

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

function post_redirect($url) {
    $_SESSION['post_data'] = $_POST;
    header('Location: ' . $url);
}
然后始终检查会话变量
post\u data

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

将有一些缺少的组件,例如apache_request_headers()将不显示帖子内容头等。

或者,在重定向之前设置会话变量并在目标url中测试它,可以为我解决此问题。

是的,您可以在PHP中执行此操作,例如在

Silex或Symfony3

使用子请求

$postParams = array(
    'email' => $request->get('email'),
    'agree_terms' => $request->get('agree_terms'),
);

$subRequest = Request::create('/register', 'POST', $postParams);
return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);

这是一篇旧文章,但我是这样处理的。使用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);
    }
}

一个工作环境非常好:

在源页面中,开始打开会话,并根据需要分配尽可能多的值。 然后使用“header”重新定位:


然后,在targe页面中:

<!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。。
祝你好运!

更好、更整洁的解决方案是使用$\u会话:

使用会话:

$_SESSION['POST'] = $_POST;
对于重定向标头请求,请使用:

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

307
是您可以使用提交的
POST
值来执行重定向请求的
http\u response\u code

奇怪的是,cURL并不是解决方案,因为我自己也使用过它。但我想您的解决方案也很有效。您可以使用jQuery$.POST方法。在这种情况下,您可以在选项之间进行选择是的,可以使用PHP和curl代理请求并将其转换为POST,但这意味着接收端容易受到CSRF的影响,并且/或者没有对请求应用基于会话的控制(您可以在传递给curl的参数中捏造一些,但不是全部)1) 2015年对308个重定向的支持非常有限2)对于任何问题,永久重定向几乎总是错误的答案。不幸的是,这不是要求的。他想通过重定向发布,而不是将POST转换为GET。此外,如果你想实现这一点,你也可以使用PHP的本机函数
http\u build\u query()
。这是一个“肮脏的"解决方案,但绝对有效!我制作了一个类似的函数,但使用了显式的
echo
,而不是关闭和重新打开
标记。我喜欢这种肮脏的东西。php标记可能需要设置为@DiegoDD:你有任何代码/要点,以便我可以复制吗?@Hiep,给你:肮脏但很好的解决方案我对php不熟悉。有什么办法吗要用它更改URL吗?此函数不会更改URL,但会重定向。我将
$headers
保留为
null
(我应该是吗?)。嘿,Matt,这在CURL中是不可能的。通过CURL,我们不会重定向。@rahul会
CURL\u setopt($ch,CURLOPT\u FOLLOWLOCATION,true)
无法解决此问题?根据我的经验,
CURLOPT_FOLLOWLOCATION
在Laravel控制器中不起作用。感谢您提供了最干净的肮脏解决方案。谢谢。您的解决方案是最好的。
$_SESSION['POST'] = $_POST;
header('Location: http://www.provider.com/process.jsp?id=12345&name=John', true, 307;)