REQUEST_METHOD of isset()

Status
Niet open voor verdere reacties.

grumbkow

Gebruiker
Lid geworden
20 aug 2007
Berichten
924
Hallo!,

Ik ben de laatste tijd op een aantal fora tegengekomen dat mensen de voorkeur geven aan
PHP:
$_SERVER['REQUEST_METHOD'] == 'post'
in plaats van
PHP:
isset($_POST[''])

Nou ben ik zeer makkelijk en wil ik alles aannemen en geloven mits ik het snap =P

Waar ik namelijk tegen aan loop is hoe controleer je WELKE submit er is verzonden met de bovenste methode.

Als ik een klein voorbeeldje schrijf naar mijn standaarden voor kleine websites dan wordt dit ongeveer zo, hier is een login formulier en een contact formulier (slechts ter voorbeeld niet werkend ofzo).

PHP:
<?php
	if(!isset($pagina))
	{
		$pagina = 'home';
	}
	if(isset($_POST['login_submit']))
	{
		$login = new Login();
		$login->checkLogin();	
	}
	if(isset($_POST['contact_submit']))
	{
		$contact = new Contact();
		$contact->validateFields();	
	}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Voorbeeld website</title>
</head>
    <body>
    	<div id="container">
			<ul>
            	<li><a href="/home">Home</a></li>
            	<li><a href="/login">Login</a></li>
            	<li><a href="/contact">Contact</a></li>
            </ul>
            <div id="content">
<?php
			switch($pagina)
			{
				case 'home':
					echo 'Home';
				break;
				case 'login':
?>
				<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
                	<label for="login_gebruikersnaam">Gebruikersnaam:</label><input type="text" name="login_gebruikersnaam" id="login_gebruikersnaam" />
                	<label for="login_wachtwoord">Wachtwoord:</label><input type="password" name="login_wachtwoord" id="login_wachtwoord" />
                    <input type="submit" name="login_submit" id="login_submit" value="Inloggen" />
                </form>
<?php				
				break;	
				case 'contact':
?>
				<form action="<?= $_SERVER['PHP_SELF']; ?>" method="post">
                	<label for="contact_naam">Naam:</label><input type="text" name="contact_naam" id="contact_naam" />
                	<label for="contact_bericht">Bericht:</label><input type="textarea" name="contact_bericht" id="contact_bericht" />
                    <input type="submit" name="contact_submit" id="contact_submit" value="Verstuur" />
                </form>
<?php	
				break;
			}
?>            	
            </div>
        </div>
    </body>
</html>
Als ik nu dus in plaats van de 2 checks bovenin de REQUEST_METHOD ga gebruiken.
Hoe kan ik dan ondervangen of het contactformulier of het loginformulier is verzonden>?

Ook zou ik graag vernemen wat jullie voorkeur heeft en waarom.

De reden dat volgens velen de REQUEST_METHOD voorkeur krijgt is omdat je nooit zeker kan weten of de browser de waarde van een submit mee stuurt. Ik zelf heb hier echter nooit problemen mee gehad en bovenstaande code zou in de theorie altijd werken bij mij.


Groeten,
jeffrey
 
Gewoon combineren, de browser is in zo'n geval altijd verplicht de submit value mee te geven (beschreven in de http spec)
Code:
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login_submit']))
 
Gewoon combineren, de browser is in zo'n geval altijd verplicht de submit value mee te geven (beschreven in de http spec)
Code:
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login_submit']))

Is dat dan geen overbodige code?
Als $_POST['login_submit'] bestaat, dan is de REQUEST_METHOD toch sowieso POST?


P.s.
Ik zie dat je === gebruikt.
Ik heb hier al meerdere malen naar gekekend, maar het verschil tussen == en === is mij nog niet helemaal duidelijk.
Zou je dit misschien kunnen onderbouwen?

Bij voorbaat dank :)
 
Laatst bewerkt:
In dit geval voegt het niet veel toe, maar === controleert of niet alleen de waarde maar ook het type van twee variabelen gelijk is. Een voorbeeld:

PHP:
$a = false;
$b = 0;
if ( $a == $b ) // true, want false en 0 zijn gelijk aan elkaar
if ( $a === $b ) // false, want false en 0 zijn wel gelijk, maar niet van hetzelfde type ( false is een boolean en 0 is een integer )

Op dezelfde manier:
PHP:
$a = 1;
$b = 1.0;
if ( $a == $b ) // true, want 1.0 = 1
if ( $a === $b ) // false, want 1.0 is wel 1, maar 1.0 is een float en 1 is een integer
 
