[php] userClass heeft dbClass nodig, hoe?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Ik heb twee classes en wat code om een gebruiker te kunnen inloggen,
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
class dbClass
{
        function db_select($query)
        {
                /*------------------------------------------------------------\
                | db_select()                                                 |
                |=============================================================|
                | Queries the database. (SELECT-queries only)                 |
                \____________________________________________________________*/
        }
}

class userClass
{
        function user_verify($username,$password)
        {
                $result = $db->db_select('SELECT user,password FROM users WHERE user="'.$user.'"');
                print_r($result);
        }
}

$db = new dbClass();
$user = new userClass();
$db->db_connect('mysql://root:@127.0.0.1/cms');
$user->user_verify('Admin','testpassword');

met elk een aantal functies. Nu heeft de userClass de dbClass nodig om de database vragen te kunnen stellen over de gebruikertjes. Maar op deze manier werkt het niet:
Fatal error: Call to a member function on a non-object in c:\webroot\_dev\classes\db.class.php on line 25.

Dus: hoe krijg ik het wel voor elkaar? Mijn excuses vast voor mijn n00bige vraag, ben vandaag begonnen met OO in PHP.

Acties:
  • 0 Henk 'm!

  • coubertin119
  • Registratie: Augustus 2002
  • Laatst online: 15-09 17:06
In een class heb je geen toegang tot daarbuiten gedeclareerde variabelen. Dus die $db->db_select die je daar toepast, is niet toegankelijk. Je moet connecten IN de userClass en dan kan het wel.

snoopy's wijze doet zoiets als ik vertel, alleen neemt hij de buiten de class gecreëerde connection mee in de class.

snoopy, hij moet ook nog connecten voor hij kan query'en ;).

[ Voor 36% gewijzigd door coubertin119 op 01-01-2004 20:30 ]

Skat! Skat! Skat!


Acties:
  • 0 Henk 'm!

Verwijderd

volgens mij klopt er iets niet in je query op regel 17. Je geeft je functie 2 vars mee ($username, $password) maar die gebruik je verder nergens in je prog. Ik heb ook geen php ervaring, maar dat viel me effe op. Misshien dat in je query ipv '.$user.' '.$username.' moet staan?

Acties:
  • 0 Henk 'm!

Verwijderd

coubertin119 schreef op 01 januari 2004 @ 20:12:
In een class heb je geen toegang tot daarbuiten gedeclareerde variabelen. Dus die $db->db_select die je daar toepast, is niet toegankelijk. Je moet connecten IN de userClass en dan kan het wel.
Dan moet hij die public maken :)

Acties:
  • 0 Henk 'm!

  • coubertin119
  • Registratie: Augustus 2002
  • Laatst online: 15-09 17:06
Dr HenDre, je kan een gigantische shitload aan gegevens meegeven aan je functie, je hoeft er niks mee te doen :).

En voor zover ik weet ondersteunt PHP4 nog geen public/private vars. En ik denk dat global vars ook niet gaan werken. Geen ervaring mee eigenlijk.

Skat! Skat! Skat!


Acties:
  • 0 Henk 'm!

  • snoopy
  • Registratie: December 2000
  • Laatst online: 17-08 08:27
Je kan natuurlijk de DB-class meegeven aan de user-klasse. Voorbeeldje:

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
class dbClass
{
        function db_select($query)
        {
                /*------------------------------------------------------------\
                | db_select()                                                 |
                |=============================================================|
                | Queries the database. (SELECT-queries only)                 |
                \____________________________________________________________*/
        }
}

class userClass
{
    var $db;
    function userClass(&$db)
    {
         $this->db = &$db;
    }    

    function user_verify($username,$password)
        {
                $result = $this->db->db_select('SELECT user,password FROM users WHERE user="'.$user.'"');
                print_r($result);
        }
}

$db = new dbClass();
$db->db_connect('mysql://root:@127.0.0.1/cms');
$user = new userClass(&$db);
$user->user_verify('Admin','testpassword');


Je geeft hier dus de $db mee aan de userClass, en deze defineert deze als een eigen klasse-/instantievariabele.

Je kan het ook op een andere manier doen, je kan de dbClass aanroepen op de volgende manier:
code:
1
dbClass::db_select($query);

[ Voor 28% gewijzigd door snoopy op 01-01-2004 20:26 ]


Acties:
  • 0 Henk 'm!

  • creative8500
  • Registratie: September 2001
  • Laatst online: 01-02 14:14

creative8500

freedom.

Offtopicvraagje: is het evil als ik zoiets gebruik:
PHP:
1
2
3
4
5
6
$query = new selectQuery;
$query -> setTable ('users');
$query -> setColumn ('user');
$query -> setColumn ('password');
$query -> setWhereEquals ('user', $user);
$query -> execute ();

in plaats van:
PHP:
1
$result = $db->db_select('SELECT user,password FROM users WHERE user="'.$user.'"');

Acties:
  • 0 Henk 'm!

  • snoopy
  • Registratie: December 2000
  • Laatst online: 17-08 08:27
