Fout met Exceptions in Database classe

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark Eilander

Mark Eilander

04/01/2008 12:15:00
Quote Anchor link
Goede middag allen,

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

PHP hulp

16/01/2022 11:57:26
 
Joren de Wit

Joren de Wit

04/01/2008 12:19:00
Quote Anchor link
Hoe roep je deze methoden aan?
 
Mark Eilander

Mark Eilander

04/01/2008 12:21:00
Quote Anchor link
try {
// 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();
}
 
Joren de Wit

Joren de Wit

04/01/2008 12:29:00
Quote Anchor link
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...
 
Mark Eilander

Mark Eilander

04/01/2008 12:35:00
Quote Anchor link
Ok, klinkt logisch.
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?
 
Joren de Wit

Joren de Wit

04/01/2008 12:43:00
Quote Anchor link
Ik zou zelf een extra methode bijvoorbeeld fetchAll() maken waarmee je alle rijen in een array zet en deze retourneert.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Mark Eilander

Mark Eilander

04/01/2008 12:46:00
Quote Anchor link
Ok, bedankt!!

Ik zal eens kijken of me dat gaat lukken.
 
Frank -

Frank -

04/01/2008 12:48:00
Quote Anchor link
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.
 
Mark Eilander

Mark Eilander

04/01/2008 12:50:00
Quote Anchor link
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.
 
Mark Eilander

Mark Eilander

04/01/2008 12:53:00
Quote Anchor link
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.


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 :)
 
Hipska BE

Hipska BE

04/01/2008 12:58:00
Quote Anchor link
nog een tip: gebruik ipv mysql_... mysqli_... of PDO omdat deze beter met de DB werken. zijn meteen ook classes die jouw classe dan zou kunnen extenden..
 
Mark Eilander

Mark Eilander

04/01/2008 13:01:00
Quote Anchor link
Ik heb idd gehoord van de PDO classe, probeer er zelf ook wel mee te werken.

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.