Imaginært sende inn php. Html-skjemaer: php-skjema - send en forespørsel til samme side. Hvordan unngå problemer med PHP _SELF

Jeg brukte lang tid på å tenke på hvilken tittel jeg skulle gi denne artikkelen og kunne ikke komme på noe bedre. Dette er den eneste tittelen som i det minste på en eller annen måte gjenspeiler essensen av det som står. For å være ærlig vet jeg ikke hva den heter riktig, så jeg kalte artikkelen på samme måte som jeg prøvde å finne i det minste litt informasjon i en søkemotor om dette emnet.

På en av sidene trengte jeg å bruke to send-knapper i ett skjema, som ville sende de utfylte dataene til forskjellige PHP-behandlere, avhengig av når knappen ble trykket. Google svarte meg ikke på noe fornuftig, tilsynelatende spurte jeg bare ikke på riktig måte, så jeg måtte komme på det selv.

Så jeg la det ut for din vurdering.

Essensen av problemet

Etter å ha implementert det selv fant jeg likevel flere løsninger som var basert på bruk av vanlige knapper som JS var skrudd fast.

Jeg implementerte planen min på nesten samme måte, men brukte standard innsendingstype. Alt ser ut til å fungere og etter min mening er løsningen min mer logisk riktig.

Denne løsningen vil fungere like bra både på gratis hosting og hvis du velger profesjonell hosting. Denne metoden er implementert utelukkende på klientsiden og bør ikke bremse serveren.

For å gjøre det lettere å forstå hva jeg ønsker og hvordan det fungerer, er her et virkelig fungerende eksempel, i form av et skjema som har 2 innsendinger som sender data til forskjellige sider.

En av de flotte tingene med PHP er måten det fungerer med HTML-skjemaer. Hovedsaken her er at hvert skjemaelement automatisk blir tilgjengelig for PHP-programmene dine. For detaljert informasjon om bruk av skjemaer i PHP, les delen. Her er et eksempel på et HTML-skjema:

Eksempel #1 Enkleste HTML-skjema

Navnet ditt:

Din alder:

Det er ikke noe spesielt med denne formen. Dette er et vanlig HTML-skjema uten noen spesielle tagger. Når brukeren fyller ut skjemaet og klikker på send-knappen, vil action.php-siden bli kalt opp. Denne filen kan ha noe sånt som:

Eksempel #2 Viser skjemadata

Hallo, .
Du er gammel.

Eksempel på utdata fra dette programmet:

Hei, Sergey. Du er 30 år gammel.

Hvis du ikke tar hensyn til kodebitene med htmlspecialchars() og (int), bør driftsprinsippet til denne koden være enkelt og forståelig. htmlspecialchars() sikrer at "spesielle" HTML-tegn er riktig kodet slik at skadelig HTML eller Javascript ikke settes inn på siden din. Aldersfeltet, som vi vet skal være et tall, kan vi ganske enkelt konvertere til et heltall, som automatisk blir kvitt de uønskede tegnene. PHP kan også gjøre dette automatisk ved å bruke filterutvidelsen. Variablene $_POST["navn"] og $_POST["alder"] settes automatisk for deg av PHP. Tidligere brukte vi $_SERVER superglobal variabel, men her bruker vi også $_POST superglobal variabel, som inneholder alle POST-dataene. Legg merke til det sendemetode(metoden) av skjemaet vårt er POST. Hvis vi brukte metoden , så vil skjemainformasjonen vår være i den superglobale variabelen $_GET . Alternativt kan du bruke variabelen $_REQUEST hvis datakilden ikke spiller noen rolle. Denne variabelen inneholder en blanding av GET, POST, COOKIE-data.

15 år siden

I henhold til HTTP-spesifikasjonen bør du bruke POST-metoden når du bruker skjemaet til å endre tilstanden til noe på serverenden. For eksempel, hvis en side har et skjema som lar brukere legge til sine egne kommentarer, som dette siden her, skal skjemaet bruke POST. Hvis du klikker "Last inn på nytt" eller "Oppdater" på en side du nådde gjennom en POST, er det nesten alltid en feil -- du bør ikke legge ut den samme kommentaren to ganger -- som er grunnen til at disse sidene ikke er bokmerket eller bufret.

