Vi behandlar POST-förfrågningar i PHP. NodeJS. Hur man behandlar POST-förfrågningar Bearbetar http-förfrågningar php

Webbläsarklienter kan skicka information till webbservern.

Innan webbläsaren skickar information kodar den den med ett schema som kallas URL-kodning. I det här schemat är namn/värdepar sammanlänkade med likhetstecken, och olika par separeras med ett et-tecken.

Namn1=värde1&namn2=värde2&namn3=värde3

Mellanslag tas bort och ersätts med tecknet + och alla andra icke-alfanumeriska tecken ersätts med hexadecimala värden. När informationen är kodad skickas den till servern.

GET-metoden

GET-metoden skickar kodad användarinformation som läggs till sidförfrågan. Är sidorna och den kodade informationen åtskilda från varandra? frågetecken.

http://www.test.com/index.htm?name1=value1&name2=value2

  • GET-metoden producerar en lång sträng som visas i dina serverloggar i webbläsarens "Plats"-fält.
  • GET-metoden är begränsad till att endast skicka upp till 1024 tecken.
  • Använd aldrig GET-metoden om du har ett lösenord eller annan känslig information att skicka till servern.
  • GET kan inte användas för att överföra binära data, såsom bilder eller textdokument, till servern.
  • Data som skickas med GET-metoden kan nås med miljövariabeln QUERY_STRING.
  • PHP tillhandahåller den associativa arrayen $_GET för att komma åt all skickad information med GET-metoden.

if($_GET["namn"] || $_GET["ålder"]) ( echo "Välkommen ". $_GET["namn"]; echo "Du är ". $_GET["ålder"]. " år gammal "; utgång(); )

Namn: Ålder:

POST-metoden

Metod POSTAöverför information via HTTP-huvuden. Informationen kodas enligt beskrivningen i fallet med metoden SKAFFA SIG, och placeras i rubriken FRÅGESTRÄNG.

  • POST-metoden har ingen gräns för storleken på data som måste skickas.
  • POST-metoden kan användas för att skicka ASCII såväl som binär data.
  • Data som skickas med POST-metoden passerar genom en HTTP-rubrik, så säkerheten beror på HTTP-protokollet. Genom att använda Secure HTTP kan du säkerställa att din information är skyddad.
  • PHP tillhandahåller en associativ array $_POST för att komma åt all information som skickas med POST-metoden.

Prova följande exempel genom att placera källkoden i test.php-skriptet.

