Kan het efficiënter?
Ik ben OOP aan het oefenen en ik heb nu de volgende code:
Code (php)
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
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
<?php
function connect()
{
$hostname = "*****";
$database = "*****";
$username = "*****";
$password = "*****";
mysql_connect("$hostname","$username","$password");
mysql_select_db("$database");
}
class gebruiker
{
public function __construct($id)
{
$this -> id = $id;
}
public function getGebruikersnaam()
{
$query = mysql_query("SELECT gebruikersnaam FROM admins WHERE id = '".$this -> id."' LIMIT 1");
$user = mysql_fetch_assoc($query);
return $user['gebruikersnaam'];
}
public function getLvl()
{
$query = mysql_query("SELECT lvl FROM admins WHERE id = '".$this -> id."' LIMIT 1");
$user = mysql_fetch_assoc($query);
return $user['lvl'];
}
}
connect();
$gebruiker = new gebruiker(1);
echo 'Gebruikersnaam: '.$gebruiker -> getGebruikersnaam().'<br />';
echo 'Level: '.$gebruiker -> getLvl();
?>
function connect()
{
$hostname = "*****";
$database = "*****";
$username = "*****";
$password = "*****";
mysql_connect("$hostname","$username","$password");
mysql_select_db("$database");
}
class gebruiker
{
public function __construct($id)
{
$this -> id = $id;
}
public function getGebruikersnaam()
{
$query = mysql_query("SELECT gebruikersnaam FROM admins WHERE id = '".$this -> id."' LIMIT 1");
$user = mysql_fetch_assoc($query);
return $user['gebruikersnaam'];
}
public function getLvl()
{
$query = mysql_query("SELECT lvl FROM admins WHERE id = '".$this -> id."' LIMIT 1");
$user = mysql_fetch_assoc($query);
return $user['lvl'];
}
}
connect();
$gebruiker = new gebruiker(1);
echo 'Gebruikersnaam: '.$gebruiker -> getGebruikersnaam().'<br />';
echo 'Level: '.$gebruiker -> getLvl();
?>
En ik vroeg me af of het beter / efficiënter kon. Nu heb ik namelijk de 2 functies getGebruikersnaam en getLvl maar het lijkt mij beter als ik werk met een array. Is dat mogelijk? Ik heb al gezocht maar heb niks kunnen vinden.
Alvast bedankt!
Gewijzigd op 22/01/2011 11:09:39 door P-ter AA
Je voert in ieder geval 2x een query uit. Dat is er in dit geval 1 teveel. Je zou 1 functie moeten maken, bijvoorbeeld getUserData, die beide gegevens ophaalt. Je query zou dan worden: SELECT gebruikersnaam, lvl FROM admins WHERE id = '".$this->id."' LIMIT 1"
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
public function getField($field)
{
$sql = mysql_query("SELECT " . $field . " FROM admins WHERE id = '" . $this->id . "' LIMIT 1");
$res = mysql_fetch_assoc($sql);
return $res[$field];
}
?>
public function getField($field)
{
$sql = mysql_query("SELECT " . $field . " FROM admins WHERE id = '" . $this->id . "' LIMIT 1");
$res = mysql_fetch_assoc($sql);
return $res[$field];
}
?>
Mar cel op 22/01/2011 14:32:32:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
public function getField($field)
{
$sql = mysql_query("SELECT " . $field . " FROM admins WHERE id = '" . $this->id . "' LIMIT 1");
$res = mysql_fetch_assoc($sql);
return $res[$field];
}
?>
public function getField($field)
{
$sql = mysql_query("SELECT " . $field . " FROM admins WHERE id = '" . $this->id . "' LIMIT 1");
$res = mysql_fetch_assoc($sql);
return $res[$field];
}
?>
@Marcel: hoe haal ik nu tegelijkertijd 2 velden op in jouw functie?
mysql_select_db("$database");
Waarvoor variabelen binnen quotes?
Waarvoor dient volgens jou jouw gebruiker object?
waarom mysql gebruiken ipv mysqlI of PDO?
@Ozzie PHP: Inderdaad, dan voer ik alsnog 2x een query uit.
@Karl Karl: Inderdaad, dat is niet nodig. Ik ken die code niet uit mijn hoofd dus ik haal die altijd van internet zonder dat ik controleer of het helemaal klopt. -.-' Ik ga er op letten!
@Chris Horeweg: Wat is er beter aan mysqlI of PDO? Ik heb eerlijk gezegd alleen nog meer met MySQL gewerkt..
PDO is extraveilig enzo maar werkt niet fijn (imo).
Een losse functie connect() is trouwens niet zo heel erg OO =)
In jouw makkelijke voorbeeldje kan je de constructor het beste alle velden meteen op laten halen en dan het object vullen. Maar nog beter kan je het in een aparte (statische) functie zetten, zodat je evt fouten af kan handelen zonder een leeg object over te houden:
[code}
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Gebruiker {
static function get( $id ) {
$q = mysql_query('SELECT * FROM users WHERE id = '.$id);
if ( 0 < mysql_num_rows($q) ) {
return mysql_fetch_object($q, __CLASS__);
}
return false; // niet gevonden met dit ID ofzo
}
function __construct() {
// Deze wordt wel uitgevoerd, maar de data wordt er 'automatisch; ingegooid door PHP. Kewl!
}
}
// Je kan attributen/properties/velden nu dus zo aanroepen:
$gebruiker = Gebruiker::get(1);
$iLevel = $gebruiker->niveau;
echo $gebruiker->naam;
// Je kan er ook methoden voor maken, maar dat is meestal nergens voor nodig.
?>
class Gebruiker {
static function get( $id ) {
$q = mysql_query('SELECT * FROM users WHERE id = '.$id);
if ( 0 < mysql_num_rows($q) ) {
return mysql_fetch_object($q, __CLASS__);
}
return false; // niet gevonden met dit ID ofzo
}
function __construct() {
// Deze wordt wel uitgevoerd, maar de data wordt er 'automatisch; ingegooid door PHP. Kewl!
}
}
// Je kan attributen/properties/velden nu dus zo aanroepen:
$gebruiker = Gebruiker::get(1);
$iLevel = $gebruiker->niveau;
echo $gebruiker->naam;
// Je kan er ook methoden voor maken, maar dat is meestal nergens voor nodig.
?>
P.S. SQL injectie mag je zelf afvangen =)
Gewijzigd op 22/01/2011 18:45:37 door rudie dirkx
Rudie dirkx op 22/01/2011 18:43:08:
MySQLi = MySQL improved (voila de I).
PDO is extraveilig enzo maar werkt niet fijn (imo).
Een losse functie connect() is trouwens niet zo heel erg OO =)
In jouw makkelijke voorbeeldje kan je de constructor het beste alle velden meteen op laten halen en dan het object vullen. Maar nog beter kan je het in een aparte (statische) functie zetten, zodat je evt fouten af kan handelen zonder een leeg object over te houden:
[code}
P.S. SQL injectie mag je zelf afvangen =)
PDO is extraveilig enzo maar werkt niet fijn (imo).
Een losse functie connect() is trouwens niet zo heel erg OO =)
In jouw makkelijke voorbeeldje kan je de constructor het beste alle velden meteen op laten halen en dan het object vullen. Maar nog beter kan je het in een aparte (statische) functie zetten, zodat je evt fouten af kan handelen zonder een leeg object over te houden:
[code}
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Gebruiker {
static function get( $id ) {
$q = mysql_query('SELECT * FROM users WHERE id = '.$id);
if ( 0 < mysql_num_rows($q) ) {
return mysql_fetch_object($q, __CLASS__);
}
return false; // niet gevonden met dit ID ofzo
}
function __construct() {
// Deze wordt wel uitgevoerd, maar de data wordt er 'automatisch; ingegooid door PHP. Kewl!
}
}
// Je kan attributen/properties/velden nu dus zo aanroepen:
$gebruiker = Gebruiker::get(1);
$iLevel = $gebruiker->niveau;
echo $gebruiker->naam;
// Je kan er ook methoden voor maken, maar dat is meestal nergens voor nodig.
?>
class Gebruiker {
static function get( $id ) {
$q = mysql_query('SELECT * FROM users WHERE id = '.$id);
if ( 0 < mysql_num_rows($q) ) {
return mysql_fetch_object($q, __CLASS__);
}
return false; // niet gevonden met dit ID ofzo
}
function __construct() {
// Deze wordt wel uitgevoerd, maar de data wordt er 'automatisch; ingegooid door PHP. Kewl!
}
}
// Je kan attributen/properties/velden nu dus zo aanroepen:
$gebruiker = Gebruiker::get(1);
$iLevel = $gebruiker->niveau;
echo $gebruiker->naam;
// Je kan er ook methoden voor maken, maar dat is meestal nergens voor nodig.
?>
P.S. SQL injectie mag je zelf afvangen =)
Woow, ik probeer het de begrijpen en dat lukt aardig op 1 ding na: Wat is __CLASS__?
Gewijzigd op 22/01/2011 19:24:14 door P-ter AA
$k = new Klasse;
echo $k->class(); // geeft Klasse
Verder die ik echt geen enkele reden om MySQLi te gebruiken. (Afgezien van een minieme performance-winst door minder abstractie, maar om die abstractie is het in OOP juist te doen)
Beter is pdo, daarmee kan je in principe ook database onafhankelijkheid maken (mysql, sqlite, access, allemaal tegelijk mogelijk).
In principe hoor je voor elk veld een eigen getter en setter te maken, als het veld überhaupt benaderd mag worden. Dit heeft te maken met information hiding.
Bij jou voorbeeld is ook nog de vraag of jou klasse wel de data uit de database moet halen. Dus daarom vroeg ik ook wat jou klasse moet gaan doen.
Het voorbeeld van rudie maakt misschien wel slim gebruik van bepaalde constructies, erg net is het IMHO niet.
@Karl Karl: Ah zo, de klasse moet enkel de waardes uit de tabel weergeven. En ik zal eens gaan kijken naar PDO! Maar ik heb zo het idee dat het (te?) moeilijk is :x
Maurice vB op 22/01/2011 19:26:48:
@Pim: Oke bedankt!
@Karl Karl: Ah zo, de klasse moet enkel de waardes uit de tabel weergeven. En ik zal eens gaan kijken naar PDO! Maar ik heb zo het idee dat het (te?) moeilijk is :x
@Karl Karl: Ah zo, de klasse moet enkel de waardes uit de tabel weergeven. En ik zal eens gaan kijken naar PDO! Maar ik heb zo het idee dat het (te?) moeilijk is :x
Nee hoor, is niet moeilijk: ORM, zoiets bestaat als doctrine.
Karl Karl op 22/01/2011 19:29:35:
Hoe weet jij dat allemaal! :O
En is niet moeilijk? XD Ik ben net begonnen met OOP dus voor mij is het allemaal nèt iets te abstract..
Als je nog maar net bezig bent met OOP kan je denk ik het beste gewoon eerst simpel en smal beginnen. Niet te moeilijk doen direct.
Karl Karl op 22/01/2011 19:37:54:
Ik draai al langer mee dan vandaag.
Als je nog maar net bezig bent met OOP kan je denk ik het beste gewoon eerst simpel en smal beginnen. Niet te moeilijk doen direct.
Als je nog maar net bezig bent met OOP kan je denk ik het beste gewoon eerst simpel en smal beginnen. Niet te moeilijk doen direct.
Oke ga ik doen. Heel erg bedankt voor de hulp!
Quote:
Ik ben net begonnen met OOP
Zat topics hier op phphulp te vinden om daarmee je kennis te vergroten. Kijk maar in de Object Georiënteerde categorie.
In het topic van 'The ultimate' genaamd 'OOp User klasse' kan je een database handler vinden.
Gewijzigd op 22/01/2011 19:48:16 door Niels K