PHP FAQ

Jak wysłać do skryptu zmienne metodą POST

piechnat

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.

FAQ

4 komentarzy

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ą :)

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

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

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