Wykonanie rządania HTTP POST do innego skryptu PHP

piechnat

Pierwszym argumentem poniższej funkcji PostVars() jest bezwzględny adres, na którego chcemy wysłać zmienne. Musi się składać z protokołu, domeny, ścieżki do pliku oraz opcjonalnych parametrów (tzw. "query parameters").

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.

Przykład

<?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; 
  }

Użycie:

<?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 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="\&quot;post\&quot;" type="\&quot;multipart/form-data\&quot;"> <input type="\&quot;file\&quot;"> </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