Classes

Gestart doorErik97 reacties359 weergaven

98 berichten · pagina 1 van 7

Erik

Lid · Topicstarter

Berichten
7.109
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Hey,
Weet iemand wat er in een database class moet en hoe je het, het beste kan maken?
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Weet je wat een class is en wat het voordeel ervan is?
0
Erik

Lid · Topicstarter

Berichten
7.109
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Niet echt.. biggrin
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Waarom wil je dan per sé een database class?
Als je het nut ervan niet inziet is het voor jou denk net zo handig om gewoon normale (My)SQL functies te gebruiken.
0
Erik

Lid · Topicstarter

Berichten
7.109
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ik wil gewoon classes leren enzo. biggrin
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Het voordeel van classes is dat je alle functies voor een bepaald deel van je site bij elkaar hebt.
Om one2xs er even bij te betrekken: We hebben hier classes voor het verbinden naar andere sites (om automatisch de omzet op te halen), de debug en foutmeldingen class (die ervoor zorgen dat jullie geen fouten zien maar wij wel), een class voor het forum, eentje voor ideal, eentje voor de domeinzooi, eentje voor de leden, en zo nog wel een paar.
Elk (abstract) deel van de site heeft een eigen class.

Als je een database-class wilt maken, moet je daar in zetten wat je nodig hebt.
Zo hebben wij in de mysql class de volgende functies:
__construct() (verbinden met de database)
query() (query uitvoeren)
num_rows() (rijen tellen)
insert_id() (ingevoegd id achterhalen)
data_seek() (result pointer op een bepaalde waarde zetten)
fetch_assoc() (query -> array)
affected_rows() (getroffen rijen ophalen)
escape() (zorgen dat alles veilig wordt geïnsert)
querycount() (houdt het aantal queries bij)
error() (zorgt ervoor dat de fouten in het MySQL gedeelte worden afgehandeld)
trigger_create() (mn eigen vorm van triggers, omdat we niet de goede rechten hadden om die in MySQL zelf te ondersteunen)
dump() (wordt gebruikt om de triggers te ontleden)
trigger_write() (triggers wegschrijven naar log ofzo)
trigger_get() (actieve triggers ophalen)
parsetijd() (uitvoertijd van de queries bijhouden)

Al deze functies horen enkel en alleen bij het MySQL gedeelte. Het is dus voor ons handiger om dit allemaal in een databaseclass te stoppen, omdat we zo alle functies bij elkaar hebben.
Daarbij heeft t ook een praktisch nut.
Bij elke query die er wordt uitgevoerd hier op o2x, wordt er gekeken of er een trigger actief is die daarop moet reageren. Zo ja, dan moet die trigger ook nog eens worden uitgevoerd (waar de juiste gegevens ook nog moeten worden ingevuld; heerlijk werk om te maken emo..), etc.
Als je dat allemaal zonder class moet doen, dan kan dat gewoonweg niet, omdat je niet na élke query een hele controle kunt bouwen.
Stop dus alleen in een databaseclass de functies die je echt nodig hebt, en bouw er de functionaliteit omheen die je nodig / handig vindt, maar een complete kopie van alle mysql_*() functies in een class stoppen is 100% zinloos. clown
0
Erik

Lid · Topicstarter

Berichten
7.109
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
En hoe maken jullie dan de verbinding? Met een array?
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
De gegevens (host, gebruikersnaam, wachtwoord, databasenaam) worden aan de core class doorgegeven, die maakt vervolgens een mysql object aan, en geeft dat object ook weer door aan de andere classes (bijvoorbeeld de leden-class) zodat die ook met de database kan verbinden.

In de praktijk dus zoiets:
$mysqlgegevens = array(host => localhost, user => blabla, ... => etc...);
$core = new core($mysqlgegevens);

en de class core ziet er versimpeld zo uit:

