OOP database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 volgende »

Erwin H

Erwin H

08/01/2013 19:47:50
Quote Anchor link
Ik heb helemaal geen user object..... en ik heb een compleet OOP framework.

Dat hele idee van een user object is wat mij betreft niet van toepassing op een php applicatie, omdat php stateless is. Elke keer dat je een script start begin je van voren af aan en php heeft geen weet van wat er daarvoor al is gebeurd. Je zal de data waar je mee werkt dus ergens vandaan moeten halen: user input, omgevingsvariabelen, database, sessie, wat dan ook.
Het gebruik van een user object dat wordt geserialized en opgeslagen in een sessie vind ik persoonlijk een knullige manier van het nabootsen van een database. Die gegevens staan namelijk al in een database, dus haal het gewoon daarvandaan als je het nodig hebt.

Dan terug naar de vraag, hoe je het in OOP doet is net als hoe je elke andere tabel update in OOP. Hoe update jij gegevens van bijvoorbeeld een product tabel?
 
PHP hulp

PHP hulp

26/12/2024 23:14:56
 
Lord Gaga

Lord Gaga

08/01/2013 19:55:11
Quote Anchor link
Nou, ik dacht dus via een manier als deze, maar dat weet ik dus niet zeker, omdat dit de eerste keer is dat ik me echt in OOP verdiep. Ik snap er nu ook helemaal niks meer van eerlijk gezegd. :P
 
Erwin H

Erwin H

08/01/2013 20:02:52
Quote Anchor link
Probleem is dat je een weg bent ingeslagen waarvan ik nu zeg dat die niet handig is.
Wat dat betreft mag je dat best negeren, het is zeker niet zo dat alles wat ik zeg perfect is en 'de' waarheid. De waarheid bestaat namelijk niet, zeker niet in dit geval.

Als je verder wilt zoals je nu al bezig bent dan moet je je denk ik 2 dingen realiseren. Ten eerste, die rechten moet je er echt in verwerken, anders kan iedereen zometeen alles aanpassen wat ze leuk vinden. Ten tweede moet je je bewust zijn van het feit dat alleen de database altijd de correcte (lees laatste) gegevens heeft. Als je dus een user object gebruikt op die manier, dan moet je ervoor zorgen dat gegevens waarop je bepaalde beslissingen maakt (zoals de rechten) altijd eerst worden geverifieerd met de database, voor je iets doet. Misschien nog beter, pas die rechten toe via een join in je query. Omdat de laatste gegevens altijd in de database staan, weet je zeker dat je dan goed zit.
 
Lord Gaga

Lord Gaga

08/01/2013 20:16:49
Quote Anchor link
Hoe zou jij dit aanpakken dan? Het doel is voor mij om een klein CMSje te maken waarbij je kan registeren, inloggen en uitloggen.

En kan ik bij een userMapper dan niet gewoon de user class achterwege laten en gelijk met $userMapper->getUsername($id) etc. de gegevens uit de database halen, of is dit niet echt waar OOP voor bedoeld is?
Gewijzigd op 08/01/2013 20:22:43 door Lord Gaga
 
Erwin H

Erwin H

08/01/2013 20:43:50
Quote Anchor link
Nou ja, hoe ik het doe is werkelijk heel anders. Ik heb een MVC achtige constructie, waarbij de drie delen (model, view, controller) werkelijk los van elkaar staan. De controller leest voor elk request dat hij krijgt de gegevens uit die nodig zijn, stopt die in een object dat alle parameters beheert en geeft dat object aan het model. Het model voert vervolgens de acties uit die nodig zijn met behulp van de parameters in het object dat hij kreeg van de controller en geeft de resultaten van de acties vervolgens weer terug aan de controller.

Ongeacht wat voor actie er wordt gevraagd gebruik ik dezelfde constructie. In het geval van een update van user gegevens stop ik dus alle gegevens die vanuit de request (POST in dit geval waarschijnlijk) komen in het parameters object en het model vogelt vervolgens wel uit wat er mee moet (en mag gebeuren). Indien de ingelogde gebruiker geen rechten heeft dan zal het model een exception opgooien waarop de controller via de view dit weer kan laten zien aan de gebruiker.
 