Du bør bruke GET-metoden når skjemaet ditt, vel, fjerner noe fra serveren og faktisk ikke endrer noe. For eksempel bør skjemaet for en søkemotor bruke GET, siden søk på et nettsted ikke skal endre noe som klienten kanskje bryr seg om, og bokmerking eller bufring av resultatene av en søkemotorspørring er like nyttig som bokmerking eller hurtigbufring. en statisk HTML-side.

2 år siden

Verdt å presisere:

POST er ikke sikrere enn GET.

Årsakene til å velge GET vs POST involverer ulike faktorer som hensikten med forespørselen (sender du informasjon?), størrelsen på forespørselen (det er grenser for hvor lang en URL kan være, og GET-parametere sendes inn URL-en), og hvor enkelt du vil at handlingen skal være delbar -- Eksempel: Google-søk er GET fordi det gjør det enkelt å kopiere og dele søket med noen andre ved å dele nettadressen.

Sikkerhet er kun en vurdering her på grunn av det faktum at en GET er enklere å dele enn en POST. Eksempel: du vil ikke at et passord skal sendes av GET, fordi brukeren kan dele den resulterende URL-en og utilsiktet avsløre passordet sitt.

Imidlertid er en GET og en POST like enkle å fange opp av en godt plassert ondsinnet person hvis du ikke distribuerer TLS/SSL for å beskytte selve nettverkstilkoblingen.

Alle skjemaer som sendes over HTTP (vanligvis port 80) er usikre, og i dag (2017) er det ikke mange gode grunner til at et offentlig nettsted ikke bruker HTTPS (som i utgangspunktet er HTTP + Transport Layer Security).

Som en bonus, hvis du bruker TLS, minimerer du risikoen for at brukerne dine får kode (AD) injisert i trafikken din som ikke ble lagt der av deg.

POST- og GET-metodene brukes hovedsakelig til å overføre parametere fra styrker. Hovedforskjellen mellom POST- og GET-metodene er måten informasjon overføres på. I GET-metoden sendes parametere gjennom adresselinjen (URL), dvs. i HTTP-forespørselshodet, mens i POST-metoden overføres parameterne gjennom kroppen til HTTP-forespørselen og reflekteres ikke i adressefeltet.

1. Knapper - Tag

Taggen oppretter knapper på en nettside og handlingen ligner resultatet oppnådd med taggen (med parameteren type="button | reset | submit"). I motsetning til denne taggen, tilbyr den avanserte alternativer for å lage knapper. For eksempel, på en slik knapp kan du plassere alle HTML-elementer, inkludert bilder. Ved å bruke stiler kan du definere utseendet til en knapp ved å endre font, bakgrunnsfarge, størrelse og andre parametere.

I teorien bør taggen være plassert inne i skjemaet angitt av elementet. Nettlesere viser imidlertid ingen feilmelding og fungerer korrekt med taggen hvis den støtes på av seg selv. Men hvis du trenger å sende resultatet av å klikke på knappen til serveren, må det legges i en container. Avslutningsbrikken er påkrevd.

Alternativer:

deaktivert - blokkerer tilgang og modifikasjon av elementet.

type - knappetype

verdi - Verdien på knappen som sendes til serveren eller leses ved hjelp av sprits.

Knapp med tekst

Parameter DISABLED Blokkerer tilgang og modifikasjon av knappen. I dette tilfellet vises den grå og kan ikke aktiveres av brukeren. I tillegg kan ikke en slik knapp få fokus ved å trykke på Tab-tasten, bruke musen eller på annen måte. Imidlertid kan denne knappens tilstand endres gjennom skript.

Aktiv knapp Inaktiv knapp

Parameter TYPE Spesifiserer typen knapp, som angir atferden på skjemaet. De forskjellige typene knapper er ikke forskjellige i utseende på noen måte, men hver knapp har sine egne funksjoner. Standardverdi: knapp.

Argumenter:

knapp - Vanlig knapp.

tilbakestilling - En knapp for å slette de angitte skjemadataene og returnere verdiene til deres opprinnelige tilstand.

Send - Knapp for å sende skjemadata til serveren.

Tøm skjema Send inn skjema

