329 votes

Comment afficher des données en PHP en utilisant file_get_contents ?

J'utilise la fonction de PHP file_get_contents() pour récupérer le contenu d'une URL, puis je traite les en-têtes par le biais de la variable $http_response_header .

Le problème, c'est que certaines URL nécessitent l'affichage de certaines données (par exemple, les pages de connexion).

Comment je fais ça ?

Je réalise qu'en utilisant stream_context, je pourrais le faire, mais je ne suis pas tout à fait sûr.

Gracias.

1 votes

9 votes

Cela devrait être upvoted infiniment. Il n'y a aucune raison d'utiliser Curl/Guzzle ou toute autre bibliothèque fantaisiste si vous avez des fonctionnalités PHP brutes qui font le travail.

652voto

Pascal MARTIN Points 195780

Envoi d'une demande HTTP POST en utilisant file_get_contents n'est pas si difficile, en fait : comme vous l'avez deviné, vous devez utiliser la fonction $context paramètre.

Un exemple est donné dans le manuel PHP, à cette page : Options du contexte HTTP (citation) :

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

En gros, vous devez créer un flux, avec les bonnes options (il y a une liste complète sur cette page) et l'utiliser comme troisième paramètre de file_get_contents -- rien de plus ;-)

Pour la petite histoire : en général, pour envoyer des requêtes HTTP POST, on a tendance à utiliser curl, qui fournit beaucoup d'options et tout -- mais les flux sont l'une des belles choses de PHP que personne ne connaît... dommage...

1 votes

Merci. Je suppose que je peux insérer le contenu de $_POST dans $postdata si je dois passer les mêmes paramètres POST à la page demandée ?

7 votes

Je suppose que vous pouvez faire quelque chose comme ça ; mais content ne doit pas être un tableau PHP : il doit s'agir d'une chaîne de requête. (c'est-à-dire qu'il doit avoir ce format : param1=value1&param2=value2&param3=value3 ) ; ce qui signifie que vous devrez probablement utiliser http_build_query($_POST)

3 votes

Merveilleux ! Je cherchais un moyen de transmettre des données POST à une autre page, ce qui est réalisable en faisant $postdata = http_build_query($_POST) .

24voto

Macbric Points 84

Une alternative, vous pouvez également utiliser 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 votes

Pour une raison quelconque, ceci a fonctionné pour moi, mais pas l'exemple officiel de PHP. +1 pour le toto=1&tata=2 également. Je n'ai pas utilisé le fopen Cependant.

4 votes

@ià Nous n'appelons pas les gens "noob" ici. Il s'agit d'un avertissement amical à ce sujet.

-2voto

user2525449 Points 281
$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");
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X