Object in meerdere files gebruiken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Trinco ingels

trinco ingels

24/05/2013 12:13:07
Quote Anchor link
Goedemiddag allen,

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)
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
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] );
}

?>

User class:
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
<?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;
    }
}

?>
Gewijzigd op 24/05/2013 12:14:15 door Trinco ingels
 
PHP hulp

PHP hulp

28/11/2024 01:39:29
 
Erwin H

Erwin H

24/05/2013 12:31:28
Quote Anchor link
Singletons -> EVIL!
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.
 
Trinco ingels

trinco ingels

24/05/2013 13:14:48
Quote Anchor link
De database class is gebruikt zoals die hier tussen de scripts staat en de user class is snel aangemaakt om te kijken of het daadwerkelijk lukt wat ik wil.
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
include 'config.php';
include 'user.class.php';

if (isset($_POST['submit'])){
$profiel = new user();
$profiel->setId();
}

?>


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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
include 'config.php';

echo $profiel->getUserId();
?>


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!
 
Erwin H

Erwin H

24/05/2013 14:26:40
Quote Anchor link
Met 'Na het inloggen wordt de gebruiker doorgestuurd naar de index.php' bedoel je neem ik aan een redirect?

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.
 
Trinco ingels

trinco ingels

24/05/2013 14:40:18
Quote Anchor link
Erwin H dat klopt en daar was ik stiekem al achter gekomen.

Maar is er geen enkele manier om dit object toch door te geven?
Via een sessie bijvoorbeeld?
 
Erwin H

Erwin H

24/05/2013 15:02:53
Quote Anchor link
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?
 
Trinco ingels

trinco ingels

24/05/2013 15:53:45
Quote Anchor link
Het gaat niet om de database. Want die werkt naar behoren

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.
 
Erwin H

Erwin H

24/05/2013 18:24:56
Quote Anchor link
Nee, wat ik zeg heeft ook niets met een database te maken....

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.
 



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.