Je wilt een actie controleren niet of een element bestaat ;)
Altijd
PHP:
if($_SERVER['REQUEST_METHOD'] === "POST") {

}
=== houdt in dat je een exacte vergelijking wilt

PHP:
$getal = 6;
$string = "6";

echo '<pre>';

var_dump($getal == "6");
var_dump($string == "6");
echo '<hr />';
var_dump($getal == 6);
var_dump($string == 6);
echo '<hr />';
var_dump($getal === "6");
var_dump($string === "6");
echo '<hr />';
var_dump($getal === 6);
var_dump($string === 6);
echo '</pre>';
Oftewel hij kijkt ook naar het type (in dit geval of het een string of integer is)
 
Laatst bewerkt:
Je wilt een actie controleren niet of een element bestaat ;)
Altijd
PHP:
if($_SERVER['REQUEST_METHOD'] === "POST") {

}
Komt weer mijn vraag, hoe ondervang ik dan of het login of contact formulier verzonden is, want dat is uiteindelijk waar ik deze topic om starte =)
=== houdt in dat je een exacte vergelijking wilt

PHP:
$getal = 6;
$string = "6";

echo '<pre>';

var_dump($getal == "6");
var_dump($string == "6");
echo '<hr />';
var_dump($getal == 6);
var_dump($string == 6);
echo '<hr />';
var_dump($getal === "6");
var_dump($string === "6");
echo '<hr />';
var_dump($getal === 6);
var_dump($string === 6);
echo '</pre>';
Oftewel hij kijkt ook naar het type (in dit geval of het een string of integer is)

Dit is me nu duidelijk, Frats en Tha_Devil bedankt hiervoor
 
Laatst bewerkt door een moderator:
Verschillende actions gebruiken, niet op dezelfde pagina willen verwerken
 
Verschillende actions gebruiken, niet op dezelfde pagina willen verwerken

Bij kleine projecten zoals bovenstaand voorbeeld een beetje indiceert wil ik dan juist alles op de index behalve standaard functions.
Dus ja.. daar gaat het hele idee
 
Ik neem aan dat inloggen en contact opnemen een redelijk standaard functie van de website is.

Ik zie dat je OOP gebruikt, werk je ook met een bepaald design pattern? MVC bijvoorbeeld?
 
Nee, design worden mij sowieso aangeleverd =)
Dit was slechts ter voorbeeld, de benaming niet te letterlijk nemen
 
Ik ga ervanuit dat je wel twee aparte forms hebt voor inloggen en contact? Anders is er sowieso iets niet helemaal handig gepland...

Als beide forms naar dezelfde verwerkingspagina moeten leiden, zet dan een hidden-input erin, met daarin de action.

Bijvoorbeeld:

HTML:
<form method="post" action="process.php">

  <!-- hier de invulvelden voor je contactformulier -->

  <input type="hidden" name="action" value="contact" />

  <input type="submit" value="Verzenden" />

</form>

<form method="post" action="process.php">

  <!-- hier de invulvelden voor je loginformulier -->

  <input type="hidden" name="action" value="login" />

  <input type="submit" value="Login" />

</form>

Op je verwerkingspagina doe je dan:

PHP:
<?php

if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) {

  if ( isset ( $_POST[ 'action' ] ) && trim ( $_POST[ 'action' ] ) === 'contact' ) {

    // verwerk contactformulier

  } else if ( isset ( $_POST[ 'action' ] ) && trim ( $_POST[ 'action' ] ) === 'login' ) {

    // verwerk inlogformulier

  } else {

    // verkeerde action opgegeven

  }

} else {

  // formulier niet verzonden

}

?>

Eventueel zou je ook nog éénmaal kunnen checken op $_POST[ 'action' ] bestaat en dan een niveau dieper checken of het contact of login is, maar dat even terzijde.

De trim functie is in principe ook overbodig, maar ik zet 'm er voor de zekerheid vaak even bij, met name als je met text-inputs werkt, zodat je functie niet vastloopt op een ongeziene spatie.
 
Wordt al een stuk logischer zo, ik blijf dan alleen eigenwijs =P
de reden dat op andere fora mensen zo voor de request_method zijn is omdat ze dus zeggen dat de browser niet altijd de submit value/name meesturen.
Als je dat dan opvangt met een hidden field is dan alsnog de request_method niet overbodig?
 
Laatst bewerkt door een moderator:
Nee. Controleren op een gesette value is altijd een slecht idee, gewoon omdat het er niet voor gemaakt is.

Je controleert of een formulier gepost is, met REQUEST_METHOD, punt.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan