Welke onderstaande $_POST[] afhandeling is beter of beter gezegd. Welke methode zouden jullie aanbevelen.
Ze doen voor mij eigenlijk alle bij het zelfde.
Optie 1:
<?php
// Er zijn gegevens verstuurd naar deze pagina!
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Hier de rest van de code
}
?>
Optie 2:
<?php
// Er zijn gegevens verstuurd naar deze pagina!
if ( $_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['gebuikersnaam'], $_POST['naam'], $_POST['achternaam'], $_POST['file']) )
{
// Hier de rest van de code
}
?>
Santhe, bedankt voor snelle reactie.
Maar is voor jou Optie 1 beter omdat: Er niet gecontroleerd word op isset (). Of heeft jou voorkeur ook nog een andere reden?
Optie 1 als je alleen wilt checken of er een post request is gedaan. De rest wat je in optie 2 doet is nog wel nodig om je gegevens te controleren! En meer nog, want waarschijnlijk wil je ook nog wel controleren op juiste waardes daar waar nodig.
Erwin, ook jij bedankt voor de reactie.Erwin, ook jij bedankt voor de reactie.
Ik wil idd nadien nog controleren of bepaalde waarder wel kloppen.k wil idd nadien nog controleren of bepaalde waarder wel kloppen.
Ik wil dat gaan doen met:
<?php
// Een naam bevat letters en spaties (minimaal 3)
if ( !isset($_POST['naam']) or !preg_match( '~^[\w ]{3,}$~', $_POST['naam'] ) ) {
$aErrors['naam'] = 'Vul een geldige Naam in. Minimaal 3 Letters !! ';
}
?>
Wel, laat ons de vraag omdraaien.
Wat gebeurt er bij else?
Wat gebeurt er als er wel een POST request is, maar er ontbreekt een POST-variabele?
Het is relevant om die tweede conditie te nesten
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
if (isset($_POST['gebuikersnaam'], $_POST['naam'], $_POST['achternaam'], $_POST['file'])) {
// alles okay
}
else {
// Wel een post, doch er is iets fout
}
}
else {
// geen post
}
?>
Mag ik alle 3 bedanken voor de uitleg en reactie's.
Ik ga het dan dus maar op deze manier doen:
<?php
// Er zijn gegevens verstuurd naar deze pagina!
if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
// We gaan de errors in een array bijhouden
$aErrors = array();
// Een naam bevat letters en spaties (minimaal 3)
if ( !isset($_POST['naam']) or !preg_match( '~^[\w ]{3,}$~', $_POST['naam'] ) ) {
$aErrors['naam'] = 'Vul een geldige Naam in. Minimaal 3 Letters !! ';
}
if ( count($aErrors) == 0 )
{
// Query afhandeling enz.........
}
} // Einde kijken of er gepost is
else
{
// Formulier tonen
}
?>
Mag ik even opmerken dat [\w ] verkeerd is om in je regex te gebruiken? \w is een predefined characterclass, deze hoor je niet in een andere characterclass te stoppen. Gebruik liever (\w| ){3,}.
Wouter, tuurlijk mag je dat opmerken. Vind het zelfs alleen maar goed en oplettend dat je het aanhaalt.
Ik ga het ook gelijk aanpassen hier, want heb geen verstand van regex en heb deze voorbeeld ook van PFZ gehaald.
Mag ik even opmerken dat [\w ] verkeerd is om in je regex te gebruiken? \w is een predefined characterclass, deze hoor je niet in een andere characterclass te stoppen. Gebruik liever (\w| ){3,}.
Dit vind ik zo ongeveer het slechtste advies dat ik vandaag op deze site heb gelezen. Wáár haal je het vandaan dat het "verkeerd" zou zijn en dat het niet "hoort"? (en ook nog eens zonder onderbouwing)
Jouw alternatieve oplossing is juist slecht. Een character class is een eenvoudige test, maar jij gaat alterneren, waardoor de regex-parser moet backtracken. En omdat in de expressie de character class \w wordt gebruikt, moet de parser dus backtracken over alle karakters die in die class zitten. Daar komt bij dat je ook nog eens een capturing group gebruikt, wat ook niet bevorderlijk is voor de performance. In dit geval is jouw oplossing een factor 20-25 langzamer dan de constructie die je zo slecht vindt.
Ik moet toegeven dat in deze situatie je dat snelheidsverschil niet zult merken (ik heb het 10000 keer uitgevoerd op een string van 16 kB en in alle testruns duurde dat gemiddeld ruwweg 0.25 sec resp. 6.9 sec) maar wie het kleine niet leert, doet het grote verkeerd. Als je real-time grote hoeveelheden gegevens gaat verwerken, wordt dit soort optimalisaties namelijk wél relevant.
Mijn test was overigens in Perl; in PHP schijnt het verschil nog extremer te zijn.