Lord Gaga

Lord Gaga

08/01/2013 20:54:51
Quote Anchor link
Zou je dat misschien eens willen opsturen zodat ik kan kijken hoe dat nou precies in z'n werk gaat, of iets soortgelijks zodat ik in ieder geval kan zien hoe het er uiteindelijk uit moet komen te zien.
 
Erwin H

Erwin H

08/01/2013 23:36:11
Quote Anchor link
Uhm, nee, ik ben niet van plan om mijn hele framework te delen. Als je specifieke vragen hebt ben ik bereid die te beantwoorden.
 
Nicky Monsma

Nicky Monsma

17/01/2013 13:25:05
Quote Anchor link
hier een voorbeeldje hoe ik mijn PDO object in een class laat mee lopen
https://github.com/Monsma/Project-Atlanta/blob/master/application/models/pdo.php
 
Moose -

Moose -

17/01/2013 14:44:05
Quote Anchor link
Ik heb het even doorgenomen en ik snap je link niet echt. Je hebt een class geschreven om PDO heen die precies hetzelfde doet als PDO?
 
Erwin H

Erwin H

17/01/2013 14:47:13
Quote Anchor link
Public property?
Nergens checken op het feit dat $this->statement wel bestaat.
'die()' in een class?

Hmm, nee, deze kant zou ik inderdaad ook niet opgaan.
 
Lord Gaga

Lord Gaga

17/01/2013 18:34:57
Quote Anchor link
Zelf heb ik dit als database klasse, maar dat is dus niet goed?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
// Database Class
class Database
{
    // Variables
    private $host;
    private $user;
    private $pass;
    private $name;
    private $link;
    
    // Constructor
    public function __construct($host, $user, $pass, $name)
    {

        $this->host = $host;
        $this->user = $user;
        $this->pass = $pass;
        $this->name = $name;
    }

    
    // Connect
    public function connect()
    {

        return $this->link = mysqli_connect($this->host, $this->user, $this->pass, $this->name);
    }

    
    // Close
    public function close()
    {

        return mysqli_close($this->link);
    }

    
    // Set Charset
    public function set_charset($charset)
    {

        return mysqli_set_charset($this->link, $charset);
    }


    // Escape
    public function escape($string)
    {

        return mysqli_real_escape_string($this->link, $string);
    }

    
    // Query
    public function query($query)
    {

        return mysqli_query($this->link, $query);
    }

    
    // Num Rows
    public function num_rows($result)
    {

        return mysqli_num_rows($result);
    }

    
    // Fetch Array
    public function fetch_array($result)
    {

        return mysqli_fetch_array($result);
    }

    
    // Fetch Assoc
    public function fetch_assoc($result)
    {

        return mysqli_fetch_assoc($result);
    }

    
    // Fetch Object
    public function fetch_object($result)
    {

        return mysqli_fetch_object($result);
    }
}

?>
 
Moose -

Moose -

17/01/2013 18:38:40
Quote Anchor link
Het is niet fout, maar ik vraag me wel af wat voor extra functionaliteit dit met zich meebrengt. Zowat elke functie die je hebt returned gewoon de mysqli functie result ervan. Wat heeft het dan voor nut om er een extra class voor te maken?

Ook zou ik je aanraden om te gaan werken met PDO. Voor meer info zie: http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/
 
Lord Gaga

Lord Gaga

17/01/2013 18:40:40
Quote Anchor link
Omdat iemand (Volgens mij was Wouter dat) zei dat je het met een klasse later makkelijker kunt aanpassen mocht je overstappen van MySQLi naar PDO ofzo, nu hoef ik dus alleen de klasse aan te passen en niet alle bestanden.

Of heb ik dit verkeerd begrepen?
 
Moose -

Moose -

