PDO met OOP
Ik ben een beetje bezig OOP te leren.
Nu heb ik een probleempje, ik krijg een variabele niet in een andere function.
Ik kan wel globals gaan gebruiken, maar het lijkt me dat er een andere manier moet zijn.
Heb nu al de hele middag gezocht, zou iemand me kunnen helpen?
B.v.d.
hier mijn code:
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
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
<?php
class connect_db
{
private $host = 'localhost';
private $db = 'database';
private $username = 'root';
private $password = '';
function connect_db()
{
try {
$dbh = new PDO("mysql:host=$this->host;dbname=$this->db", $this->username, $this->password);
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
function output_users()
{
$sql = "SELECT * FROM users";
foreach ($dbh->query($sql) as $row)
{
echo $row['username'] .' - '. $row['password'] . '<br />';
}
}
}
?>
class connect_db
{
private $host = 'localhost';
private $db = 'database';
private $username = 'root';
private $password = '';
function connect_db()
{
try {
$dbh = new PDO("mysql:host=$this->host;dbname=$this->db", $this->username, $this->password);
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
function output_users()
{
$sql = "SELECT * FROM users";
foreach ($dbh->query($sql) as $row)
{
echo $row['username'] .' - '. $row['password'] . '<br />';
}
}
}
?>
Error: Notice: Undefined variable: dbh in C:\wamp\www\Project\includes\classes\database_verbinding.inc.php on line 23
foreach ($dbh->query($sql) as $row)
Zoals je ziet, wordt hier de variabele $dbh gebruikt waarop de functie query wordt aangeroepen. En inderdaad: dat is niet goed. In de voorgaande regels
()
Zie ik nergens een initialisatie van de variabele $dbh. Maar ik zie er wel eentje in de eerste functie (connect_db), die je wellicht wilt gebruiken. In dat geval zul je hem in je object moeten opslaan. Dus misschien moet je er eens $this->dbh van maken op de één of andere manier (hoe, dat laat ik aan jou over).
Code (php)
De stukjes die ik veranderd heb staan hierboven, is dit juist, het werkt tenminste wel, maar is het goed?
En wat nu als ik de databaseconnectie ($dbh) in een andere class wil aanroepen?
Gewijzigd op 01/01/1970 01:00:00 door Jasper Sni
dit eens door, je bent niet echt object georienteerd bezig.
lees http://www.google.nl/search?client=opera&rls=nl&q=php+5+power+programming&sourceid=opera&ie=utf-8&oe=utf-8 lees dit boek effe (ja gratis online te lezen!)
Quote:
En wat nu als ik de databaseconnectie ($dbh) in een andere class wil aanroepen?
Waarom zou je dat niet via één class laten verlopen? Bijvoorbeeld door middel van een singleton-constructie (zie wikipedia).
Maar waarom scheid je de functionaliteit niet meer? Dus dat je één class maakt voor de connectie met de database en de queries. En één class maakt voor de gebruikers (en het ophalen van alle gebruikers e.d.)?
Dat is min of meer het idee van OOP.
Ik heb nu een script voor verwerken van registratie, die checkt of naam nog niet bestaat en of hij tussen 3 en 16 tekens in ligt, meer functies komen nog, is dat idee goed?
hoe moet ik het precies scheiden dan, gewoon alle queries in een include en alle verwerkingen in een include of hoe bedoel je het
dit is mijn Register class:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
abstract class register
{
public function name_exists($name)
{
$user_check = $this->dbh->prepare('SELECT * FROM users WHERE username = "' . $name . '"');
$user_check->execute();
if($user_check->rowCount() > 0)
{
$error = 'Gebruikersnaam reeds in gebruik! <BR />';
return $error;
}
}
public function name_length($name)
{
if(strlen($name) < 4 OR strlen($name) > 16)
{
$error = 'Naam moet minimaal 4 en maximaal 16 tekens bevatten <BR />';
return $error;
}
}
}
?>
abstract class register
{
public function name_exists($name)
{
$user_check = $this->dbh->prepare('SELECT * FROM users WHERE username = "' . $name . '"');
$user_check->execute();
if($user_check->rowCount() > 0)
{
$error = 'Gebruikersnaam reeds in gebruik! <BR />';
return $error;
}
}
public function name_length($name)
{
if(strlen($name) < 4 OR strlen($name) > 16)
{
$error = 'Naam moet minimaal 4 en maximaal 16 tekens bevatten <BR />';
return $error;
}
}
}
?>
Dat boek heb ik ook beetje doorgelezen, staat wel nuttige informatie in, jammer dat het in het engels is, leest wat minder makkelijk door.
Gewijzigd op 01/01/1970 01:00:00 door Jasper Sni
Eén van de manieren om vanuit een class bij een variabele van een andere class te kunnen is overerving. Je zou dus een class user kunnen hebben die een class database extend.
Quote:
Bah, dan kun je op alle user-classes functies gaan aanroepen als query, fetch_values, e.d.Je zou dus een class user kunnen hebben die een class database extend.
Ik zou dan eerder voor singleton gaan die men aan kan roepen. Of een algemene variabele die de database voorstelt, die men overal kan benaderen.
Maar in elk geval zou ik gaan voor een goede scheiding van functionaliteiten.
Waarom is de class register overigens abstract?
Gewijzigd op 01/01/1970 01:00:00 door Jan Willem van der Veer
Abstract class gebruik je alleen als bepaalde functies niet geïmplementeerd zijn. Lijkt op een halve interface
Nu heb ik iets anders, een kolomhead en kolominhoud en ik wil ze bovenin defineren zodat ze automatisch worden weergegeven.
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
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
<?php
class template
{
private static $title = 'Parites - De verliezers gaan van de plank.';
private static $menubar = array('linkje','linkje','linkje','linkje');
private static $kolommen = array('Menu','Opties');
private static $kolomMenu = array('linkje','linkje');
private static $kolomOpties = array('linkje2','linkje2');
function header()
{
echo '<html>
<head>
<title>' . self::$title . '</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<div id="container">
<div id="content">
<div class="status">';
/* Hier tekst voor het blok links van de header */
echo'
</div>
<div id="header">
<a href="#"><img src="images/layout/tutorial_guide.gif" class="tutorial" alt="Tutorial op dit moment nog niet beschikbaar!"></a>
</div>
<ul id="menubar">
';
foreach(self::$menubar as $link)
{
echo '<li><a href="parites.php?id=' . $link . '">' . $link . '</a></li>';
}
echo '
</ul>
<div id="column_wrapper">
';
foreach(self::$kolommen as $kolomhead)
{
echo '
<div id="column_head">' . $kolomhead . '</div>
<div id="column_content">
<ul>
';
foreach(self::$kolom.$kolomhead as $kolominhoud)
{
echo '
<li><a href="parites.php?id=' . $kolominhoud . '">' . $kolominhoud . '</a></li>
';
}
echo'
</ul>
</div>
';
}
echo '
</div>
';
?>
class template
{
private static $title = 'Parites - De verliezers gaan van de plank.';
private static $menubar = array('linkje','linkje','linkje','linkje');
private static $kolommen = array('Menu','Opties');
private static $kolomMenu = array('linkje','linkje');
private static $kolomOpties = array('linkje2','linkje2');
function header()
{
echo '<html>
<head>
<title>' . self::$title . '</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<div id="container">
<div id="content">
<div class="status">';
/* Hier tekst voor het blok links van de header */
echo'
</div>
<div id="header">
<a href="#"><img src="images/layout/tutorial_guide.gif" class="tutorial" alt="Tutorial op dit moment nog niet beschikbaar!"></a>
</div>
<ul id="menubar">
';
foreach(self::$menubar as $link)
{
echo '<li><a href="parites.php?id=' . $link . '">' . $link . '</a></li>';
}
echo '
</ul>
<div id="column_wrapper">
';
foreach(self::$kolommen as $kolomhead)
{
echo '
<div id="column_head">' . $kolomhead . '</div>
<div id="column_content">
<ul>
';
foreach(self::$kolom.$kolomhead as $kolominhoud)
{
echo '
<li><a href="parites.php?id=' . $kolominhoud . '">' . $kolominhoud . '</a></li>
';
}
echo'
</ul>
</div>
';
}
echo '
</div>
';
?>
Nu krijg ik
Fatal error: Access to undeclared static property: template::$kolom
Omdat hij niet zoals in normale PHP, de .$kolomhead niet pakt.
Iemand een idee hoe dit wel moet, of is het echt onmogelijk?
Gewijzigd op 01/01/1970 01:00:00 door Jasper Sni
Daarnaast vind ik: foreach(self::$kolom.$kolomhead as $kolominhoud)
wel een hele vreemde constructie...
Zie bovenstaand.