Toon posts:

[PHP] Hoe user input af te handelen

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Goedenavond

Momenteel ben ik bezig met een ledensysteem in PHP, en het is mijn eerste project die ik volledig OO wil maken. Tot nu toe gaat dat goed; ik heb nu classes voor de database toegang en error handling. Maar ik stuit nu op een probleem.

Op de betreffende website moet men dus kunnen registreren en inloggen, etc. Maar hoe handel ik "fouten" af. Bijv. als een username al bezet is, of een wachtwoord klopt niet. Moet ik daarvoor bij de ErrorHandler aankloppen? Zelf had ik dit stappenplan in gedachten:

- gebruiker vult form in en submit deze naar register.php
- register.php maakt nieuwe Register class aan
- Register instance checkt of alle ingevulde waarden geldig zijn en stuurt een query naar de Database class
- Database class voert de query uit maar het gaat fout: de username bestaat al
- ??? wat nu? Mijn huidige Database class voert een trigger_error uit als een query mislukt. Maar als de debug mode uitstaat toont-ie geen errors, en ergens vind ik het ook een beetje ranzig om gebruikers met errors op te schepen (waarin filenames en linenumbers staan).

Een andere optie is natuurlijk om de Register instance eerst te laten checken of de username al bestaat. Maar wat als-ie bestaat? trigger_error()?

Of is m'n hele opzet gewoon fout?

  • Blaise
  • Registratie: Juni 2001
  • Niet online
Register instance checkt of alle ingevulde waarden geldig zijn (...)
Mij lijkt dat je daar checkt of de username al bestaat, anders is de ingevulde waarde ongeldig.

Verwijderd

Topicstarter
Blaise schreef op zondag 01 april 2007 @ 02:33:
[...]
Mij lijkt dat je daar checkt of de username al bestaat, anders is de ingevulde waarde ongeldig.
Ja, maar wat voor soort "fout" moet ik dan geven? Een harde error? Of moet ik nog een aparte class hebben voor user-getriggerde fouten?

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 08:50

Onbekend

...

Het is i.i.g. geen fatal-error...
De gebruiker moet gewoon een melding krijgen dat de gebruikersnaam al bestaat.

Verder is jouw functie die de invoer controleert tot de conclusie geklomen dat de invoer niet aan alle voorwaarden voldoet (unieke gebruikersnaam). Deze functie moet gewoon teruggeven dat het niet mogelijk is om te registreren. Verder zou je programma d.m.v. een if-else opdracht er verder niets meer mee moeten doen en de gebruiker de kans geven om een naam te bedenken.

Speel ook Balls Connect en Repeat


  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 01-12 20:26
Je kan toch een soort van check inbouwen.

En als username bestaat (if select username = > 0 display: Gebruikersnaam bestaat al oid.

Verwijderd

Topicstarter
Ja oke, maar het gaat mij erom hoe ik die "foutweergave" moet implementeren. Kijk, ik wil zoveel mogelijk de classes gescheiden houden en hun strict beperken tot de functies die hun doel dienen. En zo klinkt het mij niet logisch in de oren als een "Register" class ook een method heeft die een soort van error moet tonen. Maar om nou de ErrorHandler class daarvoor aan te spreken is misschien ook een beetje té. Gebruiken jullie hiervoor een aparte class? Hoe pakken julie dit soort zaken aan?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 08:30

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op zondag 01 april 2007 @ 16:45:
Ja oke, maar het gaat mij erom hoe ik die "foutweergave" moet implementeren. Kijk, ik wil zoveel mogelijk de classes gescheiden houden en hun strict beperken tot de functies die hun doel dienen. En zo klinkt het mij niet logisch in de oren als een "Register" class ook een method heeft die een soort van error moet tonen. Maar om nou de ErrorHandler class daarvoor aan te spreken is misschien ook een beetje té. Gebruiken jullie hiervoor een aparte class? Hoe pakken julie dit soort zaken aan?
Je laat je insert / update / whatever methode een returnwaarde teruggeven. Aan de hand van de returnwaarde kan je dan een actie uitvoeren :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • sTeVuu
  • Registratie: Oktober 2005
  • Laatst online: 08-08-2023
Ik laat bij alle formulieren een foutmelding per veld weergeven als deze er is (gewoon met empty()) en deze vul ik wanneer er een error is, zo kun je dezelfde routine gebruiken voor het formulier en nog gebruikersvriendelijke foutmeldingen geven. Dit is het makkelijkst te implementeren met een mvc-patroon, maar het zou in jouw situatie ook zo kunnen.

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Als je het netjes wil doen maak je voor ieder model een validator.

Je models zijn bijvoorbeeld: User, Role, Topic, Forum, etc.

Voor een User kan je dan een validator doen:

new LengthValidator(User, "name", 100);

Dit zegt dan dat de lengte van de "name"-property van de user minimaal 100 moet zijn. Zo kan je je validatie en model netjes gescheiden houden.

Verwijderd

Ik zie het probleem niet zo. In de eerste opsomming geef je aan dat de Register class checkt of alle ingevulde waarden geldig zijn en indien dat zo is een query afvuurt. Wat doe je als de ingevoerde waarden niet geldig zijn, bijvoorbeeld een e-mail adres dat ontbreekt of onjuist lijkt te zijn? Het afhandelen van het feit dat een gebruiker al bestaat lijkt me in wezen gewoon een van de mogelijke foutscenario's. Dat er een database-query voor nodig is om dat vast te stellen is daarin niet niet van belang.

Er kunnen natuurlijk nog meer dingen niet kloppen, wat doe je bijv. als het e-mailadres al bestaat. Al die controles lijken me prima op zijn plaats in de Register class. De fout niet afvangen en pas aan het licht laten komen op het moment dat je database een error geeft lijkt me i.i.g. niet de fraaiste oplossing.

Wat ik zou doen is enerzijds de user-input checken op onjuiste of vergeten waarden en tegelijk via een method in je Register class (check_for_duplicate($strUn) o.i.d.) controleren of de user al bestaat. Indien iets niet klopt het formulier met de eerder ingevoerde waarden aanbieden met duidelijk aangegeven waar wat fout is. Indien alles ok, je verdere registratie afhandelen.

Verwijderd

je laat je database class een fout waarde returnen naar de register class. de register-class zou dan de error moeten geven en de error-class zou de error moeten weergeven.

ik neem aan dat je in je error-class een algemene error weergave method hebt waar je een tekst+link naar de "probeer het opnieuw" pagina kunt weergeven.

dus je krijgt dan het volgende:
1) user vult het formulier in
2) register class controlleert of gegevens geldig zijn, dus of er geen verboden tekens in de gekozen username/wachtwoord zitten en of het e-mail address een @ bevat en op een tld of ip eindigt etc.
3) register-class stuur verzoek tot aanmaken van nieuw login door naar de database-class
4) database-class voert de query uit, maar faalt bijvoorbeeld omdat de gebruikersnaam al bestaat.
5) register-class ontvangt de error code van de database-class en kiest en gaat over tot actie.
6) error-class ontvangt verzoek to weergave van error-msg+redirect link.
7) user leest de error en probeert het nogmaals.

ten minste dit is zoals ik het zou implementeren zo hou je alles gescheiden en doet elke class wat het moet doen. de register-class regelt de registratie. de database-class communiceert met de database en de error-class vertelt de gebruiker over wat er fout ging en biedt een keuze aan.
Pagina: 1