Error handling

Tags:    php

Halløj,

Jeg sidder og er ved at prøve at få styr på OOP (sigh, fatter det ikke >.<;), og jeg er ved at prøve på at lave en simpel backbone. Jeg har lavet en hel simpel class:

Fold kodeboks ind/udKode 


(ved ikke engang om det er rigtig gjort >.>;), men anywho; Jeg sidder så og vil have lavet noget error handling. Så hvis jeg på min view-page laver database connection:

Fold kodeboks ind/udKode 


Hvordan laver jeg så en class der kan handle errors?

Eventuelt hvis det ser helt skidt ud med OOP så ville jeg sætte pris på et link til en guide, men det skal helst være en guide der viser noget praktisk som jeg kan bruge til noget (ie. en database del, og så et script af en art f.eks login), bare de der standard oop guides hvor man laver nogle classes som så holder en person, som du så udbygger med hvilken farve øjne de har etc. fatter jeg ikke en skid af. Jeg tror bare jeg skal have fat i konceptet af hvordan man bruge generel database handling inden i classes, altså input, select, delete etc.

Håber der er nogen der kan vise noget super godt da jeg ikke lige kan få fat på det :(



Indlæg senest redigeret d. 31.01.2010 00:24 af Bruger #10325
9 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Hvis du skal bruge ValidateInput::SecureVar() på den måde som du gør der, så ja.

Dog vil jeg ikke anbefale det, men i stedet holde de to ting adskilt.

Her har du et eksempel for hvordan din controller "UserSystem" = "UserController" kan arbejde - så skal du få resten af din backbone til at håndtere det trivielle arbejde:
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 31.01.2010 11:23 af Bruger #10216
Jeg har selv lavet denne class, den giver lidt fejl osv. :)

Fold kodeboks ind/udPHP kode 




Du laver en væsentlig fejl ved at anvende dine funktioner som properties:
Fold kodeboks ind/udKode 

Du skal sætte et sæt parenteser på:
Fold kodeboks ind/udKode 



Her er din database klasse gjort lidt mere enkel, prøv at lure den:
Fold kodeboks ind/udKode 




Nå nu er jeg ved at være godt træt, men har leget lidt med det. Det jeg vil opnå med alt det her OOP er at komme ind i en programmeringsform som er lidt mere modul-baseret (og derved gør det nemmere for mig), men er kommet til et problem.

Min idé var at lave en backbone i form af essentielle classes (database link, query håndtering, validering af inputs etc) og så have andre classes som moduler. Det første modul jeg ville prøve at lave er et user modul (altid et godt et at starte med), og har lavet en function som bruges til at registrere en user med.

Den er i en anden fil end min backbone, og der løber jeg ind i lidt problemer. Jeg er kommet frem til noget i stil med:

Fold kodeboks ind/udKode 


Men da funktionen SecureVar ligger i klassen ValidateInput i backbonen får jeg en fejl:

Fold kodeboks ind/udKode 


Fatal error: Call to undefined method UserSystem::SecureVar()

Betyder det at jeg skal extende mit user-modul fra backbone classes? Eller kan jeg lave noget halløj med public functions?



Hmm skal lige være sikker på jeg følger :)

Du vil lave en ny klasse ( Input(); ), som er i backbonen. Her henter du så funktionen validatePost fra. !!Åbenbaring mens jeg skriver!! Altså du laver bare en ny instance af objektet NÅR du skal bruge det (i den her sammenhæng i userControl systemet), og så ville jeg gøre det i alle henseender hvor jeg skal validere noget?



Indlæg senest redigeret d. 31.01.2010 11:29 af Bruger #10325
Tanken er at man laver en ny instance af Input, når man skal bruge inputdata fra brugeren. Brugerdata skal altid valideres, og det kan man så gennemtvinge vha. denne klasse.

Validering kan ske på mange måder. Her opstilles nogle validerings kriterier og senere checkes så om det hele er valid data.

Hvis alt valideres korrekt kan man oprette brugeren.



Hmm du har altså

class Input (her henter du post/get data?) og,

class Validate (her henter du funktionerne til at validere med?)

$input->validatePost('password',new Validate('not-empty'));

Det må jo være klassen input der holder funktionen validatePost, som tager 2 properties, data (password). Men så laver du en ny instance af en anden class, og hvorfor/hvordan kan den class tage properties (troede det var funktioner kun?)

Undskylder hvis jeg er lidt langsom, men det hele er stadig lidt kryptisk for mig.



For hvad der er tekniske muligt, vil jeg anbefale dig at læse:
http://dk2.php.net/manual/en/language.oop5.php

Enhver metode/funktion i en klasse kan tage x-antal parametre.

klasser har en række magic-methods som f.eks __construct()
http://dk2.php.net/manual/en/language.oop5.decon.php

__construct() kaldes automatisk, når man opretter en ny instans af en klasse. __construct kan eksempelvis skrives:
Fold kodeboks ind/udKode 

Dvs. at du skal definere alle fire parametre før du kan oprette en instans af Database.



Okay, jeg leger stadigvæk med det her. Har et nyt problem:

Backbone (database, message funktion)
Fold kodeboks ind/udKode 


Validation (alt fra om ting er empty, isset til at kontrollere om et username er taget etc)
Fold kodeboks ind/udKode 


UserControl (save user, delete user, login etc vil være at finde her)
Fold kodeboks ind/udKode 


Mit problem ligger i at når jeg vil kontrollere hvorvidt der allerede er en user med et givent navn, så siger den:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource

Det er fordi jeg bruger

Fold kodeboks ind/udKode 


og det kan den ikke finde ud af, hvis jeg derimod bare skriver:

Fold kodeboks ind/udKode 


så vil den godt.

Desuden er jeg lidt lost med hensyn til hvordan det er mest hensigtsmæssigt at hente data ud fra DB'en. Kommentare til hele skidtet er selvfølgelig meget velkommen.



t