Parameter VERDI Angir verdien til knappen som skal sendes til serveren. Et "navn=verdi"-par sendes til serveren, der navnet spesifiseres av navneparameteren til taggen, og verdien spesifiseres av verdiparameteren. Betydningen kan enten falle sammen med teksten på knappen eller være uavhengig. Verdiparameteren brukes også for å få tilgang til data gjennom skript.

Send inn skjema

1.1. Knapp (inndatatype=knapp) 1.2. Knapp med et bilde (inndatatype=bilde) Knapp med bilde

Knapper med bilder ligner i handling på Send-knappen, men de representerer et bilde. For å gjøre dette, sett type=image og src="image.gif" .

Når brukeren klikker hvor som helst på bildet, sendes det tilsvarende skjemaet til serveren med ytterligere to variabler - sub_x og sub_y . De inneholder koordinatene til brukeren som klikker på bildet. Erfarne programmerere kan legge merke til at variabelnavnene som sendes av nettleseren faktisk inneholder en prikk i stedet for et understrek, men PHP konverterer automatisk punktet til et understrek.

1.3. Skjemainnsending-knapp (inndatatype=send)

Tjener til å sende inn skjemaet til skriptet. Når du oppretter en knapp for å sende inn et skjema, må du spesifisere 2 attributter: type="submit" og value="Button text" . Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.!}

Ingen PHP-skript kreves.

1.4. En rekke knapper (send) for å velge handlingsalternativ 2. Skjema tilbakestillingsknapp (Tilbakestill)

Når du klikker på tilbakestill-knappen, vil alle skjemaelementer settes til tilstanden som ble spesifisert i standardattributtene, og skjemaet vil ikke bli sendt.

Ingen PHP-skript kreves.

3. Avmerkingsboks

Avmerkingsbokser gir brukeren en rekke alternativer, og tillater vilkårlig valg (ingen, en eller flere av dem).

Hvit
Grønn
Blå
rød
Svart

// første sett med knapper
// andre sett med knapper
// tredje sett med knapper

5. Tekstfelt (tekst)

Når du oppretter et vanlig tekstfelt med størrelsesstørrelse og maksimalt tillatt lengde på makslengdetegn, får typeattributtet verdien tekst . Hvis verdiparameteren er spesifisert, vil feltet vise verdien spesifisert i variabelen. Når du oppretter et felt, ikke glem å spesifisere feltnavnet, fordi... dette attributtet er obligatorisk.

6. Passordfelt

Nøyaktig det samme som et tekstfelt, bortsett fra at tegnene som er skrevet av brukeren ikke vises på skjermen.

7. Skjult tekstfelt (skjult)

Lar deg sende noe tjenesteinformasjon til skriptet uten å vise det på siden.

8. Rullegardinliste (velg)

En tag er en rullegardin eller utvidet liste, og én eller flere rader kan velges samtidig. Men verdien vil bli sendt til den sist valgte knappen.

Listen starter med sammenkoblede tagger. Tagger lar deg definere innholdet i listen, og verdiparameteren definerer verdien til strengen. Hvis den valgte parameteren er spesifisert i taggen, vil raden først bli valgt. Størrelsesparameteren angir hvor mange linjer listen skal oppta. Hvis størrelsen er 1, vil listen være en rullegardin. Hvis multiple-attributtet er spesifisert, kan flere elementer fra listen velges. Men denne ordningen brukes praktisk talt ikke, og med størrelse = 1 gir det ingen mening.

Hvit Grønn Blå Rød Svart

Hvis du trenger å lage en rullegardin med en forutsigbar sekvens. For eksempel en liste med år fra 2000 til 2050. Da brukes følgende teknikk.

9. Flerlinjers tekstinntastingsfelt (tekstområde)

Et flerlinjers tekstinntastingsfelt lar deg sende ikke bare én linje, men flere samtidig. Om nødvendig kan du spesifisere skrivebeskyttet attributt, som forbyr redigering, sletting og endring av teksten, dvs. teksten vil være skrivebeskyttet. Hvis det er nødvendig at teksten først vises i et flerlinjers inntastingsfelt, må den plasseres mellom taggene.

Det er en innpakningsparameter - innstilling av linjeomvikling. Mulige verdier:

