Php pobierz wszystkie parametry pobierania. Zmienne zewnętrzne (zmienne poza PHP). Przekazywanie zmiennych do PHP przy użyciu metody POST

Pierwszą metodą wykonania żądania PHP POST jest użycie file_get_contents . Druga metoda użyje freada w połączeniu z kilkoma innymi funkcjami. Obie opcje wykorzystują funkcję stream_context_create do wypełnienia wymaganych pól nagłówka żądania.

Wyjaśnienie kodu

Zmienna $sPD zawiera dane do przesłania. Musi być w formacie ciągu żądania HTTP, więc niektóre znaki specjalne muszą być zakodowane.

Zarówno w funkcji file_get_contents, jak i funkcji fread mamy dwa nowe parametry. Pierwsza to use_include_path . Ponieważ wysyłamy żądanie HTTP, w obu przykładach będzie ono fałszywe. Po ustawieniu na true odczytu zasobu lokalnego funkcja będzie szukać pliku w include_path .

Drugim parametrem jest kontekst, który jest wypełniany wartością zwracaną przez stream_context_create, która przyjmuje wartość tablicy $aHTTP.

Używanie file_get_contents do wysyłania żądań POST

Aby wysłać żądanie POST przy użyciu file_get_contents w PHP, musisz użyć stream_context_create, aby ręcznie wypełnić pola nagłówka i określić, którego „opakowania” użyć - w tym przypadku HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // Dane POST $aHTTP = array("http" => // Opakowanie, które będzie używane array("method" => "POST", // Metoda żądania // Nagłówki żądań są ustawione poniżej "header" => "Treść - wpisz: application/x-www-form-urlencoded", "content" => $sPD)); $context = stream_context_create($aHTTP); $contents = file_get_contents($sURL, false, $context); echo $zawartość;

Używanie freada do wykonywania żądań POST

Możesz użyć funkcji fread do wysyłania żądań POST. Poniższy przykład wykorzystuje stream_context_create do utworzenia niezbędnych nagłówków żądań HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // Dane POST $aHTTP = array("http" => // Opakowanie, które będzie używane array("method" => "POST", // Metoda żądania // Nagłówki żądań są ustawione poniżej "header" => "Treść - wpisz: application/x-www-form-urlencoded", "content" => $sPD)); $context = stream_context_create($aHTTP); $uchwyt = fopen($sURL, "r", fałsz, $kontekst); $zawartość = ""; while (!feof($uchwyt)) ( $zawartość .= fread($uchwyt, 8192); ) fclose($uchwyt); echo $zawartość;

Tworzenie żądań GET za pomocą PHP

Skupimy się teraz na użyciu fread i file_get_contents do pobierania treści z Internetu za pośrednictwem protokołów HTTP i HTTPS. Aby skorzystać z metod opisanych w tym artykule, musisz włączyć opcję fopen wrappers. Aby to zrobić, musisz ustawić parametrallow_url_fopen na On w pliku php.ini.

Wykonywanie żądań POST i GET w PHP służy do logowania się na stronach internetowych, pobierania zawartości stron internetowych lub sprawdzania dostępności nowych wersji aplikacji. Omówimy, jak tworzyć proste żądania HTTP.

Używanie freada do pobierania lub odbierania plików przez Internet

Pamiętaj, że czytanie strony internetowej ogranicza się do dostępnej części pakietu. Musisz więc użyć funkcji stream_get_contents (podobnej do file_get_contents ) lub pętli while, aby przeczytać zawartość w mniejszych fragmentach, aż do osiągnięcia końca pliku:

W tym przypadku przetwarzania żądania PHP POST ostatni argument funkcji fread jest równy rozmiarowi fragmentu. Z reguły nie powinna być większa niż 8192 (8*1024).

z get(9)

Jaki jest sposób „mniejszego kodu” na uzyskanie parametrów z ciągu zapytania URL, który jest sformatowany w ten sposób?

www.mysite.com/category/subcategory?myqueryhash

Wynikiem powinno być: myqueryhash

Wiem o tym:

www.mysite.com/category/subcategory?q=myquery

Odpowiedzi

Ten kod i zapis nie są moje. Evan K rozwiązuje wielowartościowe zadanie o tej samej nazwie za pomocą funkcji zdefiniowanej przez użytkownika;) zaczerpnięte z:

Powyższy przykład daje następujące wyniki:

Cześć Hannes!

