Query in klasse
Ik ben net begonnen met mijzelf te verdiepen in classes in php. Ik wil graag mijn meest gebruikte query's in een klasse verzamelen zodat ik deze steeds kan hergebruiken bij verschillende klanten.
Nu is mijn vraag eigenlijk of ik op de goede weg ben en wat er eventueel aangepast/verbeterd kan worden aan mijn klasse zodat deze zowel veilig als juist is.
Hierbij ook de klasse zoals ik hem nu heb:
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
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
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
<?php
require("../Config/Variabelen.php");
// Klasse definiëren:
class Nieuws{
// Variabele voor het nieuwsid declareren:
private $NieuwsId;
// Constructor in de stijl van PHP 5
public function __construct(){
$this->NieuwsId;
}
//
public function id_instellen($int){
if(is_numeric($int)){
$this->NieuwsId = $int;
}
}
//
public function AlleNieuws(){
$resultaat = database_query("SELECT * FROM blogs WHERE published='1' ORDER BY id DESC");
while($row = database_fetch_array($resultaat)){
$Titel = TekstUitDatabase($row["titel"]);
$Datum = TekstUitDatabase($row["datum"]);
$Datum = date("d-m-Y H:i", $Datum);
$Tekst = TekstUitDatabase($row["tekst"]);
$Tekst = substr(strip_tags($Tekst), 0, 150)."...";
echo "<h1>".$Titel."</h1><span class=\"datum\">".$Datum."</span><br /><br /><p>".$Tekst."</p><p><a href=\"".GLB_Website."Nieuws/".$row["id"]."/".str_replace(" ", "_", $row["titel"]).".html\">Lees meer »</a></p><span class=\"content_lijntje\"> </span>";
}
}
//
public function NieuwsId(){
if(!isset($this->NieuwsId)){
exit("<br /><b>Fout:</b> Er is geen id meegegeven.<br />");
}
else{
$resultaat = database_query("SELECT * FROM blogs WHERE id = ".$this->NieuwsId."");
while($row = database_fetch_array($resultaat)) {
$Titel = TekstUitDatabase($row["titel"]);
$Tekst2 = TekstUitDatabase($row["tekst"]);
$Tekst1 = nl2br($Tekst2);
$Tekst = ubb(smiley($Tekst1));
$Datum = TekstUitDatabase($row["datum"]);
$Datum = date("d-m-Y H:i", $Datum);
$Bron_naam = TekstUitDatabase($row["bron_naam"]);
$Bron_url = TekstUitDatabase($row["bron_url"]);
$Gebruikersid = TekstUitDatabase($row["poster_id"]);
$Categorie = TekstUitDatabase($row["categorie"]);
$Schrijver = TekstUitDatabase($row["poster"]);
$ReactiesToegestaan = $row["reacties"];
echo "<h1>".$Titel."</h1><span class=\"datum\">".$Datum."</span><br /><br /><p>".$Tekst."</p><span class=\"content_lijntje\"> </span><p>Gepost door: ".$Schrijver." - Bron: <a href=\"".$Bron_url."\">".$Bron_naam."</a><br />Categorie: ".$Categorie."<br /><br />Reacties (".$reactiecount.")</p>";
}
}
}
//
}
Nieuws::AlleNieuws(); // Werkt naar behoren
// Nieuw object maken met de klasse:
$Nieuwsbericht = new Nieuws;
$Nieuwsbericht->id_instellen("2");
$Nieuwsbericht->NieuwsId();
?>
require("../Config/Variabelen.php");
// Klasse definiëren:
class Nieuws{
// Variabele voor het nieuwsid declareren:
private $NieuwsId;
// Constructor in de stijl van PHP 5
public function __construct(){
$this->NieuwsId;
}
//
public function id_instellen($int){
if(is_numeric($int)){
$this->NieuwsId = $int;
}
}
//
public function AlleNieuws(){
$resultaat = database_query("SELECT * FROM blogs WHERE published='1' ORDER BY id DESC");
while($row = database_fetch_array($resultaat)){
$Titel = TekstUitDatabase($row["titel"]);
$Datum = TekstUitDatabase($row["datum"]);
$Datum = date("d-m-Y H:i", $Datum);
$Tekst = TekstUitDatabase($row["tekst"]);
$Tekst = substr(strip_tags($Tekst), 0, 150)."...";
echo "<h1>".$Titel."</h1><span class=\"datum\">".$Datum."</span><br /><br /><p>".$Tekst."</p><p><a href=\"".GLB_Website."Nieuws/".$row["id"]."/".str_replace(" ", "_", $row["titel"]).".html\">Lees meer »</a></p><span class=\"content_lijntje\"> </span>";
}
}
//
public function NieuwsId(){
if(!isset($this->NieuwsId)){
exit("<br /><b>Fout:</b> Er is geen id meegegeven.<br />");
}
else{
$resultaat = database_query("SELECT * FROM blogs WHERE id = ".$this->NieuwsId."");
while($row = database_fetch_array($resultaat)) {
$Titel = TekstUitDatabase($row["titel"]);
$Tekst2 = TekstUitDatabase($row["tekst"]);
$Tekst1 = nl2br($Tekst2);
$Tekst = ubb(smiley($Tekst1));
$Datum = TekstUitDatabase($row["datum"]);
$Datum = date("d-m-Y H:i", $Datum);
$Bron_naam = TekstUitDatabase($row["bron_naam"]);
$Bron_url = TekstUitDatabase($row["bron_url"]);
$Gebruikersid = TekstUitDatabase($row["poster_id"]);
$Categorie = TekstUitDatabase($row["categorie"]);
$Schrijver = TekstUitDatabase($row["poster"]);
$ReactiesToegestaan = $row["reacties"];
echo "<h1>".$Titel."</h1><span class=\"datum\">".$Datum."</span><br /><br /><p>".$Tekst."</p><span class=\"content_lijntje\"> </span><p>Gepost door: ".$Schrijver." - Bron: <a href=\"".$Bron_url."\">".$Bron_naam."</a><br />Categorie: ".$Categorie."<br /><br />Reacties (".$reactiecount.")</p>";
}
}
}
//
}
Nieuws::AlleNieuws(); // Werkt naar behoren
// Nieuw object maken met de klasse:
$Nieuwsbericht = new Nieuws;
$Nieuwsbericht->id_instellen("2");
$Nieuwsbericht->NieuwsId();
?>
Ik heb nog wel 1 vraag waar ik ondertussen tegenaan ben gelopen. Dat is namelijk een query waarbij ik iets in de database wil gaan zetten. Dus met $_POST waardes. Hoe kan ik dit verwerken in de klasse?
2) Je constructor doet nu niets (behalve een variabele declareren die al bestaat). Je kunt deze dus weghalen, of bijvoorbeeld een parameter $nieuwsId meegeven. Op deze manier kun je vanuit je constructor id_instellen al aanroepen... scheelt weer een regeltje bij de aanroep :-)
2). Vermijd HTML (vooral opmaak zoals tables en h1) in classes, laat dit liever doen door de designer
en je doet geen foutafhandeling van je query's :-)
Wat je bedoelt is dus ongeveer zo iets?
Over die namen zoals NieuwsId ben ik het eens. Dat kan ik beter veranderen in Nieuwsbericht of iets dergelijks. En wat betreft foutafhandeling dat kan ik er nog in toevoegen inderdaad.
@GaMer13
Hoe kan ik anders mijn output van de query weergeven zonder dat te echo'en? En hoezo geen html tags gebruiken? Moet die klasse dan alleen uit de query zelf bestaan en de output op de pagina in de website zelf gedaan worden?
Code (php)
Je bent dan niet verplicht om die parameter mee te geven
Met echo gebruiken in een klasse en de output van de query?
- berichten kan opslaan in de database
- berichten kan wijzigen
- berichten kan verwijderen
- lijst met berichten kan ophalen
- enz. enz.
Wanneer je al deze functies in je class stopt, en alleen objecten returnt (bijvoorbeeld een array met nieuwsberichten), dan kun je deze op welke manier dan ook presenteren (HTML). Hiermee kun je de class hergebruiken met een compleet andere opmaak.
Voorbeeldje:
Code (php)
Nog beter is het om het nog verder te scheiden, mocht je dat willen, verdiep je dan in het MVC model...
Ik heb net een beetje gezocht, maar kom er niet helemaal uit.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
public function AlleNieuws(){
$resultaat = database_query("SELECT * FROM blogs WHERE published='1' ORDER BY id DESC");
$Berichten = array();
while($row = database_fetch_array($resultaat)){
$Berichten[TekstUitDatabase($row["titel"]), TekstUitDatabase($row["datum"]), date("d-m-Y H:i", $Datum), TekstUitDatabase($row["tekst"]), substr(strip_tags($Tekst), 0, 150)."..."];
return $Berichten;
}
}
?>
public function AlleNieuws(){
$resultaat = database_query("SELECT * FROM blogs WHERE published='1' ORDER BY id DESC");
$Berichten = array();
while($row = database_fetch_array($resultaat)){
$Berichten[TekstUitDatabase($row["titel"]), TekstUitDatabase($row["datum"]), date("d-m-Y H:i", $Datum), TekstUitDatabase($row["tekst"]), substr(strip_tags($Tekst), 0, 150)."..."];
return $Berichten;
}
}
?>
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
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
class Bericht {
static public function from_array(array $data)
{
$bericht = new self();
$bericht->id = (int) $data['id'];
$bericht->titel = $data['titel'];
$bericht->pubDate = new Date($data['pubdate']);
$bericht->tekst = $data['tekst'];
return $bericht;
}
public $id;
public $titel;
public $pubDate;
public $tekst;
/* Mooier is het om de properties private te maken,
en getters en setters te gebruiken zodat je meer
controle hebt over wat een Bericht-object aan
inhoud kan bevatten. */
}
class Bericht_Store {
private $_pdo;
public function __construct(PDO $pdo)
{
$this->_pdo = $pdo;
}
public function get($id)
{
$stmt = $this->_pdo->prepare("
SELECT
id,
titel,
pubDate,
tekst
FROM
berichten
WHERE
id = :id
");
$stmt->bindParam(':id', $id);
$stmt->execute();
$inhoud = $stmt->fetch(PDO::FETCH_ASSOC);
if(!$inhoud)
return false; // of throw exception, als je verwacht dat Store::get altijd een bericht teruggeeft.
return Bericht::from_array($inhoud);
}
public function find_all()
{
$stmt = $this->_pdo->prepare("
SELECT
id,
titel,
pubDate,
tekst
FROM
berichten
ORDER BY
pubDate DESC
");
$stmt->execute();
$berichten = array();
while($inhoud = $stmt->fetch(PDO::FETCH_ASSOC))
$berichten[] = Bericht::from_array($inhoud);
return $berichten;
}
public function save(Bericht $bericht)
{
// doe iets spannends met een INSERT query, of een UPDATE
}
}
$pdo = new PDO('...');
$store = new Berichten_Store($pdo);
$bericht = $store->get(24);
echo '<h1>' . htmlentities($bericht->titel) . '</h1>';
echo '<p>' . $bericht->tekst .'</p>';
?>
class Bericht {
static public function from_array(array $data)
{
$bericht = new self();
$bericht->id = (int) $data['id'];
$bericht->titel = $data['titel'];
$bericht->pubDate = new Date($data['pubdate']);
$bericht->tekst = $data['tekst'];
return $bericht;
}
public $id;
public $titel;
public $pubDate;
public $tekst;
/* Mooier is het om de properties private te maken,
en getters en setters te gebruiken zodat je meer
controle hebt over wat een Bericht-object aan
inhoud kan bevatten. */
}
class Bericht_Store {
private $_pdo;
public function __construct(PDO $pdo)
{
$this->_pdo = $pdo;
}
public function get($id)
{
$stmt = $this->_pdo->prepare("
SELECT
id,
titel,
pubDate,
tekst
FROM
berichten
WHERE
id = :id
");
$stmt->bindParam(':id', $id);
$stmt->execute();
$inhoud = $stmt->fetch(PDO::FETCH_ASSOC);
if(!$inhoud)
return false; // of throw exception, als je verwacht dat Store::get altijd een bericht teruggeeft.
return Bericht::from_array($inhoud);
}
public function find_all()
{
$stmt = $this->_pdo->prepare("
SELECT
id,
titel,
pubDate,
tekst
FROM
berichten
ORDER BY
pubDate DESC
");
$stmt->execute();
$berichten = array();
while($inhoud = $stmt->fetch(PDO::FETCH_ASSOC))
$berichten[] = Bericht::from_array($inhoud);
return $berichten;
}
public function save(Bericht $bericht)
{
// doe iets spannends met een INSERT query, of een UPDATE
}
}
$pdo = new PDO('...');
$store = new Berichten_Store($pdo);
$bericht = $store->get(24);
echo '<h1>' . htmlentities($bericht->titel) . '</h1>';
echo '<p>' . $bericht->tekst .'</p>';
?>
edit: nog even een find_all voorbeeldje toegevoegd
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
class Lode_Sql_Driver_Mysql{}
class Lode_Sql_Driver_Mysqli{}
class Lode_Sql_Driver_Pdo_Mysql{}
abstract class Lode_Sql_Adapter{}
abstract class Lode_Sql_Adapter_Mysql extends Lode_Sql_Adapter{
public function __construct(Lode_Sql_Driver $driver){}
}
interface Lode_Model_Interface{}
abstract class Lode_Sql_Model implements Lode_Model_Interface{
public function __construct(Lode_Sql_Adapter $adapter)
}
en dan hebben we nog niks eigenlijk... ook results en statements kun je heel goed abstraheren...
Je kan in theorie nog veeeeel verder door abstraheren, maar of je er in de praktijk ook gebruik van gaat maken, of dat je alleen maar overbodig veel complexiteit introduceert... Het ligt eraan waar en waarvoor je programmeert.