[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/class"]class[/URL] core
[COLOR= #007700]{[/COLOR]

  [URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] __construct[COLOR= #007700]([/COLOR][URL="http://www.php.net/array"]array[/URL] [COLOR= #0000BB]$mysql[/COLOR][COLOR= #007700])
  {[/COLOR]

    [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]mysql [COLOR= #007700]= new[/COLOR] mysql[COLOR= #007700]([/COLOR][COLOR= #0000BB]$mysql[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]host[/COLOR][COLOR= #007700]],[/COLOR] [COLOR= #0000BB]$mysql[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]user[/COLOR][COLOR= #007700]],[/COLOR] [COLOR= #0000BB]$mysql[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]pass[/COLOR][COLOR= #007700]], ...);[/COLOR]
    [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]member [COLOR= #007700]= new[/COLOR] member[COLOR= #007700](&[/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]mysql[COLOR= #007700], ...);[/COLOR]
    [COLOR= #FF8000]// etc..[/COLOR]

  [COLOR= #007700]}[/COLOR]

  [COLOR= #FF8000]// etc.[/COLOR]
[COLOR= #007700]}[/COLOR]


Om queries te doen gebruik je dan zoiets:
$query = $core->mysql->query("SELECT blaat FROM blaat");
en in de objecten zelf gebruik je dit:
$query = $this->mysql->query("SELECT blaat FROM blaat");
0
Erik

Lid · Topicstarter

Berichten
7.109
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Wat kan je dan nog meer in de core class zetten?
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Andere dingen die je nodig hebt in je site maar niet specifiek in een bepaalde class horen.
Functie om te mailen, om te redirecten, ding om magic quotes te omzeilen, je eigen alternatief voor htmlentities() wat goed met je karakterset werkt; dat soort dingen hebben wij erin. emo
0
Erik

Lid · Topicstarter

Berichten
7.109
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Wat kan je dan bijvoorbeeld in een mail functie zetten? biggrinEdit:
Heb een stukje van me database class gemaakt. Weet alleen niet of het goed is..

public function __construct()
    {
        // We kunnen geen verbinding maken
        if(!$this->connect($core->$mysqlgegevens[host], $core->$mysqlgegevens[user], $core->$mysqlgegevens[pass]) && !$this->select($core->$mysqlgegevens[name]))
        {
            // Error weergeven
            die($this->error(We konden geen verbinding maken met de database.);
        }
        // We kunnen verbinding maken
        else
        {
            $this->connect($core->$mysqlgegevens[host], $core->$mysqlgegevens[user], $core->$mysqlgegevens[pass])
            $this->select($core->$mysqlgegevens[name])
        }
    }
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Van die && op regel 4 zou ik || maken; als je niet kunt verbinden ($this->connect()) is het zinloos om te proberen of je de database kunt selecteren ($this->select()).
Die $this->connect() op regel 12 en $this->select() op regel 13 is ook overbodig; als je daar aankomt is het je al gelukt om verbinding te maken en de database te selecteren, dus hoef je dat niet nog een keer te doen.

Bij ons in de mailfunctie staat de standaardopmaak er, met de goede headers en een afmeldlink (indien van toepassing), gewoon dingen die praktisch handig zijn dus. clown
0
Erik

Lid · Topicstarter

Berichten
7.109
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ik ga weer ff classen. emo Je ziet zo nog wel ff een scriptje.. biggrinEdit:
Zoiets?

[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/class"]class[/URL] mysql
[COLOR= #007700]{[/COLOR]
    [URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] __construct[COLOR= #007700]()
    {[/COLOR]
        [COLOR= #FF8000]// We kunnen geen verbinding maken[/COLOR]
        [URL="http://www.php.net/if"]if[/URL][COLOR= #007700](![/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]connect[COLOR= #007700]([/COLOR][COLOR= #0000BB]$core[/COLOR][COLOR= #007700]->[/COLOR]mysql[COLOR= #007700][[/COLOR][COLOR= #DD0000]host[/COLOR][COLOR= #007700]],[/COLOR] [COLOR= #0000BB]$core[/COLOR][COLOR= #007700]->[/COLOR]mysql[COLOR= #007700][[/COLOR][COLOR= #DD0000]user[/COLOR][COLOR= #007700]],[/COLOR] [COLOR= #0000BB]$core[/COLOR][COLOR= #007700]->[/COLOR]mysql[COLOR= #007700][[/COLOR][COLOR= #DD0000]pass[/COLOR][COLOR= #007700]]) || ![/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]select[COLOR= #007700]([/COLOR][COLOR= #0000BB]$core[/COLOR][COLOR= #007700]->[/COLOR]mysql[COLOR= #007700][[/COLOR][COLOR= #DD0000]name[/COLOR][COLOR= #007700]]))
        {[/COLOR]
            [COLOR= #FF8000]// Error weergeven[/COLOR]
            [URL="http://www.php.net/die"]die[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]error[COLOR= #007700]([/COLOR][COLOR= #DD0000]We konden geen verbinding maken met de database.[/COLOR][COLOR= #007700]);
        }
    }
}[/COLOR]
?>


Edit 2:
Heb nog een stuke core class gemaakt. biggrin
[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/class"]class[/URL] core
[COLOR= #007700]{[/COLOR]
    [URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] __construct[COLOR= #007700]([/COLOR][URL="http://www.php.net/array"]array[/URL] [COLOR= #0000BB]$mysql[/COLOR][COLOR= #007700])
    {[/COLOR]
        [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]mysql [COLOR= #007700]= new[/COLOR] mysql[COLOR= #007700]([/COLOR][COLOR= #0000BB]$mysql[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]host[/COLOR][COLOR= #007700]],[/COLOR] [COLOR= #0000BB]$mysql[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]user[/COLOR][COLOR= #007700]],[/COLOR] [COLOR= #0000BB]$mysql[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]pass[/COLOR][COLOR= #007700]],[/COLOR] [COLOR= #0000BB]$mysql[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]name[/COLOR][COLOR= #007700]]);
    }[/COLOR]
    [URL="http://www.php.net/public"]public[/URL] [COLOR= #007700]function[/COLOR] nieuwsbrief[COLOR= #007700]()
    {[/COLOR]
        [COLOR= #FF8000]// We zetten de headers[/COLOR]
        [COLOR= #0000BB]$headers[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]Content Type: text/html[/COLOR][COLOR= #007700];[/COLOR]
        [COLOR= #0000BB]$headers[/COLOR] [COLOR= #007700].=[/COLOR] [COLOR= #DD0000]From: info@ipet.nl[/COLOR][COLOR= #007700];[/COLOR]
        [COLOR= #FF8000]// De standaard layout maken[/COLOR]
        [COLOR= #0000BB]$standaard_lay[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #DD0000]
<html>
    <head>
        <title>iPet - Nieuwsbrief</title>
        <link href="http://localhost/ipet/style.css" rel="stylesheet" type="text/css" />
    </head>
    
    <body>
        <div id="container">
            <a href="[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$rowtjuhh[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]url[/COLOR][COLOR= #007700]].[/COLOR][COLOR= #DD0000]/" target="_blank" class="header"></a>
            <div class="content">
                <h1>
                    De maandelijkse iPet Nieuwsbrief!
                </h1>
                <div class="vak">
                    [/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$bericht[/COLOR][COLOR= #007700].[/COLOR][COLOR= #DD0000]
                </div>
                <div class="afmelden">
                    <a href="[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$rowtjuhh[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]url[/COLOR][COLOR= #007700]].[/COLOR][COLOR= #DD0000]/user/profile/">Klik hier</a> om je af te melden.
                </div>
            </div>
        </div>
    </body>
</html>[/COLOR][COLOR= #007700];
    }[/COLOR]


Klopt dat weer zo? biggrin
0
Berichten
35.796
Reputatie
1
Punten
0,00
Lid sinds
Laatst gezien
Je MySQL ding klopt wel zo, alleen moet je natuurlijk nog wel de $this->connect() en $this->select() maken. biggrin
In je core class heb je $this->mysql = ..., maar je hebt nog niet aangegeven dat je $this->mysql wilt gebruiken, dus moet je na regel 3 dit zetten:
public $mysql;
Verdet doet je nieuwsbrief() functie niks, en gebruik je $rowtjuhh terwijl die nergens vandaan komt (net als $bericht trouwens). emo
Je kunt de boel ook zelf testen hea, dat werkt handiger dan dat ik moet zeggen of t werkt of niet. emo..
0
Erik

Lid · Topicstarter

Berichten
7.109
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Die connect() en select() heb ik er nu in gebouwd. biggrin Ben nu bezig met een aanmeld class. Doe later wel de nieuwsbrief functie emo
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren