[PHP] Jak przesłać "ręcznie" metodą POST dane do skryptu przetwarzającego formularze?

0x01 graphic

Chcesz przesłać dane metodą POST do skryptu, bez korzystania z formularza.

0x01 graphic

O ile wysyłanie danych metodą GET jest stosunkowo proste, bo zmienne wystarczy dołączyć do adresu strony, to metoda POST działa zupełnie inaczej.

Metoda POST nie ma też ograniczeń w ilości przesłanych danych, co jest jej niewąpliwą zaletą i dlatego często służy ona do przesyłania danych z rozbudowanych formularzy do skryptów.

Aby przesłać do skryptu dane metodą POST nie trzeba jednak tworzyć formularza. Wystarczy odpowiednio spreparować nagłówki i przesłać zakodowane pary: zmienna=wartość. Zobacz jak to zrobić.

<?

$serwer = "www.jakisserwer.com";

$skrypt = "http://www.jakisserwer.com/katalog/skrypt.php";

$dane[] = "zmienna1=wartosc1";

$dane[] = "zmienna2=wartosc2";

$dane[] = "zmienna3=wartosc3";

for ($i=0;$i<count($dane);$i++) {

$p = explode("=",$dane[$i]);

$sciezka .= urlencode($p[0])."=".urlencode($p[1])."&";

}

$naglowek = "POST $skrypt HTTP/1.0\r\n";

$naglowek .= "Content-type: application/x-www-form-urlencoded\r\n";

$naglowek .= "Content-length: ".strlen($sciezka)."\r\n\r\n";

$f=fsockopen($serwer,80);

if ($f) {

fputs($f, "$naglowek$sciezka");

while (!feof($f)) echo fgets($f,1024);

fclose($f);

}

?>

Na początku trzeba zdefiniować nazwę serwera, na którym znajduje się skrypt i pełną ścieżkę do skryptu (URL). Następnie w tablicy $dane[] można umieścić wszystkie dane, które mają zostać przesłane do skryptu. Ważne jest aby umieścić znak równości pomiędzy zmienną i jej wartością.

Pętla for pobiera pary zmienna=wartość i przekształca je w zakodowany łańcuch znaków (kodowane są tylko znaki specjalne), gdzie każda para oddzielona jest symbolem &. Całość wyglšda podobnie jak w metodzie GET, z tym, że tutaj nie ma ograniczenia co do długości zmiennych.

Pozostało nam jeszcze przygotować nagłówek, również standardowy dla metody POST. Trzeba więc ustalić kodowanie (typ danych) jako x-www-form-urlencoded i określić długość przesyłanych danych, czyli Content-length.

Na koniec wystarczy przesłać dane do skryptu łącząc się z nim na porcie 80, czyli dokładnie tak samo jak przeglądarka. Niektóre serwery mogą korzystać z innych portów, więc wtedy trzeba numer 80 zmienić na właściwy port.

Jeżeli połączenie zostanie nawiązane skrypt przesyła dane. W pętli while() odczytywana jest zawartość strony i w skrypcie ma znaczenie informacyjne - ma sprawdzić jak przebiegła transmisja danych. W praktyce możesz usunąć ten zapis, jeżeli masz pewność, że skrypt działa poprawnie.