Mysql Class
Ik ben bezig om OOP te leren, zo ben ik nu bezig met het maken van een MySQL class. Dit mij het gemakkelijk maakt om querys naar de database te zenden. Natuurlijk zijn er genoeg class te vinden maar wat ik al zonet vertelde, het was om te leren.
Mijn mysql.class.php
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
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
<?php
class mysql
{
var $sServer;
var $sUserName;
var $sPassWord;
var $sDataBase;
var $sCommand;
public $queryprompt;
public function __construct($sUserName, $sPassWord, $sDataBase)
{
$this->sServer = "localhost";
$this->sUserName = $sUserName;
$this->sPassWord = $sPassWord;
$this->sDataBase = $sDataBase;
}
/*
Connection to the database
Returns a error if the connetion failed
*/
public function connectToDB()
{
if(!mysql_connect($this->sServer,$this->sUserName,$this->sPassWord) || !mysql_select_db($this->sDataBase)) {
return "There is some problem";
}
}
public function query($sCommand)
{
$queryprompt = mysql_query($sCommand, $this->connectToDB());
}
public function getRecord()
{
$data = mysql_fetch_array($this->queryprompt);
return $data;
}
}
?>
class mysql
{
var $sServer;
var $sUserName;
var $sPassWord;
var $sDataBase;
var $sCommand;
public $queryprompt;
public function __construct($sUserName, $sPassWord, $sDataBase)
{
$this->sServer = "localhost";
$this->sUserName = $sUserName;
$this->sPassWord = $sPassWord;
$this->sDataBase = $sDataBase;
}
/*
Connection to the database
Returns a error if the connetion failed
*/
public function connectToDB()
{
if(!mysql_connect($this->sServer,$this->sUserName,$this->sPassWord) || !mysql_select_db($this->sDataBase)) {
return "There is some problem";
}
}
public function query($sCommand)
{
$queryprompt = mysql_query($sCommand, $this->connectToDB());
}
public function getRecord()
{
$data = mysql_fetch_array($this->queryprompt);
return $data;
}
}
?>
Mijn test bestand:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
include_once( "mysql.class.php" );
$db = new mysql("gebruikersnaam","wachtwoord", "databasenaam");
$db->connectToDB();
$db->query("SELECT * FROM klanten");
$db->getRecord();
?>
include_once( "mysql.class.php" );
$db = new mysql("gebruikersnaam","wachtwoord", "databasenaam");
$db->connectToDB();
$db->query("SELECT * FROM klanten");
$db->getRecord();
?>
Op moment krijg ik deze error:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/classtest/mysql.class.php on line 46
Wat doe ik nou fout?
Joris van Rijn op 20/06/2010 15:19:06:
Heb het aangepast, maar nog steeds de melding.
Want regel 46 bestaat daar namelijk niet in.
Ik neem aan regel 39?
Joris van Rijn op 20/06/2010 15:23:57:
Wat is regel 46 in de code die jij had gepost?
Want regel 46 bestaat daar namelijk niet in.
Ik neem aan regel 39?
Want regel 46 bestaat daar namelijk niet in.
Ik neem aan regel 39?
Dat klopt, ik heb in mijn class nog een blokje commentaar staan, maar regel 46 is:
$data = mysql_fetch_array($this->queryprompt);
Voeg dus de nodige foutafhandeling toe in je query() method, gooi bijvoorbeeld een Exception als de query mislukt is en geef dan als message in ieder geval de mysql_error() mee...
ps. Dat geldt trouwens ook voor je connectToDb() method, het is nutteloos om een string met 'There was a problem' te retourneren. Gooi dan liever een Exception met die melding.
Gewijzigd op 20/06/2010 15:33:43 door Joren de Wit
Blanche PHP op 20/06/2010 15:32:28:
Waar is de foutafhandeling van je query gebleven? Als je query mislukt zal $this->queryprompt false zijn en dus onbruikbaar zijn in mysql_fetch_array()...
Voeg dus de nodige foutafhandeling toe in je query() method, gooi bijvoorbeeld een Exception als de query mislukt is en geef dan als message in ieder geval de mysql_error() mee...
ps. Dat geldt trouwens ook voor je connectToDb() method, het is nutteloos om een string met 'There was a problem' te retourneren. Gooi dan liever een Exception met die melding.
Voeg dus de nodige foutafhandeling toe in je query() method, gooi bijvoorbeeld een Exception als de query mislukt is en geef dan als message in ieder geval de mysql_error() mee...
ps. Dat geldt trouwens ook voor je connectToDb() method, het is nutteloos om een string met 'There was a problem' te retourneren. Gooi dan liever een Exception met die melding.
Ja, die foutmelding is iets wat ik later er in wou bakken of via een error.class ofzo, ben nog aant leren dus thanks voor de input!
Maar hoe pak ik een variable op uit een andere function?
Dat kan niet, dan moet je hem of teruggeven met return, of opslaan in het object met $this->...
Ruliezz liezz op 20/06/2010 15:38:39:
Ja, die foutmelding is iets wat ik later er in wou bakken of via een error.class ofzo, ben nog aant leren dus thanks voor de input!
Jouw probleem wordt juist veroorzaakt doordat je nog niets aan foutafhandeling doet. Mijn vermoeden is dat de query die je uitvoert gewoon niet klopt, maar daar krijg je nu geen melding van.
Foutafhandeing is niet iets dat je in een later stadium toevoegt, dat hoort er vanaf het begin in te zitten! Desnoods laat je je script doodvallen met die() tijdens je leerproces, maar je zult toch op een of andere manier gewaarschuwd moeten worden als je query mislukt.
ps. Basis van een Exception gooien:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
public function query($sCommand)
{
$result = mysql_query($sCommand, $this->connectToDB());
if($result === false) {
throw new Exception('Query mislukt: '.mysql_error());
}
$this->queryprompt = $result;
}
?>
public function query($sCommand)
{
$result = mysql_query($sCommand, $this->connectToDB());
if($result === false) {
throw new Exception('Query mislukt: '.mysql_error());
}
$this->queryprompt = $result;
}
?>
Gewijzigd op 20/06/2010 16:07:23 door Joren de Wit
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
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
<?php
class mysql
{
var $sServer;
var $sUserName;
var $sPassWord;
var $sDataBase;
var $sCommand;
public $queryprompt;
public $data;
public $conn;
public function __construct($sUserName, $sPassWord, $sDataBase)
{
$this->sServer = "localhost";
$this->sUserName = $sUserName;
$this->sPassWord = $sPassWord;
$this->sDataBase = $sDataBase;
// Connect on setup
$this->connectDB();
}
/*
Connection to the database
Returns a error if the connetion failed
*/
public function connectDB()
{
if($this->conn = mysql_connect($this->sServer,$this->sUserName,$this->sPassWord))
{
if(mysql_select_db($this->sDataBase, $this->conn))
{
return $this->conn;
}
else print "db conn fail";
}
else print "not connected";
}
public function query($sCommand)
{
if(!$this->queryprompt = mysql_query($sCommand, $this->conn))
print "query connect int putje";
return;
}
public function getRecord()
{
$this->data = mysql_fetch_array($this->queryprompt);
print $this->data;
return $this->data;
}
}
?>
class mysql
{
var $sServer;
var $sUserName;
var $sPassWord;
var $sDataBase;
var $sCommand;
public $queryprompt;
public $data;
public $conn;
public function __construct($sUserName, $sPassWord, $sDataBase)
{
$this->sServer = "localhost";
$this->sUserName = $sUserName;
$this->sPassWord = $sPassWord;
$this->sDataBase = $sDataBase;
// Connect on setup
$this->connectDB();
}
/*
Connection to the database
Returns a error if the connetion failed
*/
public function connectDB()
{
if($this->conn = mysql_connect($this->sServer,$this->sUserName,$this->sPassWord))
{
if(mysql_select_db($this->sDataBase, $this->conn))
{
return $this->conn;
}
else print "db conn fail";
}
else print "not connected";
}
public function query($sCommand)
{
if(!$this->queryprompt = mysql_query($sCommand, $this->conn))
print "query connect int putje";
return;
}
public function getRecord()
{
$this->data = mysql_fetch_array($this->queryprompt);
print $this->data;
return $this->data;
}
}
?>
- Printen of echoën doe je liever niet direct vanuit een klasse. Laat je klasse enkel waarden teruggeven en echo deze gewoon in je procedurele code.
- De foutafhandeling die je nu gebruikt is vrij nutteloos. Je geeft een foutmelding die totaal niet weergeeft wat er nu eigenlijk fout gaat. Hoe wil je dan ook bepalen waar de fout zit?
De tip uit mijn vorige posts geldt nog steeds: gebruik Exceptions voor het afhandelen van je fouten. Dat is de meest gangbare manier als je met OOP aan de slag gaat...
var $var
staan, waar ik geen gegronde reden voor kan verzinnen, zet die ook om daar de "PHP5 manier. Probeer zelf netjes en consistent te programmeren, waaronder ook met Exceptions werken.
@Afra ca: hoe bedoel je, moet ik alles maar op public zetten?
Sorry, ben er nog niet zo in thuis in OOP.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
public function getRecord()
{
$this->data = mysql_fetch_array($this->queryprompt);
return $this->data;
}
?>
public function getRecord()
{
$this->data = mysql_fetch_array($this->queryprompt);
return $this->data;
}
?>
Hoe pak ik de data weer op? met een foreache in mijn procedurele code?