Query in klasse

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michel de Groot

Michel de Groot

14/07/2009 21:15:00
Quote Anchor link
Beste php-ers,

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)
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
<?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 &raquo;</a></p><span class=\"content_lijntje\">&nbsp;</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\">&nbsp;</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();
?>
 
PHP hulp

PHP hulp

27/12/2024 05:28:07
 
Michel de Groot

Michel de Groot

15/07/2009 21:57:00
Quote Anchor link
Niemand enige commentaar op mijn klasse? Lijkt me sterk dat hij in 1x helemaal goed zou zijn.

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?
 
Rens nvt

Rens nvt

15/07/2009 22:04:00
Quote Anchor link
1) De methodenamen klinken mij wat onlogisch in de oren (NieuwsId geeft een bericht weer????? )
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 :-)
 
GaMer B

GaMer B

15/07/2009 22:09:00
Quote Anchor link
1). Gebruik NOOIT echo in classes
2). Vermijd HTML (vooral opmaak zoals tables en h1) in classes, laat dit liever doen door de designer
 
Rens nvt

Rens nvt

15/07/2009 22:09:00
Quote Anchor link
en je doet geen foutafhandeling van je query's :-)
 
Michel de Groot

Michel de Groot

15/07/2009 22:25:00
Quote Anchor link
@Rens

Wat je bedoelt is dus ongeveer zo iets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

public function __construct($NieuwsId){
        id_instellen("2");
    }


?>


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?
 
Rens nvt

Rens nvt

15/07/2009 22:26:00
Quote Anchor link
Zoiets is beter:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
public function __construct($NieuwsId = null)
{

  if ($NieuwsId !== null)
  {

    $this->id_instellen($NieuwsId);
  }
}

?>

Je bent dan niet verplicht om die parameter mee te geven
 
Michel de Groot

Michel de Groot

15/07/2009 22:34:00
Quote Anchor link
Top dank je wel. Dit werkt weer een stukje makkelijker ja. Mag ik vragen hoe jij dit dan oplost met de fouten die Gamer13 aangeeft?

Met echo gebruiken in een klasse en de output van de query?
 
Rens nvt

Rens nvt

15/07/2009 22:43:00
Quote Anchor link
In het geval van nieuws zou je een class kunnen maken die:
- 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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$nieuws
= new Nieuws();
foreach ($nieuws->getAllMessages() as $message)
{

// hier je opmaak van het bericht
}

foreach ($nieuws->getAllMessages() as $message)
{

// hier een alternatieve opmaak
}
?>

Nog beter is het om het nog verder te scheiden, mocht je dat willen, verdiep je dan in het MVC model...
 
Michel de Groot

Michel de Groot

15/07/2009 23:01:00
Quote Anchor link
Oke dat snap ik dan. Dus dan heb ik alleen de query zeg maar in me class staan. En die moet ik returnen in een array?

Ik heb net een beetje gezocht, maar kom er niet helemaal uit.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}
}

?>
 
Jelmer -

Jelmer -

15/07/2009 23:17:00
Quote Anchor link
Voorbeeldje van hoe je het zou kunnen doen:
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
<?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>';
?>


edit: nog even een find_all voorbeeldje toegevoegd
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Lode

Lode

15/07/2009 23:42:00
Quote Anchor link
in echt OOP gaat het nog een stuk verder denk ik...

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

Jelmer -

15/07/2009 23:52:00
Quote Anchor link
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.
 



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.