Kan het efficiënter?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

P-ter AA

P-ter AA

22/01/2011 11:09:16
Quote Anchor link
Hallo,

Ik ben OOP aan het oefenen en ik heb nu de volgende code:

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


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
 
PHP hulp

PHP hulp

26/12/2024 04:02:05
 
Ozzie PHP

Ozzie PHP

22/01/2011 14:30:38
Quote Anchor link
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"
 
Mar cel

Mar cel

22/01/2011 14:32:32
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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];
}

?>
 
Ozzie PHP

Ozzie PHP

22/01/2011 14:34:28
Quote Anchor link
Mar cel op 22/01/2011 14:32:32:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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];
}

?>

@Marcel: hoe haal ik nu tegelijkertijd 2 velden op in jouw functie?
 

22/01/2011 14:35:59
Quote Anchor link
mysql_connect("$hostname","$username","$password");
mysql_select_db("$database");
Waarvoor variabelen binnen quotes?
Waarvoor dient volgens jou jouw gebruiker object?
 
Chris -

Chris -

22/01/2011 14:50:11
Quote Anchor link
waarom mysql gebruiken ipv mysqlI of PDO?
 
P-ter AA

P-ter AA

22/01/2011 15:36:03
Quote Anchor link
@Mar cel: Bedankt! Super.

@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..
 
Rudie dirkx

rudie dirkx

22/01/2011 18:43:08
Quote Anchor link
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}
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
<?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.
?>



P.S. SQL injectie mag je zelf afvangen =)
Gewijzigd op 22/01/2011 18:45:37 door rudie dirkx
 
P-ter AA

P-ter AA

22/01/2011 19:02:52
Quote Anchor link
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}
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
<?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.
?>



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
 
Pim -

Pim -

22/01/2011 19:14:37
Quote Anchor link
__CLASS__ wordt automatisch ingevuld met de naam van de klasse waarin het wordt opgeroepen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
class Klasse {
public function class(){
return __CLASS__;
}
}

?>


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

22/01/2011 19:15:15
Quote Anchor link
Het voordeel van mysqli en pdo is dat ze beiden al OOP zijn. Mysqli is gewoon de veroopte versie van mysql, heeft dus niet zoveel toegevoegde waarde en werkt onhandig / slecht / raar.
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.
 
P-ter AA

P-ter AA

22/01/2011 19:26:48
Quote Anchor link
@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
 

22/01/2011 19:29:35
Quote Anchor link
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


Nee hoor, is niet moeilijk: ORM, zoiets bestaat als doctrine.
 
P-ter AA

P-ter AA

22/01/2011 19:34:28
Quote Anchor link
Karl Karl op 22/01/2011 19:29:35:
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


Nee hoor, is niet moeilijk: ORM, zoiets bestaat als doctrine.


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..
 

22/01/2011 19:37:54
Quote Anchor link
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.
 
P-ter AA

P-ter AA

22/01/2011 19:46:30
Quote Anchor link
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.


Oke ga ik doen. Heel erg bedankt voor de hulp!
 
Niels K

Niels K

22/01/2011 19:47:19
Quote Anchor link
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
 



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.