24. september 2007 - 22:59Der er
37 kommentarer og 1 løsning
OOP i php
Hej eksperter.
Så er det tid til at lege lidt med OOP - jeg gør det i php mest fordi jeg vil prøve at starte lidt småt ud, så jeg måske kan finde pointen med at bruge oop et sted, senere vil jeg udvide det til at lege med java. (PS: det er php4 og jeg er obs på at OOP i php4 ikke er helt på toppen)
Anyways - jeg har prøvet at lave en user class ting - formålet er at jeg vil prøve at lave et simpelt login system med classes.
Jeg har indtil videre lavet følgende:
class user { var $user; var $pass;
function setUser($formUser) { $this -> user = $formUser; }
function getUser() { return $this -> user; }
function setPass($formPass) { $this->pass = $formPass; }
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
hej jakobdo og nielle - tak for jeres inspiration.
Jeg skal lige høre om jeg har fattet det helt rigtigt det med classes.
Hvis jeg nu siger følgende: User kan have: ---------- username password autologin ---------- Navn Adresse Tlf Antal_indlaeg DatoForSidsteIndlaeg
Og så skal der selvfølgelig nogle funktioner til for at hente de oplysninger, enten fra DB eller Form. Er det korrekt forstået ? og er det de rigtige ting jeg vil have i min klasse?
Hvis jeg skulle lave en login funktion ville jeg lave noget i stil med dette:
Jeg ville lave en variabel - authorized - som sættes til sand når username og password er verificeret imod databasen (initialiseres til false i klassens constructor).
Autologin ville jeg lave som et metode-kald: Når brugeren først besøger din side kaldes autologin() som så tjekker om der ligger en login-cookie, henter password og username fra denne og så forsøger at verificere disse imod databasen (aldrig gå ud fra at de er korrekte!). Hvis de passere så sættes authorized til true.
"Fields" og "attributes" ser ud til at være brugt stort set lige meget. Selv kommer jeg fra .NET hvor at MS har valgt at bruge betegnelsen "field", og det ser vist også ud til at Java bruger det samme. Jeg må tilstå at jeg ikke er helt klar over hvad der er den korrekte betegnelse i UML. Men nu er vi vist ved at gå lidt OT her ;^)
// En "constructor". // Kaldes automatisk med "$bruger = new user();". // Formålet med en constructor er populært sagt // at initialisere objekterne når de oprettes. function user() { $authorized = false; }
function authorizeUser() { if (!isset($user) || $user != "") return; if (!isset($pass) || $pass != "") return;
$sql = "SELECT count(*) AS antal FROM dinUserTabel WHERE username = '$user' AND password = '$pass'"; $query = mysql_query($sql) or die(mtsqk_error()); $row = mysql_fetch_assoc($query);
I øvrigt tror jeg at jeg ville spare set- og get- moeoderne (undskyld funktionerne) væk. Det er lidt overflødige her idet man næppe kan forestille sig et user-objekt hvor username og password ikke er defineret. I stedet ville jeg óverebeje at flytte dem til constructoren:
function authorizeUser() { if (!isset($user) || $user != "") return; if (!isset($pass) || $pass != "") return;
$sql = "SELECT count(*) AS antal FROM dinUserTabel WHERE username = '$user' AND password = '$pass'"; $query = mysql_query($sql) or die(mtsqk_error()); $row = mysql_fetch_assoc($query);
Denne funktion kender jeg ikke: or die(mtsqk_error()); :o)
Og der bør kun være EN bruger med ET kodeord. $sql = "SELECT id FROM dinUserTabel WHERE username = '$user' AND password = '$pass' LIMIT 1"; $query = mysql_query($sql) or die(mtsqk_error());
Og så ville jeg lave tjekket: if(mysql_num_rows($query)==1) $authorized = true; else $authorized = false;
jamen nu tror jeg faktisk jeg er ved at være lidt mere med! :)
Når jeg opretter min bruger(objekt?) vil det altid indeholde 3 variabler/fields/attributes - user, pass, authorized. Mit spørgsmål er så nu: Sessions skal de altid holdes uden for klassen? Og så kan jeg lave et tjek op imod $minBruger->$authorized for at se om brugeren er godkendt, og derefter sætte min session?
Jeg bruger faktisk allerede jakobdo's if(mysql_num_rows($query)==1) i mit "non-oop" loginsystem hehe, dog bruger jeg ikke limit 1 i min sql. det burde jeg nok.
Indtil videre tror jeg efterhånden jeg er ved at være lidt på sporet :) takker for eksemplerne.
jakobdo> Jeg prøver konskvent at lærer folk herinde at bruge count(*) frem for at bruge mysql_num_rows(). Alt for mange misbruger nemlig den sidste. Men ja, det alternativ virker selvfølgelig også.
Jeg ville dog ikke sætte LIMIT 1 på - hvis der faktisk er 2 eller flere rækker i søge-resultatet, så er det en fejl som der skal tages hånd om. Måske er det endda resultatet af hacker-aktivitet.
Hej, undskyld jeg hopper ind midt i det hele, men jeg har lige et par spørgsmål mht. netop det her - håber ikke det gør noget, ellers må I lige sige til så skal jeg nok oprette min egen tråd. ;)
Først og fremmest, hvad mener du, nielle, når du skriver at mange misbruger mysql_num_rows()? Jeg bruger det selv en del, dog synes jeg ikke at jeg direkte "misbruger" det - men man tror jo altid noget indtil man finder ud af noget andet, så hvis jeg kan blive klogere ville det da være rart. ;)
Dernæst har jeg længe kigget på OOP (specielt classes) og jeg har egentlig gerne ville sætte mig lidt mere ind i det - men efter at have læst lidt rundt omkring kan jeg simpelthen ikke se den store fordel ved det. Jeg modtager heller end gerne links der forklarer OOP lidt mere specifikt hvis I ligger inde med nogle af dem - for det ser spændende ud, må jeg sige, det handler bare om at overbevise mig selv at det er værd at sætte sig ind i.
af blot fordi at de ønsker at vide hvor mange rækker der er. Dette er en meget uøkonomisk måde at benytte databasen på - hvorfor udtrække *samtlige* data fra tabellen når en count(*) kunne have givet resultatet?
Ahh nielle - det link gad jeg godt have haft lidt tidligere :P
1) OOP-tankegangen tilskynder til at man adskiller funktionalitet fra design (html/css-koden). Dermed er det nemt senere at ændre designet uden at bekymre sig om hvorvidt man kommer til at ødelægge funktionalitet.
Sådan havde jeg ikke lige tænkt det før.
Jeg læste også et sted, tror det var her på eksperten. At ved meget store systemer, kan oop spare firmaer MANGE penge, fordi det er så meget nemmere at vedligeholde som det er.
(I må undskylde min langsomme responstid i den her tråd(og min reg.exp tråd) men jeg er lidt tidspresset og vil gerne prøve tingene af og sådan. Men jeg er rimelig tidspresset for tiden. Men endnu engang undskyld - jeg skal nok lukke mine spørgsmål når jeg kommer dertil, bare lige så i ikke tror at jeg glemmer jer) :)
class user { var $user; var $pass; var $role; var $authorized;
function users($user, $pass) { $this -> user = $user; $this -> pass = $pass; $this-> authorized = "false"; }
function authorizeUser() { $user = $this->user; $pass = $this -> pass; if (!isset($user) || $user == "") return; if (!isset($pass) || $pass == "") return;
$sql = "SELECT count(*) AS antal FROM user WHERE username = '$user' AND password = '$pass'"; $query = mysql_query($sql) or die(m_error()); $row = mysql_fetch_assoc($query);
> Nielle - kan det passe at du skriver de her ting med små indbyggede fejl, så det ikke bare er copy paste ? :) (jeg synes det er en god måde at hjælpe)
Heh-heh. Nej ikke ligefrem med vilje. Men jeg synes nu at det er ganske ok at folk faktisk også bruger hovedet og eksperimentere lidt. :
Helt i orden, men jeg synes nu at du skulle prøve at få det til at fungere *uden* "-tegn rundt om true og false. Det er faktisk ikke så svært når det kommer til stykket - og boolske variable er noget enhver seriøs programør skal kunne mestre. :^)
function users($user, $pass) { $this -> user = $user; $this -> pass = $pass; $this -> authorized = "false"; }
function authorizeUser() { $user = $this->user; $pass = $this -> pass; if (!isset($user) || $user == "") return; if (!isset($pass) || $pass == "") return;
$sql = "SELECT count(*) AS antal FROM useroop WHERE username = '$user' AND password = '$pass'"; $query = mysql_query($sql) or die(m_error()); $row = mysql_fetch_assoc($query);
function users($user, $pass) { $this -> user = $user; $this -> pass = $pass; $this -> authorized = false; }
function authorizeUser() { $user = $this->user; $pass = $this->pass; if (!isset($user) || $user == "") return; if (!isset($pass) || $pass == "") return;
$sql = "SELECT count(*) AS antal FROM useroop WHERE username = '$user' AND password = '$pass'"; $query = mysql_query($sql) or die(m_error()); $row = mysql_fetch_assoc($query);
07/10-2007 15:09:47> Det er vist en oversimplificering. Funktioner må meget gerne returnere andet end boolske variable. Der er bare den datatype som virker mest lokisk lige her.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.