Beginnen met een Class
Ik wil een class schrijven omdat een functie voor mijn doel hier te klein voor is. Mijn class ziet er nu zo uit (schematisch):
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
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
<?php
class Classname{
public $id_item;
public $properties;
public $relations = array();
public function __construct($id_item){
/*get the id of the item*/
$this->id_item = $id_item;
$this->get_item_properties();
}
public function get_item_properties(){
/*get all properties from the database*/
$query = $mysqli->query("SELECT * FROM table WHERE id_item = '".$this->id_item."'");
$this->properties = $query->fetch_assoc();
}
public function get_item_relations(){
/*get all relations to this item*/
$query = $mysqli->query("SELECT id_user FROM table_item_users WHERE id_item = '".$this->id_item."'");
while ($row = $query->fetch_assoc()){
array_push($this->relations,$row['id_user']);
}
}
}
?>
class Classname{
public $id_item;
public $properties;
public $relations = array();
public function __construct($id_item){
/*get the id of the item*/
$this->id_item = $id_item;
$this->get_item_properties();
}
public function get_item_properties(){
/*get all properties from the database*/
$query = $mysqli->query("SELECT * FROM table WHERE id_item = '".$this->id_item."'");
$this->properties = $query->fetch_assoc();
}
public function get_item_relations(){
/*get all relations to this item*/
$query = $mysqli->query("SELECT id_user FROM table_item_users WHERE id_item = '".$this->id_item."'");
while ($row = $query->fetch_assoc()){
array_push($this->relations,$row['id_user']);
}
}
}
?>
Ik wil deze class oproepen met
Code (php)
Doe ik het correct op deze manier?
Gewijzigd op 16/12/2013 12:32:52 door Albert de Wit
Je queries hebben helemaal geen connectie met welke database dan ook.
Op regel 10 roep je de niet bestaande methode set_item_properties aan.
Op regel 23 push je een element in de niet gedefinieerde property id_users
En verder nooit publieke properties gebruiken. Echt de doodsteek voor je classes en voornamelijk het toekomstig onderhoud van je applicaties.
Maar wat is je doel van deze class, in welke omstandigheid wil je het gebruiken etc?
Gewijzigd op 16/12/2013 12:31:52 door Erwin H
Ik wil het includen in bepaalde pagina's van mijn projectje. Omdat ik vaak deze gegevens moet ophalen wilde ik het zo makkelijk mogelijk maken. Natuurlijks zijn relations en properties een paar van de gegevens die ik wil hebben. Veel van de pagina's in mijn projectje moeten veel overeenkomstige gegevens ophalen maar andere moeten weer een paar gegevens extra hebben dan andere pagina's. Toen pas dacht ik te begrijpen waar het OOP echt om draait met classes.
Waar ik in elk geval nog wel naar zou kijken is om het misschien niet meteen een volwaardige OOP class te maken, maar in elk geval om er een aparte database class naast te hebben die het hele process van data uit je database halen kan overnemen. Daar heb je zeker ook in je volgende projecten heel veel aan. Dat moet dan dus wel een class zijn die niets, maar dan ook niets project specifieks doet. Die class kan je dan in bovenstaande class gebruiken om de specifieke gegevens op te halen die je nu nodig hebt.
Sorry Erwin, ik volg het niet helemaal, kun je een voorbeeld geven? Wat bedoel je met een standalone class? En waarom een apparte database class? Is die class voor ALLE verkeer tussen databases? Of is die class voor alleen voor aanpassingen in een database?
Met stand alone class bedoel ik dat je nu gewoon een class hebt die specifiek voor 1 doel is gebouwd in je huidige applicatie. Daarmee is die class niet herbruikbaar, maar kan nog steeds wel nuttig zijn op dit moment.
Oké, ik denk dat ik je begrijp!. Zou je alleen nog een voorbeeld willen geven over hoe ik zo'n query-code zou kunnen schrijven.
Wat je beter kan doen is eens wat oude code pakken en 3, 4, 5, misschien nog wel meer stukjes code waarin je een volledige database call uitvoert eruit halen. Zet die onder elkaar, bekijk wat de overeenkomsten zijn en al die overeenkomsten wil je dus in die nieuwe class hebben. Denk daarbij overigens ook aan de verschillen tussen insert/update/delete queries enerzijds en select queries anderzijds.
In principe kan je in 1 methode alles afhandelen, in de praktijk heb ik ervaren dat het handiger is het te splitsen. Ik doe het in 4 (setQuery, setParameters, executeQuery, getResults/getAffectedRows), waarbij er in feite ook nog meerdere opties zijn voor de executeQuery methode, omdat je soms wel resultaten ophaalt en soms dus niet.
Gewijzigd op 16/12/2013 14:43:18 door Erwin H
Oke, dus als ik het goed begrijp, zou ik een sql class moeten maken zodat ik met een paar parameters een hele query uitvoer. Hmmm, ik zal even wat proberen, het klinkt namelijk wel bekend in de oren. Bedankt!