Why use OOP?
zie onderaan:
Run deze code eens en je zult zien dat er maar 1x geechoed word. Zodra de eerste Exception word gethrowed gebeurd er niks meer in het script.
Naja, bedankt in elk geval.. Dan maar een oplossing met arrays in zo'n geval. Hmm, maar als je dan met try/ catch een form afhandeling maakt, dan gaat het niet meer zoals je dat wil, namelijk dat je alle meldingen te zien krijgt.
Nee dat klopt dat is ook wel jammer ja. Heb mijn OOP Formulier script geupdate nu ook met een Validator:
http://www.phphulp.nl/php/scripts/4/1215/
Daar maak ik alleen gebruik van Exceptions bij invoers fouten van de classes en verder gewoon een array met invoer fouten van de bezoeker van de pagina.
Vervolgens check je na alle controles of deze array gevuld is. Zo ja, gooi je een Exception met de foutmelding(en), zo niet ga je gewoon verder met je script...
Paginanummeringsysteem is af nu ben ik gaa nadenken over het reactiesysteem maar waarom moet dat een aparte classe zijn ik zat namelijk zo te denken:
In het php gedeelte ga zet je het form neer en het invul gedeelte:
Dan hoef je eigenlijk in die classe maar 1 functie te hebben die alles invoert en vervolgens wordt op het beeldscherm weergeven dat je bericht is toegevoegd.
Waarom dan per se een aparte classe? Ben ik weer =D
Volgens mij kan je beter een andere classe maken omdat deze dan universeel zou kunnen zijn voor al je formulieren die je later gaat posten. Kijk bijvoorbeeld eens naar het OOP formulier van Jan Koehoorn
Maar ik ben geen specialist hoor! ;) het definitieve antwoord laat ik over aan de guru's ;) Ik ben wel nieuwsgierig naar je paginanummering Vincent!
Wat je wél zou kunnen doen, is een aparte klasse 'Bericht' aanmaken. Een instantie van deze klasse bevat dan alle gegevens over 1 bepaald bericht en zou methodes kunnen bevatten om bijvoorbeeld de auteur of inhoud van het bericht te wijzigen.
Maar dat neemt nog niet weg dat je in je Gastenboek klasse nog steeds een methode moet hebben om nieuwe berichten toe te voegen. Enkel maak je in deze methode nu eerste een nieuwe instantie van de klasse Bericht aan. Nee, je gaat uiteraard geen aparte klasse maken voor het toevoegen van berichten. Dit is namelijk een bewerking op je gastenboek en zal dus als methode in je gastenboek klasse komen te zitten.
@Blanche: Oke, dat is dan duidelijk =) dat scheeld weer een breinbreker, aangezien ik in dit script geen aanpas en admin gedoe ga maken kan ik dus werken met 1 classe =)
Crispijn hier is 't script, kijk vooral naar hoe je paginanummering nogmaals snel kan aanroepen op je site =) super handig =)
Verder zou ik in je constructor nog een aantal default waarden toevoegen, zodat je je klasse ook zonder parameters kunt instantiëren:
En om je klasse dan te instantiëren:
Ik mis nog een member waarin je het aantal berichten per pagina specificeert? Dat is een eigenschap van je gastenboek, dus daar zou je een class member voor moeten gebruiken.
Is ie verder goed? Ik had het aantal berichten erin verwerkt om later aan te passen maar vergeten.. voortaan doe ik dat soort dingen gewoon in het begin ik zou de aanpassen hier ff doorvoeren en dan mn vorige bericht editen =)
Je hoeft dus niet voor elke bewerking een aparte try/catch constructie te gebruiken. Je hebt in principe in het uitvoerscript maar 1 try/catch constructie nodig. In de try zet je gewoon je hele script, dus alle bewerkingen achter elkaar. Ten slotte sluit je af met een reeks catch-statements waarmee je alle mogelijke Exceptions die in je try kunnen optreden, afvangt.
Is ie nu goed? Script geupdate =D
verder moet je bij de limit in die query natuurlijk wel je class member opgeven in plaats van de 15 die er nu staat.
Regel 32: gebruik hier de fetchAll() methode van PDO. Deze doet precies hetzelfde als jouw foreach loop ;-)
Regel 39: ik zou met die num_rows() methode het aantal berichten wegschrijven naar een member in je klasse en deze methode vervolgens in je constructor aanroepen. Op deze manier voorkom je dat de query meerdere keren uitgevoerd wordt bij bijvoorbeeld het weergeven en het creëren van de paginanummering. In deze methoden kun je dan gebruik maken van de betreffende member.
Regel 48: in je pagina_nummering() methode ga je in de array $gegevens al HTML opnemen. Je legt dus in feit al deels vast welke urls en layout je hier voor moet gebruiken. Dit is iets dat je door je template engine moet laten bepalen. Probeer je klasse dus alleen de informatie te laten teruggeven die echt nodig is. In jouw geval dus waarschijnlijk een array met paginanummers en eventueel wat informatie over huidige, volgende, vorige, eerste en laatste pagina. Regel 26: Het berekenen van het startbericht kan eleganter:
Robert_Deiman schreef op 07.02.2008 00:15:
zie onderaan:
klik
klik
Quote:
Als je echter netjes met een catch blok de exception afvangt, loopt het script gewoon netjes door. Het afvangen van de fout zou bij wijze van spreken pas honderden regels code later gebeuren, zonder dat de rest van het script daar hinder van ondervindt.
Run deze code eens en je zult zien dat er maar 1x geechoed word. Zodra de eerste Exception word gethrowed gebeurd er niks meer in het script.
Code (php)
Gewijzigd op 01/01/1970 01:00:00 door Thijs X
Naja, bedankt in elk geval.. Dan maar een oplossing met arrays in zo'n geval.
Robert_Deiman schreef op 07.02.2008 09:17:
Hmm, maar als je dan met try/ catch een form afhandeling maakt, dan gaat het niet meer zoals je dat wil, namelijk dat je alle meldingen te zien krijgt.
Naja, bedankt in elk geval.. Dan maar een oplossing met arrays in zo'n geval.
Naja, bedankt in elk geval.. Dan maar een oplossing met arrays in zo'n geval.
Nee dat klopt dat is ook wel jammer ja. Heb mijn OOP Formulier script geupdate nu ook met een Validator:
http://www.phphulp.nl/php/scripts/4/1215/
Daar maak ik alleen gebruik van Exceptions bij invoers fouten van de classes en verder gewoon een array met invoer fouten van de bezoeker van de pagina.
Robert_Deiman schreef op 07.02.2008 09:17:
Hoezo niet? Je kunt tijdens de controle van alle velden eventuele fouten toch opslaan in een array $aErrors. Hmm, maar als je dan met try/ catch een form afhandeling maakt, dan gaat het niet meer zoals je dat wil, namelijk dat je alle meldingen te zien krijgt.
Vervolgens check je na alle controles of deze array gevuld is. Zo ja, gooi je een Exception met de foutmelding(en), zo niet ga je gewoon verder met je script...
Ohja, dat kan ook.. Goede tip Blanche!
Paginanummeringsysteem is af nu ben ik gaa nadenken over het reactiesysteem maar waarom moet dat een aparte classe zijn ik zat namelijk zo te denken:
In het php gedeelte ga zet je het form neer en het invul gedeelte:
Code (php)
Dan hoef je eigenlijk in die classe maar 1 functie te hebben die alles invoert en vervolgens wordt op het beeldscherm weergeven dat je bericht is toegevoegd.
Waarom dan per se een aparte classe?
Gewijzigd op 01/01/1970 01:00:00 door Vincent
Volgens mij kan je beter een andere classe maken omdat deze dan universeel zou kunnen zijn voor al je formulieren die je later gaat posten. Kijk bijvoorbeeld eens naar het OOP formulier van Jan Koehoorn
Maar ik ben geen specialist hoor! ;) het definitieve antwoord laat ik over aan de guru's ;)
Wat je wél zou kunnen doen, is een aparte klasse 'Bericht' aanmaken. Een instantie van deze klasse bevat dan alle gegevens over 1 bepaald bericht en zou methodes kunnen bevatten om bijvoorbeeld de auteur of inhoud van het bericht te wijzigen.
Maar dat neemt nog niet weg dat je in je Gastenboek klasse nog steeds een methode moet hebben om nieuwe berichten toe te voegen. Enkel maak je in deze methode nu eerste een nieuwe instantie van de klasse Bericht aan.
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php
class gastenboek
{
protected $pagina;
protected $aantal_paginas;
protected $db;
protected $aantal_per_pagina;
public function __construct($pagina = 1, $aantal_per_pagina = 10)
{
$this->pagina = $pagina;
$this->aantal_per_pagina = $aantal_per_pagina;
$this->connectie();
}
protected function connectie(){
$this->db = new PDO('pgsql:host=sterretjes;dbname=sterretjes', 'sterretjes', 'sterretjes');
}
public function weergeven()
{
if($this->num_rows() == 0){
throw new Exception( 'Er zijn nog geen berichten ingevoerd.' );
}else{
$paginares = ($this->aantal_per_pagina * $this->pagina)-$this->aantal_per_pagina;
$this->sql = "SELECT *
FROM berichten
LIMIT 15 OFFSET ".$paginares."
";
$this->gegevens = $this->db->query($this->sql);
foreach($this->gegevens as $fetch){
$berichten[] = $fetch;
}
return $berichten;
}
}
public function num_rows()
{
$this->sql = "SELECT count(id) AS aantal FROM berichten";
$this->results = $this->db->query($this->sql);
foreach($this->results as $row){
return $row['aantal'];
}
}
public function pagina_nummering()
{
$aantal = $this->num_rows();
$vorige = $this->pagina-1;
if ($this->pagina > 1 && $aantal > $this->aantal_per_pagina){
$this->gegevens['vorige'] = "[<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$vorige."&berichten=".$this->aantal_per_pagina."\">Vorige</a>]\n";
} else {
$this->gegevens['vorige'] = "[Vorige]\n";
}
$pages = $aantal / $this->aantal_per_pagina;
for($i=1;$i<=ceil($pages);$i++){
if($i == $this->pagina){
$this->gegevens[$i] = "<strong>[<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$i."&berichten=".$this->aantal_per_pagina."\">".$i."</a>]</strong>\n";
}else{
$this->gegevens[$i] = "<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$i."&berichten=".$this->aantal_per_pagina."\">".$i."</a>\n";
}
}
$volgende = $this->pagina+1;
if ($this->pagina < $pages){
$this->gegevens['volgende'] = "[<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$volgende."&berichten=".$this->aantal_per_pagina."\">Volgende</a>]\n";
} else {
$this->gegevens['volgende'] = "[Volgende]\n";
}
return $this->gegevens;
}
}
try
{
if(!empty($_GET['pagina']) && ctype_digit($_GET['pagina']) && !empty($_GET['berichten']) && ctype_digit($_GET['berichten'])){
$gastenboek = new gastenboek($_GET['pagina'], $_GET['berichten']); // de classe aanmaken
}elseif(!empty($_GET['pagina']) && ctype_digit($_GET['pagina'])){
$gastenboek = new Gastenboek($_GET['pagina'], 25);
}elseif(!empty($_GET['berichten']) && ctype_digit($_GET['berichten'])){
$gastenboek = new Gastenboek(1, $_GET['berichten']);
}else{
$gastenboek = new Gastenboek(1, 25);
}
$pngegevens = $gastenboek->pagina_nummering(); // dit is de pagina nummering
echo $pngegevens['vorige'];
for($i=1;array_key_exists($i, $pngegevens);$i++){
echo $pngegevens[$i];
}
echo $pngegevens['volgende'];
echo "<br /><br />";
$gegevens = $gastenboek->weergeven(); // hier weergeef je de berichten
if(!empty($gegevens)){
foreach($gegevens as $gegevens_naar_browser){
echo "
ID ".$gegevens_naar_browser['id']."#<br />
Door: <a href=\"mailto:".$gegevens_naar_browser['email']."\">".$gegevens_naar_browser['naam']."</a>
Op: ".$gegevens_naar_browser['datum']."<br />
Bericht: <br />".nl2br($gegevens_naar_browser['bericht'])."
<br /><br />
";
}
}
echo $pngegevens['vorige']; // hier nogmaals paginanummering maar dan onderaan pagina, kost bijna geen extra reken tijd
// want je hoeft niet opnieuw $pngegevens = $gastenboek->pagina_nummering(); aan te roepen dus ook niet de query
for($i=1;array_key_exists($i, $pngegevens);$i++){
echo $pngegevens[$i];
}
echo $pngegevens['volgende'];
echo "<br /><br />";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
catch( Exception $e )
{
echo $e->getMessage();
}
?>
class gastenboek
{
protected $pagina;
protected $aantal_paginas;
protected $db;
protected $aantal_per_pagina;
public function __construct($pagina = 1, $aantal_per_pagina = 10)
{
$this->pagina = $pagina;
$this->aantal_per_pagina = $aantal_per_pagina;
$this->connectie();
}
protected function connectie(){
$this->db = new PDO('pgsql:host=sterretjes;dbname=sterretjes', 'sterretjes', 'sterretjes');
}
public function weergeven()
{
if($this->num_rows() == 0){
throw new Exception( 'Er zijn nog geen berichten ingevoerd.' );
}else{
$paginares = ($this->aantal_per_pagina * $this->pagina)-$this->aantal_per_pagina;
$this->sql = "SELECT *
FROM berichten
LIMIT 15 OFFSET ".$paginares."
";
$this->gegevens = $this->db->query($this->sql);
foreach($this->gegevens as $fetch){
$berichten[] = $fetch;
}
return $berichten;
}
}
public function num_rows()
{
$this->sql = "SELECT count(id) AS aantal FROM berichten";
$this->results = $this->db->query($this->sql);
foreach($this->results as $row){
return $row['aantal'];
}
}
public function pagina_nummering()
{
$aantal = $this->num_rows();
$vorige = $this->pagina-1;
if ($this->pagina > 1 && $aantal > $this->aantal_per_pagina){
$this->gegevens['vorige'] = "[<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$vorige."&berichten=".$this->aantal_per_pagina."\">Vorige</a>]\n";
} else {
$this->gegevens['vorige'] = "[Vorige]\n";
}
$pages = $aantal / $this->aantal_per_pagina;
for($i=1;$i<=ceil($pages);$i++){
if($i == $this->pagina){
$this->gegevens[$i] = "<strong>[<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$i."&berichten=".$this->aantal_per_pagina."\">".$i."</a>]</strong>\n";
}else{
$this->gegevens[$i] = "<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$i."&berichten=".$this->aantal_per_pagina."\">".$i."</a>\n";
}
}
$volgende = $this->pagina+1;
if ($this->pagina < $pages){
$this->gegevens['volgende'] = "[<a href=\"".$_SERVER['PHP_SELF']."?pagina=".$volgende."&berichten=".$this->aantal_per_pagina."\">Volgende</a>]\n";
} else {
$this->gegevens['volgende'] = "[Volgende]\n";
}
return $this->gegevens;
}
}
try
{
if(!empty($_GET['pagina']) && ctype_digit($_GET['pagina']) && !empty($_GET['berichten']) && ctype_digit($_GET['berichten'])){
$gastenboek = new gastenboek($_GET['pagina'], $_GET['berichten']); // de classe aanmaken
}elseif(!empty($_GET['pagina']) && ctype_digit($_GET['pagina'])){
$gastenboek = new Gastenboek($_GET['pagina'], 25);
}elseif(!empty($_GET['berichten']) && ctype_digit($_GET['berichten'])){
$gastenboek = new Gastenboek(1, $_GET['berichten']);
}else{
$gastenboek = new Gastenboek(1, 25);
}
$pngegevens = $gastenboek->pagina_nummering(); // dit is de pagina nummering
echo $pngegevens['vorige'];
for($i=1;array_key_exists($i, $pngegevens);$i++){
echo $pngegevens[$i];
}
echo $pngegevens['volgende'];
echo "<br /><br />";
$gegevens = $gastenboek->weergeven(); // hier weergeef je de berichten
if(!empty($gegevens)){
foreach($gegevens as $gegevens_naar_browser){
echo "
ID ".$gegevens_naar_browser['id']."#<br />
Door: <a href=\"mailto:".$gegevens_naar_browser['email']."\">".$gegevens_naar_browser['naam']."</a>
Op: ".$gegevens_naar_browser['datum']."<br />
Bericht: <br />".nl2br($gegevens_naar_browser['bericht'])."
<br /><br />
";
}
}
echo $pngegevens['vorige']; // hier nogmaals paginanummering maar dan onderaan pagina, kost bijna geen extra reken tijd
// want je hoeft niet opnieuw $pngegevens = $gastenboek->pagina_nummering(); aan te roepen dus ook niet de query
for($i=1;array_key_exists($i, $pngegevens);$i++){
echo $pngegevens[$i];
}
echo $pngegevens['volgende'];
echo "<br /><br />";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
catch( Exception $e )
{
echo $e->getMessage();
}
?>
@Blanche: Oke, dat is dan duidelijk =) dat scheeld weer een breinbreker, aangezien ik in dit script geen aanpas en admin gedoe ga maken kan ik dus werken met 1 classe =)
Edit:
script veranderd
Gewijzigd op 01/01/1970 01:00:00 door Vincent
Verder zou ik in je constructor nog een aantal default waarden toevoegen, zodat je je klasse ook zonder parameters kunt instantiëren:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
public function __construct($pagina = 1, $aantal_per_pagina = 10)
{
$this->pagina = $pagina;
$this->aantal_per_pagina = $aantal_per_pagina;
$this->connectie();
}
?>
public function __construct($pagina = 1, $aantal_per_pagina = 10)
{
$this->pagina = $pagina;
$this->aantal_per_pagina = $aantal_per_pagina;
$this->connectie();
}
?>
En om je klasse dan te instantiëren:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// Met parameters
// Pagina 2 en 25 berichten per pagina:
$oGastenboek = new Gastenboek(2, 25)
// Met default waarden:
$oGastenboek = new Gastenboek();
?>
// Met parameters
// Pagina 2 en 25 berichten per pagina:
$oGastenboek = new Gastenboek(2, 25)
// Met default waarden:
$oGastenboek = new Gastenboek();
?>
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Is ie verder goed?
Je hoeft dus niet voor elke bewerking een aparte try/catch constructie te gebruiken.
Is ie nu goed?
verder moet je bij de limit in die query natuurlijk wel je class member opgeven in plaats van de 15 die er nu staat.
Regel 32: gebruik hier de fetchAll() methode van PDO. Deze doet precies hetzelfde als jouw foreach loop ;-)
Regel 39: ik zou met die num_rows() methode het aantal berichten wegschrijven naar een member in je klasse en deze methode vervolgens in je constructor aanroepen. Op deze manier voorkom je dat de query meerdere keren uitgevoerd wordt bij bijvoorbeeld het weergeven en het creëren van de paginanummering. In deze methoden kun je dan gebruik maken van de betreffende member.
Regel 48: in je pagina_nummering() methode ga je in de array $gegevens al HTML opnemen. Je legt dus in feit al deels vast welke urls en layout je hier voor moet gebruiken. Dit is iets dat je door je template engine moet laten bepalen. Probeer je klasse dus alleen de informatie te laten teruggeven die echt nodig is. In jouw geval dus waarschijnlijk een array met paginanummers en eventueel wat informatie over huidige, volgende, vorige, eerste en laatste pagina.
Oke, veranderingen ga ik doorvoeren, ze zijn te zien wanneer ik hem opnieuw post met reageer morgelijkheid
Ik ben benieuwd ;-)