if($_POST["namn"] || $_POST["ålder"]) (if (preg_match("[^A-Za-z"-]",$_POST["namn"])) (die (" ogiltigt namn och namn ska vara alfa"); ) echo "Välkommen ". $_POST["namn"]; echo "Du är ". $_POST["ålder"]. " år gammal."; exit(); )

Namn: Ålder:

$_REQUEST variabel

PHP-variabel $_REQUEST innehåller innehåll som $_GET, $_POST, alltså $_COOKIE. Vi kommer att diskutera variabeln $_COOKIE när vi pratar om kakor.

PHP $_REQUEST-variabeln kan användas för att hämta resultatet från formulärdata som skickats med metoderna GET och POST.

Den första metoden för att utföra en PHP POST-begäran är att använda file_get_contents . Den andra metoden kommer att använda fread i kombination med ett par andra funktioner. Båda alternativen använder stream_context_create-funktionen för att fylla i de obligatoriska rubrikfälten för begäran.

Kodförklaring

Variabeln $sPD innehåller data som ska överföras. Det måste vara i HTTP-begäransträngsformat, så vissa specialtecken måste kodas.

I både file_get_contents-funktionen och fread-funktionen har vi två nya parametrar. Den första är use_include_path . Eftersom vi gör en HTTP-förfrågan kommer den att vara falsk i båda exemplen. När den är inställd på true för att läsa en lokal resurs, kommer funktionen att leta efter filen på include_path .

Den andra parametern är context, som fylls i med returvärdet för stream_context_create, som tar värdet för $aHTTP-matrisen.

Använder file_get_contents för att göra POST-förfrågningar

För att skicka en POST-förfrågan med file_get_contents i PHP måste du använda stream_context_create för att manuellt fylla i rubrikfälten och ange vilken "wrapper" som ska användas - i det här fallet HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST-data $aHTTP = array("http" => // Wrapper som kommer att användas array("method" => "POST", // Request method // Request headers sätts under "header" => "Innehåll - typ: application/x-www-form-urlencoded", "content" => $sPD)); $kontext = stream_context_create($aHTTP); $contents = file_get_contents($sURL, false, $context); echo $innehåll;

Använder fread för att utföra POST-förfrågningar

Du kan använda fread-funktionen för att göra POST-förfrågningar. Följande exempel använder stream_context_create för att skapa de nödvändiga HTTP-begärans rubriker:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // POST-data $aHTTP = array("http" => // Wrapper som kommer att användas array("method" => "POST", // Request Method // Request headers är inställda under "header" => "Innehåll - typ: application/x-www-form-urlencoded", "content" => $sPD)); $kontext = stream_context_create($aHTTP); $handle = fopen($sURL, "r", false, $kontext); $contents = ""; while (!feof($handle)) ( $contents .= fread($handle, 8192); ) fclose($handle); echo $innehåll;

Gör GET-förfrågningar med PHP

Vi kommer nu att fokusera på att använda fread och file_get_contents för att ladda ner innehåll från internet via HTTP och HTTPS. För att använda metoderna som beskrivs i den här artikeln måste du aktivera alternativet fopen omslag. För att göra detta måste du ställa in parametern allow_url_fopen till On i filen php.ini.

Att utföra POST- och GET-förfrågningar i PHP används för att logga in på webbplatser, hämta innehåll på webbsidor eller söka efter nya versioner av applikationer. Vi tar upp hur man gör enkla HTTP-förfrågningar.

Använder fread för att ladda ner eller ta emot filer över Internet

Kom ihåg att webbsidans läsning är begränsad till den tillgängliga delen av paketet. Så du måste använda funktionen stream_get_contents ( liknande file_get_contents) eller en while-loop för att läsa innehållet i mindre bitar tills slutet av filen nås:

I det här fallet med bearbetning av en PHP POST-förfrågan är det sista argumentet för fread-funktionen lika med fragmentstorleken. Det bör i allmänhet inte vara större än 8192 ( 8*1024 ).

Tänk på att det kan vara större eller mindre, och kan också begränsas av inställningarna för det system som PHP körs på.

Använda file_get_contents för att få en webbplats URL

Det är ännu enklare att använda den här metoden när du läser en fil över HTTP, eftersom du inte behöver oroa dig för att läsa i bitar – allt hanteras i PHP.

Denna publikation är en översättning av artikeln "Making POST Requests With PHP", utarbetad av det vänliga projektteamet

PHP är för närvarande ett av de mest populära språken för att implementera webbapplikationer. Denna kurs ägnas åt att studera dess grunder. Tonvikten ligger på den praktiska tillämpningen av förvärvade färdigheter.

PHP-språket skapades för att lösa ett specifikt praktiskt problem på Internet (vilket man kan ta reda på genom att läsa kursens första föreläsning). Vi kommer också att försöka att inte distraheras för mycket av teoretiska resonemang, och kommer att sträva efter att lösa ett specifikt problem i var och en av föreläsningarna. De flesta av exemplen är hämtade från ett verkligt system: ett virtuellt museum över datavetenskapens historia. Den första delen av kursen ägnas åt att studera grunderna i syntax och kontrollstrukturer. Efter detta betraktas klient-serverteknologi som det huvudsakliga applikationsområdet för PHP-språket. Sedan går vi vidare till att studera de mest användbara inbyggda funktionerna enligt vår mening och lösa praktiska problem med deras hjälp. Även om objektmodellen i PHP-språket inte är den rikaste, tillåter dess grundläggande närvaro dig att naturligt beskriva objektdatamodeller. Som grundmodell kommer dokumentmodellen för ett virtuellt datavetenskapsmuseum att övervägas. Efter detta kommer ett antal tillämpade aspekter att övervägas: att arbeta med filsystemet, med databasen, strängar, sessioner, DOM XML - allt detta kommer att tillåta oss att överväga nyckeluppgifterna för den praktiska användningen av språket.

Som framgår av tabellen ovan intar Apache-servern en ledande position. Allt vi någonsin kommer att säga om webbservrar är Apache-centrerat om inget annat anges. Vi pratade redan om hur du installerar det på din dator i den allra första föreläsningen. Och nu, som utlovat, låt oss vända oss till HTTP-protokollet.

HTTP-protokoll och metoder för att överföra data till servern

Internet bygger på en flerskiktsprincip, från det fysiska lagret, som behandlar de fysiska aspekterna av överföringen av binär information, till applikationslagret, som tillhandahåller gränssnittet mellan användaren och nätverket.

HTTP (HyperText Transfer Protocol) är ett applikationslagerprotokoll utformat för att utbyta hypertextinformation på Internet.

HTTP tillhandahåller en uppsättning metoder för att specificera syftet med begäran som skickas till servern. Dessa metoder är baserade på referensdisciplin, där en Universal Resource Identifier, antingen som en Universal Resource Locator (URL) eller ett Universal Resource Name, används för att indikera den resurs som metoden ska tillämpas på. ,URN).

Meddelanden över nätverket när HTTP-protokollet används överförs i ett format som liknar meddelandeformatet för Internet-e-post (RFC-822) eller meddelandeformatet MIME (Multipurpose Internet Mail Exchange).

HTTP används för kommunikation mellan olika användarprogram och gatewayprogram som ger åtkomst till befintliga Internetprotokoll som SMTP (Email Protocol), NNTP (News Transfer Protocol), FTP (File Transfer Protocol), Gopher och WAIS. HTTP är utformad för att tillåta sådana gateways att överföra data via proxyservrar utan förlust.

Protokollet implementerar begäran/svar-principen. Det begärande programmet - klienten initierar interaktion med det svarande programmet - servern och skickar en begäran som innehåller:

Åtkomstmetod;

URI-adress;

Protokollversion;

Ett meddelande (liknande i form av MIME) som innehåller information om typen av data som överförs, information om klienten som gör begäran och möjligen innehållet (kroppen) i meddelandet.

Serversvaret innehåller:

En statusrad som inkluderar protokollversionen och returkoden (framgång eller fel);

Ett meddelande (i MIME-liknande form) som innehåller serverinformation, metainformation (det vill säga information om innehållet i meddelandet) och meddelandetexten.

Protokollet anger inte vem som ska öppna och stänga anslutningen mellan klienten och servern. I praktiken öppnas anslutningen vanligtvis av klienten och servern, efter att ha skickat svaret, initierar dess avslutning.

Låt oss titta närmare på i vilken form förfrågningar skickas till servern.

Formulär för kundförfrågan

Klienten skickar begäran till servern i en av två former: fullständig eller förkortad. En begäran i den första formen kallas en fullständig begäran, och i den andra formen en enkel begäran.

En enkel begäran innehåller en åtkomstmetod och en resursadress. Formellt kan detta skrivas så här:

<Простой-Запрос> := <Метод> <символ пробел>
<Запрашиваемый-URI> <символ новой строки>

Metoden kan vara GET, POST, HEAD, PUT, DELETE och andra. Vi kommer att prata om de vanligaste av dem lite senare. Den begärda URI:n är oftast resursens URL.

Exempel på en enkel begäran:

Hämta http://phpbook.info/

Här är GET åtkomstmetoden, d.v.s. en metod som bör tillämpas på den begärda resursen, och http://phpbook.info/ är webbadressen till den begärda resursen.

En komplett begäran innehåller en statusrad, flera rubriker (begäran rubrik, allmän rubrik eller innehållsrubrik) och eventuellt en begärandekropp. Formellt kan den allmänna formen för en fullständig begäran skrivas enligt följande:

<Полный запрос> := <Строка Состояния>
(<Общий заголовок>|<Заголовок запроса>|
<Заголовок содержания>)
<символ новой строки>
[<содержание запроса>]

Hakparenteser här indikerar valfria rubrikelement, och alternativa alternativ listas genom en vertikal stapel. Element<Строка состояния>innehåller begäranmetoden och resurs-URI (precis som en enkel begäran) och dessutom versionen av HTTP-protokollet som används. För att till exempel anropa ett externt program kan du använda följande statusrad:

POST http://phpbook.info/cgi-bin/test HTTP/1.0

I det här fallet används POST-metoden och HTTP version 1.0.

I båda formerna av begäran spelar den begärda resursens URI en viktig roll. Den vanligaste URI:n används i form av en resurs-URL. När du kommer åt servern kan du använda både den fullständiga formen av URL:en och den förenklade.

Det fullständiga formuläret innehåller typen av åtkomstprotokoll, adressen till resursservern och adressen till resursen på servern (Figur 4.2).

I den förkortade formen utelämnas protokollet och serveradressen, vilket endast anger platsen för resursen från serverroten. Det fullständiga formuläret används om det är möjligt att vidarebefordra begäran till en annan server. Om arbete sker med endast en server, används ofta den förkortade formen.


Ris. 4.2. Fullständig URL-formulär

Metoder

Som redan nämnts måste varje klientförfrågan till servern börja med en metodspecifikation. Metoden kommunicerar syftet med kundens begäran. HTTP-protokollet stöder en hel del metoder, men endast tre används faktiskt: POST, GET och HEAD. GET-metoden låter dig hämta all data som identifieras av URI:n i resursbegäran. Om URI:n pekar på ett program, så returneras resultatet av programmets operation, inte dess text (såvida inte texten naturligtvis är resultatet av dess operation). Ytterligare information som behövs för att behandla begäran är inbyggd i själva begäran (i statusraden). När du använder GET-metoden returneras den faktiska begärda informationen (texten i ett HTML-dokument, till exempel) i resurskroppsfältet.

Det finns en variant av GET-metoden - villkorad GET. Den här metoden talar om för servern att begäran endast ska besvaras om villkoret i fältet if-Modified-Since i förfrågningshuvudet är sant. Mer specifikt skickas resurskroppen som svar på begäran om resursen har modifierats sedan det datum som anges i if-Modified-Since.

HEAD-metoden liknar GET-metoden, men returnerar inte resurskroppen och har ingen villkorlig motsvarighet. HEAD-metoden används för att få information om en resurs. Detta kan vara användbart till exempel när man löser problemet med att testa hypertextlänkar.

POST-metoden är utformad för att överföra information till servern såsom resurskommentarer, nyheter och e-postmeddelanden, data som ska läggas till databasen, d.v.s. för att överföra stora volymer och ganska viktig information. Till skillnad från GET- och HEAD-metoderna överför POST resurskroppen, vilket är information som tas emot från formulärfält eller andra indatakällor.

Hittills har vi bara teoretiserat och bekantat oss med de grundläggande begreppen. Nu är det dags att lära sig hur man använder allt detta i praktiken. Senare i föreläsningen kommer vi att titta på hur man skickar förfrågningar till servern och hur man behandlar dess svar.

Använda HTML-formulär för att skicka data till servern

Hur överför man data till servern? För detta ändamål har HTML-språket en speciell konstruktion - former. Formulär är utformade för att ta emot information från användaren. Du behöver till exempel känna till användarens inloggning och lösenord för att avgöra vilka sidor på webbplatsen han kan få tillgång till. Eller så behöver du användarens personuppgifter för att kunna kontakta honom. Formulär används just för att ange sådan information. Du kan skriva in text i dem eller välja lämpliga alternativ från en lista. Data som skrivs i formuläret skickas för bearbetning till ett speciellt program (till exempel ett PHP-skript) på servern. Beroende på vilken data användaren har angett kan detta program generera olika webbsidor, skicka frågor till databasen, starta olika applikationer, etc.

Låt oss förstå syntaxen för HTML-formulär. Många kanske känner till det, men vi kommer ändå att upprepa huvudpunkterna eftersom det är viktigt.

Så, för att skapa ett formulär i HTML, används FORM-taggen. Inuti den finns ett eller flera INPUT-kommandon. Med hjälp av åtgärds- och metodattributen för FORM-taggen anger du namnet på programmet som ska bearbeta formulärdata respektive begäranmetoden. INPUT-kommandot specificerar typen och olika egenskaper hos den begärda informationen. Formulärdata skickas efter att du har tryckt på inmatningsknappen för inlämningstypen. Låt oss skapa ett formulär för att registrera deltagare i en korrespondensskola för programmering.

När den har bearbetats av webbläsaren kommer den här filen att se ut ungefär så här:


Ris. 4.3. Exempel html-formulär

Så här skapas och ser HTML-formulär ut. Vi kommer att anta att vi har lärt oss eller kommit ihåg hur man skapar dem. Som vi kan se kan du ange dataöverföringsmetoden i formuläret. Låt oss se vad som händer om du anger GET- eller POST-metoden, och vad skillnaden blir.

För GET-metoden

När du skickar in formulärdata med GET-metoden läggs formulärinnehållet till i URL:en efter frågetecknet som namn=värdepar sammanlänkade med ett et-tecken &:

action?namn1=värde1&namn2=värde2&namn3=värde3

Här är action URL:en till programmet som ska bearbeta formuläret (antingen programmet som anges i action-attributet för form-taggen, eller det aktuella programmet i sig om det attributet utelämnas). Namnen namn1, namn2, namn3 motsvarar namnen på formelementen och värde1, värde2, värde3 motsvarar värdena för dessa element. Alla specialtecken, inklusive = och &, kommer att utelämnas från dessa parameternamn eller värden. Därför bör du inte använda dessa symboler och kyrilliska tecken i identifierare i namn eller värden för formulärelement.

Om du anger något tjänstecken i inmatningsfältet kommer det att sändas i sin hexadecimala kod, till exempel kommer symbolen $ att ersättas med %24. Ryska bokstäver överförs också på samma sätt.

För text- och lösenordsinmatningsfält (dessa är inmatningselement med attributen type=text och type=password), blir värdet vad användaren än anger. Om användaren inte anger något i ett sådant fält, kommer elementet name= att finnas i frågesträngen, där namn motsvarar namnet på detta formulärelement.

För kryssruta- och alternativknappsknappar bestäms värdet av VALUE-attributet när knappen är markerad. Omarkerade knappar ignoreras helt när frågesträngen skapas. Flera kryssrutor kan ha samma NAME-attribut (och olika VÄRDEN) om det behövs. Knappar av typen radioknapp är avsedda för ett av alla erbjudna alternativ och måste därför ha samma NAME-attribut och olika VALUE-attribut.

I princip är det inte nödvändigt att skapa ett HTML-formulär för att överföra data med GET-metoden. Du kan helt enkelt lägga till de önskade variablerna och deras värden till URL-strängen.

http://phpbook.info/test.php?id=10&user=pit

I detta avseende har dataöverföring med GET-metoden en betydande nackdel - vem som helst kan förfalska parametervärden. Därför rekommenderar vi inte att du använder den här metoden för att komma åt lösenordsskyddade sidor eller för att överföra information som påverkar säkerheten för programmet eller servern. Dessutom bör du inte använda GET-metoden för att överföra information som användaren inte får ändra.

Trots alla dessa nackdelar är det ganska bekvämt att använda GET-metoden vid felsökning av skript (då kan du se värdena och namnen på de variabler som skickas) och för att skicka parametrar som inte påverkar säkerheten.

För POST-metoden

Formulärinnehållet kodas på exakt samma sätt som för GET-metoden (se ovan), men istället för att lägga till en sträng till URL:en skickas begäransinnehållet som ett datablock som en del av POST-operationen. Om ACTION-attributet finns, bestämmer URL-värdet som finns där vart detta datablock ska skickas. Denna metod, som redan nämnts, rekommenderas för överföring av stora datablock.

Information som skrivs in av användaren och skickas till servern med POST-metoden serveras på standardinmatning till programmet som specificeras av action-attributet, eller till det aktuella skriptet om detta attribut utelämnas. Längden på den skickade filen skickas i miljövariabeln CONTENT_LENGTH och datatypen skickas i variabeln CONTENT_TYPE.

Du kan bara skicka data med POST-metoden med ett HTML-formulär, eftersom data skickas i förfrågans brödtext och inte i rubriken, som i GET. Följaktligen kan du bara ändra värdet på parametrarna genom att ändra värdet som anges i formuläret. När du använder POST ser användaren inte data som skickas till servern.

Den största fördelen med POST-förfrågningar är deras större säkerhet och funktionalitet jämfört med GET-förfrågningar. Därför används POST-metoden oftare för att överföra viktig information, såväl som storskalig information. Du bör dock inte lita helt på säkerheten för denna mekanism, eftersom POST-begäransdata också kan förfalskas, till exempel genom att skapa en HTML-fil på din maskin och fylla den med nödvändiga data. Dessutom kan inte alla klienter använda POST-metoden, vilket begränsar dess användningsfall.

När data skickas till servern med valfri metod överförs inte bara data som användaren matat in, utan också ett antal variabler, kallade miljövariabler, som kännetecknar klienten, dess operationshistorik, filsökvägar, etc. Här är några av miljövariablerna:

REMOTE_ADDR – IP-adressen till värden (datorn) som skickar begäran;

REMOTE_HOST – värdnamnet från vilket begäran skickades;

HTTP_REFERER – adressen till sidan som länkar till det aktuella skriptet;

REQUEST_METHOD – metoden som användes när förfrågan skickades;

QUERY_STRING – information som finns i URL:en efter frågetecknet;

SCRIPT_NAME – virtuell sökväg till programmet som ska köras;

HTTP_USER_AGENT – information om webbläsaren som klienten använder

Hittills har vi bara nämnt att klientförfrågningar behandlas på servern med hjälp av ett speciellt program. Faktum är att vi kan skriva det här programmet själva, inklusive i PHP, och det kommer att göra vad vi vill med mottagna data. För att kunna skriva detta program måste du bekanta dig med några av de regler och verktyg som PHP erbjuder för detta ändamål.

Inom ett PHP-skript finns det flera sätt att komma åt data som skickas av en klient via HTTP. Före PHP 4.1.0 utfördes åtkomst till sådan data av namnen på de överförda variablerna (kom ihåg att data överförs i form av paren "variabelnamn, "=" symbol, variabelvärde"). Således, om till exempel first_name=Nina godkändes, så dök variabeln $first_name med värdet Nina upp i skriptet. Om det var nödvändigt att särskilja med vilken metod data överfördes, användes de associativa arrayerna $HTTP_POST_VARS och $HTTP_GET_VARS, vars nycklar var namnen på de överförda variablerna och värdena var respektive värdena ​av dessa variabler. Således, om paret first_name=Nina skickas med GET-metoden, då $HTTP_GET_VARS["first_name"]="Nina".

Det är inte säkert att använda namnen på godkända variabler direkt i ett program. Därför beslutades det, från och med PHP 4.1.0, att använda en speciell array – $_REQUEST – för att komma åt variabler som överförs via HTTP-förfrågningar. Denna array innehåller data som överförs med POST- och GET-metoderna, såväl som med hjälp av HTTP-cookies. Detta är en superglobal associativ array, dvs. dess värden kan erhållas var som helst i programmet med namnet på motsvarande variabel (formelement) som nyckel.

Exempel 4.2. Låt oss säga att vi skapade ett formulär för att registrera deltagare till en, som i exemplet ovan. Sedan kan du skriva följande i 1.php-filen som behandlar detta formulär:

$str = "Hej,
".$_REQUEST["first_name"]. "
".$_REQUEST["efternamn"]."!
";
$str .="Du har valt att läsa en kurs i
".$_REQUEST["kurs"];
echo $str;
?>

Sedan, om vi skrev in namnet "Vasya", efternamnet "Petrov" i formuläret och valde PHP-kursen bland alla kurser, kommer vi att få följande meddelande på webbläsarskärmen:

Hej, Vasya Petrov!

Efter introduktionen av $_REQUEST-matrisen döptes $HTTP_POST_VARS- och $HTTP_GET_VARS-arrayerna till $_POST respektive $_GET för konsekvens, men de försvann inte själva från användning av kompatibilitetsskäl med tidigare versioner av PHP. Till skillnad från sina föregångare har arrayerna $_POST och $_GET blivit superglobala, d.v.s. tillgängliga direkt och inuti funktioner och metoder.

Låt oss ge ett exempel på hur du använder dessa arrayer. Låt oss säga att vi behöver bearbeta ett formulär som innehåller indataelement som heter förnamn, efternamn, kurs (till exempel form.html ovan). Data överfördes med POST-metoden och vi vill inte behandla data som överförts med andra metoder. Detta kan göras på följande sätt:

$str = "Hej,
".$_POST ["förnamn"]."
".$_POST ["efternamn"] ."!
";
$str .= "Du har valt att läsa en kurs på ".
$_POST["kurs"];
echo $str;
?>

Sedan på webbläsarskärmen, om vi skrev in namnet "Vasya", efternamnet "Petrov" och valde PHP-kursen bland alla kurser, kommer vi att se ett meddelande, som i föregående exempel:

Hej, Vasya Petrov!
Du har valt att läsa en PHP-kurs

För att bibehålla förmågan att bearbeta skript tidigare än PHP 4.1.0, introducerades register_globals-direktivet, som tillåter eller nekar åtkomst till variabler direkt med deras namn. Om parametern register_globals=On finns i PHP-inställningsfilen, kan variabler som skickas till servern med GET- och POST-metoderna nås helt enkelt genom deras namn (dvs. du kan skriva $first_name). Om register_globals=Av måste du skriva $_REQUEST["first_name"] eller $_POST["first_name"], $_GET["first_name"], $HTTP_POST_VARS["first_name"], $HTTP_GET_VARS["first_name"]. Ur säkerhetssynpunkt är det bättre att inaktivera detta direktiv (dvs register_globals=Off). Med register_globals-direktivet aktiverat kommer arrayerna ovan också att innehålla data som skickas av klienten.

Ibland behöver du veta värdet på en miljövariabel, till exempel metoden som används för att skicka förfrågan eller IP-adressen till datorn som skickade förfrågan. Du kan få denna information med hjälp av getenv()-funktionen. Den returnerar värdet på miljövariabeln vars namn skickas till den som en parameter.

getenv("REQUEST_METHOD");
// returnerar den använda metoden
echo getenv("REMOTE_ADDR");
// kommer att visa användarens IP-adress,
// vem skickade förfrågan
?>

Som vi sa, om GET-metoden används, överförs data genom att lägga till en frågesträng i form av variabelnamn=värdepar till resurs-URL:n. Allt efter frågetecknet i URL:en kan hämtas med kommandot

getenv("QUERY_STRING");

Tack vare detta är det möjligt att överföra data i någon annan form med GET-metoden. Till exempel kan du endast ange värden för flera parametrar med hjälp av ett plustecken, och i skriptet kan du analysera frågesträngen i delar, eller så kan du skicka värdet på bara en parameter. I det här fallet kommer ett tomt element med en nyckel lika med detta värde (hela frågesträngen) att visas i $_GET-matrisen, och "+"-tecknet som påträffas i frågesträngen kommer att ersättas med ett understreck "_".

Med POST-metoden överförs data endast med hjälp av formulär, och användaren (klienten) ser inte vilken data som skickas till servern. För att se dem måste hackaren ersätta vårt formulär med sitt eget. Sedan kommer servern att skicka resultatet av behandlingen av det felaktiga formuläret till fel plats. För att undvika detta kan du kontrollera adressen till sidan som informationen skickades från. Detta kan göras igen med funktionen getenv():

getenv("HTTP_REFERER");

Nu är det dags att lösa problemet som formulerades i början av föreläsningen.

Exempel på bearbetning av en förfrågan med PHP

Låt oss komma ihåg vad uppgiften var och förtydliga dess formulering. Du måste skriva ett formulär för att registrera deltagare i korrespondensskolan för programmering och efter registrering skicka ett meddelande till deltagaren. Vi har kallat detta meddelande för det universella brevet, men det kommer att skilja sig något från brevet vi skrev i föregående föreläsning. Här kommer vi inte heller att skicka något via e-post, för att inte vara som spammare, utan kommer helt enkelt att generera detta meddelande och visa det på webbläsarens skärm. Vi har redan tillhandahållit den första versionen av registreringsformuläret ovan. Vi kommer att ändra det så att varje registrar kan välja så många kurser de vill gå och vi kommer inte att bekräfta mottagandet av anmälningsformuläret.

Allt här är ganska enkelt och tydligt. Det enda att notera är hur värdena för checkbox-elementet skickas. När vi skriver kurs i elementnamnet betyder det att det första kryssrutan-elementet kommer att skrivas till det första elementet i kurs-matrisen, den andra kryssrutan kommer att skrivas till det andra matriselementet, etc. Du kan givetvis helt enkelt ge olika namn på kryssruteelementen, men det kommer att komplicera databehandlingen om det finns många kurser.

Skriptet som kommer att analysera och bearbeta allt detta kallas 1.php (formuläret hänvisar specifikt till denna fil, som är skriven i dess action-attribut). Som standard används GET-metoden för överföring, men vi angav POST. Baserat på informationen från den registrerade personen genererar skriptet ett motsvarande meddelande. Om en person har valt några kurser får han ett meddelande om när de kommer att hållas och vilka föreläsare som undervisar i dem. Om en person inte har valt något, visas ett meddelande om nästa möte med Correspondence School of Programmers (ZSH).

HTML-formulär gör att användarinmatade data kan skickas till en server där de kan bearbetas ytterligare. Formunderhåll utförs i två steg. Formuläret måste först presenteras för användaren, som fyller det med sina uppgifter och sedan skickar det till servern. Varje formulär har en landningswebbsida som måste laddas för att bearbeta data som användaren skickar in. Detta är ofta samma skriptfil som genererar formuläret. I det här fallet söker PHP-koden helt enkelt efter data i formuläret för att avgöra om skriptet ska anropas igen för att skapa formuläret eller börja bearbeta mottagna data.

Uppmärksamhet! Lektionen är föråldrad. Nya lektioner om detta ämne finns i PHP-kursen för nybörjare.

I de flesta fall innebär det att skicka in formulär till servern någon form av databasarbete. Till exempel är en databassökning en nödvändig åtgärd för de flesta olika applikationer, vare sig det är att söka på foruminlägg, användare eller en blogg. Hur som helst kan denna operation göra användarens liv enklare. Därför att Vid det här laget har vi ännu inte bekantat oss med interaktionen mellan PHP och MySQL DBMS, i den här artikeln kommer vi att titta på enkla exempel på formulärbehandling, och huvuduppgiften för mig är att visa hur information överförs med PHP-språket .

Överföra information med PHP-språk

Det här avsnittet ger grundläggande information om hur data kan överföras mellan webbsidor. En del av denna information relaterar inte enbart till PHP-teknik, utan beskriver interaktionen mellan PHP och HTML-verktyg eller rör själva HTTP-protokollet.

Brist på statligt stöd i HTTP-protokoll

Den viktigaste egenskapen hos någon webbteknik som alltid bör ha i åtanke är att själva HTTP-protokollet är tillståndslöst. Detta innebär att varje HTTP-förfrågan (som i de flesta fall motsvarar en begäran om att ta emot och leverera en enskild resurs, såsom en HTML-sida, en .jpg-fil, en stilmall, etc.) är oberoende av alla andra förfrågningar, inte inkludera någon - information om klientens identifiering och lämnar inga spår i datorns minne.

Även om sajten är utformad på ett sådant sätt att navigeringen, d.v.s. övergången från en sida till en annan sker strikt i en riktning (låt oss säga att sida 1 endast leder till sida 2, som endast leder till sida 3, etc.), stödverktyg för HTTP-protokoll har ingen information och tar inte hänsyn till att en användare visning av sida 2 måste tidigare ha besökt sida 1. Du kan inte tilldela ett värde till en variabel på sida 1 och förvänta dig att den ska importeras till sida 2 med HTML själv. HTML-kod kan användas för att visa ett formulär, och den här koden kan till och med användas för att mata in information, men såvida inte några ytterligare medel används för att överföra den inmatade informationen till en annan sida eller ett annat program, kommer värdet som tilldelats variabeln helt enkelt att försvinna efter flyttning till en annan sida.

Formulärbehandlingstekniker som PHP är designade för att lösa just detta problem. PHP låter dig fånga upp värdet på en variabel som skickas från föregående sida till nästa och göra det värdet tillgängligt för senare användning. Som det visar sig ger PHP-tekniken möjligheten att utföra dessa typer av dataöverföringsfunktioner extremt bra, så det låter dig snabbt och enkelt distribuera de nödvändiga verktygen för att lösa en mängd olika problem i samband med att säkerställa att en webbplats fungerar.

HTML-formulär ger ett bekvämt sätt att skicka ett litet antal värden från en given sida till en annan enskild sida på en webbplats. Det finns andra sätt att upprätthålla status över många sidvisningar som är längre, som cookies och sessioner, som kommer att behandlas i en framtida artikel. Den här artikeln fokuserar främst på de enklaste sätten att överföra information mellan webbsidor, som använder GET- och POST-metoder i kombination med HTTP-protokollet för att skapa dynamiskt genererade sidor och bearbeta formulärdata.

GET parametrar

GET-metoden skickar parametrar från föregående sida till nästa som en del av en frågesträng, som representeras i formatet av en Uniform Resource Identifier URI. När du använder GET-metoden för att bearbeta ett formulär följs URL-adressen som identifieras av formulärets action-attribut av ett frågetecken efter avgränsaren, följt av de angivna variabelnamnen och värdet, och sedan är hela strängen skickas till bearbetningsagenten (i detta fall webbservern).

Nedan är ett exempel på ett HTML-formulär som använder GET-metoden (skriv denna markering och spara filen som sportselect.html):

Grunderna i PHP

Välj din favoritsport

När användaren har gjort sitt val och klickar på knappen Skicka, kommer webbläsaren att ansluta följande element i den ordning som visas, utan mellanslag mellan elementen:

  • URL inom citattecken efter ordet action (http://localhost/sports.php).
  • Ett frågetecken (?) som indikerar att följande tecken utgör en GET-sträng.
  • Namnvariabeln, likhetstecknet (=) och motsvarande värdeparameter (värde=Hockey).
  • Et-tecken (&) följt av paret namn=värde (om något).

Så webbläsaren kommer att generera följande URL-sträng:
http://localhost/sports.php?sport=Hockey

Webbläsaren omdirigerar sedan den resulterande URL-strängen inom sitt eget adressutrymme som en ny begäran. PHP-skriptet nedan (sports.php), som formuläret skickas till, hämtar GET-variabelvärdena från den sista delen av frågesträngen, infogar dessa variabler och variabelvärden i den superglobala $_GET-matrisen (att vara beskrivs kort), och utför några nödvändiga åtgärder med dessa värden; i detta fall sker infogningen i en textsträng.

Nedan är ett kodexempel som visar PHP-formulärhanteraren för HTML-formuläret ovan:

Favorit sport

Din favoritsport är

Observera att värdet som anges i HTML-formulärfältet med attributet name="sport" på föregående sida nu är tillgängligt som en PHP-variabel med namnet $_GET["sport"]. Följande bild visar hur detta exempel fungerar:

Nu måste vi förklara exakt hur du kan komma åt de värden som skickas från sida till sida. Den här artikeln diskuterar de två huvudsakliga metoderna för att skicka värden som används i formulär - GET och POST. Varje metod har en superglobal array associerad med sig. Superglobala arrayer beskrivs mer i detalj i artikeln "Variables and Constants". En utmärkande egenskap hos superglobala arrayer från andra arrayer är närvaron av ett prefix i namnet i form av ett understreck.

Formulärbehandlaren kommer åt varje element som skickats med GET-metoden genom att komma åt $_GET-matrisen, och varje element som skickas med POST-metoden genom att komma åt $_POST-arrayen. Den syntaktiska strukturen som används för att komma åt alla element i en superglobal array är enkel och helt enhetlig:

$_array_name["index_name"]

Här är index_name namndelen av namn-värdeparet (för GET-metoden), eller namnet på HTML-formulärfältet (för POST-metoden). Efter det föregående exemplet specificerar $_GET["sport"] värdet på det valda elementet i formuläret som heter "sport"; detta värde skickades med en GET-operation utförd på originalfilen. Formulärhanteraren måste använda en array som motsvarar den metod med vilken data skickades. Specifikt i det här exemplet är värdet på $_POST["sport"] odefinierat eftersom det ursprungliga formuläret inte skickade några data med POST-metoden.

GET-formulärbearbetningsmetoden har en betydande fördel jämfört med POST-metoden - den låter dig faktiskt generera en ny URL-frågesträng varje gång, lämplig för den aktuella situationen. Användare kan sedan bokmärka denna sida. Å andra sidan kan resultaten av formulärinlämningar med POST-metoden inte bokmärkas.

Bara för att önskad funktionalitet kan uppnås med GET-parametrar betyder det inte att GET-metoden måste användas. Nackdelarna med GET-metoden som finns i de flesta typer av formulärbehandling är så betydande. Den ursprungliga HTML 4.0-arbetsspecifikationen, publicerad 1997, rekommenderade inte denna metod. De största nackdelarna med GET-metoden listas nedan:

  • GET-metoden är inte tillämplig för att skapa registreringsfönster, eftersom användarnamnet och lösenordet är helt synliga på skärmen, och det är också möjligt att denna data lagras i minnet av klientens webbläsare som information om den besökta sidan.
  • Varje GET-överföringsoperation, inklusive själva datamängden, loggas på webbservern.
  • GET-metoden tilldelar data till en servermiljövariabel, så längden på URL:en är begränsad. Du kanske har sett hur mycket långa webbadresser ser ut när de skickas med GET-metoden, och det är faktiskt osannolikt att någon skulle vilja skicka en HTML-text på 300 ord med den här metoden.

Den ursprungliga HTML-specifikationen angav att längden på frågesträngen inte fick överstiga 255 tecken. Naturligtvis togs denna begränsning senare bort och bara rekommendationen återstod att hålla sig till gränsen på 255 tecken, men användningen av längre rader kan fortfarande orsaka störningar.

POST-parametrar

För närvarande är den föredragna metoden för att skicka in formulärdata POST (särskilt i de fall där utförande av åtgärder resulterar i permanenta ändringar, som att lägga in information i en databas). Formulärdatauppsättningen inkluderas i formulärets brödtext när formuläret omdirigeras till bearbetningsagenten (i det här fallet PHP-tolken). URL-strängen genomgår inga synliga förändringar för att återspegla mängden data som överförs.

Det finns en utbredd omotiverad uppfattning bland utvecklare att POST-metoden är säkrare än GET. I verkligheten är ingen av metoderna mer eller mindre säker än den andra. En besökare kan se variabler och data som skickas med POST-metoden lika väl som med GET-metoden. Den enda skillnaden är att i det första fallet hittas inte överförda data i adressfältet. Men det betyder inte att de är dolda. Data som skickas med POST-metoden kan ses och ändras av webbplatsanvändaren.

Den första och viktigaste regeln för programmering, speciellt nätverksprogrammering, är denna:
Lita aldrig på indata.

Du bör alltid anta att en besökare med uppsåt, eller till och med av misstag, kan ha ändrat data som skickas till en viss applikation, så du måste noggrant kontrollera dessa uppgifter.

Den överförda formulärinformationen är bara mer eller mindre säker om begäran är säkrad med SSL, TLS eller någon annan krypteringsmetod. Men data kommer ändå fram till slutanvändaren eller besökaren i tydlig form, så han har fortfarande möjlighet att se och ändra data på ett eller annat sätt. Faktum är att SSL-protokollet helt enkelt krypterar data som överförs över nätverket, vilket inte tillåter att data visas i klartext i det skede av dess passage från avsändaren till mottagaren. När det gäller möjligheten för en besökare att göra ändringar i formulärdata, ger SSL-protokollet inget som förhindrar detta.

För att ändra hur data överförs i föregående exempel, måste du göra följande ändringar:

...

Arbeta med flera värden

Om formuläret har kryssrutor eller alternativknappar uppstår ett nytt problem. Till exempel kan en användare välja två värden samtidigt i ett formulär, men en variabel kan inte lagra mer än ett värde, så en array måste användas. Denna situation visas i exemplet nedan:

" method="post">
Välj dina favorithusdjur

Valda djur: "; foreach ($animal som $a) ( echo " ".htmlentities($a).""; } } ?>

Detta formulär låter användaren välja sina favorithusdjur. I det här exemplet kan användaren markera flera kryssrutor samtidigt. Detta innebär att när man bearbetar formulärdata i ett PHP-skript är det nödvändigt att tillhandahålla möjligheten att komma åt flera värden med ett namn. Vi har placerat ett par hakparenteser () efter namnet i namnattributet för att kunna skicka flera val som en array. Om hakparenteserna utelämnades och användaren markerade flera kryssrutor, skulle deras val skrivas över av den senast markerade kryssrutan. Genom att placera hakparenteser efter namnet indikerade vi att värdena skulle lagras som en array.

I hanteraren lagras arrayen i variabeln $animal och räknas upp med hjälp av en foreach loop, som en vanlig array.

Formulärvalidering och formatering av formulärvariabler

När en applikation tar emot data från en användare måste den kontrollera att den är korrekt varje gång. Om du inte kontrollerar de uppgifter som användaren matat in kan du få många problem, inklusive säkerhetsrisker. Att utföra en bakgrundskontroll är inte så svårt som det kan verka.

Det är bekvämare för användare att kontrollera på klientsidan med JavaScript, men oavsett om denna kontroll används måste verifiering på serversidan utföras.

En annan sak att tänka på när du skapar HTML-formulär är att om formuläret behöver visa förifylld inmatning måste värdeattributet ställas in. Detta gäller särskilt två typer av formulär - de som används för att redigera data som tas emot från en databas, och de som är utformade för att eventuellt skicka data mer än en gång. Det sistnämnda fallet är mycket vanligt i situationer där formuläret måste visas igen efter att fel har upptäckts i de uppgifter som redan är ifyllda i förväg. Ett exempel är ett registreringsformulär som inte accepterar data för behandling förrän användaren uppger en giltig e-postadress eller annan nödvändig data.

Exemplet nedan visar hur man bearbetar ett formulär, inklusive validering och bearbetning på serversidan på samma formulärsida:

Grunderna i PHP

" method="post">
Kontaktinformation "klass="">
"klass="">

Det här exemplet använder funktionen filter_var(), som testar en variabel med hjälp av ett filter och tar två parametrar - en källsträng och en konstant som indikerar typen av filter. Förutom att validera e-postadresser (FILTER_VALIDATE_EMAIL) stöder den här funktionen följande konstanter: FILTER_VALIDATE_URL - kontrollerar värdet för URL-adressen (till exempel), FILTER_VALIDATE_IP - kontrollerar värdet för IP-adresser, FILTER_VALIDATE_REGEXP - kontrollerar värdet för korrektheten av det reguljära uttryckets syntax och flera andra konstanter, som är alternativ till funktionerna is_bool(), is_float(), is_int(), etc.

Detta och följande avsnitt kommer kortfattat att täcka hur man skapar grundläggande webbapplikationer med PHP. Det som diskuterades i avsnittet räcker uppenbarligen inte för att din applikation ska kommunicera med användaren och formulera sig beroende på de åtgärder han utförde eller de parametrar han angett. Vad saknas? Det finns inte tillräckligt med kunskap om hur man organiserar användardatainmatning och överföring av dessa data till servern. Tja, du bör redan ha grundläggande kunskaper om hur man programmatiskt bearbetar information som tas emot på servern.

HTTP-begäransmetoder och deras parametrar

Alla dynamiska webbapplikationer genererar ett svar till användaren i enlighet med de parametrar som angetts av honom eller de åtgärder som utförs på klientsidan. Att kontakta servern beror oftast på två typer av förfrågningar: att använda GET-metoden eller POST-metoden. Några ord om skillnaderna mellan dessa två typer av förfrågningar.

GET-metod:

    Parametrarna skickas i HTTP-förfrågningshuvudet, så de är synliga på kommandoraden, och en sådan begäran kan sparas som bokmärken. Eftersom den totala längden på rubriken är begränsad, är antalet och längden av parametrar som skickas med GET också begränsat.

    Man tror att resultaten av flera identiska GET-förfrågningar som körs i rad bör vara desamma.

POST-metod:

    Begäran parametrar skickas i brödtexten i HTTP-begäran, så de finns inte på kommandoraden. Antalet och storleken på parametrar är obegränsat.

    Man tror att resultaten av flera identiska POST-förfrågningar kan returnera olika värden eftersom de kan ändra egenskaperna för målobjektet.

GET-metoden bör användas för att hämta innehållet i en informationsresurs enligt parametrar när det inte finns något behov av att göra ändringar i målresursens datastrukturer, och det är vettigt att spara begäran (URL) i bokmärken. GET-metoden kan vara snabbare än liknande förfrågningar med POST-metoden.

POST-metoden bör användas när du behöver dölja parametrar som skickas till servern från URL:en. Denna metod bör också användas i förfrågningar om ändringar av innehållet i målresursen, genom att skicka en beskrivning av dessa ändringar i parametrarna (i förfrågans brödtext).

Sökväg till resurs?parameter1=värde1¶meter2=värde2&...

Om du inte har ett speciellt HTML-formulär för att fylla i parametrar kan du felsöka driften av din PHP-applikation genom att skicka testparametrar direkt på webbläsarens kommandorad, till exempel:

Http://site/php-samples/sql.php?sql=select * från d_staff

För att komma åt begärandeparametrar på serversidan bör du använda globala arrayer $_GET Och $_POST respektive. Om din applikation inte bryr sig om vilken metod den nås av, bör du använda en array $_REQUEST, som kombinerar data från $_GET- och $_POST-matriserna, till exempel, så här:

$sql = isset($_REQUEST["sql"]) ? $_REQUEST["sql"] : "";

I det här exemplet avgör programmet om parametern "sql" skickades: om ja, tilldelar det sitt värde till motsvarande variabel, och om inte, tilldelar det det ett tomt värde.

Definiera parametrar för HTTP-begäran via HTML-formulär

Att definiera parametrar manuellt direkt i webbläsarens kommandorad är naturligtvis inte särskilt bekvämt. Denna metod är lämplig för att programmässigt exekvera HTTP-förfrågningar när webbapplikationer kommunicerar med varandra. För att gå in och utföra initial dataverifiering på klientsidan bör du använda HTML-formulär och . Nedan är ett exempel på den enklaste formen med vilken en textparameter (värde) matas in, som sedan skickas till servern som en parameter för POST-metoden.

metod ="inlägg" handling =’sql.php’ > SQL:

Metodattributet för formelementet anger metoden som bestämmer metoden för att överföra data till servern (get eller post). Action-attributet anger php-fil, som kommer att behandla begäran. Om hanteraren ska vara den aktuella filen, behöver inte åtgärdsattributet läggas till. För alla element vars värde måste skickas som en HTTP-begäransparameter måste du definiera ett unikt värde för namnattributet. Det är attributvärdet namn kommer vara index i arrayerna $_GET, $_POST eller $_REQUEST (se exemplet ovan). Att trycka på en knapp Skicka in skickar formuläret med alla inmatade värden till servern.