webwinkel met oop
webpagina:
Quote:
klasse include:
Quote:
klasse MyDB:
Quote:
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
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;
}
}
?>
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)
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
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>";
}
}
?>
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
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)
1
2
3
4
2
3
4
<?php
$oArtikel = new Artikel();
$oArtikel->load(1); // Haal artikel 1 op uit de database
?>
$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
Quote:
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
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;
}
}
?>
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
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...
Quote:
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
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";
?>
$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";
?>
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.
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 ;-)
Topic mag gesloten worden. Het is opgelost. Property moest nog ingevuld worden met gegevens uit de database. Nog bedankt voor het meedenken