Fout met Exceptions in Database classe
Ik ben bezig met een database classe voor een project dat ik voor mijn studie masterclass php moet maken.
Ik zit echter met een klein probleempje.
Het gaat om de volgende code:
public function FetchObject ($m_sQuery) {
$this->IsConnected();
$m_sResult = @mysql_fetch_object($m_sQuery);
if (!$m_sResult) {
throw new MyException ('<b>Database</b> | FetchObject() | Array error');
}
RETURN $m_sResult;
}
Als ik de method aanroep, en alles goed is geeft hij EN de rijen weer, EN de exception.
Hoe kan dit?
Heb hetzelfde bij NumRows gedaan, en daar gaat het wel goed.
Code:
public function NumRows($m_sQuery)
{
$this->IsConnected();
$m_sResult = @mysql_num_rows($m_sQuery);
if ($m_sResult === false) {
throw new MyException ('<b>Database</b> | NumRows() | Could not count rows');
}
RETURN $m_sResult;
}
Als ik de NumRows method aanroep, zonder een query, geeft hij netjes de exception.
Doe ik hetzelfde bij FetchObject, geeft hij geen exception, maar de error van php zelf.
Wat te doen?
Met vriendelijke groet,
Mark Eilander.
Hoe roep je deze methoden aan?
// Maak een verbinding met de database
$oDb->Connect($oDb->sHost, $oDb->sName, $oDb->sUser, $oDb->sPassword);
// Voer een query uit
$m_sThisQuery = $oDb->Query("SELECT * FROM ".$oDb->sRoot."");
// Haal alle objecten op en print ze op het scherm
while ($m_sResult = $oDb->FetchObject($m_sThisQuery)) {
echo $m_sResult->FirstName." ". $m_sResult->LastName."<br />";
}
// Tel het totaal aantal rijen in de tabel
$m_nTotalRows = $oDb->NumRows($m_sThisQuery);
echo $m_nTotalRows;
//Database verbinding afsluiten
$oDb = null;
} catch(MyException $e) {
echo $e->getError();
}
Het zal komen door die while loop. In de allerlaatste loop zullen er geen rijen meer zijn in de resultaat-set waardoor je die foutmelding krijgt...
Doordat er geen rijen meer zijn wordt de waarde false en daardoor gooit hij de exception.
Zou een try/catch ipv een throw new exception wel werken?
In de method zelf.
Of heeft het geen nut om hier een exception te gooien?
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Ik zal eens kijken of me dat gaat lukken.
Offtopic: Je weet dat mysql_fetch_object() érg langzaam is en (relatief) veel geheugen nodig heeft? mysql_fetch_assoc() is in vrijwel alle gevallen deze beste keuze wanneer je moet fetchen.
Heb in mijn database classe alle fetch mogelijkheden opgenomen.
Ik heb fetch_object aangeroepen, om te testen of de exceptions werkten.
mark schreef op 04.01.2008 12:50:
Bedankt voor de tip, zal hem onthouden.
Heb in mijn database classe alle fetch mogelijkheden opgenomen.
Ik heb fetch_object aangeroepen, om te testen of de exceptions werkten.
Heb in mijn database classe alle fetch mogelijkheden opgenomen.
Ik heb fetch_object aangeroepen, om te testen of de exceptions werkten.
Ik krijg bij alle fetch methoden de rijen netjes gepresenteerd, net als de exception, hoop dat ik zo'n fetchAll functie kan maken, anders is het niet echt een mega grote ramp.
Thnx voor de hulp, ben alweer wat wijzer geworden :)
mysqli_... of PDO omdat deze beter met de DB werken. zijn meteen ook classes die jouw classe dan zou kunnen extenden..
nog een tip: gebruik ipv mysql_... Maar het gat er bij de cursus om dat je laat zien dat je classes kunt maken en exceptions kunt gebruiken.
Ook dien ik gebruik te maken van het multitier princiepe.
Vandaar dat ik ervoor gekozen heb zelf een database classe te maken.
Kan deze uiteraard nog wel aanpassen zodat hij de mysqli extensie gebruikt.