Ziet er heel eng uit, en als ik het tegen zou komen zou ik niet weten wat het precies inhoudt...

Acties:
  • 0 Henk 'm!

  • creative8500
  • Registratie: September 2001
  • Laatst online: 01-02 14:14

creative8500

freedom.

snoopy schreef op 01 januari 2004 @ 20:40:
Ziet er heel eng uit, en als ik het tegen zou komen zou ik niet weten wat het precies inhoudt...
Daar heb je natuurlijk uitgebreide comments voor in de code van de selectQuery-class. :)

Btw:
PHP:
1
2
echo $query -> getQuery ();
// geeft: SELECT `user`, `password` FROM `users` WHERE `user` = ''

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
creative8500 schreef op 01 januari 2004 @ 20:25:
Offtopicvraagje: is het evil als ik zoiets gebruik:
PHP:
1
2
3
4
5
6
$query = new selectQuery;
$query -> setTable ('users');
$query -> setColumn ('user');
$query -> setColumn ('password');
$query -> setWhereEquals ('user', $user);
$query -> execute ();

in plaats van:
PHP:
1
$result = $db->db_select('SELECT user,password FROM users WHERE user="'.$user.'"');
't Is niet zo gek hoor, alleen ik denk dat je er geen duidelijkheid bij krijgt, meer tikwerk hebt en door de extra complexiteit je (niet perse meetbaar, tenzij je het vaak doet) extra tijd kwijt bent.

Dus de vraag is dan: Heeft het wel nut om dat zo te doen?
Zelf heb ik een soort template systeem opgezet voor de queries, zodat er idd niet continue hopen queries geschreven hoeven te worden in de code, maar er toch een redelijk efficiente en overzichtelijke query-generator is :)

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Bedankt allemaal, ik heb het op de manier van Snoopy opgelost. Als bedankje de (voorlopige) database class voor de mensen die te lui zijn er zelf eentje te maken.
NOTE: Het is niet mogelijk een DELETE of UPDATE statement uit te voeren. MySQL is op het moment als enigste ondersteund.
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
class dbClass
{
        var $provider;
        var $user;
        var $password;
        var $db_server;
        var $database;

        var $link;
        var $is_connected;

        var $result;

        var $stats;

        function dbClass()
        {
                /*------------------------------------------------------------\
                | constructor of the dbClass                                  |
                \____________________________________________________________*/
        }
        
        function db_connect($connection)
        {
                /*------------------------------------------------------------\
                | db_connect()                                                |
                |=============================================================|
                | Connects to database.                                       |
                |=============================================================|
                | Parameters:                                                 |
                |  + $connection: (string)                                    |
                |     'provider://user:password@server:port/database'         |
                |=============================================================|
                | Returns:                                                    |
                |  (void)                                                     |
                |=============================================================|
                | Dies:                                                       |
                |  + unable to connect                                        |
                |  + unable to select database                                |
                |  + database provider not supported                          |
                |=============================================================|
                | Updates / Changelog                                         |
                |  + 2004-01-01 Initial release.                              |
                \____________________________________________________________*/
                preg_match("!(\w+):\/\/(\w+):(.*?)@(.*?)\/(\w+)!si",$connection,$matches);
                $this->provider = $matches[1];
                $this->user     = $matches[2];
                $this->password = $matches[3];
                $this->db_server= $matches[4];
                $this->database = $matches[5];
                
                switch ($this->provider)
                {
                        case 'mysql':
                                $this->link = mysql_connect($this->db_server,$this->user,$this->password) or die('ERROR::DB.CLASS:CONNECT::UNABLE TO CONNECT');
                                $this->is_connected = true;
                                mysql_select_db($this->database) or die('ERROR:DB.CLASS::CONNECT::UNABLE TO SELECT DATABASE');
                                break;
                        default:
                                die('ERROR::DB.CLASS::CONNECT::DATABASE PROVIDER NOT SUPPORTED');
                                break;
                }
        }

        function db_disconnect()
        {
                /*------------------------------------------------------------\
                | db_disconnect()                                             |
                |=============================================================|
                | disconnects from the database                               |
                |=============================================================|
                | Parameters:                                                 |
                |  + None.                                                    |
                |=============================================================|
                | Returns:                                                    |
                |  (void)                                                     |
                |=============================================================|
                | Dies:                                                       |
                |  + unable to disconnect                                     |
                |  + database provider not supported                          |
                |=============================================================|
                | Updates / Changelog                                         |
                |  + 2004-01-01 Initial release.                              |
                \____________________________________________________________*/
                if ($this->is_connected)
                {
                        switch($this->provider)
                        {
                                case 'mysql':
                                        mysql_close($this->link) or die('ERROR:DB.CLASS::DISCONNECT::UNABLE TO DISCONNECT');
                                        break;
                                default:
                                        die('ERROR::DB.CLASS::DISCONNECT::DATABASE PROVIDER NOT SUPPORTED');
                                        break;
                        }
                }
        }
        
        function db_select($query)
        {
                /*------------------------------------------------------------\
                | db_select()                                                 |
                |=============================================================|
                | Queries the database. (SELECT-queries only)                 |
                |=============================================================|
                | Parameters:                                                 |
                |  + $query: The query to be executed.                        |
                |=============================================================|
                | Returns:                                                    |
                |  (array) Containing the results from the query. The array   |
                |  is an associative array.                                   |
                |=============================================================|
                | Dies:                                                       |
                |  + unable to query                                          |
                |  + database provider not supported                          |
                |=============================================================|
                | Updates / Changelog                                         |
                |  + 2004-01-01 Initial release.                              |
                \____________________________________________________________*/
                if(!$this->is_connected)
                {
                        die('ERROR:DB.CLASS::QUERY::NOT CONNECTED TO A DATABASE');
                }
                else
                {
                        if (!isset($this->stats['select']))
                        {
                                $this->stats = array();
                                $this->stats['select'] = 0;
                        }
                        $this->stats['select']++;
                        $this->result = array();
                        $this->result[0] = array();
                        $this->result[0]['query'] = $query;
                        switch($this->provider)
                        {
                                case 'mysql':
                                        $result = mysql_query($query) or die('ERROR:DB.CLASS::SELECT::UNABLE TO QUERY');
                                        while($row = mysql_fetch_array($result,MYSQL_ASSOC))
                                        {
                                                $this->result[count($this->result)] = $row;
                                        }
                                        mysql_free_result($result);
                                        return $this->result;
                                        break;
                                default:
                                        die('ERROR:DB.CLASS::SELECT::DATABASE PROVIDER NOT SUPPORTED');
                                        break;
                        }
                }
        }
        function db_insert($table,$values)
        {
                /*------------------------------------------------------------\
                | db_insert()                                                 |
                |=============================================================|
                | Add rows to the database                                    |
                |=============================================================|
                | Parameters:                                                 |
                |  + $table: (string) The table to add the data to.           |
                |  + $values: (array) An array containing the values to add.  |
                |=============================================================|
                | Returns:                                                    |
                |  (void)                                                     |
                |=============================================================|
                | Dies:                                                       |
                |  + unable to query                                          |
                |  + database provider not supported                          |
                |=============================================================|
                | Updates / Changelog                                         |
                |  + 2004-01-01 Initial release.                              |
                \____________________________________________________________*/
                if(!$this->is_connected)
                {
                        die('ERROR:DB.CLASS::QUERY::NOT CONNECTED TO A DATABASE');
                }
                else
                {
                        if (!isset($this->stats['insert']))
                        {
                                $this->stats = array();
                                $this->stats['insert'] = 0;
                        }
                        $this->stats['insert']++;
                        $query  = 'INSERT INTO '.$table. ' VALUES (';
                        $i = 0;
                        foreach($values as $val)
                        {
                                $i++;
                                $query .= $this->db_value_for_query($val);
                                if ($i < count($values))
                                {
                                        $query .= ',';
                                }
                        }
                        $query .= ')';
                        switch($this->provider)
                        {
                                case 'mysql':
                                        mysql_query($query) or die('ERROR:DB.CLASS::INSERT::ERROR IN QUERY');
                                        break;
                                default:
                                        die('ERROR:DB.CLASS::INSERT::DATABASE PROVIDER NOT SUPPORTED');
                                        break;
                        }
                }
        }
        function db_value_for_query($val)
        {
                /*------------------------------------------------------------\
                | db_value_for_query()                                        |
                |=============================================================|
                | Converts any input for use in a query.                      |
                |=============================================================|
                | Parameters:                                                 |
                |  + $val (float, int, null, string): value to convert.       |
                |=============================================================|
                | Returns:                                                    |
                |  (string) converted value.                                  |
                |=============================================================|
                | Dies:                                                       |
                |  + If $val is an array or object.                           |
                |=============================================================|
                | Updates / Changelog                                         |
                |  + 2004-01-01 Initial release.                              |
                \____________________________________________________________*/
                if(is_float($val))
                {
                        return '"'.$val.'"';
                }
                if(is_int($val))
                {
                        return $val;
                }
                if(is_null($val))
                {
                        return 'null';
                }
                if(is_string($val))
                {
                        return '"'.addslashes($val).'"';
                }
                if(is_array($val) || is_object($val))
                {
                        die('ERROR:DB.CLASS::VALUECONVERT::UNEXPECTED INPUT TYPE');
                }
        }
}

Geen commentaar alsjeblieft om de impressie van een 'kijk mijn code na'-request te vermijden.

Acties:
  • 0 Henk 'm!

Verwijderd

Een andere oplossing is dat je $db global maakt in de method user_verify

PHP:
1
2
3
4
5
6
        function user_verify($username,$password) 
        { 
                GLOBAL $db;  // <--  Zo dus.
                $result = $db->db_select('SELECT user,password FROM users WHERE user="'.$user.'"'); 
                print_r($result); 
        }
Pagina: 1