av - deaktiverer linjeinnpakning;

virtuals - viser linjeskift, men sender teksten slik den ble skrevet inn;

fysisk - linjeskift blir stående i sin opprinnelige form.

Som standard lager taggen et tomt felt som er 20 tegn bredt og består av 2 linjer.


For at et tekstfelt med flere linjer skal samsvare med html-formatering (linjebryting ved bruk av taggen
eller
), bruk deretter nl2br()-funksjonen:

Opprinnelig satt inn linje 1 Opprinnelig satt inn linje 2 Opprinnelig satt inn linje 3

10. Knapp for å laste opp filer (bla gjennom)

Tjener til å implementere opplasting av filer til serveren. Når du oppretter et tekstfelt, må du også angi feltets type som "fil".

Last opp fil:

MÅTER Å KOMMUNIKERE NETTLESEREN MED SERVEREN

Det er få metoder som tilbys av HTTP-protokollen. Dette er viktig informasjon. Det er ingen andre måter. I praksis brukes to: GET er når data overføres i adressefeltet, for eksempel når brukeren klikker på en lenke. POST - når han klikker på en knapp på skjemaet.

GET metoden

For å overføre data ved hjelp av GET-metoden, trenger du ikke lage et skjema på en HTML-side (ingen forbyr deg å bruke skjemaer for forespørsler ved bruk av GET-metoden - men dette er dumhet) - bare en lenke til dokumentet med tillegg av en spørringsstreng som kan se ut som en variabel=verdi-par kombineres med et og-tegn & og strengen legges til sidens URL ved å bruke et spørsmålstegn "? "

Men du trenger ikke å bruke nøkkel=verdi-par hvis du bare trenger å sende inn én variabel; for å gjøre dette må du skrive VERDI (ikke navnet) til variabelen etter spørsmålstegnet.

Fordelen med å sende parametere på denne måten er at klienter som ikke kan bruke POST-metoden (for eksempel søkemotorer) fortsatt kan sende parameterne til scriptet ved å følge lenken og motta innholdet.

Ulempen er at ganske enkelt ved å endre parametrene i adresselinjen kan brukeren snu skriptet på en uforutsigbar måte, dette skaper et stort sikkerhetshull når det kombineres med udefinerte variabler og register_globals på eller noen kan finne ut verdien av en viktig variabel (som økt-ID) bare ved å se på skjermen.

For å få tilgang til offentlige sider ved å sende parametere (økt funksjonalitet)

Overføring av informasjon som ikke påvirker sikkerhetsnivået

For å få tilgang til beskyttede sider med parametere som er bestått

For å overføre informasjon som påvirker sikkerhetsnivået

