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.
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?
<form method="\"post\"" type="\"multipart/form-data\""> <input type="\"file\""> </form>chodzi mi o działanie identyczne z submitowaniem formularza html takiego jak
oczywiście zakładając, że znam ścieżkę do pliku na dysku lokalnym, pewni coś z
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