Vraag & Antwoord

Webprogrammeren & scripting

Errorhandler in een functie

Anoniem
Lord Wodan
5 antwoorden
  • Zoals in een ander topic aangegeven ben ik bezig met een form-validator.

    Nu kan ik natuurlijk per formulier een check doen maar in een functie is het natuurlijk makkelijker en kan ik het bij elk formulier inzetten.

    Misschien denk ik te moeilijk maar ik kom er niet uit.

    met de validator wil ik:

    een leeg veld afkeuren als het verplicht is.
    bv www.blahblah.nl afkeuren als het om een emailadres gaat
    hackingpogingen of opzettelijke fouten registreren (?page=www.evil.nl)

    Uiteraard ook input goedkeuren en terugzenden
    de foutmelding terugzenden.
    mail naar de webmaster sturen met vreemde events(of opslaan in database)

    Al het bovenstaande lukt me redelijk per formulier maar om dit in een functie te gieten die zowel formulierinput als $_POST input verwerkt lijkt me moeilijk.

    (hardopdenkend)..

    ik moet dus IN de functie sturen:
    verplicht (ja of nee)
    soort (email,adres oid)
    de input zelf

    de functie moet retourneren:
    de gecontroleerde input indien OK
    de foutmelding

    De foutmelding zal waarschijnlijk in een array terug moeten komen omdat ik bv in 1 lus de functie meerdere keren zal aanroepen (www, email, telefoonnummer etc.)

    Kan dit? en hoe moet ik het aanpakken? Stel er is een redelijk simpele hackpoging (bv show.php?product=1 OR 1=1), dat wil ik melden aan de webmaster. Roep ik de actie beter op vanuit de functie of stuur ik dit bericht terug naar het formulier?

    Als er geen fouten zijn, dan retourneert de functie wel de variabele error, is dit op te vangen door if(!empty($error))?

    Iemand ervaring of suggesties hoe dit aan te pakken?

    edit: de ontvangende variabele wordt ook trouwens een array denk ik??

    antwoord=check($input,email,ja);// email is de soort en ja is verplicht.

    antwoord wordt dus:
    antwoord['input'] // de gecontroleerde gegevens
    antwoord['fout'] // de eventuele foutmelding

    zit ik zo goed?
  • [quote:6987062ffa="sander16v"]ik moet dus IN de functie sturen:
    verplicht (ja of nee)
    soort (email,adres oid)
    de input zelf[/quote:6987062ffa]
    Ik zou zelf een definitielijst bijhouden van de inputs (bijv array van objecten) en alleen het object meesturen met de functie. Vanuit de functie kan je dan de eigenschappen opvragen van het object wanneer je deze nodig hebt.

    [quote:6987062ffa="sander16v"]de functie moet retourneren:
    de gecontroleerde input indien OK
    de foutmelding
    [/quote:6987062ffa]
    Het volstaat om de validator alleen een result terug te geven (valid/nonvalid en/of een errorcode). De waarde van de input heb je immers al.

    [quote:6987062ffa="sander16v"]De foutmelding zal waarschijnlijk in een array terug moeten komen omdat ik bv in 1 lus de functie meerdere keren zal aanroepen (www, email, telefoonnummer etc.)
    [/quote:6987062ffa]
    Waarom? De melding betreft toch maar één object; bundelen van errors kan je buiten de validator doen in een array (als je dat zou willen). Het lijkt mij iig logischer om niet in de validatorfunctie de verzameling errors bij te houden.

    [quote:6987062ffa="sander16v"]Kan dit? en hoe moet ik het aanpakken? Stel er is een redelijk simpele hackpoging (bv show.php?product=1 OR 1=1), dat wil ik melden aan de webmaster. Roep ik de actie beter op vanuit de functie of stuur ik dit bericht terug naar het formulier?[/quote:6987062ffa]
    Stuur fouten door naar een logging functie. En laat deze bepalen wat je er mee wil doen: direct mailen, plaatsen in een queue (bijv in db), wegschrijven in een txt-bestand. Hier zijn overigens ook 'standaard' oplossingen voor (bijv http://logging.apache.org/log4php/).

    Hopelijk kan je hier nu wat mee verder.
  • En inderdaad ik dacht te moeilijk over sommige zaken. Nu nog even proberen deze post redelijk kort te houden ivm quotes..
    [quote:9ea9cb753f="Annie"]
    Ik zou zelf een definitielijst bijhouden van de inputs (bijv array van objecten) en alleen het object meesturen met de functie. Vanuit de functie kan je dan de eigenschappen opvragen van het object wanneer je deze nodig hebt.

    [/quote:9ea9cb753f]
    Hier kan ik je niet helemaal volgen, ik gebruik (nog)geen objecten.
    Bedoel je: de input EN de regexp meezenden in de functie? en waar laat ik de optie verplicht of niet??
    [quote:9ea9cb753f="Annie"]
    Het volstaat om de validator alleen een result terug te geven (valid/nonvalid en/of een errorcode). De waarde van de input heb je immers al.

    [/quote:9ea9cb753f]
    Helemaal waar maar het gaat me nou net om dat en/of. de ene keer zendt hij 1 waarde terug(valid) de andere keer de fout(nonvalid) maar dan wel met een errorcode. Dus ik weet van te voren niet of hij 1 of 2 variabelen terugzend..
    [quote:9ea9cb753f="Annie"]
    Waarom? De melding betreft toch maar één object; bundelen van errors kan je buiten de validator doen in een array (als je dat zou willen). Het lijkt mij iig logischer om niet in de validatorfunctie de verzameling errors bij te houden.

    [/quote:9ea9cb753f]
    Ook hier dacht ik dus te moeilijk. helemaal gelijk!
    [quote:9ea9cb753f="Annie"]
    Stuur fouten door naar een logging functie. En laat deze bepalen wat je er mee wil doen: direct mailen, plaatsen in een queue (bijv in db), wegschrijven in een txt-bestand. Hier zijn overigens ook 'standaard' oplossingen voor (bijv http://logging.apache.org/log4php/).

    [/quote:9ea9cb753f]
    Het is niet ongebruikelijk om deze loggingfunctie vanuit zo'n validatorfunctie aan te roepen?
    [quote:9ea9cb753f="Annie"]
    Hopelijk kan je hier nu wat mee verder.

    [/quote:9ea9cb753f]
    Vast wel! :D
  • Dat je niet OO werkt maakt op zich niet zoveel uit, alhoewel het misschien wel de moeite waard is om daar nu in te duiken.
    Je kan iig de definitie van de inputs ook vastleggen in een multi-dimensionale array. Als je maar een definitie vastlegt van een input en welke eigenschappen deze kan bevatten.
    Even een voorbeeldje (geen idee of dit werkt; is alleen bedoeld ter illustratie):
    [code:1:46c891e800]
    // definitie van je form
    // (dit zou je eventueel ook in een extern bestand kunnen doen,
    // of samenstellen op basis van een xml-definitie file. Je kan het
    // zo gek maken als je wil)
    $form = array();
    $form["naam"] = array(
    "type" => "text",
    "maxlength" => 50,
    "required" => true,
    "regexp" => null
    );
    $form["email"] = array(
    "type" => "text",
    "maxlength" => 100,
    "required" => false,
    "regexp" => "bla"
    );

    // formwaarden opvragen/vastleggen
    // (names van de inputs hebben dezelfde naam als de keys in de $forms array)
    foreach ($_POST as $key => $val)
    {
    $form[$key]["value"] = $val;
    }

    // validaten
    foreach ($_POST as $key => $val)
    {
    $returncode = validateInput($form[$key]);
    }
    [/code:1:46c891e800]
    De validateInput() heeft nu alle gegevens van de input tot z'n beschikking en kan afhankelijk van type en eisen bepaalde checks uitvoeren.

    Voor wat betreft de returncode: je kan bijvoorbeeld stellen dat foutcodes groter zijn dan 0. Wanneer je een returncode = 0 terug krijgt dan is de input dus valid.

    Over de loggin was ik idd niet duidelijk. Houdt de logging buiten de validator, zo hoef je de validator niet te vervuilen met de logica om de meldingstekst op te bouwen, enz. Als je dit algemeen wil toepassen op alle formelementen, dan kan je alsnog een wrapper bouwen die de validation en de loggin voor z'n rekening neemt.


    Overigens, er bestaan voor formvalidatie natuurlijk ook kant-en-klaar oplossingen. Met een beetje zoeken op internet moet er wel eentje te vinden zijn die voldoet aan je wensen.
    Maar als vingeroefening kan het natuurlijk ook geen kwaad om zelf iets te proberen.
  • OOP heb ik helemaal geen kennis van, ga ik naar zoeken.

    Ik ben bang dat ik het met alleen een errorcode niet ga redden. of ik moet de errorcodes gaan definieren bv:

    0=OK
    1=ingevuld maar fout
    2=niet ingevuld maar verplicht
    3=hackingpoging

    dit zou kunnen, ik ga iig even spelen weer.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.