For å overføre informasjon som ikke kan endres av brukeren (noen overfører teksten til SQL-spørringer.

POST metode

Du kan sende inn data ved å bruke POST-metoden bare ved å bruke et skjema på en HTML-side. Hovedforskjellen mellom POST og GET er at dataene ikke overføres i forespørselsoverskriften, men i kroppen, derfor ser brukeren dem ikke. Det kan bare endres ved å endre selve skjemaet.

Fordel:

Større sikkerhet og funksjonalitet for forespørsler ved bruk av POST-skjemaer.

Feil :

Mindre tilgjengelighet.

Hva skal du bruke den til:

For å overføre en stor mengde informasjon (tekst, filer..);

For å overføre viktig informasjon;

For å begrense tilgangen (bruk for eksempel kun skjemaet for navigering - et alternativ som ikke er tilgjengelig for alle robotprogrammer eller innholdsfangere).

Hva bør ikke brukes til:

Ingen restriksjoner.

Laster opp filer ved hjelp av POST-metoden

PHP er i stand til å godta en fil som er lastet ned ved hjelp av hvilken som helst nettleser. Dette gjør det mulig å laste opp både tekst og binære filer. Kombinert med PHP-autentisering og filsystemfunksjoner har du full kontroll over hvem som har lov til å laste opp filer og hva du skal gjøre med filen når den er lastet opp.

Filopplastingssiden kan implementeres ved hjelp av et spesielt skjema som ser omtrent slik ut:

//Skjema for opplasting av filer Send denne filen:

I eksemplet ovenfor må "_URL_" erstattes med en lenke til PHP-skriptet. Det skjulte feltet MAX_FILE_SIZE (verdien må spesifiseres i byte) må gå foran filvalgfeltet, og verdien er den maksimalt tillatte filstørrelsen som skal aksepteres. Du bør også sørge for at du spesifiserer enctype="multipart/form-data" i skjemaattributtene, ellers blir ikke filene lastet opp til serveren.

Merk følgende

Alternativet MAX_FILE_SIZE er en nettleseranbefaling, selv om PHP også vil se etter denne tilstanden. Det er ganske enkelt å omgå denne begrensningen på nettlesersiden, så du bør ikke stole på denne funksjonen for å blokkere alle større filer. Det er imidlertid ingen måte å omgå PHPs maksimale størrelsesbegrensning. Du bør uansett legge til en variabel på formen MAX_FILE_SIZE, siden den hindrer brukere i å vente spent mens de overfører store filer, bare for å finne ut at filen er for stor og at overføringen faktisk mislyktes.

Hvordan definere en forespørselsmetode?

Direkte:

Getenv("REQUEST_METHOD");

vil returnere GET eller POST.

Hvilken metode bør brukes?

Hvis skjemaet brukes til å be om informasjon, for eksempel under et søk, skal det sendes med GET-metoden. For å kunne oppdatere siden kan du bokmerke den og eller sende lenken til en venn.

Hvis data blir registrert eller endret på serveren som et resultat av å sende inn et skjema, bør de sendes ved hjelp av POST-metoden, og etter å ha behandlet skjemaet, er det viktig å omdirigere nettleseren ved hjelp av GET-metoden. POST kan også være nødvendig hvis en stor mengde data må overføres til serveren (for GET er det svært begrenset), og også hvis de overførte dataene ikke skal vises i adressefeltet (når du skriver inn pålogging og passord, for eksempel).

I alle fall, etter å ha behandlet POST, bør du alltid omdirigere nettleseren til en eller annen side, selv den samme, men uten skjemadataene, slik at når siden oppdateres, blir de ikke registrert igjen.

Hvordan overføre data til en annen fil direkte fra hoveddelen av et PHP-program ved å bruke GET- og POST-metoder? Et eksempel for å demonstrere sending av data ved å bruke POST- og GET-metodene samtidig og motta et svar fra serveren.

Denne artikkelen diskuterer bruken av PHP _SELF-variabelen i detalj.

Hva er PHP _SELF-variabelen?

PHP _SELF-variabelen returnerer navnet og banen til den gjeldende filen (i forhold til dokumentroten). Du kan bruke denne variabelen i skjemaets handlingsattributt. Det er også noen nyanser du bør vite. Selvfølgelig kan vi ikke ignorere disse nyansene.

La oss se på noen få eksempler.

Ekko $_SERVER["PHP_SELF"];

1) La oss anta at php-filen din er plassert på følgende adresse:

Http://www.dinserver.com/form-action.php

I dette tilfellet vil PHP _SELF-variabelen inneholde:

"/form-action.php"

2) La oss anta at php-filen din er plassert på denne adressen:

Http://www.dinserver.com/dir1/form-action.php

PHP_SELF vil være:

"/dir1/form-action.php"

PHP _SELF i skjemaets handlingsattributt. Hvorfor var hun nødvendig der?

Vanligvis brukes PHP _SELF-variabelen i handlingsattributtet til form-taggen. Action-attributtet spesifiserer adressen som innholdet i skjemaet skal sendes til etter bekreftelse (brukeren klikker på knappen med type="submit"). Som regel er dette den samme siden som skjemaet gikk fra.

Men hvis du gir nytt navn til filen det refereres til i skjemaet, må du gi nytt navn til filnavnet i handlingsattributtet, ellers vil ikke skjemaet fungere.

PHP _SELF-variabelen vil spare deg for unødvendige rettelser, siden sideadressen vil bli generert automatisk basert på filnavnet.

La oss si at du har en skjemafil kalt form-action.php og du vil at skjemaet skal sendes til samme fil etter bekreftelse. Vanligvis skriver de slik:

Men du kan bruke PHP _SELF-variabelen i stedet for form-action.php. I dette tilfellet vil koden se slik ut: