Programowanie w języku PHP » FAQ

Jak wysłać do skryptu zmienne metodą POST

Pierwszym argumentem poniższej funkcji PostVars() jest
bezwzględny adres skryptu, do którego chcemy wysłać zmienne.
Drugi argument to tablica asocjacyjna, w której klucze są
nazwami zmiennych i przydzielone są im odpowiednie wartości.
W funkcji wykomentowane zostały nagłówki, które nie są
konieczne do prawidłowego wysłania zmiennych, ale są
często podawane przez przeglądarki.

<?php  
 
  function PostVars($url, $vars) 
  {
      $result = $post = '';
      $url = parse_url($url);
      if (!is_array($vars)) return false;
 
      foreach ($vars as $k => $v)
      {
          $post .= urlencode($k) . '=' . urlencode($v) . '&';
      }
 
      $post = substr($post, 0, -1);
 
      if ($fp = @fsockopen($url['host'], 80)) 
      {
          fputs($fp, 
            "POST " . $url['path'] . " HTTP/1.0\r\n" .
            //"Accept: image/gif, image/x-xbitmap, image/jpeg, " .
            //"image/pjpeg, application/msword, " .
            //"application/x-shockwave-flash, */*\r\n" .
            //"Accept-Language: pl\r\n" .
            "Content-Type: application/x-www-form-urlencoded\r\n" .
            //"Accept-Encoding: gzip, deflate\r\n" .
            //"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; " .
            //"Windows NT 5.1)\r\n" .
            //"Host: " . $url['host'] . "\r\n" .
            "Content-Length: " . strlen($post) . "\r\n" .
            //"Connection: Keep-Alive\r\n" .
            "\r\n" . $post . "\r\n");
 
          while ($buf = fread($fp, 8192)) $result .= $buf; 
 
          fclose($fp); 
          return $result;
      }
 
      return false; 
  }
 
?>

Przykład użycia:

<?php
 
  $post['zmienna1'] = 'bla bla bla';
  $post['zmienna2'] = 'ble ble ble';
  $post['zmienna3'] = 'pla pla pla';
  echo PostVars('http://serwer.pl/skrypt.php', $post);
 
?>

W przypadkupomyślnego przesłania zmiennych funkcja zwróci
odpowiedź serwera zawierającą nagłówki oraz treść strony HTML.

4 komentarze

blackpig 2009-10-15 12:30

Witam ;) użyteczna funkcja,
ale brakuje jednej pierdółki:
zamiast:
"POST " . $url['path'] . " HTTP/1.0\r\n" .
lepiej:
"POST " . $url['path'] . "?" . $url['query'] . " HTTP/1.0\r\n" .

Inaczej parametry z URL-a są pomijane i udaje nam się trudna sztuka wysłania POSTa,
zaś wysłanie "zwykłego" GETa kończymy porażką :)

majes 2006-04-24 19:16

To działa tylko jesli tablica jest jednowymairowa :/  co trzeba zrobic zeby lyknela wielowymiarowe?

Can I 2005-02-16 22:41

a jak będą wyglądały nagłówki dla uploadowania pliku?
chodzi mi o działanie identyczne z submitowaniem formularza html takiego jak

<form method=\"post\" type=\"multipart/form-data\">
<input type=\"file\">
</form>

oczywiście zakładając, że znam ścieżkę do pliku na dysku lokalnym, pewni coś z

chunk_split(base64_encode(implode(\"\", file($uploadfile))))

Marooned 2005-08-30 16:15

Kurna... dlaczego w FAQ nigdy nie szukam? [green]
Pół dnia szukałem tego na google, kolejne funkcje nie działały... a tu ciach - działa idealnie :)
thx piechnat