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
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.
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?
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());
}
- 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...