17/01/2013 18:49:42
Quote Anchor link
Nee dat is zeker waar. De vraag is echter, mocht je willen overstappen van mysqli naar pdo, gaat dat hiermee lukken? Een grote kracht van pdo zijn de prepared statements, en ik zie dat je bij je functie query alleen maar een string meegeeft. Dan zijn prepared statements dus al zowieso van de baan ;)
 
Lord Gaga

Lord Gaga

17/01/2013 18:52:19
Quote Anchor link
Hoe zou ik dat dan moeten doen?
 
Nicky Monsma

Nicky Monsma

17/01/2013 20:03:25
Quote Anchor link
Erwin H op 17/01/2013 14:47:13:
Public property?
Nergens checken op het feit dat $this->statement wel bestaat.
'die()' in een class?

Hmm, nee, deze kant zou ik inderdaad ook niet opgaan.


of je begrijpt het gewoon niet ik zou is een voorbeeld geven hoe je met mijn class overweg kan

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$Database
= new Database();

$Query = $Database->prepare('SELECT * FROM users WHERE username = ?')->bind_param(array($naam))->execute();

$Row = $Query->fetch_assoc();

echo $Row['password'];
?>


zo simple
 
Erwin H

Erwin H

17/01/2013 21:47:03
Quote Anchor link
Nicky Monsma op 17/01/2013 20:03:25:
of je begrijpt het gewoon niet

Nou, ik denk dat dat wel meevalt. Maar je class is gewoon slecht opgezet.
die() is uberhaupt al een slechte gewoonte, maar als je met classes aan de slag gaat helemaal. Een simpele database class moet niet gaan bepalen hoe een applicatie afgesloten wordt als er een fout is.
Public properties betekent dat alles en idereen in die class kan gaan zitten vroeten en er vanalles in zetten, zonder dat die class weet wat er gebeurt.
Niet controleren of je statement wel bestaat betekent dat als er iets verkeerd gaat die class hard onderuit gaat zonder dat je het afhandelt.

Dan kan het makkelijk aan te roepen zijn, het is nog steeds slecht geschreven, vol met fouten en levert je meer problemen op dan gewoon direct met PDO werken.
 
Nicky Monsma

Nicky Monsma

17/01/2013 22:17:48
Quote Anchor link
Ow gaan we zeggen er zitten fouten in? en die doet het zelfde als een exit
en ik kan er ook wel een trigger_error van maken maar je moet niet bijdehand gaan doen

heb jij certificaten in PHP? ik toevallig wel dus beetje opletten,
BTW de class check wel of er een statement is beter lezen of wil je een brilletje
 
Erwin H

Erwin H

17/01/2013 22:31:31
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
public function fetch_assoc()
{

return $this->statement->fetch(PDO::FETCH_ASSOC);
}


public function num_rows()
{

return $this->statement->rowCount();
}


public function result()
{

return $this->statement->fetchColumn();
}

?>

Als statement niet bestaat, of nog niet is aangemaakt gaat je class vreselijk onderuit.
En ja, die is hetzelfde als exit, dat is beide net zo slecht. Een class behoort ofwel een foutcode terug te geven, ofwel een exception op te gooien. Wat als je deze class morgen in een script wil gebruiken waar je een file aanmaakt voor downloading. Dan wil je echt niet dat er een string naar het scherm wordt gestuurd met die foutmelding. Dan is namelijk niet echt een juist bestand, wel?
 
Nicky Monsma

Nicky Monsma

17/01/2013 22:36:29
Quote Anchor link
je weet niet wat ik doe met die class he
zonder statement kan je ook geen fetch_assoc / result of num_rows maken
ik geef je een voorbeeld hoe je echt moet parameteren

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$DB
= new Database();
$DB->prepare('SELECT email FROM users WHERE username = ? LIMIT 1')->bind_param(array('monsma'))->execute()->result();
?>


zoals je wel ziet heb ik nu een result gemaakt snap je het nu?
 

Pagina: « vorige 1 2 3 4 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.