Gå til innhold

"Gjetter" php seg til riktig form?


Anbefalte innlegg

Si at vi har to forms på en side:

<form action="index.php" method="POST">
	<input type="text" name="id" value="ID" size="1">
	<input type="submit" value="Lagre">
</form>

<form action="index.php" method="POST">
	<input type="text" name="id" value="ID" size="1">
	<input type="text" name="fornavn" value="Nytt Fornavn">
	<input type="submit" value="Lagre">
</form>

så har vi php kode for å gjøre noe med forms.

<?php
	if(!empty($_POST[id]) && !empty($_POST[fornavn])) {

	}
?>

<?php
	if(!empty($_POST[id])) {

	}
?>

Hva er det som gjør at php vet hvilket forms den skal gjøre actions på? Gjetter den seg fram siden disse forms er ulike? hva om begge formsa bare innehold ID?

Lenke til kommentar
Videoannonse
Annonse

Når du trykker submit i en av disse formene blir bare de variablene som er i formen submitted. Dvs. år du submitter den øverste formen vil bare den siste if-setningen kjøres, mens den første vil feile fordi fornavn ikke er satt.

 

Det som blir problemet her er at begge if-setningene kjøres dersom du submitter den nederste formen. For å forhindre dette kan du gjøre noe ala dette (quick fix):

<form action="index.php?something" method="POST">
	<input type="text" name="id" value="ID" size="1">
	<input type="submit" value="Lagre">
</form>

<form action="index.php?something_else" method="POST">
	<input type="text" name="id" value="ID" size="1">
	<input type="text" name="fornavn" value="Nytt Fornavn">
	<input type="submit" value="Lagre">
</form>

Og behandlet dette på følgende måte i PHP koden:

<?php
	if(isset($_GET['something'])) {

	}
?>

<?php
	if(isset($_GET['something_else'])) {

	}
?>

For deretter å se om variablene er satt inne i disse if-setningen.

Lenke til kommentar

Det Feh foreslo er en fullgod løsning. En annen metode som også kan være fullgod er å bruke en usynlig input:

<form action="index.php" method="POST">
	<input type="hidden" name="form_id" value="something">
	<input type="text" name="id" value="ID" size="1">
	<input type="submit" value="Lagre">
</form>

<form action="index.php" method="POST">
	<input type="hidden" name="form_id" value="something_else">
	<input type="text" name="id" value="ID" size="1">
	<input type="text" name="fornavn" value="Nytt Fornavn">
	<input type="submit" value="Lagre">
</form>

Med PHP gjør du det samme som Feh sa, men f.eks.

if($_POST['form_id'] == 'something') {

i stedet for

if(isset($_GET['something'])) {
Endret av ahw_
  • Liker 1
Lenke til kommentar

 

Det Feh foreslo er en fullgod løsning. En annen metode som også kan være fullgod er å bruke en usynlig input:

<form action="index.php" method="POST">
	<input type="hidden" name="form_id" value="something">
	<input type="text" name="id" value="ID" size="1">
	<input type="submit" value="Lagre">
</form>

<form action="index.php" method="POST">
	<input type="hidden" name="form_id" value="something_else">
	<input type="text" name="id" value="ID" size="1">
	<input type="text" name="fornavn" value="Nytt Fornavn">
	<input type="submit" value="Lagre">
</form>

Med PHP gjør du det samme som Feh sa, men f.eks.

if($_FORM['form_id'] == 'something') {

i stedet for

if(isset($_GET['something'])) {

Skal det ikke være $_POST og ikke $_FORM?

 

Dette ser uansett ut til å være den beste løsningen. Husk uansett og sjekk at isset($_POST['fornavn'], $_POST['id'])

 

Jeg ser at du bruker $_POST[id] istedenfor $_POST['id'] -- dette er ikke den godkjente metoden og er en du bør unngå - den vil gi error meldinger i konsolen.

Lenke til kommentar

Når du trykker submit i en av disse formene blir bare de variablene som er i formen submitted. Dvs. år du submitter den øverste formen vil bare den siste if-setningen kjøres, mens den første vil feile fordi fornavn ikke er satt.

 

Det som blir problemet her er at begge if-setningene kjøres dersom du submitter den nederste formen. For å forhindre dette kan du gjøre noe ala dette (quick fix):

<form action="index.php?something" method="POST">
	<input type="text" name="id" value="ID" size="1">
	<input type="submit" value="Lagre">
</form>

<form action="index.php?something_else" method="POST">
	<input type="text" name="id" value="ID" size="1">
	<input type="text" name="fornavn" value="Nytt Fornavn">
	<input type="submit" value="Lagre">
</form>

Og behandlet dette på følgende måte i PHP koden:

<?php
	if(isset($_GET['something'])) {

	}
?>

<?php
	if(isset($_GET['something_else'])) {

	}
?>

For deretter å se om variablene er satt inne i disse if-setningen.

 

Kan man bruke GET selv om method står som POST?

+

Hvis jeg skal endre verdier eller sette inn verdier i database, er det da greit å bruke denne eller burde jeg gå for ahw_ sin løsning?

Lenke til kommentar

Man kan bruke GET og POST omhverandre på denne måten. GET henter kun det som står etter ? i URLen, uavhengig av hva som postes. Du kan til og med skrive inn noe for hånd i URLen og få PHP til å fange det opp.

Det var dog en liten glipp fra min side som ikke la merke til det, for det er generelt ikke anbefalt å bruke disse omhverandre, men som nevnt fullt mulig. Alternativt kan man også bruke REQUEST for å hente forskjellige variabler og slippe å tenke på metoden som brukes, men denne tar imot både COOKIE, POST og GET og bør ikke brukes med mindre man vet hva man driver med, uten at jeg gidder å utdype noe mer enn det.

Eventuelt som ahw_ sa kan man bruke hidden inputs

<input type="hidden" name="something" value="" />

og

<?php
    if(isset($_POST['something'])) {
        if(!empty($_POST[id]) && !empty($_POST[fornavn])) {
            
        }
    }
?>

Hvis du skal kjøre update eller insert i etterkant vil det i prinsippet være like utrygt med alle de forskjellige metodene. Du må uansett sanitere/validere inputene og/eller bruke prepared statements som ordner mye av dette for deg.

Endret av Feh
Lenke til kommentar

 

Man kan bruke GET og POST omhverandre på denne måten. GET henter kun det som står etter ? i URLen, uavhengig av hva som postes. Du kan til og med skrive inn noe for hånd i URLen og få PHP til å fange det opp.

 

Det var dog en liten glipp fra min side som ikke la merke til det, for det er generelt ikke anbefalt å bruke disse omhverandre, men som nevnt fullt mulig. Alternativt kan man også bruke REQUEST for å hente forskjellige variabler og slippe å tenke på metoden som brukes, men denne tar imot både COOKIE, POST og GET og bør ikke brukes med mindre man vet hva man driver med, uten at jeg gidder å utdype noe mer enn det.

 

Eventuelt som ahw_ sa kan man bruke hidden inputs

<input type="hidden" name="something" value="" />

og

<?php
    if(isset($_POST['something'])) {
        if(!empty($_POST[id]) && !empty($_POST[fornavn])) {
            
        }
    }
?>

Den er god, takk for hjelpen

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...