Why use OOP?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 5

Robert Deiman

Robert Deiman

07/02/2008 00:15:00
Quote Anchor link
zie onderaan:
klik
 
PHP hulp

PHP hulp

16/04/2024 19:43:56
 
Thijs X

Thijs X

07/02/2008 00:20:00
Quote Anchor link
Robert_Deiman schreef op 07.02.2008 00:15:
zie onderaan:
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)
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
<?php
try{
    echo 'test<br>';
    if(bla) {
        throw new Exception( 'Error: bla' );
    }

    echo 'test2<br>';
    if(bla2) {
        throw new Exception( 'Error: bla2' );
    }

    echo 'test3<br>';
}

catch( Exception $e ) {
    echo $e->getMessage();
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Thijs X
 
Robert Deiman

Robert Deiman

07/02/2008 09:17:00
Quote Anchor link
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.
 
Thijs X

Thijs X

07/02/2008 11:35:00
Quote Anchor link
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.


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.
 
Joren de Wit

Joren de Wit

07/02/2008 17:42:00
Quote Anchor link
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.
Hoezo niet? Je kunt tijdens de controle van alle velden eventuele fouten toch opslaan in een array $aErrors.

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

Robert Deiman

07/02/2008 18:10:00
Quote Anchor link
Ohja, dat kan ook.. Goede tip Blanche!
 
Vincent

Vincent

08/02/2008 12:14:00
Quote Anchor link
Ben ik weer =D
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
if(niks gepost){
 // form
}elseif(niet alles is gepost{
 // hier ga je kijken wat er niet is gepost en je weergeeft het form met bijbehorende error
}else{
 // je roept classe aan
}
?>

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

Crispijn -

08/02/2008 12:19:00
Quote Anchor link
Ik ben wel nieuwsgierig naar je paginanummering 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 ;)
 
Joren de Wit

Joren de Wit

08/02/2008 12:28:00
Quote Anchor link
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.

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

Vincent

08/02/2008 12:47:00
Quote Anchor link
Crispijn hier is 't script, kijk vooral naar hoe je paginanummering nogmaals snel kan aanroepen op je site =) super handig =)
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
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();
}

?>


@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
 
Joren de Wit

Joren de Wit

08/02/2008 13:09:00
Quote Anchor link
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.

Verder zou ik in je constructor nog een aantal default waarden toevoegen, zodat je je klasse ook zonder parameters kunt instantiëren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
    }

?>

En om je klasse dan te instantiëren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Vincent

Vincent

08/02/2008 13:11:00
Quote Anchor link
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 =)
Is ie verder goed?
 
Joren de Wit

Joren de Wit

08/02/2008 13:14:00
Quote Anchor link
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.

Je hoeft dus niet voor elke bewerking een aparte try/catch constructie te gebruiken.
 
Vincent

Vincent

08/02/2008 13:31:00
Quote Anchor link
Script geupdate =D
Is ie nu goed?
 
Joren de Wit

Joren de Wit

08/02/2008 13:49:00
Quote Anchor link
Regel 26: Het berekenen van het startbericht kan eleganter:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$paginares
= $this->aantal_per_pagina * ($this->pagina - 1);
?>

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

Vincent

08/02/2008 14:30:00
Quote Anchor link
Oke, veranderingen ga ik doorvoeren, ze zijn te zien wanneer ik hem opnieuw post met reageer morgelijkheid
 
Joren de Wit

Joren de Wit

08/02/2008 14:38:00
Quote Anchor link
Ik ben benieuwd ;-)
 

Pagina: « vorige 1 2 3 4 5



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.