Avatar billede Six Nybegynder
24. september 2007 - 22:59 Der 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;
    }
   
    function getPass() {
        return md5($this->pass);
    }
}


$ourUser = new user;
$ourUser->setUser('Kasper');
$ourUser->setPass('etellerandetpass');
echo "<br>User: ". $ourUser->getUser();
echo "<br>Pass: ". $ourUser->getPass();

Og jeg er allerede end i en blindgyde. Hvordan kommer jeg videre herfra ? ;)
Avatar billede jakobdo Ekspert
25. september 2007 - 07:46 #1
Du skal vel evt. have lavet en MYSQL klasse, så du kan tjekke om brugerens data findes i en mysql.
Evt. via funktionen: $ourUser->login()
Avatar billede nielle Nybegynder
25. september 2007 - 08:19 #2
Noget med at gemme og hente data i en session - sådan at du kan initialisere user-klassen ved hver ny side.

Noget med cookies sådan at du kan lave auto-login.

Tilføj noget med roller - spdan at di kan skelne mellem om brugeren er admin, co-admin, moderator, almindelig bruger eller hvad du nu kan finde på.
Avatar billede Six Nybegynder
25. september 2007 - 15:38 #3
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:

function compare_userdata($user, $pass) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    if($_SESSION['logged_ind'] == "ja" && $_SESSION['logged_name'] == $username) {
        echo "du er allerede logget ind";
    } else {       
        if($username == $user && md5($password) == md5($pass)) {
            echo "Du er logget ind";
            $_SESSION['logged_ind'] = "ja";
            $_SESSION['logged_name'] = $username;
        } else {
            echo "Niksen biksen, ingen adgang kammerat";
        }
    }
}

ville det være helt dumt eller hvordan ?
Avatar billede Six Nybegynder
25. september 2007 - 15:43 #4
Den funktion der skal selvfølgelig lige tilpasses.

Pt er jeg ved at lave et loginsystem uden brug af classes - så jeg har et udgangspunkt til at lave det om så det gør brug af classes.
Avatar billede nielle Nybegynder
25. september 2007 - 18:16 #5
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.
Avatar billede Six Nybegynder
26. september 2007 - 01:52 #6
Se nielle - det der er alt for advanceret snak til mig endnu hehe, undskyld jeg siger det ;)

Med variablen authorized, vil du sætte den i klassen ligesom mine user og pass variabler?

Jeg fanger godt din ide med at lave det metode-kald. Er et metode-kald det samme som en funktion, den er bare inde i en klasse - eller hvordan ?

Kan du prøve at give mig nogle små eksempler?
Avatar billede nielle Nybegynder
26. september 2007 - 06:55 #7
> Se nielle - det der er alt for advanceret snak til mig endnu hehe, undskyld jeg siger det ;)

Det er mig som skal undskylde :^)

> Med variablen authorized, vil du sætte den i klassen ligesom mine user og pass variabler?

Rigtigt.

> Jeg fanger godt din ide med at lave det metode-kald. Er et metode-kald det samme som en funktion, den er bare inde i en klasse - eller hvordan ?

Ja. "method" er blot den officielle OOP navngivning for den slags. Variable hedder i øvrigt "fields".
Avatar billede jakobdo Ekspert
26. september 2007 - 07:43 #8
Nielle: fields? Jeg troede det hed attributes?
Avatar billede nielle Nybegynder
26. september 2007 - 08:15 #9
"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 ;^)
Avatar billede jakobdo Ekspert
26. september 2007 - 08:47 #10
Fordi det er står på internettet, er det jo ikke altid sandt.
Men: http://en.wikipedia.org/wiki/Object-oriented_programming -> its attributes, fields or properties

Kært barn har mange navne. :o)
Avatar billede nielle Nybegynder
26. september 2007 - 08:54 #11
PHP's egen dokumentation ser ud til at favorisere "variabel":

http://dk2.php.net/oop

:^)
Avatar billede nielle Nybegynder
26. september 2007 - 09:29 #12
> Kan du prøve at give mig nogle små eksempler?

