Hee Allemaal,

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

<?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;
}
}
?>

Mijn test bestand:

<?php

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?
regel 34 moet zijn:


$this->queryprompt = mysql_query($sCommand, $this->connectToDB());
Joris van Rijn op 20/06/2010 15:19:06

regel 34 moet zijn:


$this->queryprompt = mysql_query($sCommand, $this->connectToDB());




Heb het aangepast, maar nog steeds de melding.
Wat is regel 46 in de code die jij had gepost?
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?


Dat klopt, ik heb in mijn class nog een blokje commentaar staan, maar regel 46 is:
$data = mysql_fetch_array($this->queryprompt);
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.
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.


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 [php]die[/php]() 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:
<?php
public function query($sCommand)
{
$result = mysql_query($sCommand, $this->connectToDB());

if($result === false) {
throw new Exception('Query mislukt: '.mysql_error());
}

$this->queryprompt = $result;
}
?>
Heb er nog even samen met een vriend naar gekeken, en het is nu opgelost! Hij werkt! We hebben het zo gedaan!

<?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;
}
}
?>
Een paar zaken:

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

Reageren