webwinkel met oop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Shynn lee

shynn lee

30/12/2010 11:08:35
Quote Anchor link
kan iemand mij helpen met mijn script. Ik krijg niet de juiste waarde uit mysql afgedrukt in (html) tabel. Het tabel (artikel) uit database wordt in mijn pagina webwinkel ivm goed beveiligen via een aparte klasse- include, config, MyDB en artikel aangeroepen.


webpagina:
Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
include("include.php");
$artikel = new Artikel();
$inhoud = $artikel->printArtikelen();

echo $inhoud;
?>


klasse include:
Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    include('config.php');
    require('class.MyDB.php');
    require('class.Artikel.php');
?>


klasse MyDB:
Quote:
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
<?php
class MyDB {
    protected $dbh; // db connection host
    protected $query; // query resultaat

    public function connect() {
    // connectie met de host en tegelijk met 1 vaste database.
    $this -> dbh = mysql_connect(HOST, USERNAME, PASSWORD)
        or die(mysql_error());
    mysql_select_db(DATABASE)
            or die(mysql_error());
    }

    
    public function query($sql) { // runt de query/vraag
    $this->query = mysql_query($sql, $this->dbh);
    if ($this->query)
        return $this->query;
    else {
        if (strlen($sql) < 500)
            echo "<br />query: <br />$sql <p />";
    else
            echo "<br />long query string <br />";
    die("not so good! ".mysql_error());
        }
    }

    
    public function fetch() {
    // retourneert een rij uit de query. Velden alleen opvragen via index, veldnummer.
    return mysql_fetch_row($this->query);
    }

    
    public function fetchArray() {
    // retourneert ook een rij uit de query
    // Velden opvragen via veld nummer of kolomnaam.

    return mysql_fetch_array($this->query);
    }

    
    public function close() {
        mysql_close($this->dbh);
    }

    
    public function doQuery($sql) {
    // runt query en maakt ZELF een connectie met host.
    $this -> connect();
    return $this->query($sql);
    }

    
    // Quote variable to make safe. Voorkomt SQL injectie.
    function quoteSmart($value) {
    // Stripslashes
    if (get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }

    // Quote if not integer
    if (!is_numeric($value)) {
        $value = "'".mysql_real_escape_string($value)."'";
    }

    return $value;
    }
}

?>


klasse artikel
Quote:
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
<?php
class Artikel {

    protected $mydb; // db connection
    
    protected $artikelnummer;
    protected $omschrijving;
    protected $land;
    protected $soort;
    protected $eenheid;
    protected $verpakking;
    protected $verkoopprijs;
    protected $voorraad;
    protected $gereserveerd;
    protected $datumin;
    protected $datumuit;
    protected $prijs;    

    public function load($artikelnummer)
    {

        $sql = "SELECT * FROM artikel";
        $this->mydb->doQuery($sql);
        
        if($artikel = $this->mydb->fetch())
        {

            // artikel object vullen met gegevens uit de database
        }
        $this->mydb->close();
    }

    
    public function printArtikel()
    {

        // artikelinformatie als string retourneren.
        echo "<table border='1'>";
        echo "<tr>
            <th>land</th>
            <th>wijn</th>
            <th>soort</th>
            <th>verpakking</th>
            <th>per eenheid</th>
            <th>aantal</th>
            <th>aantal eenheden</th>
        </tr>"
;
        echo "<tr>
                <td>"
.$this->land."</td>
                <td>"
.$this->omschrijving."</td>
        </tr>"
;
        echo "</table>";
    }
}

?>


In klasse artikel moet ik volgens mij nog artikel object vullen met gegevens uit database. Helaas weet ik niet hoe. Ik heb van alles geprobeerd, wat doe ik hier fout?
Gewijzigd op 30/12/2010 11:12:40 door Shynn lee
 
PHP hulp

PHP hulp

23/11/2024 09:29:29
 
Joren de Wit

Joren de Wit

30/12/2010 11:29:10
Quote Anchor link
De method printArtikelen() bestaat in ieder geval niet in de Artikel klasse. Verder zou ik verwachten dat je ook nog ergens Artikel::load() aan moet roepen om daadwerkelijk een query uit te voeren.

Verder klopt je opzet niet helemaal. De method Artikel::load() accepteert een $artikelnummer maar doet daar verder niets mee. In plaats daarvan worden alle artikelen uit de database geselecteert, maar worden ze niet op de juiste manier gefetched. De klasse Artikel zou moeten resulteren in 1 Artikel object:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$oArtikel
= new Artikel();
$oArtikel->load(1); // Haal artikel 1 op uit de database
?>


Je zult waarschijnlijk nog een extra object willen gebruiken dat allemaal Artikel objecten bevat, dat wordt vaak een Store genoemd. Dus in jouw geval zou je nog een klasse ArtikelStore moeten hebben.

Zowel de Artikel als de ArtikelStore klasse kunnen dan een print() method hebben die de HTML respectievelijk 1 of meerdere artikelen genereert. Let op dat je deze HTML returned en niet echot, je wilt namelijk niets direct vanuit je klasse echoën.

Lees ook eens: OOP beginnershandleiding
 
Shynn lee

shynn lee

30/12/2010 15:28:00
Quote Anchor link
beetje aangepast, maar helaas nog steeds een lege tabel.

