file_get_contentsを使用してPHPでデータを投稿する方法は?


299

PHPの関数file_get_contents()を使用してURLのコンテンツをフェッチしてから、変数を使用してヘッダーを処理します$http_response_header

ここで問題となるのは、一部のURLにURLに投稿するためのデータが必要なことです(たとえば、ログインページ)。

それ、どうやったら出来るの?

stream_contextを使用すると実現できるかもしれませんが、完全には明確ではありません。

ありがとう。



8
これは無限に賛成されるべきです。PHPの生の機能が機能している場合は、Curl / Guzzleまたはその他の豪華なライブラリを使用する理由はありません。
Omar Abid 2015年

回答:


589

を使用してHTTP POSTリクエストを送信することfile_get_contentsはそれほど難しいことではありません。実際には、ご想像のとおり、$contextパラメータを使用する必要があります。


PHPマニュアルのこのページの例:HTTPコンテキストオプション (引用)

$postdata = http_build_query(
    array(
        'var1' => 'some content',
        'var2' => 'doh'
    )
);

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context  = stream_context_create($opts);

$result = file_get_contents('http://example.com/submit.php', false, $context);

基本的に、適切なオプションを使用してストリームを作成し(そのページに完全なリストがあります)、それを3番目のパラメーターとして使用する必要がありますfile_get_contents-これ以上はありません;-)


補足として:一般的に言えば、HTTP POSTリクエストを送信するために、curlを使用する傾向があります。curlは多くのオプションをすべて提供しますが、ストリームは誰も知らないPHPの優れた点の1つです...残念です。 。


1
ありがとう。リクエストされたページに同じPOSTパラメータを渡す必要がある場合、$ _ POSTから$ postdataにコンテンツを挿入できると思いますか?
Paras Chopra 2010年

6
あなたはそのようなことができると思います。しかし、contentPHPの配列であってはなりません。それは、クエリ文字列である必要があります:(それはこの形式を持っている必要がありますすなわちparam1=value1&param2=value2&param3=value3 ;; これは、おそらく使用する必要があることを意味しますhttp_build_query($_POST)
Pascal MARTIN

2
素晴らしい!私はPOSTデータを別のページに渡す方法を探していました$postdata = http_build_query($_POST)
リアムニューマーチ

1
これを十分に理解してもこれは私にとってはまったく機能しません。数時間試してみましたが、すべてのリクエストはクエリの取得に変わりました
WojonsTech

1
複数のヘッダー値を送信するには、それらをすべて\r\n改行付きの1つの文字列に入れます-参照:stackoverflow.com/a/2107792/404960
rymo

20

代わりに、fopenを使用することもできます

$params = array('http' => array(
    'method' => 'POST',
    'content' => 'toto=1&tata=2'
));

$ctx = stream_context_create($params);
$fp = @fopen($sUrl, 'rb', false, $ctx);
if (!$fp)
{
    throw new Exception("Problem with $sUrl, $php_errormsg");
}

$response = @stream_get_contents($fp);
if ($response === false) 
{
    throw new Exception("Problem reading data from $sUrl, $php_errormsg");
}

どういうわけか、これは私にはうまくいきましたが、PHPの公式の例はうまくいきませんでした。toto=1&tata=2同様に+1 。fopenただし、は使用しませんでした。
Michael Yaworski、2015

4
@Ġiĺàɗここでは「noob」とは呼びません。これはそのようなことに対する友好的な警告です。
Daedalus、2016年

0
$sUrl = 'http://www.linktopage.com/login/';
$params = array('http' => array(
    'method'  => 'POST',
    'content' => 'username=admin195&password=d123456789'
));

$ctx = stream_context_create($params);
$fp = @fopen($sUrl, 'rb', false, $ctx);
if(!$fp) {
    throw new Exception("Problem with $sUrl, $php_errormsg");
}

$response = @stream_get_contents($fp);
if($response === false) {
    throw new Exception("Problem reading data from $sUrl, $php_errormsg");
}

2
単にコードをコピー/貼り付けるのではなく、複雑な答えを提供するようにしてください。
FelipeLeão2018

1
また、これは不必要に複雑です。+のfile_get_contents代わりに使用できます。そして、あなたも「ファイル」を閉じていません。@PascalMARTINが承認した回答を参照してください。fopenstream_get_contents
Martin Prikryl、2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.