F.eks. sådan:

class user {
    var $user;
    var $pass;

    var $authorized;

    // 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);

        if ($row["antal"] == 1)
            $authorized = true;
        else
            $authorized = $false;
    }
   
    function setUser($formUser) {
        $this -> user = $formUser;
    }
   
    function getUser() {
        return $this -> user;
    }
   
    function setPass($formPass) {
        $this->pass = $formPass;
    }
   
    function getPass() {
        return md5($this->pass);
    }
}
Avatar billede nielle Nybegynder
26. september 2007 - 09:34 #13
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:

class user {
    var $user;
    var $pass;

    var $authorized;

    function user($user, $pass) {
        $this -> $user = $user;
        $this -> $pass = $pass;

        $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);

        if ($row["antal"] == 1)
            $authorized = true;
        else
            $authorized = false;
    }
}
Avatar billede jakobdo Ekspert
26. september 2007 - 09:53 #14
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;
Avatar billede Six Nybegynder
26. september 2007 - 11:54 #15
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.
Avatar billede nielle Nybegynder
26. september 2007 - 12:00 #16
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.
Avatar billede woowii Nybegynder
26. september 2007 - 23:00 #17
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.
Avatar billede nielle Nybegynder
26. september 2007 - 23:18 #18
Med moisbrug mener jeg når folk fyre en:

SELECT * FROM dinTabel

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?

Et link til noget snak om OOP i PHP:

http://www.eksperten.dk/spm/794844
Avatar billede woowii Nybegynder
26. september 2007 - 23:23 #19
Ah, ok - tak for det. Begge dele. =)
Avatar billede Six Nybegynder
27. september 2007 - 01:00 #20
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) :)
Avatar billede Six Nybegynder
27. september 2007 - 01:19 #21
Når jeg nu bruger din funktion nielle:

    function users($user, $pass) {
        $this -> $user = $user;
        $this -> $pass = $pass;

        $authorized = false;
    }
Renamede til users (Den må vel ikke hedde det samme som klassen? fik ihvertfald en fejl)

og bruger:
$ourUser = new user;
$ourUser->users(Kasper, jegersej);
echo "<br>User: ". $ourUser->$user;
echo "<br>Pass: ". $ourUser->$pass;

til at outputte med, så udskriver den:
User:
Pass:

hvorfor det? - og hvordan skal jeg ellers kalde mine variabler?
Avatar billede Six Nybegynder
27. september 2007 - 01:26 #22
Jeg har rettet funktionen users:

    function users($user, $pass) {
        $this -> user = $user;
        $this -> pass = $pass;

        $authorized = false;
    }

og bruger:

echo "<br>User: ". $ourUser->user;
echo "<br>Pass: ". $ourUser->pass;

Så udskriver den det :)

Men hvorfor må man ikke bruge $ inde i funtionen til at sætte klassens variabler med ?

$this -> $user = $user;
skal være
$this -> user = $user;
Avatar billede Six Nybegynder
27. september 2007 - 01:47 #23
jeg er nu nået frem til det her:

<?

mysql_connect ($host, $user, $pass);
mysql_select_db($dbase);

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);

        if ($row["antal"] == 1)
            $this -> authorized = "true";
        else
            $this -> authorized = "false";
    }
}

$ourUser = new user;
$ourUser->users("password", "fjappe");
$ourUser->authorizeUser();
echo "<br>User: ". $ourUser->user;
echo "<br>Pass: ". $ourUser->pass;
echo "<br>Pass: ". $ourUser->authorized;
?>

Jeg sætter klammer om $this-> authorized = "false"; false for at kan teste outputtet.

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)

Anyways - er der noget i det jeg er kommet frem til nu, der er helt skudt ?
Avatar billede Six Nybegynder
27. september 2007 - 01:47 #24
Output:

User: password
Pass: fjappe
Pass: true
Avatar billede nielle Nybegynder
27. september 2007 - 06:54 #25
> 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. :
Avatar billede nielle Nybegynder
27. september 2007 - 06:57 #26
Det burde ikke være nødvendigt med "-tegn - PHP understøtter udemærket boolske værdier. :^)
Avatar billede Six Nybegynder
01. oktober 2007 - 23:26 #27
Hej med jer igen - ja.. jeg er stadig igang med at lege med mit oop loginsystem :)