Quote:

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
<?php
class Artikel {

    protected $mydb; // db connection
    
    protected $artikelnummer;
    protected $omschrijving;
    protected $land;
    protected $soort;
    protected $eenheid;
    protected $verpakking;
    protected $verkoopprijs;
    protected $voorraad;
    protected $gereserveerd;
    protected $datumin;
    protected $datumuit;
    protected $prijs;    

    public function __construct($artikelnummer = false)
    {
    //  databaseconnectie:
        $this->mydb = new MyDB();
        
        if($artikelnummer)
        {

            $this->load($artikelnummer); // method van Artikel.
        }
        else // alles laden uit de database tabel.
            {
            $sql = "SELECT * FROM artikel";
            $this->mydb->doQuery($sql);
            $this->mydb->close();
        }
    }

    
    public function load($artikelnummer)
    {

        $sql = "SELECT * FROM artikel";
        $this->mydb->doQuery($sql);
        
        if($artikel = $this->mydb->fetch())
        {

            // artikel object vullen met gegevens uit de database
        }
        $this->mydb->close();
    }

    
    public function loadAll()
    {

    $sql = "SELECT * FROM artikel";
    $this->mydb->doQuery($sql);
    $this->mydb->close();
    }
    
    
    public function printArtikel()
    {

        // retourneert de artikelinformatie als string.
        $html = "<table border='1'>";
        $html .= "<tr>
            <th>land</th>
            <th>wijn</th>
            <th>soort</th>
            <th>verpakking</th>
            <th>per eenheid</th>
            <th>aantal</th>
            <th>aantal eenheden</th>
        </tr>
        <tr>
            <td>"
.$this->land. "</td>
            <td>"
.$this->omschrijving."</td>
        </tr>"
;
        $html .= "</table>";
        return $html;
    }
}

?>
Gewijzigd op 30/12/2010 15:28:48 door shynn lee
 
Joren de Wit

Joren de Wit

30/12/2010 15:33:28
Quote Anchor link
In methods load() en loadAll() voer je de query wel uit, maar doe je verder niets met het resultaat ervan. Daar zul je dus nog een fetch method moeten gebruiken en het resultaat moeten returnen of in een property van je klasse moeten zetten. In de printArtikel() method zul je vervolgens die property moeten gebruiken of een van de load methods aan moeten roepen om het resultaat te verkrijgen.

Probeer voor je te zien wat er gebeurt en zelf door je code heen te lopen. Dan zie je vaak vanzelf al waar je variabelen mist. Nog een tip: echo tijdens het debuggen regelmatig wat variabelen om te zien of de inhoud wel klopt...
 
Shynn lee

shynn lee

30/12/2010 15:34:35
Quote Anchor link
Met de onderstaande script heb geen problemen. Graag wil dit omzetten als een aparte klasse. Weet iemand hoe ik het onderstaande kan omzetten als een aparte klasse (vb. class Artikel {} in aparte file?

Quote:
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
<?php
$mydb
= new MyDB();

// Query uitvoeren. Resultaat bewaren in $result.
$sql = "SELECT * FROM artikel";
$result = $mydb->doQuery($sql)
     or die("Fout bij uitvoeren query");

// Resultaat verwerken
echo "<table border='1'>\n";
echo "<tr>";
        echo "<td><strong>land</strong></td>";
        echo "<td><strong>omschrijving</strong></td>";
        echo "<td><strong>soort</strong></td>";
        echo "<td><strong>verpakking</strong></td>";
        echo "<td><strong>eenheid</strong></td>";
        echo "<td><strong>voorraad</strong></td>";
    echo "</tr>";
while ($record = mysql_fetch_assoc($result)) {
    echo "<tr>";
        $artikelnummer = $record['artikelnummer'];
        $land = $record['land'];
        $omschrijving = $record['omschrijving'];
        $soort = $record['soort'];
        $verpakking = $record['verpakking'];
        $eenheid = $record['eenheid'];
        $voorraad = $record['voorraad'];
            echo "<td>$land</td>";
            echo "<td>$omschrijving</td>";
            echo "<td>$soort</td>";
            echo "<td>$verpakking</td>";
            echo "<td>$eenheid</td>";
            echo "<td>$voorraad</td>";
    echo "</tr>";
}

echo "</table>\n";
?>
 
Joren de Wit

Joren de Wit

30/12/2010 16:02:20
Quote Anchor link
Wat is de reden dat je dit om wilt zetten naar een aparte klasse. Die redenatie strookt namelijk niet echt met de denkwijze die achter OOP zit...

Al met al ben je aardig op weg, met de tips die ik je eerder gaf moet je toch een aardig eind verder kunnen komen.
 
Shynn lee

shynn lee

30/12/2010 16:39:56
Quote Anchor link
Met aparte klasse/script wil ik een overzicht blijven behouden. Met één script raak je al snel de overzicht kwijt. Ik heb ook de gevoel dat ik aardig op weg ben, des meer reden ook om het af te maken. Ook is het zo frusterend ;-)
 
Shynn lee

shynn lee

01/01/2011 13:40:56
Quote Anchor link
Topic mag gesloten worden. Het is opgelost. Property moest nog ingevuld worden met gegevens uit de database. Nog bedankt voor het meedenken
 



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.