338 Stimmen

Wie poste ich Daten in PHP mit file_get_contents?

Ich verwende die PHP-Funktion file_get_contents() um den Inhalt einer URL zu holen, und dann verarbeite ich die Kopfzeilen über die Variable $http_response_header .

Das Problem ist nun, dass einige der URLs einige Daten benötigen, um in die URL aufgenommen zu werden (z. B. Anmeldeseiten).

Wie kann ich das tun?

Ich erkenne mit stream_context kann ich in der Lage sein, das zu tun, aber ich bin nicht ganz klar.

Danke.

1 Stimmen

662voto

Pascal MARTIN Punkte 384469

Senden einer HTTP-POST-Anfrage mit file_get_contents ist eigentlich gar nicht so schwer: wie Sie schon vermutet haben, müssen Sie die $context Parameter.

Ein Beispiel ist im PHP-Handbuch auf dieser Seite zu finden: HTTP-Kontext-Optionen (zitiert) :

$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);

Im Grunde müssen Sie einen Stream mit den richtigen Optionen erstellen (eine vollständige Liste befindet sich auf dieser Seite) und verwenden ihn als dritten Parameter für file_get_contents -- mehr nicht ;-)

Nebenbei bemerkt: um HTTP-POST-Anfragen zu senden, tendieren wir dazu, curl zu verwenden, das eine Menge Optionen bietet -- aber Streams sind eines der netten Dinge von PHP, die niemand kennt... schade...

1 Stimmen

Danke. Ich nehme an, ich kann den Inhalt von $_POST in $postdata einfügen, wenn ich dieselben POST-Parameter an die angeforderte Seite übergeben muss?

7 Stimmen

Ich nehme an, dass man so etwas tun kann; aber content darf kein PHP-Array sein: es muss ein Querystring sein (d.h. sie muss dieses Format haben: param1=value1&param2=value2&param3=value3 ) ; das heißt, Sie müssen wahrscheinlich http_build_query($_POST)

3 Stimmen

Wunderbar! Ich habe nach einer Möglichkeit gesucht, POST-Daten an eine andere Seite weiterzugeben. $postdata = http_build_query($_POST) .

24voto

Macbric Punkte 462

Als Alternative können Sie auch 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");
}

0 Stimmen

Aus irgendeinem Grund funktionierte dies bei mir, aber das offizielle PHP-Beispiel funktionierte nicht. +1 für die toto=1&tata=2 auch. Ich habe nicht die fopen Allerdings.

4 Stimmen

@ià Wir nennen die Leute hier nicht 'Noob'. Dies ist eine freundliche Warnung vor solchen.

-2voto

user2525449 Punkte 277
$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 Stimmen

Bitte versuchen Sie, eine ausführliche Antwort zu geben, anstatt einfach nur Code zu kopieren/einzufügen.

1 Stimmen

Auch dies ist unnötig kompliziert. Sie können verwenden file_get_contents anstelle von fopen + stream_get_contents . Und Sie schließen nicht einmal die "Datei". Siehe die akzeptierte Antwort von @PascalMARTIN.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X