web-dev-qa-db-ja.com

PHP-POST

非表示フィールドを含むHTMLフォームを送信する必要があるオンラインゲートウェイがあります。 PHPスクリプトをHTMLフォームなしで実行する必要があります(DBの非表示フィールドのデータがあります)

GET経由でデータを送信するためにこれを行うには:

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

そして、これをPOST経由でデータを送信するには?

46
Robinicks

PHPを使用してこれを行うことはできません。

他の人が言ったように、cURLを使用できますが、PHPコードはブラウザではなくクライアントになります。

POSTを使用する必要がある場合、それを行う唯一の方法は、PHPを使用してデータが取り込まれたフォームを生成し、window.onloadフックを使用してJavaScriptを呼び出してフォームを送信することです。

C.

42
symcbean

これが回避策のサンプルです。

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

Curlコールを回避し、ブラウザを通常のようにリダイレクトさせ、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コンテンツヘッダーなどを表示しません)などの一部のコンポーネントが欠落します。

9
newms87

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);
5
Matt

私はより良くてきれいな解決策を見つけたので、私はそれを共有すべきだと思いました:

セッションを使用します。

$_SESSION['POST'] = $_POST;

リダイレクトヘッダーリクエストには次を使用する必要があります。

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

307 それは htttp_response_code送信されたPOST値を使用したリダイレクト要求に使用できます。

4
MajidJafari
/**
 * 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");
    }
}
4
Eduardo Cuomo

これにはcurlを使用します。 「curl php post」のGoogleで、これを見つけることができます: http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html

CURLOPT_POSTFIELDSオプションに配列を使用することもできます。 php.netドキュメントから:

HTTP "POST"操作で投稿する完全なデータ。ファイルを投稿するには、ファイル名の前に@を付けてフルパスを使用します。これは、「para1 = val1&para2 = val2&...」のようなurlencoded文字列として、またはフィールド名をキーとして、フィールドデータを値として持つ配列として渡すことができます。値が配列の場合、Content-Typeヘッダーはmultipart/form-dataに設定されます。

2
svens

そのタスクのためにCURLが必要になるのではないかと心配しています。ここでそれを行う簡単な簡単な方法: http://davidwalsh.name/execute-http-post-php-curl

役立つことを願っています

1
Glyn Mooney

fsockopen でサイトへのソケットを開き、HTTP-Post-Requestをシミュレートする必要があります。 Googleは、リクエストをシミュレートする方法を多くのスニペットで示します。

1
Tobias P.

または、リダイレクトの前にセッション変数を設定して宛先URLでテストすると、この問題を解決できます。

はい、これはPHP e.g.

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);
0
R Picheta

回避策は完全に動作します:

ソースページで、セッションの開始を開始し、必要な数の値を割り当てます。次に、「header」を使用して再配置を実行します。

<!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も必要ありません。

0
PVE

古い投稿ですが、ここに私がそれを処理した方法があります。 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);
    }
}
0
Adam Benoit

次のコードを使用して、form.phpから送信されたPOSTデータをキャプチャし、URLに連結して、検証修正のためにフォームにBACKを送信します。チャームのように、エフェクトはPOSTデータをGETデータに変換します。

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

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