Jeśli chcesz uzyskać cały ciąg zapytania:

$_SERVER["QUERY_STRING"]

Ponadto, jeśli szukasz bieżącej nazwy pliku wraz z ciągiem zapytania, potrzebujesz tylko następujących informacji

Nazwa bazowa($_SERVER["REQUEST_URI"])

Otrzymasz informacje takie jak w poniższym przykładzie

plik.php? arg1 = wartość i arg2 = wartość

A jeśli potrzebujesz także pełnej ścieżki do pliku, zaczynając od katalogu głównego, np. /folder/folder2/file.php?arg1=val&arg2=val, po prostu usuń funkcję basename() i po prostu użyj nakładki

$_SERVER["REQUEST_URI"]

Dziękuję @K. Shahzad Pomaga to, gdy chcesz przepisać ciąg zapytania bez konieczności przepisywania dodatków. Powiedzmy, że przepisujesz /test/? X = y w indeksie.php? Q = test & x = y i chcesz uzyskać ciąg zapytania.

Funkcja get_query_string())( $arr = eksploduj("?",$_SERVER["REQUEST_URI"]); if (count($arr) == 2)( return ""; )else( return "?".end( $ arr).”
"; ) ) $query_string = get_query_string();

W PHP można to zrobić za pomocą funkcji parse_url, która analizuje adres URL i zwraca jego składniki. Łącznie z ciągiem zapytania.

$url = "www.mysite.com/category/subcategory?myqueryhash"; echo parse_url($url, PHP_URL_QUERY); # wyjście „myqueryhash”

Oto moja funkcja odzyskiwania części ciągu zapytania REFERRER.

Jeśli strona wywołująca miała już własny ciąg zapytania i musisz wrócić do tej strony i chcesz wysłać niektóre, a nie wszystkie, zmienne $_GET (np. numer strony).

Przykład: ciąg zapytania strony odsyłającej to?foo=1&bar=2&baz=3 wywołujący refererQueryString("foo" , "baz") zwraca foo=1&baz=3" :

Funkcja refererQueryString(/* var args */) ( //Zwróć pusty ciąg znaków, jeśli brak referera lub zmienne $_GET w refererze są dostępne: if (!isset($_SERVER["HTTP_REFERER"]) || pusty($_SERVER["HTTP_REFERER " "]) || pusty(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_QUERY))) ( return ""; ) //Pobierz zapytanie URL strony odsyłającej (coś w rodzaju "threadID=7&page=8") $refererQueryString = parse_url ( urldecode($_SERVER["HTTP_REFERER"]), PHP_URL_QUERY); //Jakie wartości chcesz wyodrębnić? (Przekazałeś ich nazwy jako zmienne.) $args = func_get_args(); //Pobierz ciągi znaków „” adresu URL osoby odsyłającej: $pairs = eksploduj("&",$refererQueryString); //Ciąg, który zwrócisz później: $return = ""; //Przeanalizuj pobrane ciągi i poszukaj tych, które Cię interesują: foreach ($pairs jako $pair ) ( $keyVal = eksploduj("=",$pair); $key = &$keyVal; $val = urlencode($keyVal); //Jeśli przekazałeś nazwę jako argument, dołącz bieżącą parę do zwracanego ciągu : if( in_array($key,$args)) ( $return .= "&". $key . "=" .$val; ) ) //Oto zwrócone pary „klucz=wartość” sklejone za pomocą „& ": return ltrim($return,"&"); ) //Jeśli Twoją stroną odsyłającą był „page.php?foo=1&bar=2&baz=3” //i chcesz, aby header() wrócił do „page.php?foo=1&baz=3” //(bez „paska”, tylko foo i baz), następnie zastosuj: header("Lokalizacja: page.php?".refererQueryString("foo","baz"));

Pomoc techniczna firmy Microsoft stwierdza: „Maksymalna długość adresu URL w przeglądarce Internet Explorer wynosi 2083 znaki”.

IE od dłuższego czasu ma problemy z adresami URL. Wydaje się, że Firefox działa dobrze z > 4 tys. znaków.

Programowanie stron internetowych w przeważającej części polega po prostu na przetwarzaniu różnych danych wprowadzanych przez użytkownika - czyli przetwarzaniu formularzy HTML.
Prawdopodobnie nie ma innego języka jak PHP, który tak bardzo ułatwiłby Ci przetwarzanie i parsowanie, tj. zmienne, które pochodzą z (z przeglądarki użytkownika). Faktem jest, że wszystkie niezbędne możliwości są wbudowane w język PHP, więc nie musisz nawet myśleć o funkcjach protokołu HTTP i zastanawiać się, jak wysyłać i odbierać formularze POST, a nawet pobierać pliki. zapewnione na wszystko.

Nie będziemy tutaj szczegółowo omawiać mechanizmu protokołu HTTP, który jest odpowiedzialny za dostarczanie danych z przeglądarki na serwer i z powrotem; temu PHP i HTTP poświęcono specjalną sekcję. Szczegółowo omówiono także zasady pracy z formularzami HTML.

Teraz rozważymy te mechanizmy tylko z stosowanego punktu widzenia, bez zagłębiania się w teorię.

Aby otrzymywać dane od użytkowników, potrzebujemy interaktywnej interakcji z nimi.

Spróbujmy teraz napisać skrypt, który jako parametry i dane wyjściowe przyjmie nazwę użytkownika:

"Cześć, !".

Najpierw przyjrzyjmy się najprostszemu sposobowi przekazania nazwy do skryptu — bezpośrednio wpisując ją w adresie URL po ? - na przykład w formacie nazwa=nazwa . Oto przykład:

http://localhost/script.php?name=nazwa

Nasz skrypt musi rozpoznać parametr name. Czyli najprościej mówiąc, skrypt (skrypt) musi zaakceptować parametr name w postaci zmiennej name, a następnie wyświetlić w przeglądarce użytkownika ciąg znaków „Hello,!”. Możesz to zrobić w ten sposób:

Piszemy skrypt, który pobiera parametr name i wyświetla wynik w przeglądarce użytkownika, a następnie zapisuje go pod nazwą script.php:

W naszym przykładzie użyliśmy predefiniowanej zmiennej $_GET["nazwa"] do "otrzymania" parametru name. Teraz przekazując parametr name=Sasha poprzez żądanie GET otrzymamy następujący wynik:

Witaj Sasza!

Spróbujmy teraz przekazać parametr name nie z ciągu zapytania przeglądarki, ale poprzez formularz HTML. Tworzymy dokument HTML o następującej treści:


Nazwa:

Zapiszmy teraz ten dokument HTML na naszym serwerze testowym (localhost) pod nazwą send.html w tym samym katalogu, w którym zapisaliśmy już skrypt script.php.

Teraz uruchamiamy dokument HTML w przeglądarce:

http://localhost/send.html

Wpisz nazwę w polu i naciśnij przycisk „GO!”. Formularz przekaże parametr name do naszego skryptu script.php poprzez żądanie GET. Jeśli wszystko zrobiłeś poprawnie i Twój serwer WWW działa normalnie, w polu formularza zobaczysz nazwę, którą wpisałeś! W pasku adresu przeglądarki zobaczysz ścieżkę i przekazany parametr name.

Teraz musimy zrozumieć, w jaki sposób możemy przekazywać wiele parametrów, na początek co najmniej dwa.

Potrzebujemy więc skryptu, który wygeneruje następujące informacje:

„Witam! Jesteś stary!”

Oznacza to, że musimy przekazać do skryptu 2 parametry: imię i wiek.

Teraz napiszemy skrypt.php, który przyjmie dwa parametry: imię i wiek, a także dokument HTML z formularzem, który przekaże te dwa parametry do naszego nowego skryptu:

A oto dokument HTML send.html, za pomocą którego przekażemy do naszego skryptu parametry name i age:



Wpisz swoje imię:

Podaj wiek:



Teraz nasz skrypt pobiera dwa parametry name i age i wyświetla wynik w przeglądarce w formacie: „Witam, czy jesteś stary!”

Zwróć uwagę na pasek adresu przeglądarki po przekazaniu parametrów do skryptu, będzie on wyglądał mniej więcej tak (bez kodowania adresu URL w cyrylicy):

http://localhost/script.php?name=Sasha&age=23

W zależności od ustawień interpretera istnieje kilka sposobów uzyskiwania dostępu do danych z formularzy HTML. Oto kilka przykładów:

//W formularzu metodą get wysyłamy przez ukryte pole wartość 1 Wyślij zapytanie

plik get.php

Post z prośbą o PHP

Żądanie postu w PHP jest również wysyłane przez formularz, tylko atrybutem w tagu formularza będzie method="post" . A dane we wskazanym pliku otrzymamy z tablicy post $_POST["search"] i od razu podamy przykład.

Zadanie: wysłać dane z pliku Index.php metodą POST na serwer w pliku get.php i odebrać je z powrotem, jeżeli pole wysyłania danych jest puste, wyświetli się komunikat o pustym polu. Zacznijmy rozwiązanie od pliku Index.php

Wyszukiwana fraza

Wypełnij pole żądania

Wpisane zapytanie:

Wysłać prośbę

plik get.php

Przekazywanie tablicy AJAX

Wykonajmy to samo zadanie, używając ajax. Właściwie ajax to technologia powiązana z javascriptem, ale w ramach notatki dotyczącej przesyłania danych na serwer poruszymy również tę technologię. Oczywiście ajax to temat na osobny artykuł. Podczas procesu żądania wyświetlimy również gif wskaźnika ładowania. Mamy też dwa pliki Index.php i get.php. Plik Index.php. Nie zapomnij połączyć jquery. Pamiętaj, że aby ukryć gif przy pierwszym ładowaniu strony, przypisz styl display: none do bloku box

$(document).ready(function())( //do przycisku wysyłania dołączamy zdarzenie $(.submit").click(function())( $.ajax(( //jak będziemy przesyłać typ danych : "GET", / /gdzie przekazujemy url: "get.php", //jakie dane przekazujemy dane: (flaga: 1), //zdarzenie przed wysłaniem ajax beforeSend:function())( //wyświetl gif $(.box").show( ); ), //zdarzenie po otrzymaniu odpowiedzi, //pobranie tablicy w przypadku powodzenia danych:function(data)( //ukryj gif $(.box").hide (); var html = ""; //f- i JSON.parse tłumaczy dane json na obiekt var dt=JSON.parse(data); for (var i = 0; i

Plik get.php. Otrzymujemy dane z tablicy get do pliku i przekazujemy tablicę z php do javascript. Aby przekazać tablicę do php do js, ​​należy ją przekonwertować do formatu json. Aby to zrobić, używamy funkcji php json_encode. Po przekodowaniu json jest wysyłany za pomocą php, w szczególności wywołując echo.

Mam strukturę adresu URL z ciągiem zapytania i parametrem o nazwie pozycja.

Http://computerhelpwanted.com/jobs/?occupation=administrator&position=network+administrator

Mam także listę rozwijaną wyboru formularza z pozycją wyboru nazwy formularza.

Wybierz stanowisko Administrator Wybierz pozycję Administrator sieci

Gdy użytkownik dokonuje wyboru, wysyła wartości parametrów do atrybutu akcji z parametrem wybierz nazwę="pozycja", który ma zostać użyty w ciągu zapytania.

Moje pytanie brzmi: jak uzyskać dostęp do wartości wyboru formularza oddzielnie od wartości ciągu zapytania?

Używam metody _GET do wywołania wartości z parametru ciągu zapytania.

$pozycja = isset($_GET["pozycja"]) ? ($_GET["pozycja"]): "";

Oczywiście czerpie to swoją wartość ze struktury adresu URL, a nie elementu formularza. A może tak jest, nie jestem pewien. Ale testując to, wydaje mi się, że doszedłem do wniosku, że pobiera go za pomocą adresu URL, a nie formularza.

Jak mogę uzyskać dostęp do wybranej wartości formularza podczas porównywania w moim PHP?

Aktualizacja

Mam problem z kanonicznym adresem URL określonym w nagłówku.

Tak właśnie powinno być

jedyną różnicą są - i + w ciągu zapytania.

Nie wszystkie moje ciągi zapytań mają znak +. Niektórzy mają -. Ale wyświetlam treść pod obydwoma adresami URL, niezależnie od tego, czy ma ona - czy +. Tak czy inaczej, oba adresy URL otrzymują tę samą treść strony.

Ponieważ jednak znak kanoniczny jest tworzony dynamicznie na podstawie identyfikatora URI, a nie wartości elementu formularza, na obu stronach zawartości znajdują się 2 różne znaki kanoniczne.

Użycie _Get('value') pobiera wartość z ciągu zapytania zamiast z elementu formularza. Wiem o tym, ponieważ wartość elementu formularza zawiera spację między administratorem sieci, która jest kodowana w formacie urlen, gdy formularz jest przesyłany jako sieć+administrator.Więc jeśli mogę porównać z wartością elementu formularza, mogę ustawić poprawną wartość kanoniczną.