Jeg vil lige høre jer - ser den her auto_login metode nogenlunde rigtig ud? - er jeg på sporet ? :)

    function user_autologin() {
        $user = $this -> user;
        $pass = $this -> pass;
        $authorized = $this -> authorized;
       
               
        $sql = "SELECT autologin AS user_autologin FROM useroop WHERE username = '$user' AND password = '$pass'";
        $query = mysql_query($sql) or die(mysql_error());
        $row = mysql_fetch_assoc($query);
        $this -> autologin = $row['user_autologin'];
       
        if(!isset($_COOKIE['userautologin'])) {
            if($authorized == "true" && $user != "" && $pass != "") {
                if($this -> autologin == "1") {
                    setcookie('userautologin', $user .",". $pass, time() + (60*60*24*30));
                } else {
                    setcookie('userautologin', "false", time() + (60*60*24*30));
                }
            } else {
                echo "Du har ingen adgang";
            }
        } else {
            return "du er allerede autologget ind";
        }
    }
Avatar billede Six Nybegynder
02. oktober 2007 - 00:39 #28
Deltagere - i smider bare et svar så i kan få point :)

Jeg kan jo ikke blive ved med at spørge løs her i tråden, så jeg har besluttet mig at oprette nye spørgsmål, som ovenstående, når de opstår.

Mange tak for hjælpen og jeg tror jeg har fanget det bare en lille smule ;)
Avatar billede nielle Nybegynder
02. oktober 2007 - 06:56 #29
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. :^)
Avatar billede Six Nybegynder
02. oktober 2007 - 12:49 #30
Nielle - jeg kan godt få det til at virke.

MEN! :D - hvis den retunerer false er variablen tom, og ikke 0 - og det forstår jeg ikke . Hvorfor er den det? - ved true udskrives 1.
Avatar billede nielle Nybegynder
02. oktober 2007 - 17:50 #31
> hvis den retunerer false er variablen tom

Hvilken variabel?

Prøv at vise din kode hvor at det ikke virker.
Avatar billede nielle Nybegynder
07. oktober 2007 - 11:15 #32
Er du kommet videre med denne her?
Avatar billede Six Nybegynder
07. oktober 2007 - 11:22 #33
Hej nielle, nej jeg har desværre ikke haft tid til at kigge på det - og undskyld der ikke har været reaktion på din sidste post.

Men variablen jeg snakker om er authorized = "false" og "true"

Hvis jeg laver den med authorized = true og false giver den 1 ved true og tom ved false.
Avatar billede nielle Nybegynder
07. oktober 2007 - 11:38 #34
Hvordan ser din kode ud?
Avatar billede Six Nybegynder
07. oktober 2007 - 15:08 #35
Den er her:

    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);

        if ($row["antal"] == 1)
            $this -> authorized = "true";
        else
            $this -> authorized = "false";
    }

Og det eneste jeg gør for at teste dem er at fjerne " omkring min erklæring. og udskriver med:
echo $ourUser->authorized;
Avatar billede Six Nybegynder
07. oktober 2007 - 15:09 #36
Er det helt misforstået hvis jeg tror at man med oop sigter efter at lave et slags enten eller system?

At mine funktioner returnere enten sand eller falsk - og bruger mine methoder til at teste med?
Avatar billede nielle Nybegynder
07. oktober 2007 - 15:14 #37
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);

        if ($row["antal"] == 1)
            $this -> authorized = true;
        else
            $this -> authorized = false;
    }

Jeg er ikke helt sikker, men virker det ikke direkte med:

echo $ourUser->authorized;

Hvis ikke, så kan det gøres sådan i stedet:

if (echo $ourUser->authorized)
    echo "sandt!";
else
    echo "falsk!";
Avatar billede nielle Nybegynder
07. oktober 2007 - 15:15 #38
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester