Wat is er mis met onderstaande 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
30
31
32
33
34
35
36
37
38
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
<?php
$DBUSER = "username";
$DBPASS = "pass";
$DBNAME = "dbname";
$DBSERVER= "localhost";
class myDB {
var $myConnection;
var $myRecordset;
var $row;
function myDB() {
GLOBALS $DBUSER, $DBPASS, $DBSERVER, $DBNAME;
$this->myConnection = mysql_connect($DBSERVER, $DBUSER, $DBPASS) or die("DB ERROR" . mysql_error());
mysql_select_db($DBNAME, $this->myConnection) or die("Huh?" . mysql_error());
}
function getRecords(strSQL) {
$this->myRecordset = mysql_query(strSQL, this->myConnection);
}
function getRow() {
$this->row = mysql_fetch_row($this->recordset);
}
function dbclose() {
mysql_free_result($this->myRecordset);
mysql_close($this->myConnection);
}
}
$bla = new myDB();
?>
$DBUSER = "username";
$DBPASS = "pass";
$DBNAME = "dbname";
$DBSERVER= "localhost";
class myDB {
var $myConnection;
var $myRecordset;
var $row;
function myDB() {
GLOBALS $DBUSER, $DBPASS, $DBSERVER, $DBNAME;
$this->myConnection = mysql_connect($DBSERVER, $DBUSER, $DBPASS) or die("DB ERROR" . mysql_error());
mysql_select_db($DBNAME, $this->myConnection) or die("Huh?" . mysql_error());
}
function getRecords(strSQL) {
$this->myRecordset = mysql_query(strSQL, this->myConnection);
}
function getRow() {
$this->row = mysql_fetch_row($this->recordset);
}
function dbclose() {
mysql_free_result($this->myRecordset);
mysql_close($this->myConnection);
}
}
$bla = new myDB();
?>
________________________________________
result = Huh?Access denied for user: '@localhost' to database 'dbname'
Het lijkt er dus op dat de username ineens niet meer wordt meegegeven????
Gewijzigd op 12/10/2004 16:08:00 door Mike
Bij jou in je echte script staat toch niet ook "username", "pass" en "dbname" he?
Hahahahaha, nee uiteraard niet.... Is een voorbeeldje...
BPASS moet volgens mij $DBPASS zijn en DBSERVER mist een $?
Gewijzigd op 12/10/2004 15:47:00 door Frisbee
En tis $GLOBALS['varname'] je hoeft ze niet eerst als global te zetten ...
Die $GLOBALS['varname'] is een handige tip!!!! bedankt.
Heb de tikfoutjes even aangepast...
maar ziet iemand een reden waarom het script died op mysql_select_db ????
Je kan kijke offut aan de database ligt, probeer eens een ander script, en wil je perse een class, probeer dan deze eens :
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
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
<?php
# Filename : database.php
# Author : Mitch Vroege
# Projectname : nvt
# Projectversion : nvt
# Releasedate : nvt
class Database
{
# Database vars
var $user = "User";
var $pass = "Pass";
var $host = "localhost";
var $name = "DBname";
# Functie die mysql_num_rows teruggeeft
function num_rows($sql)
{
$this->connect();
$res = mysql_query($sql);
$aantal = mysql_num_rows($res);
mysql_close();
return $aantal;
}
# Functie de mysql_fetch_array teruggeeft
function get_array($sql)
{
$this->connect();
$res = mysql_query($sql);
while($data = mysql_fetch_array($res))
$row[] = $data;
mysql_close();
return $row;
}
# Zelfde als hierboven maar dan 1 row
function get_single($sql)
{
$this->connect();
$res = mysql_query($sql);
$data = mysql_fetch_array($res);
mysql_close();
return $data;
}
# Functie die een normale query runt
function execute($sql)
{
$this->connect();
$res = mysql_query($sql);
mysql_close();
return $res;
}
# Functie die de database connectie maakt
function connect()
{
return mysql_select_db($this->name, mysql_connect($this->host, $this->user, $this->pass));
}
}
?>
# Filename : database.php
# Author : Mitch Vroege
# Projectname : nvt
# Projectversion : nvt
# Releasedate : nvt
class Database
{
# Database vars
var $user = "User";
var $pass = "Pass";
var $host = "localhost";
var $name = "DBname";
# Functie die mysql_num_rows teruggeeft
function num_rows($sql)
{
$this->connect();
$res = mysql_query($sql);
$aantal = mysql_num_rows($res);
mysql_close();
return $aantal;
}
# Functie de mysql_fetch_array teruggeeft
function get_array($sql)
{
$this->connect();
$res = mysql_query($sql);
while($data = mysql_fetch_array($res))
$row[] = $data;
mysql_close();
return $row;
}
# Zelfde als hierboven maar dan 1 row
function get_single($sql)
{
$this->connect();
$res = mysql_query($sql);
$data = mysql_fetch_array($res);
mysql_close();
return $data;
}
# Functie die een normale query runt
function execute($sql)
{
$this->connect();
$res = mysql_query($sql);
mysql_close();
return $res;
}
# Functie die de database connectie maakt
function connect()
{
return mysql_select_db($this->name, mysql_connect($this->host, $this->user, $this->pass));
}
}
?>
Zou je willen uitleggen wat voor rare dingen? Het was m.i. toch heel simpel... (Het is idd nu even niet compleet, maar hij klapt er toch al uit bij de constructor.)
Deze regel heb je dus niets aan, die werkt niet:
GLOBALS $DBUSER, $DBPASS, $DBSERVER, $DBNAME;
Want daardoor komt die error ...
unction getRecords(strSQL) {
Mss een $ voor strSQL?
$bla = new myDB();
Een class is GEEN functie, als je niet weet hoe je een class hoort te gebruiken doe het dan niet, je maakt het jezelf onnodig moeilijk.
Vergeet even die globals.....
Maar even voor de duidelijkheid, zal ik het stukje script opnieuw maken, zonder extra toeters en bellen, want het hele point is hier gemist:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class DBASE {
// var om de mysql_link in vast te houden
var $dbConnection
//constructor
function DBASE() {
//connecten naar de database
$this->myConnection = mysql_connect('localhost','username','pass') or die ("DB Connect failed");
//juiste database selecteren
mysql_select_db('dbname', $this->myConnection) or die (mysql_error());
}
}
?>
class DBASE {
// var om de mysql_link in vast te houden
var $dbConnection
//constructor
function DBASE() {
//connecten naar de database
$this->myConnection = mysql_connect('localhost','username','pass') or die ("DB Connect failed");
//juiste database selecteren
mysql_select_db('dbname', $this->myConnection) or die (mysql_error());
}
}
?>
Als ik nu een DBASE object instantieer, klapt het eruit met de melding:
Access denied for user: '@localhost' to database 'dbname'
Terwijl ik dan zou verwachten dat ik de melding zou krijgen waarin staat:
Access denied for user: 'username@localhost' to database 'dbname'
Waar is mijn username gebleven....????
Gewijzigd op 12/10/2004 17:08:00 door Mike
Dan moet je wel je inloggegevens voor MySQL ook binnen de klasse definieren. Dus:
var $DBHOST = 'localhost';
var $DBUSER = 'user';
var $DBPWD = 'pass';
var $DBNAME = 'dbname';
Gewijzigd op 12/10/2004 17:19:00 door Winston Smith
Ik definieer een aantal variabelen buiten de class (zals Kasper idd opmerkt)...
Om deze variablen binnen de class (of binnen andere fucnties) te gebruiken, definieer je eerst de variable opnieuw door $GLOBAL $varName...
Nu heeft de $varName dus de waarde die ook buiten de functie / Class gedefinieerd is. Het heeft dus niets met de $GLOBALS['varname'] te maken....
(Variabelen zijn anders alleen bekend binnen de functie / class)...
Nog een puntje trouwens:
in php4 kun je variables niet op deze manier declareren, dit moet je in je constructor doen. Dus:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
class whatever {
var $varname;
function whatever() {
$this->varname = 'iets';
}
}
?>
class whatever {
var $varname;
function whatever() {
$this->varname = 'iets';
}
}
?>
Just ter info.....
Gewijzigd op 12/10/2004 17:26:00 door Mike
Code (php)
Geef dus netjes Mitch :)
Niet zeuren dus ;)
Edit: En ik weet niet waarop je doeld met
Quote:
maar ik werk enkel met classes ...(Variabelen zijn anders alleen bekend binnen de functie / class)...
Gewijzigd op 12/10/2004 17:26:00 door Mitch X
Ik wist idd niet dat het ook op die manier kon, ik gebruikte daar dus altijd de andere manier voor: "$global $varName' $varName2"
Wat ik bedoelde met alleen bekend binnen class / functie is dit:
Code (php)
Zal niets terug geven omdat $naam niet bekend is binnen de functie zegnaam...
Als je eerst dit doet:
Code (php)
dan werkt het weer zoals jij verwachtte, en heeft $naam de waarde mitch...
Enneh: Ik zeur niet ;)
Iedereen die met functies leert omgaan kent lokale en globale variabelen :)
Mike:
Nog een puntje trouwens:
in php4 kun je variables niet op deze manier declareren, dit moet je in je constructor doen. Dus:
Just ter info.....
in php4 kun je variables niet op deze manier declareren, dit moet je in je constructor doen. Dus:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
class whatever {
var $varname;
function whatever() {
$this->varname = 'iets';
}
}
?>
class whatever {
var $varname;
function whatever() {
$this->varname = 'iets';
}
}
?>
Just ter info.....
Heuh? Da's nieuw... Bij mij werkt dat wel gewoon en ik draai toch echt PHP 4 :|
Als je het niet weet, leer het, vraag het, maar ga geen onzin uitkramen!
Je kunt gewo0n lokale variabelen aanmaken zonder problemen.
Wat is het voordeel dan van O.O.P.? Ik snap wel dat het moeilijk is ;)
Wat betreft die variabelen die je niet kunt declareren in php4: dit betreft alleen niet-constanten... en ik gebruik zelden constanten op die manier... (Dat was misschien niet duidelijk) voor info, kijk gerust op php.net:
Quote:
In PHP 4, only constant initializers for var variables are allowed. To initialize variables with non-constant values, you need an initialization function which is called automatically when an object is being constructed from the class. Such a function is called a constructor (see below).
http://us2.php.net/manual/nl/language.oop.php
Enneh, bedankt voor de fijne reacties... Zo wordt je echt gemotiveerd om actief mee te gaan doen aan dit forum....
Jammer.....
Gewijzigd op 13/10/2004 11:07:00 door Mike
Globale variabelen gebruiken is zeer dom in klasses en functies. De hele bedoeling achter klasses en functies is dat ze een op zichzelf staand stukje code worden dat je op een snelle en makkelijke manier in eender welke code kan inplakken.
Met het doorgeven van parameters kan je gewoon je functie aanroepen en de juiste waardes in de functiehoofding zetten.
Bij het gebruik van globalen ga je dus al eerst je mogelijke bestaande variabelen moeten globaal maken/renamen en ga je je vingers moeten kruisen dat je niet al ergens een variabele met die naam hebt of je hele script draait in het frut.
Moraal van het verhaal :
Hou zoveel mogelijk variabelen lokaal gedeclareerd om 'ambigious errors' of dubbelzinnigheid tegen te gaan.
Gewijzigd op 13/10/2004 11:24:00 door mary
Ik wilde echter iets proberen, gewoon als PoC, en dat is gelukt...
Dat het onverstandig is, is duidelijk. Het ging alleen maar even om de theorie.
Maar deze hele discussie is ondertussen losgeslagen van de eigenlijke vraag..... :P