Object in meerdere files gebruiken
Ik zit hier met een probleem waar ik na lang zoeken niet uitkom.
Ik ben bezig met een systeem wat ik heb opgebouwd in php. Nu wil ik dit gaan koppelen aan klassen.
Ik heb het volgende aan files:
- database.class.php
- user.class.php
- config.php
- functions.php
- login.php
- index.php
Wat ik wil is dat op het moment een gebruiker inlogd de klasse user wordt aangemaakt en opgevuld met user gegevens.
Vervolgens wil ik dit object op bijv. index.php weer kunnen opvragen en bevragen.
Ik heb in beide klassen gebruik gemaakt van de singleton methode
Het object aanmaken en invullen lukt maar als ik het object op de andere pagina opvraag is deze leeg.
Hoe kan ik dit oplossen?
Database 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
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<?php
include 'config.php';
# Made by Mitch Vroege 2005
# Versie 0.6.2
# Class database
class database
{
# Database connectie variabele
private $db;
private static $instance;
function __construct()
{
$this->connect();
$this->select_db();
}
static function get_instancee()
{
if ( ! isset(self::$instance) )
self::$instance = new database();
return self::$instance;
}
# Constructor
function connect()
{
# Connectie leggen
$this->db = mysql_connect( DB_HOST, DB_USERNAME, DB_PASSWORD );
# Kijken of de connectie gelukt is, en of de database geselecteerd kon worden
if( !$this->db )
{
die( 'Geen connectie..');
}
//elseif(!mysql_select_db( $database, $this->db ) )
//{
//$this->run_query('CREATE DATABASE IF NOT EXISTS '. $database);
//mysql_select_db($database, $this->db);
//include('install.php');
//createTables($this->db);
//}
return $this->db;
}
function select_db(){
if(!$this->db || !mysql_select_db(DB_NAME, $this->db))
{
return false;
die('Db does not exist');
}
return true;
}
# Query resultaat variabele
private $res;
# Functie die mysql_num_rows teruggeeft
function num_rows( $sql = NULL )
{
# Kijken of er een query meegegeven is, zo ja uitvoeren
if( $sql != NULL )
$this->run_query( $sql );
# Mysql_num_rows uitspugen
return mysql_num_rows( $this->res );
}
# Functie die mysql_fetch_array teruggeeft
function get_array( $sql = NULL, $refetch = false )
{
# Kijken of er een query meegegeven is, zo ja uitvoeren
if( $sql != NULL )
$this->run_query( $sql );
# Kijken of refetch is meegegeven
if( $refetch == true )
mysql_data_seek( $this->res, 0 );
# Loopje door alle resultaten
// while( $row = mysql_fetch_array( $this->res ) )
// $rows[] = $row;
# Array met rows uitspugen
return mysql_fetch_array( $this->res );
}
# Functie die mysql_insert_id teruggeeft
function insert_id( $sql = NULL )
{
# Kijken of er een query meegegeven is, zo ja uitvoeren
if( $sql != NULL )
$this->run_query( $sql );
# Mysql_insert_id uitspugen
return mysql_insert_id( $this->db );
}
# Functie die mysql_affected_rows teruggeeft
function affected_rows( $sql = NULL )
{
# Kijken of er een query meegegeven is, zo ja uitvoeren
if( $sql != NULL )
$this->run_query( $sql );
# Mysql_affected_rows uitspugen
return mysql_affected_rows( $this->db );
}
# Functie die kijkt of $table in $database bestaat, zoja 'true', zo nee, 'false'
function find_table( $table, $database )
{
# Tabellen opvragen
$this->res = mysql_list_tables( $database, $this->db );
# Tabellen in een array proppen
$data = $this->get_array( );
if($data != null)
# Return true
return in_array( $table, $data );
# Return flase
else
return FALSE;
}
# Functie die de query uitvoert
function run_query( $sql )
{
//var_dump($sql);
# Query uitvoeren en het resultaat wegschrijven in de $res var
$this->res = mysql_query( $sql, $this->db );
# Kijken of het een geldige query is
if( !$this->res )
die( 'De opgegeven query is onjuist!' );
}
# Functie die de verbinding sluit & $res leegt
function database_close( )
{
# $res legen
if( !@mysql_free_result( $this->res ) )
unset( $this->res );
# Verbinding sluiten
mysql_close( $this->db );
}
}
# Class database destructor
function destruct( $name )
{
# Referentie naar object $name meegeven aan $db
$db = &$GLOBALS[$name];
# Database afsluiten
$db->database_close( );
# Object verwijderen
unset( $GLOBALS[$name] );
}
?>
include 'config.php';
# Made by Mitch Vroege 2005
# Versie 0.6.2
# Class database
class database
{
# Database connectie variabele
private $db;
private static $instance;
function __construct()
{
$this->connect();
$this->select_db();
}
static function get_instancee()
{
if ( ! isset(self::$instance) )
self::$instance = new database();
return self::$instance;
}
# Constructor
function connect()
{
# Connectie leggen
$this->db = mysql_connect( DB_HOST, DB_USERNAME, DB_PASSWORD );
# Kijken of de connectie gelukt is, en of de database geselecteerd kon worden
if( !$this->db )
{
die( 'Geen connectie..');
}
//elseif(!mysql_select_db( $database, $this->db ) )
//{
//$this->run_query('CREATE DATABASE IF NOT EXISTS '. $database);
//mysql_select_db($database, $this->db);
//include('install.php');
//createTables($this->db);
//}
return $this->db;
}
function select_db(){
if(!$this->db || !mysql_select_db(DB_NAME, $this->db))
{
return false;
die('Db does not exist');
}
return true;
}
# Query resultaat variabele
private $res;
# Functie die mysql_num_rows teruggeeft
function num_rows( $sql = NULL )
{
# Kijken of er een query meegegeven is, zo ja uitvoeren
if( $sql != NULL )
$this->run_query( $sql );
# Mysql_num_rows uitspugen
return mysql_num_rows( $this->res );
}
# Functie die mysql_fetch_array teruggeeft
function get_array( $sql = NULL, $refetch = false )
{
# Kijken of er een query meegegeven is, zo ja uitvoeren
if( $sql != NULL )
$this->run_query( $sql );
# Kijken of refetch is meegegeven
if( $refetch == true )
mysql_data_seek( $this->res, 0 );
# Loopje door alle resultaten
// while( $row = mysql_fetch_array( $this->res ) )
// $rows[] = $row;
# Array met rows uitspugen
return mysql_fetch_array( $this->res );
}
# Functie die mysql_insert_id teruggeeft
function insert_id( $sql = NULL )
{
# Kijken of er een query meegegeven is, zo ja uitvoeren
if( $sql != NULL )
$this->run_query( $sql );
# Mysql_insert_id uitspugen
return mysql_insert_id( $this->db );
}
# Functie die mysql_affected_rows teruggeeft
function affected_rows( $sql = NULL )
{
# Kijken of er een query meegegeven is, zo ja uitvoeren
if( $sql != NULL )
$this->run_query( $sql );
# Mysql_affected_rows uitspugen
return mysql_affected_rows( $this->db );
}
# Functie die kijkt of $table in $database bestaat, zoja 'true', zo nee, 'false'
function find_table( $table, $database )
{
# Tabellen opvragen
$this->res = mysql_list_tables( $database, $this->db );
# Tabellen in een array proppen
$data = $this->get_array( );
if($data != null)
# Return true
return in_array( $table, $data );
# Return flase
else
return FALSE;
}
# Functie die de query uitvoert
function run_query( $sql )
{
//var_dump($sql);
# Query uitvoeren en het resultaat wegschrijven in de $res var
$this->res = mysql_query( $sql, $this->db );
# Kijken of het een geldige query is
if( !$this->res )
die( 'De opgegeven query is onjuist!' );
}
# Functie die de verbinding sluit & $res leegt
function database_close( )
{
# $res legen
if( !@mysql_free_result( $this->res ) )
unset( $this->res );
# Verbinding sluiten
mysql_close( $this->db );
}
}
# Class database destructor
function destruct( $name )
{
# Referentie naar object $name meegeven aan $db
$db = &$GLOBALS[$name];
# Database afsluiten
$db->database_close( );
# Object verwijderen
unset( $GLOBALS[$name] );
}
?>
User 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
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
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
<?php
class user
{
var $userId;
var $studentCode;
var $username;
var $klas;
var $rol;
var $active;
var $cursus;
static private $instance;
var $db;
function __construct()
{
$this->db = database::get_instancee();
}
static function get_instance()
{
if ( ! isset(user::$instance) )
user::$instance = new user();
return user::$instance;
}
function create_instance()
{
user::$instance = new user();
}
function test()
{
$this->cursus = array();
$this->studentCode = $data['StudentCode'];
$this->username = $data['Naam'];
$this->klas = $this->getKlas();
//echo $this->klas;
$this->rol = $data['Rol'];
$this->Active = $data['Active'];
}
function getUserData()
{
$this->db->run_query("SELECT * FROM users WHERE UserId = 1");
while ($row = $this->db->get_array())
{
echo $row['Naam'];
}
}
function getCursus()
{
$this->db->run_query("SELECT * FROM cursus, klas, users WHERE klas.KlasId = users.Klas AND klas.KlasId = cursus.Klas AND users.UserId = '".$this->getUserId()."'");
while ($row = $this->db->get_array())
{
$cursus[] = $row['CursusNaam'];
echo $row['CursusNaam'];
}
}
function getKlas()
{
$this->db->run_query("SELECT klas.KlasNaam FROM users, klas WHERE users.UserId = 1 AND users.Klas = klas.KlasId");
$data = $this->db->get_array();
$klas = $data['KlasNaam'];
return $klas;
}
function getUserId()
{
return $this->userId;
}
function setUserId($userId)
{
$this->userId = $userId;
}
}
?>
class user
{
var $userId;
var $studentCode;
var $username;
var $klas;
var $rol;
var $active;
var $cursus;
static private $instance;
var $db;
function __construct()
{
$this->db = database::get_instancee();
}
static function get_instance()
{
if ( ! isset(user::$instance) )
user::$instance = new user();
return user::$instance;
}
function create_instance()
{
user::$instance = new user();
}
function test()
{
$this->cursus = array();
$this->studentCode = $data['StudentCode'];
$this->username = $data['Naam'];
$this->klas = $this->getKlas();
//echo $this->klas;
$this->rol = $data['Rol'];
$this->Active = $data['Active'];
}
function getUserData()
{
$this->db->run_query("SELECT * FROM users WHERE UserId = 1");
while ($row = $this->db->get_array())
{
echo $row['Naam'];
}
}
function getCursus()
{
$this->db->run_query("SELECT * FROM cursus, klas, users WHERE klas.KlasId = users.Klas AND klas.KlasId = cursus.Klas AND users.UserId = '".$this->getUserId()."'");
while ($row = $this->db->get_array())
{
$cursus[] = $row['CursusNaam'];
echo $row['CursusNaam'];
}
}
function getKlas()
{
$this->db->run_query("SELECT klas.KlasNaam FROM users, klas WHERE users.UserId = 1 AND users.Klas = klas.KlasId");
$data = $this->db->get_array();
$klas = $data['KlasNaam'];
return $klas;
}
function getUserId()
{
return $this->userId;
}
function setUserId($userId)
{
$this->userId = $userId;
}
}
?>
Gewijzigd op 24/05/2013 12:14:15 door Trinco ingels
Globals -> EVIL!
Nu zijn dit allebij meningen, maar je zal snel de problemen ervaren. Probeer eens uit te leggen waarom je gebruik maakt van singletons en globals.
Daarnaast is er nog veel meer te verbeteren aan de code, zoals het gebruik maken van de juiste visibility in je classes. Zolang je niets meegeeft is alles per definitie public.
Anyway, wat uit deze stukken code niet duidelijk is is hoe je met de variabele omgaat waarin het user object zich bevindt. Een object kan je gewoon zien als een variabele en moet je dus gewoon van de ene functie aan de andere doorgeven.
Vandaar ook de slordige code
Maargoed ik heb een file login.php op het moment dat een gebruiker inlogd moet er na een tal van controles een object aangemaakt worden met de user gegevens.
Onderstaand een simpele weergave.
Code (php)
Na het inloggen wordt de gebruiker doorgestuurd naar de index.php
waar ik bijvoorbeeld de userid wil presenteren.
Maar onderstaand werkt dus niet.
Ook weer een versimpelde weergave
Hoe kan ik er voor zorgen dat ik op het moment dat bij login.php een object wordt aangemaakt ditzelfde object ook te benaderen is in index.php?
bij voorbaat dank!
Dan wordt het tijd dat echt begrijpt hoe dit soort requests werken. Elke keer dat er een pagina request van de browser naar de server gaat begint de server weer van voren af aan. Alles wat er daarvoor gebeurd is is vergeten en je begint vanaf 0. Dus het user object dat je aanmaakt bij het inloggen bestaat niet meer als de gebruiker een volgende pagina aanroept. Je zal dat object dus opnieuw moeten aanmaken.
Maar is er geen enkele manier om dit object toch door te geven?
Via een sessie bijvoorbeeld?
Je kan het serializen en unserializen, maar daar ben ik absoluut geen voorstander van. In feite is dat niets anders dan een (slechte) database vervanging. Alle data in dat object heb je al in de database staan, dus waarom nog een keer opslaan?
Ik wil het user object in meedere files kunnen bevragen.
Ik maak zoals eerder is gezegd op het moment dat een user inlogd is een instantie(object) van een klasse aan met de benodigde gegevens van die user.
Deze wil ik dan later in de index.php of profiel.php kunnen bevragen met $user->getUsername;
Op dit moment lukt dit dusniet omdat hij het object niet doorgeeft of onthoud in een file zaosl hij is geinitialiseerd tijdens het inloggen.
Wat NIET kan is een object gebruiken dat in een vorig request is aangemaakt. Dat object bestaat niet meer, php is weer terug naar 0.
Wat WEL kan is een object serializen, in een bestand opslaan en bij het volgende request weer unserializen. Echter, in mijn optiek ga je dan data dubbel opslaan. Alle data van de gebruiker zit namelijk al in je database en dus is het een beetje onzinnig om dat via een serialize nog eens op te gaan slaan.
Echte oplossing: bij elk request gewoon opnieuw die user class instantieren en opnieuw vullen met data uit je database.